!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie)}(window||{},function(t){"use strict";function e(){return{}}function s(t){zt=t?Math.round:function(t){return t}}function a(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=i<0?-1:1}function r(t,e){this.type=t,this.direction=e<0?-1:1}function n(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=i<0?-1:1}function h(t,e,s){this.type=t,this._ch=e,this.totalFrames=s}function o(t,e){this.type=t,this.target=e}function p(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 l(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 f(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*(e<s?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 m(t,e){var s=f(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),l(s[0],s[1],s[2])}function d(t,e){var s=f(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),l(s[0],s[1],s[2])}function c(t,e){var s=f(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),l(s[0],s[1],s[2])}function u(){}function g(t){return Array.apply(null,{length:t})}function y(t){return document.createElementNS(Bt,t)}function v(t){return document.createElement(t)}function b(t,e){var s,i,a=t.length;for(s=0;s<a;s+=1){i=t[s].prototype;for(var r in i)i.hasOwnProperty(r)&&(e.prototype[r]=i[r])}}function k(){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&&n<1e-4}function e(e,s,i,a,r,n,h,o,p){if(0===i&&0===n&&0===p)return t(e,s,a,r,h,o);var l,f=Math.sqrt(Math.pow(a-e,2)+Math.pow(r-s,2)+Math.pow(n-i,2)),m=Math.sqrt(Math.pow(h-e,2)+Math.pow(o-s,2)+Math.pow(p-i,2)),d=Math.sqrt(Math.pow(h-a,2)+Math.pow(o-r,2)+Math.pow(p-n,2));return l=f>m?f>d?f-m-d:d-m-f:d>m?d-m-f:m-f-d,l>-1e-4&&l<1e-4}function s(t){var e,s=ye.newElement(),i=t.c,a=t.v,r=t.o,n=t.i,h=t._length,p=s.lengths,l=0;for(e=0;e<h-1;e+=1)p[e]=o(a[e],a[e+1],r[e],n[e+1]),l+=p[e].addedLength;return i&&(p[e]=o(a[e],a[0],r[e],n[0]),l+=p[e].addedLength),s.totalLength=l,s}function i(t){this.segmentLength=0,this.points=new Array(t)}function a(t,e){this.partialLength=t,this.point=e}function r(t,e){var s=e.percents,i=e.lengths,a=s.length,r=qt((a-1)*t),n=t*e.addedLength,h=0;if(r===a-1||0===r||n===i[r])return s[r];for(var o=i[r]>n?-1:1,p=!0;p;)if(i[r]<=n&&i[r+1]>n?(h=(n-i[r])/(i[r+1]-i[r]),p=!1):r+=o,r<0||r>=a-1){if(r===a-1)return s[r];p=!1}return s[r]+(s[r+1]-s[r])*h}function n(t,e,s,i,a,n){var h=r(a,n),o=1-h,p=Math.round(1e3*(o*o*o*t[0]+(h*o*o+o*h*o+o*o*h)*s[0]+(h*h*o+o*h*h+h*o*h)*i[0]+h*h*h*e[0]))/1e3,l=Math.round(1e3*(o*o*o*t[1]+(h*o*o+o*h*o+o*o*h)*s[1]+(h*h*o+o*h*h+h*o*h)*i[1]+h*h*h*e[1]))/1e3;return[p,l]}function h(t,e,s,i,a,n,h){a=a<0?0:a>1?1:a;var o=r(a,h);n=n>1?1:n;var p,f=r(n,h),m=t.length,d=1-o,c=1-f,u=d*d*d,g=o*d*d*3,y=o*o*d*3,v=o*o*o,b=d*d*c,k=o*d*c+d*o*c+d*d*f,A=o*o*c+d*o*f+o*d*f,P=o*o*f,M=d*c*c,_=o*c*c+d*f*c+d*c*f,E=o*f*c+d*f*f+o*c*f,w=o*f*f,F=c*c*c,C=f*c*c+c*f*c+c*c*f,x=f*f*c+c*f*f+f*c*f,D=f*f*f;for(p=0;p<m;p+=1)l[4*p]=Math.round(1e3*(u*t[p]+g*s[p]+y*i[p]+v*e[p]))/1e3,l[4*p+1]=Math.round(1e3*(b*t[p]+k*s[p]+A*i[p]+P*e[p]))/1e3,l[4*p+2]=Math.round(1e3*(M*t[p]+_*s[p]+E*i[p]+w*e[p]))/1e3,l[4*p+3]=Math.round(1e3*(F*t[p]+C*s[p]+x*i[p]+D*e[p]))/1e3;return l}var o=(Math,function(){return function(t,e,s,i){var a,r,n,h,o,p,l=Jt,f=0,m=[],d=[],c=ve.newElement();for(n=s.length,a=0;a<l;a+=1){for(o=a/(l-1),p=0,r=0;r<n;r+=1)h=Wt(1-o,3)*t[r]+3*Wt(1-o,2)*o*s[r]+3*(1-o)*Wt(o,2)*i[r]+Wt(o,3)*e[r],m[r]=h,null!==d[r]&&(p+=Wt(m[r]-d[r],2)),d[r]=m[r];p&&(p=Xt(p),f+=p),c.percents[a]=o,c.lengths[a]=f}return c.addedLength=f,c}}()),p=function(){var e={};return function(s){var r=s.s,n=s.e,h=s.to,o=s.ti,p=(r[0]+"_"+r[1]+"_"+n[0]+"_"+n[1]+"_"+h[0]+"_"+h[1]+"_"+o[0]+"_"+o[1]).replace(/\./g,"p");if(e[p])return void(s.bezierData=e[p]);var l,f,m,d,c,u,y,v=Jt,b=0,k=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])&&(v=2);var A=new i(v);for(m=h.length,l=0;l<v;l+=1){for(y=g(m),c=l/(v-1),u=0,f=0;f<m;f+=1)d=Wt(1-c,3)*r[f]+3*Wt(1-c,2)*c*(r[f]+h[f])+3*(1-c)*Wt(c,2)*(n[f]+o[f])+Wt(c,3)*n[f],y[f]=d,null!==k&&(u+=Wt(y[f]-k[f],2));u=Xt(u),b+=u,A.points[l]=new a(u,y),k=y}A.segmentLength=b,s.bezierData=A,e[p]=A}}(),l=Qt("float32",8);return{getSegmentsLength:s,getNewSegment:h,getPointInSegment:n,buildBezierData:p,pointOnLine2D:t,pointOnLine3D:e}}function A(){function t(a,r,h){var o,p,l,f,m,d,c,u,g=a.length;for(f=0;f<g;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 y=o.masksProperties;for(d=y.length,m=0;m<d;m+=1)if(y[m].pt.k.i)i(y[m].pt.k);else for(u=y[m].pt.k.length,c=0;c<u;c+=1)y[m].pt.k[c].s&&i(y[m].pt.k[c].s[0]),y[m].pt.k[c].e&&i(y[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;s<i;){if(e[s].id===t)return e[s].layers.__used?JSON.parse(JSON.stringify(e[s].layers)):(e[s].layers.__used=!0,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;a<r;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;e<s;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]||!(s[0]>t[0])&&(t[1]>s[1]||!(s[1]>t[1])&&(t[2]>s[2]||!(s[2]>t[2])&&void 0))}function r(e,s){e.__complete||(p(e),h(e),o(e),l(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}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;s<i;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;i<r;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),o=function(){var t=[4,7,99];return function(e){if(e.chars&&!a(t,e.v)){var s,r,n,h,o,p=e.chars.length;for(s=0;s<p;s+=1)if(e.chars[s].data&&e.chars[s].data.shapes)for(o=e.chars[s].data.shapes[0].it,n=o.length,r=0;r<n;r+=1)h=o[r].ks.k,h.__converted||(i(o[r].ks.k),h.__converted=!0)}}}(),p=function(){function t(e){var s,i,a,r=e.length;for(s=0;s<r;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;i<a;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;s<i;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;i<r;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),l=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;i<a;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;i<o;i+=1){if(s=e[i],s.hasMask){var p=s.masksProperties;for(r=p.length,a=0;a<r;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;n<h;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;i<r;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),f={};return f.completeData=r,f}function P(){this.c=!1,this._length=0,this._maxLength=8,this.v=g(this._maxLength),this.o=g(this._maxLength),this.i=g(this._maxLength)}function M(){}function _(){}function E(){}function w(){}function F(){this._length=0,this._maxLength=4,this.shapes=g(this._maxLength)}function C(t,e,s,i){this.elem=t,this.frameId=-1,this.dataProps=g(e.length),this.renderer=s,this.mdf=!1,this.k=!1,this.dashStr="",this.dashArray=Qt("float32",e.length-1),this.dashoffset=Qt("float32",1);var a,r,n=e.length;for(a=0;a<n;a+=1)r=ae._bo(t,e[a].v,0,0,i),this.k=!!r.k||this.k,this.dataProps[a]={n:e[a].n,p:r};this.k?i.push(this):this.getValue(!0)}function x(t,e,s){this.prop=ae._bo(t,e.k,1,null,[]),this.data=e,this.k=this.prop.k,this.c=Qt("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=Qt("float32",i),this.cmdf=!1,this.omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.prop.k&&s.push(this),this.getValue(!0)}function D(t,e,s){this.mdf=!1,this._ch=!0,this._hasMaskedPath=!1,this._frameId=-1,this.__co=[],this._textData=t,this._renderType=e,this._elem=s,this._animatorsData=g(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this._bt=[],this.lettersChangedFlag=!1}function S(t,e,s){var i={propType:!1},a=ae._bo,r=e.a;this.a={r:r.r?a(t,r.r,0,Ut,s):i,rx:r.rx?a(t,r.rx,0,Ut,s):i,ry:r.ry?a(t,r.ry,0,Ut,s):i,sk:r.sk?a(t,r.sk,0,Ut,s):i,sa:r.sa?a(t,r.sa,0,Ut,s):i,s:r.s?a(t,r.s,1,.01,s):i,a:r.a?a(t,r.a,1,0,s):i,o:r.o?a(t,r.o,0,.01,s):i,p:r.p?a(t,r.p,1,0,s):i,sw:r.sw?a(t,r.sw,0,0,s):i,sc:r.sc?a(t,r.sc,1,0,s):i,fc:r.fc?a(t,r.fc,1,0,s):i,fh:r.fh?a(t,r.fh,0,0,s):i,fs:r.fs?a(t,r.fs,0,.01,s):i,fb:r.fb?a(t,r.fb,0,.01,s):i,t:r.t?a(t,r.t,0,0,s):i},this.s=fe.getTextSelectorProp(t,e.s,s),this.s.t=e.s.t}function T(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.p=r,this.mdf={o:!0,sw:!!e,sc:!!s,fc:!!i,m:!0,p:!0}}function I(t,e,s){this._frameId=jt,this.pv="",this.v="",this.kf=!1,this._ch=!0,this.mdf=!0,this.data=e,this.elem=t,this.keysIndex=-1,this.currentData={ascent:0,boxWidth:[0,0],f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:[0,0],fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,__complete:!1},this.searchProperty()?s.push(this):this.getValue(!0)}function L(){}function R(t,e){this._cq=t,this.layers=null,this.renderedFrame=-1,this._cf=y("svg");var s=y("g");this._cf.appendChild(s),this._bx=s;var i=y("defs");this._cf.appendChild(i),this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||e.hideOnTransparent!==!1,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this._x={mdf:!1,frameNum:-1,defs:i,frameId:0,_de:{w:0,h:0},renderConfig:this.renderConfig,_cr:new ie},this._br=[],this._dc=[],this.destroyed=!1}function V(t,e,s){this._co=[],this.data=t,this.element=e,this._x=s,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null,this._ch=!0;var i,a=this._x.defs,r=this.masksProperties?this.masksProperties.length:0;this.viewData=g(r),this.solidPath="";var n,h,o,l,f,m,d,c=this.masksProperties,u=0,v=[],b=p(10),k="clipPath",A="clip-path";for(i=0;i<r;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(k="mask",A="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!=u?l=null:(l=y("rect"),l.setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w),l.setAttribute("height",this.element.comp.data.h),v.push(l)),n=y("path"),"n"!=c[i].mode){if(u+=1,n.setAttribute("fill","s"===c[i].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[i].x.k){k="mask",A="mask",d=ae._bo(this.element,c[i].x,0,null,this._co);var P="fi_"+p(10);f=y("filter"),f.setAttribute("id",P),m=y("feMorphology"),m.setAttribute("operator","dilate"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),f.appendChild(m),a.appendChild(f),n.setAttribute("stroke","s"===c[i].mode?"#000000":"#ffffff")}else m=null,d=null;if(this.storedData[i]={elem:n,x:d,expan:m,lastPath:"",lastOperator:"",filterId:P,lastRadius:0},"i"==c[i].mode){o=v.length;var M=y("g");for(h=0;h<o;h+=1)M.appendChild(v[h]);var _=y("mask");_.setAttribute("mask-type","alpha"),_.setAttribute("id",b+"_"+u),_.appendChild(n),a.appendChild(_),M.setAttribute("mask","url("+Ot+"#"+b+"_"+u+")"),v.length=0,v.push(M)}else v.push(n);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:n,lastPath:"",op:ae._bo(this.element,c[i].o,0,.01,this._co),prop:ne._bp(this.element,c[i],3,this._co,null)},l&&(this.viewData[i].invRect=l),this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:ae._bo(this.element,c[i].o,0,.01,this._co),prop:ne._bp(this.element,c[i],3,this._co,null),elem:n},a.appendChild(n);for(this.maskElement=y(k),r=v.length,i=0;i<r;i+=1)this.maskElement.appendChild(v[i]);u>0&&(this.maskElement.setAttribute("id",b),this.element._ca.setAttribute(A,"url("+Ot+"#"+b+")"),a.appendChild(this.maskElement))}function N(){}function z(){}function B(){}function O(){}function j(){}function G(t,e){this.elem=t,this.pos=e}function W(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this.mdf=!1,this.closed=!1,this.pElem=y("path"),this.msElem=null}function X(t,e,s){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=s,this.lvl=e}function q(t,e){this.transform={mProps:t,op:e},this._br=[]}function Y(t,e,s,i){this.o=ae._bo(t,e.o,0,.01,s),this.w=ae._bo(t,e.w,0,null,s),this.d=new C(t,e.d||{},"svg",s),this.c=ae._bo(t,e.c,1,255,s),this.style=i}function H(t,e,s,i){this.o=ae._bo(t,e.o,0,.01,s),this.c=ae._bo(t,e.c,1,255,s),this.style=i}function J(t,e,s,i){this.initGradientData(t,e,s,i)}function U(t,e,s,i){this.w=ae._bo(t,e.w,0,null,s),this.d=new C(t,e.d||{},"svg",s),this.initGradientData(t,e,s,i)}function Z(){this.it=[],this.prevViewData=[],this.gr=y("g")}function K(){}function Q(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initFrame(),this.initTransform(t,e,s),this.initHierarchy()}function $(){}function tt(){}function et(){}function st(){}function it(t,e,s){this.assetData=e.getAssetData(t.refId),this._cz(t,e,s)}function at(t,e,s){this._cz(t,e,s)}function rt(t,e,s){this.layers=t.layers,this.supports3d=!0,this._db=!1,this._dc=[],this._br=this.layers?g(this.layers.length):[],this._cz(t,e,s),this.tm=t.tm?ae._bo(this,t.tm,0,e.frameRate,this._co):{_placeholder:!0}}function nt(t,e,s){this.textSpans=[],this.renderType="svg",this._cz(t,e,s)}function ht(t,e,s){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this._cz(t,e,s),this.prevViewData=[]}function ot(t,e){this._cl=e;var s=y("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=y("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._cm[2].p.v||e._cm[2].p.k){var i=y("feMerge");t.appendChild(i);var a;a=y("feMergeNode"),a.setAttribute("in","SourceGraphic"),i.appendChild(a),a=y("feMergeNode"),a.setAttribute("in","f2"),i.appendChild(a)}}function pt(t,e){this._cl=e;var s=y("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 lt(t,e){this.initialized=!1,this._cl=e,this.elem=t,this.paths=[]}function ft(t,e){this._cl=e;var s=y("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=y("feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var a=y("feFuncR");a.setAttribute("type","table"),i.appendChild(a),this.feFuncR=a;var r=y("feFuncG");r.setAttribute("type","table"),i.appendChild(r),this.feFuncG=r;var n=y("feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function mt(t,e){this._cl=e;var s=this._cl._cm,i=y("feComponentTransfer");(s[10].p.k||0!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||1!==s[12].p.v||s[13].p.k||0!==s[13].p.v||s[14].p.k||1!==s[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(s[17].p.k||0!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||1!==s[19].p.v||s[20].p.k||0!==s[20].p.v||s[21].p.k||1!==s[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(s[24].p.k||0!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||1!==s[26].p.v||s[27].p.k||0!==s[27].p.v||s[28].p.k||1!==s[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(s[31].p.k||0!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||1!==s[33].p.v||s[34].p.k||0!==s[34].p.v||s[35].p.k||1!==s[35].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=y("feComponentTransfer")),(s[3].p.k||0!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||1!==s[5].p.v||s[6].p.k||0!==s[6].p.v||s[7].p.k||1!==s[7].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 dt(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this._cl=e;var s=y("feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var i=y("feOffset");i.setAttribute("dx","25"),i.setAttribute("dy","0"),i.setAttribute("in","drop_shadow_1"),i.setAttribute("result","drop_shadow_2"),this.feOffset=i,t.appendChild(i);var a=y("feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var r=y("feComposite");r.setAttribute("in","drop_shadow_3"),r.setAttribute("in2","drop_shadow_2"),r.setAttribute("operator","in"),r.setAttribute("result","drop_shadow_4"),t.appendChild(r);var n=y("feMerge");t.appendChild(n);var h;h=y("feMergeNode"),n.appendChild(h),h=y("feMergeNode"),h.setAttribute("in","SourceGraphic"),this.feMergeNode=h,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(h)}function ct(t,e,s){this.initialized=!1,this._cl=e,this.filterElem=t,this.elem=s,s.matteElement=y("g"),s.matteElement.appendChild(s._bx),s.matteElement.appendChild(s._bz),s._by=s.matteElement}function ut(t){var e,s=t.data.ef?t.data.ef.length:0,i=p(10),a=le.createFilter(i),r=0;this.filters=[];var n;for(e=0;e<s;e+=1)20===t.data.ef[e].ty?(r+=1,n=new ot(a,t.effects._cm[e]),this.filters.push(n)):21===t.data.ef[e].ty?(r+=1,n=new pt(a,t.effects._cm[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new lt(t,t.effects._cm[e]),this.filters.push(n)):23===t.data.ef[e].ty?(r+=1,n=new ft(a,t.effects._cm[e]),this.filters.push(n)):24===t.data.ef[e].ty?(r+=1,n=new mt(a,t.effects._cm[e]),this.filters.push(n)):25===t.data.ef[e].ty?(r+=1,n=new dt(a,t.effects._cm[e]),this.filters.push(n)):28===t.data.ef[e].ty&&(n=new ct(a,t.effects._cm[e],t),this.filters.push(n));r&&(t._x.defs.appendChild(a),t._bx.setAttribute("filter","url("+Ot+"#"+i+")"))}function gt(t){Ot=t}function yt(t){Ae.play(t)}function vt(t){Ae.pause(t)}function bt(t){Ae.togglePause(t)}function kt(t,e){Ae.setSpeed(t,e)}function At(t,e){Ae.setDirection(t,e)}function Pt(t){Ae.stop(t)}function Mt(t){Ae.moveFrame(t)}function _t(){_e===!0?Ae.searchAnimations(Ee,_e,we):Ae.searchAnimations()}function Et(t){return Ae.registerAnimation(t)}function wt(){Ae.resize()}function Ft(t,e,s){Ae.goToAndStop(t,e,s)}function Ct(t){Gt=t}function xt(t){return _e===!0&&(t.animationData=JSON.parse(Ee)),Ae.loadAnimation(t)}function Dt(t){return Ae.destroy(t)}function St(t){if("string"==typeof t)switch(t){case"high":Jt=200;break;case"medium":Jt=50;break;case"low":Jt=10}else!isNaN(t)&&t>1&&(Jt=t);s(!(Jt>=50))}function Tt(){return"undefined"!=typeof navigator}function It(t,e){"expressions"===t&&(Nt=e)}function Lt(t){switch(t){case"propertyFactory":return ae;case"shape_ai":return ne;case"matrix":return $t}}function Rt(){"complete"===document.readyState&&(clearInterval(Se),_t())}function Vt(t){for(var e=De.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}var Nt,zt,Bt="http://www.w3.org/2000/svg",Ot="",jt=-999999,Gt=!0,Wt=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent),Math.round,Math.pow),Xt=Math.sqrt,qt=(Math.abs,Math.floor),Yt=(Math.max,Math.min),Ht={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;t<s;t+=1)Ht[e[t]]=Math[e[t]]}(),Ht.random=Math.random,Ht.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,i=g(t.length),a=t.length;for(s=0;s<a;s+=1)i[s]=Math.abs(t[s]);return i}return Math.abs(t)};var Jt=150,Ut=Math.PI/180,Zt=.5519;s(!1);var Kt=function(){var t,e,s=[];for(t=0;t<256;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,i){return t<0&&(t=0),e<0&&(e=0),i<0&&(i=0),"#"+s[t]+s[e]+s[i]}}();u.prototype={_cy:function(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;i<s;i++)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;s<i;)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}};var Qt=function(){function t(t,e){var s,i=0,a=[];switch(t){case"int16":case"uint8c":s=1;break;default:s=1.1}for(i=0;i<e;i+=1)a.push(s);return a}function e(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?e:t}(),$t=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=w(t),s=F(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function s(t){if(0===t)return this;var e=w(t),s=F(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=w(t),s=F(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function a(t){if(0===t)return this;var e=w(t),s=F(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function r(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(C(t),C(e))}function h(t,e){var s=w(e),i=F(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,C(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 o(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 p(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 l(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 f(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 this.props[12]=this.props[12]*t+this.props[15]*m,this.props[13]=this.props[13]*r+this.props[15]*d,this.props[14]=this.props[14]*l+this.props[15]*c,this.props[15]=this.props[15]*u,this._identityCalculated=!1,this;var g=this.props[0],y=this.props[1],v=this.props[2],b=this.props[3],k=this.props[4],A=this.props[5],P=this.props[6],M=this.props[7],_=this.props[8],E=this.props[9],w=this.props[10],F=this.props[11],C=this.props[12],x=this.props[13],D=this.props[14],S=this.props[15];return this.props[0]=g*t+y*a+v*o+b*m,this.props[1]=g*e+y*r+v*p+b*d,this.props[2]=g*s+y*n+v*l+b*c,this.props[3]=g*i+y*h+v*f+b*u,this.props[4]=k*t+A*a+P*o+M*m,this.props[5]=k*e+A*r+P*p+M*d,this.props[6]=k*s+A*n+P*l+M*c,this.props[7]=k*i+A*h+P*f+M*u,this.props[8]=_*t+E*a+w*o+F*m,this.props[9]=_*e+E*r+w*p+F*d,this.props[10]=_*s+E*n+w*l+F*c,this.props[11]=_*i+E*h+w*f+F*u,this.props[12]=C*t+x*a+D*o+S*m,this.props[13]=C*e+x*r+D*p+S*d,this.props[14]=C*s+x*n+D*l+S*c,this.props[15]=C*i+x*h+D*f+S*u,this._identityCalculated=!1,this}function m(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function d(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function c(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function u(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function g(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 y(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function v(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function b(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function k(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,i=-this.props[1]/e,a=-this.props[4]/e,r=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*a+n,t[0]*i+t[1]*r+h,0]}function A(t){var e,s=t.length,i=[];for(e=0;e<s;e+=1)i[e]=k(t[e]);return i}function P(t,e,s,i){if(i&&2===i){var a=ce.newElement();return a[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],a[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],a}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 M(t,e){return this.isIdentity()?t+","+e:t*this.props[0]+e*this.props[4]+this.props[12]+","+(t*this.props[1]+e*this.props[5]+this.props[13])}function _(){for(var t=0,e=this.props,s="matrix3d(",i=1e4;t<16;)s+=x(e[t]*i)/i,s+=15===t?")":",",t+=1;return s}function E(){var t=1e4,e=this.props;return"matrix("+x(e[0]*t)/t+","+x(e[1]*t)/t+","+x(e[4]*t)/t+","+x(e[5]*t)/t+","+x(e[12]*t)/t+","+x(e[13]*t)/t+")"}var w=Math.cos,F=Math.sin,C=Math.tan,x=Math.round;return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=i,this.rotateZ=a,this.skew=n,this.skewFromAxis=h,this.shear=r,this.scale=o,this.setTransform=p,this.translate=l,this.transform=f,this.applyToPoint=g,this.applyToX=y,this.applyToY=v,this.applyToZ=b,this._cn=P,this.applyToPointStringified=M,this.toCSS=_,this.to2dCSS=E,this.clone=c,this.cloneFromProps=u,this.equals=d,this.inversePoints=A,this.inversePoint=k,this._t=this.transform,this.isIdentity=m,this._identity=!0,this._identityCalculated=!1,this.props=Qt("float32",16),this.reset()}}();!function(t,e){function s(s,p,l){var d=[];p=1==p?{entropy:!0}:p||{};var v=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;t<g;)t=(t+s)*f,e*=f,s=b.g(1);for(;t>=y;)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,v,"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++]);a<f;)n[a]=a++;for(a=0;a<f;a++)n[a]=n[r=v&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=v&a+1],s=s*f+n[v&(n[a]=n[r=v&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+"\0"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[v&a]=v&(s^=19*e[v&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),g=e.pow(2,d),y=2*g,v=f-1;e["seed"+c]=s,n(e.random(),t)}([],Ht);var te=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;n<f;++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=y?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,g=1/(u-1),y="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;s<u;++s)this._mSampleValues[s]=a(s*g,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+=g;
--o;var l=(t-i[o])/(i[o+1]-i[o]),f=a+l*g,d=r(f,e,s);return d>=m?h(t,f,e,s):0===d?f:n(t,a,a+g,e,s)}},p}();!function(){for(var e=0,s=["ms","moz","webkit","o"],i=0;i<s.length&&!t.requestAnimationFrame;++i)t.requestAnimationFrame=t[s[i]+"RequestAnimationFrame"],t.cancelAnimationFrame=t[s[i]+"CancelAnimationFrame"]||t[s[i]+"CancelRequestAnimationFrame"];t.requestAnimationFrame||(t.requestAnimationFrame=function(t,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-e)),r=setTimeout(function(){t(i+a)},a);return e=i+a,r}),t.cancelAnimationFrame||(t.cancelAnimationFrame=function(t){clearTimeout(t)})}();var ee=k(),se=A(),ie=function(){function e(t,e){var s=v("span");s.style.fontFamily=e;var i=v("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 s(){var e,i,a,r=this.fonts.length,n=r;for(e=0;e<r;e+=1)if(this.fonts[e].loaded)n-=1;else if("t"===this.fonts[e].fOrigin||2===this.fonts[e].origin){if(t.Typekit&&t.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{t.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(h){}}2===this.typekitLoaded&&(this.fonts[e].loaded=!0)}else"n"===this.fonts[e].fOrigin||0===this.fonts[e].origin?this.fonts[e].loaded=!0:(i=this.fonts[e].monoCase.node,a=this.fonts[e].monoCase.w,i.offsetWidth!==a?(n-=1,this.fonts[e].loaded=!0):(i=this.fonts[e].sansCase.node,a=this.fonts[e].sansCase.w,i.offsetWidth!==a&&(n-=1,this.fonts[e].loaded=!0)),this.fonts[e].loaded&&(this.fonts[e].sansCase.parent.parentNode.removeChild(this.fonts[e].sansCase.parent),this.fonts[e].monoCase.parent.parentNode.removeChild(this.fonts[e].monoCase.parent)));0!==n&&Date.now()-this.initTime<p?setTimeout(s.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function i(t,e){var s=y("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=v("canvas").getContext("2d");return i.font="100px "+e.fFamily,i}function a(t,a){if(!t)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=t.list);var r,n=t.list,h=n.length;for(r=0;r<h;r+=1){if(n[r].loaded=!1,n[r].monoCase=e(n[r].fFamily,"monospace"),n[r].sansCase=e(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){var o=v("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||1===n[r].origin){var p=v("link");p.type="text/css",p.rel="stylesheet",p.href=n[r].fPath,a.appendChild(p)}else if("t"===n[r].fOrigin||2===n[r].origin){var l=v("script");l.setAttribute("src",n[r].fPath),a.appendChild(l)}}else n[r].loaded=!0;n[r].helper=i(a,n[r]),this.fonts.push(n[r])}s.bind(this)()}function r(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;e<a;e+=1){for(s=0,i=!1;s<r;)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 n(t,e,s){for(var i=0,a=this.chars.length;i<a;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,s),l}function h(t,e,s){var i=this.getFontByName(e),a=i.helper;return a.measureText(t).width*s/100}function o(t){for(var e=0,s=this.fonts.length;e<s;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var p=5e3,l={w:0,size:0,shapes:[]},f=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return f.prototype.addChars=r,f.prototype.addFonts=a,f.prototype.getCharData=n,f.prototype.getFontByName=o,f.prototype.measureText=h,f}(),ae=function(){function t(t,e,s){var i,a=this.offsetTime;"multidimensional"===this.propType&&(i=Qt("float32",e.length));for(var r,n,h=s.lastIndex,o=h,p=this._df.length-1,l=!0;l;){if(r=this._df[o],n=this._df[o+1],o==p-1&&t>=n.t-a){r.h&&(r=n),h=0;break}if(n.t-a>t){h=o;break}o<p-1?o+=1:(h=0,l=!1)}var f,m,d,c,u,g;if(r.to){r.bezierData||ee.buildBezierData(r);var y=r.bezierData;if(t>=n.t-a||t<r.t-a){var v=t>=n.t-a?y.points.length-1:0;for(m=y.points[v].point.length,f=0;f<m;f+=1)i[f]=y.points[v].point[f];s._lastBezierData=null}else{r.__fnct?g=r.__fnct:(g=te.getBezierEasing(r.o.x,r.o.y,r.i.x,r.i.y,r.n).get,r.__fnct=g),d=g((t-(r.t-a))/(n.t-a-(r.t-a)));var b,k=y.segmentLength*d,A=s.lastFrame<t&&s._lastBezierData===y?s._lastAddedLength:0;for(u=s.lastFrame<t&&s._lastBezierData===y?s._lastPoint:0,l=!0,c=y.points.length;l;){if(A+=y.points[u].partialLength,0===k||0===d||u==y.points.length-1){for(m=y.points[u].point.length,f=0;f<m;f+=1)i[f]=y.points[u].point[f];break}if(k>=A&&k<A+y.points[u+1].partialLength){for(b=(k-A)/y.points[u+1].partialLength,m=y.points[u].point.length,f=0;f<m;f+=1)i[f]=y.points[u].point[f]+(y.points[u+1].point[f]-y.points[u].point[f])*b;break}u<c-1?u+=1:l=!1}s._lastPoint=u,s._lastAddedLength=A-y.points[u].partialLength,s._lastBezierData=y}}else{var P,M,_,E,w;for(p=r.s.length,o=0;o<p;o+=1){if(1!==r.h&&(t>=n.t-a?d=1:t<r.t-a?d=0:(r.o.x.constructor===Array?(r.__fnct||(r.__fnct=[]),r.__fnct[o]?g=r.__fnct[o]:(P=r.o.x[o]||r.o.x[0],M=r.o.y[o]||r.o.y[0],_=r.i.x[o]||r.i.x[0],E=r.i.y[o]||r.i.y[0],g=te.getBezierEasing(P,M,_,E).get,r.__fnct[o]=g)):r.__fnct?g=r.__fnct:(P=r.o.x,M=r.o.y,_=r.i.x,E=r.i.y,g=te.getBezierEasing(P,M,_,E).get,r.__fnct=g),d=g((t-(r.t-a))/(n.t-a-(r.t-a))))),this.sh&&1!==r.h){var F=r.s[o],C=r.e[o];F-C<-180?F+=360:F-C>180&&(F-=360),w=F+(C-F)*d}else w=1===r.h?r.s[o]:r.s[o]+(r.e[o]-r.s[o])*d;1===p?i=w:i[o]=w}}return s.lastIndex=h,i}function e(t){for(var e=0;e<this.v.length;)this.pv[e]=t[e],this.v[e]=this.mult?this.pv[e]*this.mult:this.pv[e],this.lastPValue[e]!==this.pv[e]&&(this.mdf=!0,this.lastPValue[e]=this.pv[e]),e+=1}function s(t){this.pv=t,this.v=this.mult?this.pv*this.mult:this.pv,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)}function i(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this._df[0].t-this.offsetTime,s=this._df[this._df.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==l&&(this._caching.lastFrame>=s&&t>=s||this._caching.lastFrame<e&&t<e))){this._caching.lastIndex=this._caching.lastFrame<t?this._caching.lastIndex:0;var i=this.interpolateValue(t,this.pv,this._caching);this.calculateValueAtCurrentTime(i)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function a(){}function r(t,e,s){this.propType="unidimensional",this.mult=s,this.v=s?e.k*s:e.k,this.pv=e.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=a}function n(t,e,s){this.propType="multidimensional",this.mult=s,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Qt("float32",e.k.length),this.pv=Qt("float32",e.k.length),this.lastValue=Qt("float32",e.k.length);Qt("float32",e.k.length);this.vel=Qt("float32",e.k.length);var i,r=e.k.length;for(i=0;i<r;i+=1)this.v[i]=s?e.k[i]*s:e.k[i],this.pv[i]=e.k[i];this.getValue=a}function h(e,a,r){this.propType="unidimensional",this._df=a.k,this.offsetTime=e.data.st,this.lastValue=l,this.lastPValue=l,this.frameId=-1,this._caching={lastFrame:l,lastIndex:0,value:0},this.k=!0,this.kf=!0,this.data=a,this.mult=r,this.elem=e,this._ch=!1,this.comp=e.comp,this.v=r?a.k[0].s[0]*r:a.k[0].s[0],this.pv=a.k[0].s[0],this.getValue=i,this.calculateValueAtCurrentTime=s,this.interpolateValue=t}function o(s,a,r){this.propType="multidimensional";var n,h,o,p,f,m=a.k.length;for(n=0;n<m-1;n+=1)a.k[n].to&&a.k[n].s&&a.k[n].e&&(h=a.k[n].s,o=a.k[n].e,p=a.k[n].to,f=a.k[n].ti,(2===h.length&&(h[0]!==o[0]||h[1]!==o[1])&&ee.pointOnLine2D(h[0],h[1],o[0],o[1],h[0]+p[0],h[1]+p[1])&&ee.pointOnLine2D(h[0],h[1],o[0],o[1],o[0]+f[0],o[1]+f[1])||3===h.length&&(h[0]!==o[0]||h[1]!==o[1]||h[2]!==o[2])&&ee.pointOnLine3D(h[0],h[1],h[2],o[0],o[1],o[2],h[0]+p[0],h[1]+p[1],h[2]+p[2])&&ee.pointOnLine3D(h[0],h[1],h[2],o[0],o[1],o[2],o[0]+f[0],o[1]+f[1],o[2]+f[2]))&&(a.k[n].to=null,a.k[n].ti=null),h[0]===o[0]&&h[1]===o[1]&&0===p[0]&&0===p[1]&&0===f[0]&&0===f[1]&&(2===h.length||h[2]===o[2]&&0===p[2]&&0===f[2])&&(a.k[n].to=null,a.k[n].ti=null));this._df=a.k,this.offsetTime=s.data.st,this.k=!0,this.kf=!0,this._ch=!0,this.mult=r,this.elem=s,this.comp=s.comp,this.getValue=i,this.calculateValueAtCurrentTime=e,this.interpolateValue=t,this.frameId=-1;var d=a.k[0].s.length;this.v=Qt("float32",d),this.pv=Qt("float32",d),this.lastValue=Qt("float32",d),this.lastPValue=Qt("float32",d),this._caching={lastFrame:l,lastIndex:0,value:Qt("float32",d)}}function p(t,e,s,i,a){var p;if(0===e.a)p=0===s?new r(t,e,i):new n(t,e,i);else if(1===e.a)p=0===s?new h(t,e,i):new o(t,e,i);else if(e.k.length)if("number"==typeof e.k[0])p=new n(t,e,i);else switch(s){case 0:p=new h(t,e,i);break;case 1:p=new o(t,e,i)}else p=new r(t,e,i);return p.k&&a.push(p),p}var l=jt,f={_bo:p};return f}(),re=function(){function t(t){var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[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 e(t){if(this.elem._x.frameId!==this.frameId){this.mdf=t;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].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._df&&this.p._dg){var i,a;this.p._caching.lastFrame+this.p.offsetTime<=this.p._df[0].t?(i=this.p._dg((this.p._df[0].t+.01)/this.elem._x.frameRate,0),a=this.p._dg(this.p._df[0].t/this.elem._x.frameRate,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p._df[this.p._df.length-1].t?(i=this.p._dg(this.p._df[this.p._df.length-1].t/this.elem._x.frameRate,0),a=this.p._dg((this.p._df[this.p._df.length-1].t-.01)/this.elem._x.frameRate,0)):(i=this.p.pv,a=this.p._dg((this.p._caching.lastFrame+this.p.offsetTime-.01)/this.elem._x.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(i[1]-a[1],i[0]-a[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._x.frameId}}function s(){this.inverted=!0,this.iv=new $t,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 i(){}function a(t,e,s){if(this.elem=t,this.frameId=-1,this.propType="transform",this._co=[],this.mdf=!1,this.data=e,this.v=new $t,e.p.s?(this.px=ae._bo(t,e.p.x,0,0,this._co),this.py=ae._bo(t,e.p.y,0,0,this._co),e.p.z&&(this.pz=ae._bo(t,e.p.z,0,0,this._co))):this.p=ae._bo(t,e.p,1,0,this._co),e.r)this.r=ae._bo(t,e.r,0,Ut,this._co);else if(e.rx){if(this.rx=ae._bo(t,e.rx,0,Ut,this._co),this.ry=ae._bo(t,e.ry,0,Ut,this._co),this.rz=ae._bo(t,e.rz,0,Ut,this._co),e.or.k[0].ti){var i,a=e.or.k.length;for(i=0;i<a;i+=1)e.or.k[i].to=e.or.k[i].ti=null}this.or=ae._bo(t,e.or,1,Ut,this._co),this.or.sh=!0}e.sk&&(this.sk=ae._bo(t,e.sk,0,Ut,this._co),this.sa=ae._bo(t,e.sa,0,Ut,this._co)),e.a&&(this.a=ae._bo(t,e.a,1,0,this._co)),e.s&&(this.s=ae._bo(t,e.s,1,.01,this._co)),e.o?this.o=ae._bo(t,e.o,0,.01,s):this.o={mdf:!1,v:1},this._co.length?s.push(this):this.getValue(!0)}function r(t,e,s){return new a(t,e,s)}return a.prototype.applyToMatrix=t,a.prototype.getValue=e,a.prototype.setInverted=s,a.prototype.autoOrient=i,{_bj:r}}();P.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var s=0;s<e;)this.v[s]=ce.newElement(),this.o[s]=ce.newElement(),this.i[s]=ce.newElement(),s+=1},P.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},P.prototype.doubleArrayLength=function(){this.v=this.v.concat(g(this._maxLength)),this.i=this.i.concat(g(this._maxLength)),this.o=this.o.concat(g(this._maxLength)),this._maxLength*=2},P.prototype._ax=function(t,e,s,i,a){var r;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o}(!r[i]||r[i]&&!a)&&(r[i]=ce.newElement()),r[i][0]=t,r[i][1]=e},P.prototype._aw=function(t,e,s,i,a,r,n,h){this._ax(t,e,"v",n,h),this._ax(s,i,"o",n,h),this._ax(a,r,"i",n,h)},P.prototype.reverse=function(){var t=new P;t.setPathData(this.c,this._length);var e=this.v,s=this.o,a=this.i,r=0;this.c&&(t._aw(e[0][0],e[0][1],a[0][0],a[0][1],s[0][0],s[0][1],0,!1),r=1);var n=this._length-1,h=this._length;for(i=r;i<h;i+=1)t._aw(e[n][0],e[n][1],a[n][0],a[n][1],s[n][0],s[n][1],i,!1),n-=1;return t};var ne=function(){function t(t,e,s,i){var a,r,n,h=i.lastIndex;if(t<this._df[0].t-this.offsetTime)a=this._df[0].s[0],n=!0,h=0;else if(t>=this._df[this._df.length-1].t-this.offsetTime)a=1===this._df[this._df.length-2].h?this._df[this._df.length-1].s[0]:this._df[this._df.length-2].e[0],n=!0;else{for(var o,p,l,f,m,d,c=h,u=this._df.length-1,g=!0;g&&(o=this._df[c],p=this._df[c+1],!(p.t-this.offsetTime>t));)c<u-1?c+=1:g=!1;n=1===o.h,h=c;var y;if(!n){if(t>=p.t-this.offsetTime)y=1;else if(t<o.t-this.offsetTime)y=0;else{var v;o.__fnct?v=o.__fnct:(v=te.getBezierEasing(o.o.x,o.o.y,o.i.x,o.i.y).get,o.__fnct=v),y=v((t-(o.t-this.offsetTime))/(p.t-this.offsetTime-(o.t-this.offsetTime)))}r=o.e[0]}a=o.s[0]}f=e._length,d=a.i[0].length;var b,k=!1;i.lastIndex=h;var l,m,b,f=e._length,d=a.i[0].length,k=!1;for(l=0;l<f;l+=1)for(m=0;m<d;m+=1)b=n?a.i[l][m]:a.i[l][m]+(r.i[l][m]-a.i[l][m])*y,e.i[l][m]!==b&&(e.i[l][m]=b,s&&(this.pv.i[l][m]=b),k=!0),b=n?a.o[l][m]:a.o[l][m]+(r.o[l][m]-a.o[l][m])*y,e.o[l][m]!==b&&(e.o[l][m]=b,s&&(this.pv.o[l][m]=b),k=!0),b=n?a.v[l][m]:a.v[l][m]+(r.v[l][m]-a.v[l][m])*y,e.v[l][m]!==b&&(e.v[l][m]=b,s&&(this.pv.v[l][m]=b),k=!0);return k}function e(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this._df[0].t-this.offsetTime,s=this._df[this._df.length-1].t-this.offsetTime,i=this._caching.lastFrame;if(i===p||!(i<e&&t<e||i>s&&t>s)){this._caching.lastIndex=i<t?this._caching.lastIndex:0;var a=this.interpolateShape(t,this.v,!0,this._caching);this.mdf=a,a&&(this.paths=this._ak)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function s(){return this.v}function i(){this.paths=this._ak,this.k||(this.mdf=!1)}function a(t,e,s){this.propType="shape",this.comp=t.comp,this.k=!1,this.mdf=!1;var a=3===s?e.pt.k:e.ks.k;this.v=ue.clone(a),this.pv=ue.clone(this.v),this._ak=ge._al(),this.paths=this._ak,this.paths.addShape(this.v),this.reset=i}function r(t,e,s){this.propType="shape",this.comp=t.comp,this.elem=t,this.offsetTime=t.data.st,this._df=3===s?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var a=this._df[0].s[0].i.length;this._df[0].s[0].i[0].length;this.v=ue.newElement(),this.v.setPathData(this._df[0].s[0].c,a),this.pv=ue.clone(this.v),this._ak=ge._al(),this.paths=this._ak,this.paths.addShape(this.v),this.lastFrame=p,this.reset=i,this._caching={lastFrame:p,lastIndex:0}}function n(t,e,s,i){var n;if(3===s||4===s){var h=3===s?e.pt:e.ks,o=h.k;n=1===h.a||o.length?new r(t,e,s):new a(t,e,s)}else 5===s?n=new m(t,e):6===s?n=new l(t,e):7===s&&(n=new f(t,e));return n.k&&i.push(n),n}function h(){return a}function o(){return r}var p=-999999;a.prototype.interpolateShape=t,a.prototype.getValue=s,r.prototype.getValue=e,r.prototype.interpolateShape=t;var l=function(){function t(){var t=this.p.v[0],e=this.p.v[1],i=this.s.v[0]/2,a=this.s.v[1]/2,r=3!==this.d,n=this.v;3!==this.d&&(n.v[0][0]=t,n.v[0][1]=e-a,n.v[1][0]=r?t+i:t-i,n.v[1][1]=e,n.v[2][0]=t,n.v[2][1]=e+a,n.v[3][0]=r?t-i:t+i,n.v[3][1]=e,n.i[0][0]=r?t-i*s:t+i*s,n.i[0][1]=e-a,n.i[1][0]=r?t+i:t-i,n.i[1][1]=e-a*s,n.i[2][0]=r?t+i*s:t-i*s,n.i[2][1]=e+a,n.i[3][0]=r?t-i:t+i,n.i[3][1]=e+a*s,n.o[0][0]=r?t+i*s:t-i*s,n.o[0][1]=e-a,n.o[1][0]=r?t+i:t-i,n.o[1][1]=e+a*s,n.o[2][0]=r?t-i*s:t+i*s,n.o[2][1]=e+a,n.o[3][0]=r?t-i:t+i,n.o[3][1]=e-a*s)}function e(t){var e,s=this._co.length;if(this.elem._x.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem._x.frameId,e=0;e<s;e+=1)this._co[e].getValue(t),this._co[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var s=Zt;return function(s,a){this.v=ue.newElement(),this.v.setPathData(!0,4),this._ak=ge._al(),this.paths=this._ak,this._ak.addShape(this.v),this.d=a.d,this._co=[],this.elem=s,this.comp=s.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=i,this.p=ae._bo(s,a.p,1,0,this._co),this.s=ae._bo(s,a.s,1,0,this._co),this._co.length?this.k=!0:this.convertEllToPath()}}(),f=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*e),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=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._aw(o,p,o-l*r*a*h,p-f*r*a*h,o+l*r*a*h,p+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,i,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,h=this.or.v,o=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*h/(2*a),m=2*Math.PI*o/(2*a),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<a;t+=1){e=n?h:o,s=n?p:l,i=n?f:m;var u=e*Math.cos(d),g=e*Math.sin(d),y=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),v=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v._aw(u,g,u-y*i*s*c,g-v*i*s*c,u+y*i*s*c,g+v*i*s*c,t,!0),n=!n,d+=r*c}}function s(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue(),this._co[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(a,r){this.v=ue.newElement(),this.v.setPathData(!0,0),this.elem=a,this.comp=a.comp,this.data=r,this.frameId=-1,this.d=r.d,this._co=[],this.mdf=!1,this.getValue=s,this.reset=i,1===r.sy?(this.ir=ae._bo(a,r.ir,0,0,this._co),this.is=ae._bo(a,r.is,0,.01,this._co),this.convertToPath=e):this.convertToPath=t,this.pt=ae._bo(a,r.pt,0,0,this._co),this.p=ae._bo(a,r.p,1,0,this._co),this.r=ae._bo(a,r.r,0,Ut,this._co),this.or=ae._bo(a,r.or,0,0,this._co),this.os=ae._bo(a,r.os,0,.01,this._co),this._ak=ge._al(),this._ak.addShape(this.v),this.paths=this._ak,this._co.length?this.k=!0:this.convertToPath()}}(),m=function(){function t(t){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(t),this._co[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=Yt(s,i,this.r.v),r=a*(1-Zt);this.v._length=0,2===this.d||1===this.d?(this.v._aw(t+s,e-i+a,t+s,e-i+a,t+s,e-i+r,0,!0),this.v._aw(t+s,e+i-a,t+s,e+i-r,t+s,e+i-a,1,!0),0!==a?(this.v._aw(t+s-a,e+i,t+s-a,e+i,t+s-r,e+i,2,!0),this.v._aw(t-s+a,e+i,t-s+r,e+i,t-s+a,e+i,3,!0),this.v._aw(t-s,e+i-a,t-s,e+i-a,t-s,e+i-r,4,!0),this.v._aw(t-s,e-i+a,t-s,e-i+r,t-s,e-i+a,5,!0),this.v._aw(t-s+a,e-i,t-s+a,e-i,t-s+r,e-i,6,!0),this.v._aw(t+s-a,e-i,t+s-r,e-i,t+s-a,e-i,7,!0)):(this.v._aw(t-s,e+i,t-s+r,e+i,t-s,e+i,2),this.v._aw(t-s,e-i,t-s,e-i+r,t-s,e-i,3))):(this.v._aw(t+s,e-i+a,t+s,e-i+r,t+s,e-i+a,0,!0),0!==a?(this.v._aw(t+s-a,e-i,t+s-a,e-i,t+s-r,e-i,1,!0),this.v._aw(t-s+a,e-i,t-s+r,e-i,t-s+a,e-i,2,!0),this.v._aw(t-s,e-i+a,t-s,e-i+a,t-s,e-i+r,3,!0),this.v._aw(t-s,e+i-a,t-s,e+i-r,t-s,e+i-a,4,!0),this.v._aw(t-s+a,e+i,t-s+a,e+i,t-s+r,e+i,5,!0),this.v._aw(t+s-a,e+i,t+s-r,e+i,t+s-a,e+i,6,!0),this.v._aw(t+s,e+i-a,t+s,e+i-a,t+s,e+i-r,7,!0)):(this.v._aw(t-s,e-i,t-s+r,e-i,t-s,e-i,1,!0),this.v._aw(t-s,e+i,t-s,e+i-r,t-s,e+i,2,!0),this.v._aw(t+s,e+i,t+s-r,e+i,t+s,e+i,3,!0)))}return function(s,a){this.v=ue.newElement(),this.v.c=!0,this._ak=ge._al(),this._ak.addShape(this.v),this.paths=this._ak,this.elem=s,this.comp=s.comp,this.frameId=-1,this.d=a.d,this._co=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=i,this.p=ae._bo(s,a.p,1,0,this._co),this.s=ae._bo(s,a.s,1,0,this._co),this.r=ae._bo(s,a.r,0,0,this._co),this._co.length?this.k=!0:this.convertRectToPath()}}(),d={};return d._bp=n,d.getConstructorFunction=h,d.getKeyframedConstructorFunction=o,d}(),he=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}();M.prototype.initModifierProperties=function(){},M.prototype.addShapeToModifier=function(){},M.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,_ak:ge._al()};this.shapes.push(e),this.addShapeToModifier(e)}},M.prototype.init=function(t,e,s){this._co=[],this.shapes=[],this.elem=t,this.initModifierProperties(t,e),this.frameId=jt,this.mdf=!1,this.closed=!1,this.k=!1,this._co.length?(this.k=!0,s.push(this)):this.getValue(!0)},b([M],_),_.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=t,this.frameId=this.elem._x.frameId;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;i<0&&(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}}},_.prototype.initModifierProperties=function(t,e){this.s=ae._bo(t,e.s,0,.01,this._co),this.e=ae._bo(t,e.e,0,.01,this._co),this.o=ae._bo(t,e.o,0,0,this._co),this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.m=e.m},_.prototype.addShapeToModifier=function(t){t.pathsData=[]},_.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];e<=1?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;n<p;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},_.prototype.releasePathsData=function(t){var e,s=t.length;for(e=0;e<s;e+=1)ye.release(t[e]);return t.length=0,t},_.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;s<o;s+=1)this.shapes[s]._ak.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s]._ak;else if(1===l&&0===p||0===l&&1===p){if(this.mdf)for(s=0;s<o;s+=1)this.shapes[s].shape.mdf=!0}else{var m,d,c=[];for(s=0;s<o;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.length)h=m.totalShapeLength;else{for(r=this.releasePathsData(m.pathsData),i=0;i<a;i+=1)n=ee.getSegmentsLength(e.shapes[i]),r.push(n),h+=n.totalLength;m.totalShapeLength=h,m.pathsData=r}f+=h,m.shape.mdf=!0}else m.shape.paths=m._ak;var i,a,u=p,g=l,y=0;for(s=o-1;s>=0;s-=1)if(m=this.shapes[s],m.shape.mdf){if(d=m._ak,d.releaseShapes(),2===this.m&&o>1){var v=this.calculateShapeEdges(p,l,m.totalShapeLength,y,f);y+=m.totalShapeLength}else v=[[u,g]];for(a=v.length,i=0;i<a;i+=1){u=v[i][0],g=v[i][1],c.length=0,g<=1?c.push({s:m.totalShapeLength*u,e:m.totalShapeLength*g}):u>=1?c.push({s:m.totalShapeLength*(u-1),e:m.totalShapeLength*(g-1)}):(c.push({s:m.totalShapeLength*u,e:m.totalShapeLength}),c.push({s:0,e:m.totalShapeLength*(g-1)}));var b=this.addShapes(m,c[0]);if(c[0].s!==c[0].e){if(c.length>1)if(m.shape.v.c){var k=b.pop();this.addPaths(b,d),b=this.addShapes(m,c[1],k)}else this.addPaths(b,d),b=this.addShapes(m,c[1]);this.addPaths(b,d)}}m.shape.paths=d}}this._co.length||(this.mdf=!1)},_.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)e.addShape(t[s])},_.prototype.addSegment=function(t,e,s,i,a,r,n){a._ax(e[0],e[1],"o",r),a._ax(s[0],s[1],"i",r+1),n&&a._ax(t[0],t[1],"v",r),a._ax(i[0],i[1],"v",r+1)},_.prototype.addSegmentFromArray=function(t,e,s,i){e._ax(t[1],t[5],"o",s),e._ax(t[2],t[6],"i",s+1),i&&e._ax(t[0],t[4],"v",s),e._ax(t[3],t[7],"v",s+1)},_.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,p,l,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(s?(h=s._length,l=s._length):(s=ue.newElement(),h=0,l=0),u.push(s),i=0;i<d;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;a<r;a+=1)if(n=o[a-1],c+n.addedLength<e.s)c+=n.addedLength,s.c=!1;else{if(c>e.e){s.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[a],m[i].v[a],s,h,g),g=!1):(p=ee.getNewSegment(m[i].v[a-1],m[i].v[a],m[i].o[a-1],m[i].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,o[a-1]),this.addSegmentFromArray(p,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c){if(n=o[a-1],c<=e.e){var y=o[a-1].addedLength;e.s<=c&&e.e>=c+y?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[0],m[i].v[0],s,h,g),g=!1):(p=ee.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/y,(e.e-c)/y,o[a-1]),this.addSegmentFromArray(p,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=1}if(s._length&&(s._ax(s.v[l][0],s.v[l][1],"i",l),s._ax(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),c>e.e)break;i<d-1&&(s=ue.newElement(),g=!0,u.push(s),h=0)}return u},he.registerModifier("tm",_),b([M],E),E.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t,this.frameId=this.elem._x.frameId;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}},E.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=ae._bo(t,e.r,0,null,this._co)},E.prototype.processPath=function(t,e){var s=ue.newElement();s.c=t.c;var i,a,r,n,h,o,p,l,f,m,d,c,u,g=t._length,y=0;for(i=0;i<g;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(h=0===i?t.v[g-1]:t.v[i-1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=c=a[0]+(h[0]-a[0])*p,f=u=a[1]-(a[1]-h[1])*p,m=l-(l-a[0])*Zt,d=f-(f-a[1])*Zt,s._aw(l,f,m,d,c,u,y),y+=1,h=i===g-1?t.v[0]:t.v[i+1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=m=a[0]+(h[0]-a[0])*p,f=d=a[1]+(h[1]-a[1])*p,c=l-(l-a[0])*Zt,u=f-(f-a[1])*Zt,s._aw(l,f,m,d,c,u,y),y+=1):(s._aw(a[0],a[1],n[0],n[1],r[0],r[1],y),y+=1):(s._aw(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],y),y+=1);return s},E.prototype.processShapes=function(t){var e,s,i,a,r=this.shapes.length,n=this.rd.v;if(0!==n){var h,o,p;for(s=0;s<r;s+=1){if(h=this.shapes[s],o=h.shape.paths,p=h._ak,h.shape.mdf||this.mdf||t)for(p.releaseShapes(),h.shape.mdf=!0,e=h.shape.paths.shapes,a=h.shape.paths._length,i=0;i<a;i+=1)p.addShape(this.processPath(e[i],n));h.shape.paths=h._ak}}this._co.length||(this.mdf=!1)},he.registerModifier("rd",E),w.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}},w.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=ae._bo(t,e.c,0,null,this._co),this.o=ae._bo(t,e.o,0,null,this._co),this.tr=re._bj(t,e.tr,this._co),this.data=e,this._co.length||this.getValue(!0),this.pMatrix=new $t,this.rMatrix=new $t,this.sMatrix=new $t,this.tMatrix=new $t,this.matrix=new $t},w.prototype.applyTransforms=function(t,e,s,i,a,r){var n=r?-1:1,h=i.s.v[0]+(1-i.s.v[0])*(1-a),o=i.s.v[1]+(1-i.s.v[1])*(1-a);t.translate(i.p.v[0]*n*a,i.p.v[1]*n*a,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*a),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),s.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),s.scale(r?1/h:h,r?1/o:o),s.translate(i.a.v[0],i.a.v[1],i.a.v[2])},w.prototype.init=function(t,e,s,i,a){this.elem=t,this.arr=e,this.pos=s,this.elemsData=i,this._currentCopies=0,this._bq=[],this._groups=[],this._co=[],this.frameId=-1,this.initModifierProperties(t,e[s]);for(var r=0;s>0;)s-=1,this._bq.unshift(e[s]),r+=1;this._co.length?(this.k=!0,a.push(this)):this.getValue(!0)},w.prototype.resetElements=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},w.prototype.cloneElements=function(t){var e=(t.length,JSON.parse(JSON.stringify(t)));return this.resetElements(e),e},w.prototype.changeGroupRender=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)t[s]._render=e,"gr"===t[s].ty&&this.changeGroupRender(t[s].it,e)},w.prototype.processShapes=function(t){if(this.elem._x.frameId!==this.frameId&&(this.frameId=this.elem._x.frameId,this._co.length||t||(this.mdf=!1),this.mdf)){var e=Math.ceil(this.c.v);if(this._groups.length<e){for(;this._groups.length<e;){var s={it:this.cloneElements(this._bq),
ty:"gr"};s.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:0,ix:6,k:0},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,s),this._groups.splice(0,0,s),this._currentCopies+=1}this.elem.reloadShapes()}var i,a,r=0;for(i=0;i<=this._groups.length-1;i+=1)a=r<e,this._groups[i]._render=a,this.changeGroupRender(this._groups[i].it,a),r+=1;this._currentCopies=e,this.elem._ch=!0;var n=this.o.v,h=n%1,o=n>0?Math.floor(n):Math.ceil(n),p=(this.tr.v.props,this.pMatrix.props),l=this.rMatrix.props,f=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var m=0;if(n>0){for(;m<o;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),m+=1;h&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,h,!1),m+=h)}else if(n<0){for(;m>o;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),m-=1;h&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-h,!0),m-=h)}i=1===this.data.m?0:this._currentCopies-1;var d=1===this.data.m?1:-1;for(r=this._currentCopies;r;){if(0!==m){(0!==i&&1===d||i!==this._currentCopies-1&&d===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15]),this.matrix.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15]),this.matrix.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);var c,u=this.elemsData[i].it,g=u[u.length-1].transform.mProps.v.props,y=g.length;for(c=0;c<y;c+=1)g[c]=this.matrix.props[c];this.matrix.reset()}else{this.matrix.reset();var c,u=this.elemsData[i].it,g=u[u.length-1].transform.mProps.v.props,y=g.length;for(c=0;c<y;c+=1)g[c]=this.matrix.props[c]}m+=1,r-=1,i+=d}}},w.prototype.addShape=function(){},he.registerModifier("rp",w),F.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(g(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},F.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)ue.release(this.shapes[t]);this._length=0},C.prototype.getValue=function(t){if(this.elem._x.frameId!==this.frameId||t){var e=0,s=this.dataProps.length;for(this.mdf=!1,this.frameId=this.elem._x.frameId;e<s;){if(this.dataProps[e].p.mdf){this.mdf=!t;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dashStr=""),e=0;e<s;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},x.prototype.comparePoints=function(t,e){for(var s,i=0,a=this.o.length/2;i<a;){if(s=Math.abs(t[4*i]-t[4*e+2*i]),s>.01)return!1;i+=1}return!0},x.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},x.prototype.getValue=function(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;e<a;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=!t);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;e<a;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=!t)}};var oe=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function e(t){var e="";if(this.assetsPath){var s=t.p;s.indexOf("images/")!==-1&&(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=v("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function i(t,i){this.imagesLoadedCb=i,this.totalAssets=t.length;var a;for(a=0;a<this.totalAssets;a+=1)t[a].layers||(s.bind(this)(e.bind(this)(t[a])),this.totalImages+=1)}function a(t){this.path=t||""}function r(t){this.assetsPath=t||""}function n(){this.imagesLoadedCb=null}return function(){this.loadAssets=i,this.setAssetsPath=r,this.setPath=a,this.destroy=n,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null}}(),pe=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}(),le=function(){function t(t){var e=y("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=y("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 1 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}();D.prototype.searchProperties=function(t){var e,s,i=this._textData.a.length,a=ae._bo;for(e=0;e<i;e+=1)s=this._textData.a[e],this._animatorsData[e]=new S(this._elem,s,this.__co);this._textData.p&&"m"in this._textData.p?(this._pathData={f:a(this._elem,this._textData.p.f,0,0,this.__co),l:a(this._elem,this._textData.p.l,0,0,this.__co),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=a(this._elem,this._textData.m.a,1,0,this.__co),this.__co.length&&t.push(this)},D.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this.mdf||this._ch||e||this._hasMaskedPath&&this._pathData.m.mdf){this._ch=!1;var s,i,a,r,n=this._moreOptions.alignment.v,h=this._animatorsData,o=this._textData,p=this.mHelper,l=this._renderType,f=this._bt.length,u=(this.data,t.l);if(this._hasMaskedPath){var g=this._pathData.m;if(!this._pathData.n||this._pathData.mdf){var y=g.v;this._pathData.r&&(y=y.reverse());var v={tLength:0,segments:[]};r=y._length-1;var b,k=0;for(a=0;a<r;a+=1)b={s:y.v[a],e:y.v[a+1],to:[y.o[a][0]-y.v[a][0],y.o[a][1]-y.v[a][1]],ti:[y.i[a+1][0]-y.v[a+1][0],y.i[a+1][1]-y.v[a+1][1]]},ee.buildBezierData(b),v.tLength+=b.bezierData.segmentLength,v.segments.push(b),k+=b.bezierData.segmentLength;a=r,g.v.c&&(b={s:y.v[a],e:y.v[0],to:[y.o[a][0]-y.v[a][0],y.o[a][1]-y.v[a][1]],ti:[y.i[0][0]-y.v[0][0],y.i[0][1]-y.v[0][1]]},ee.buildBezierData(b),v.tLength+=b.bezierData.segmentLength,v.segments.push(b),k+=b.bezierData.segmentLength),this._pathData.pi=v}var A,P,M,v=this._pathData.pi,_=this._pathData.f.v,E=0,w=1,F=0,C=!0,x=v.segments;if(_<0&&g.v.c)for(v.tLength<Math.abs(_)&&(_=-Math.abs(_)%v.tLength),E=x.length-1,M=x[E].bezierData.points,w=M.length-1;_<0;)_+=M[w].partialLength,w-=1,w<0&&(E-=1,M=x[E].bezierData.points,w=M.length-1);M=x[E].bezierData.points,P=M[w-1],A=M[w];var D,S,I=A.partialLength}r=u.length,s=0,i=0;var L,R,V,N,z,B=1.2*t.s*.714,O=!0;N=h.length;var j,G,W,X,q,Y,H,J,U,Z,K,Q,$,tt=-1,et=_,st=E,it=w,at=-1,rt=0,nt="",ht=this.defaultPropsArray;for(a=0;a<r;a+=1){if(p.reset(),q=1,u[a].n)s=0,i+=t.yOffset,i+=O?1:0,_=et,O=!1,rt=0,this._hasMaskedPath&&(E=st,w=it,M=x[E].bezierData.points,P=M[w-1],A=M[w],I=A.partialLength,F=0),$=Z=Q=nt="",ht=this.defaultPropsArray;else{if(this._hasMaskedPath){if(at!==u[a].line){switch(t.j){case 1:_+=k-t.lineWidths[u[a].line];break;case 2:_+=(k-t.lineWidths[u[a].line])/2}at=u[a].line}tt!==u[a].ind&&(u[tt]&&(_+=u[tt].extra),_+=u[a].an/2,tt=u[a].ind),_+=n[0]*u[a].an/200;var ot=0;for(V=0;V<N;V+=1)L=h[V].a,L.p.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),ot+=j.length?L.p.v[0]*j[0]:L.p.v[0]*j),L.a.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),ot+=j.length?L.a.v[0]*j[0]:L.a.v[0]*j);for(C=!0;C;)F+I>=_+ot||!M?(D=(_+ot-F)/A.partialLength,W=P.point[0]+(A.point[0]-P.point[0])*D,X=P.point[1]+(A.point[1]-P.point[1])*D,p.translate(-n[0]*u[a].an/200,-(n[1]*B/100)),C=!1):M&&(F+=A.partialLength,w+=1,w>=M.length&&(w=0,E+=1,x[E]?M=x[E].bezierData.points:g.v.c?(w=0,E=0,M=x[E].bezierData.points):(F-=A.partialLength,M=null)),M&&(P=A,A=M[w],I=A.partialLength));G=u[a].an/2-u[a].add,p.translate(-G,0,0)}else G=u[a].an/2-u[a].add,p.translate(-G,0,0),p.translate(-n[0]*u[a].an/200,-n[1]*B/100,0);for(rt+=u[a].l/2,V=0;V<N;V+=1)L=h[V].a,L.t.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),this._hasMaskedPath?_+=j.length?L.t*j[0]:L.t*j:s+=j.length?L.t.v*j[0]:L.t.v*j);for(rt+=u[a].l/2,t.strokeWidthAnim&&(H=t.sw||0),t.strokeColorAnim&&(Y=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(J=[t.fc[0],t.fc[1],t.fc[2]]),V=0;V<N;V+=1)L=h[V].a,L.a.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),j.length?p.translate(-L.a.v[0]*j[0],-L.a.v[1]*j[1],L.a.v[2]*j[2]):p.translate(-L.a.v[0]*j,-L.a.v[1]*j,L.a.v[2]*j));for(V=0;V<N;V+=1)L=h[V].a,L.s.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),j.length?p.scale(1+(L.s.v[0]-1)*j[0],1+(L.s.v[1]-1)*j[1],1):p.scale(1+(L.s.v[0]-1)*j,1+(L.s.v[1]-1)*j,1));for(V=0;V<N;V+=1){if(L=h[V].a,R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),L.sk.propType&&(j.length?p.skewFromAxis(-L.sk.v*j[0],L.sa.v*j[1]):p.skewFromAxis(-L.sk.v*j,L.sa.v*j)),L.r.propType&&(j.length?p.rotateZ(-L.r.v*j[2]):p.rotateZ(-L.r.v*j)),L.ry.propType&&(j.length?p.rotateY(L.ry.v*j[1]):p.rotateY(L.ry.v*j)),L.rx.propType&&(j.length?p.rotateX(L.rx.v*j[0]):p.rotateX(L.rx.v*j)),L.o.propType&&(q+=j.length?(L.o.v*j[0]-q)*j[0]:(L.o.v*j-q)*j),t.strokeWidthAnim&&L.sw.propType&&(H+=j.length?L.sw.v*j[0]:L.sw.v*j),t.strokeColorAnim&&L.sc.propType)for(U=0;U<3;U+=1)j.length?Y[U]=Y[U]+(L.sc.v[U]-Y[U])*j[0]:Y[U]=Y[U]+(L.sc.v[U]-Y[U])*j;if(t.fillColorAnim&&t.fc){if(L.fc.propType)for(U=0;U<3;U+=1)j.length?J[U]=J[U]+(L.fc.v[U]-J[U])*j[0]:J[U]=J[U]+(L.fc.v[U]-J[U])*j;L.fh.propType&&(J=j.length?c(J,L.fh.v*j[0]):c(J,L.fh.v*j)),L.fs.propType&&(J=j.length?m(J,L.fs.v*j[0]):m(J,L.fs.v*j)),L.fb.propType&&(J=j.length?d(J,L.fb.v*j[0]):d(J,L.fb.v*j))}}for(V=0;V<N;V+=1)L=h[V].a,L.p.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),this._hasMaskedPath?j.length?p.translate(0,L.p.v[1]*j[0],-L.p.v[2]*j[1]):p.translate(0,L.p.v[1]*j,-L.p.v[2]*j):j.length?p.translate(L.p.v[0]*j[0],L.p.v[1]*j[1],-L.p.v[2]*j[2]):p.translate(L.p.v[0]*j,L.p.v[1]*j,-L.p.v[2]*j));if(t.strokeWidthAnim&&(Z=H<0?0:H),t.strokeColorAnim&&(K="rgb("+Math.round(255*Y[0])+","+Math.round(255*Y[1])+","+Math.round(255*Y[2])+")"),t.fillColorAnim&&t.fc&&(Q="rgb("+Math.round(255*J[0])+","+Math.round(255*J[1])+","+Math.round(255*J[2])+")"),this._hasMaskedPath){if(p.translate(0,-t.ls),p.translate(0,n[1]*B/100+i,0),o.p.p){S=(A.point[1]-P.point[1])/(A.point[0]-P.point[0]);var pt=180*Math.atan(S)/Math.PI;A.point[0]<P.point[0]&&(pt+=180),p.rotate(-pt*Math.PI/180)}p.translate(W,X,0),_-=n[0]*u[a].an/200,u[a+1]&&tt!==u[a+1].ind&&(_+=u[a].an/2,_+=t.tr/1e3*t.s)}else{switch(p.translate(s,i,0),t.ps&&p.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:p.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[u[a].line]),0,0);break;case 2:p.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[u[a].line])/2,0,0)}p.translate(0,-t.ls),p.translate(G,0,0),p.translate(n[0]*u[a].an/200,n[1]*B/100,0),s+=u[a].l+t.tr/1e3*t.s}"html"===l?nt=p.toCSS():"svg"===l?nt=p.to2dCSS():ht=[p.props[0],p.props[1],p.props[2],p.props[3],p.props[4],p.props[5],p.props[6],p.props[7],p.props[8],p.props[9],p.props[10],p.props[11],p.props[12],p.props[13],p.props[14],p.props[15]],$=q}f<=a?(z=new T($,Z,K,Q,nt,ht),this._bt.push(z),f+=1,this.lettersChangedFlag=!0):(z=this._bt[a],this.lettersChangedFlag=z.update($,Z,K,Q,nt,ht)||this.lettersChangedFlag)}}},D.prototype.getValue=function(){if(this._elem._x.frameId!==this._frameId){this._frameId=this._elem._x.frameId;var t,e=this.__co.length;for(this.mdf=!1,t=0;t<e;t+=1)this.__co[t].getValue(),this.mdf=this.__co[t].mdf||this.mdf}},D.prototype.mHelper=new $t,D.prototype.defaultPropsArray=[],T.prototype.update=function(t,e,s,i,a,r){this.mdf.o=!1,this.mdf.sw=!1,this.mdf.sc=!1,this.mdf.fc=!1,this.mdf.m=!1,this.mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this.mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this.mdf.sw=!0,n=!0),this.sc!==s&&(this.sc=s,this.mdf.sc=!0,n=!0),this.fc!==i&&(this.fc=i,this.mdf.fc=!0,n=!0),this.m!==a&&(this.m=a,this.mdf.m=!0,n=!0),!r.length||this.p[0]===r[0]&&this.p[1]===r[1]&&this.p[4]===r[4]&&this.p[5]===r[5]&&this.p[12]===r[12]&&this.p[13]===r[13]||(this.p=r,this.mdf.p=!0,n=!0),n},I.prototype.setCurrentData=function(t){var e=this.currentData;e.ascent=t.ascent,e.boxWidth=t.boxWidth?t.boxWidth:e.boxWidth,e.f=t.f,e.fStyle=t.fStyle,e.fWeight=t.fWeight,e.fc=t.fc,e.j=t.j,e.justifyOffset=t.justifyOffset,e.l=t.l,e.lh=t.lh,e.lineWidths=t.lineWidths,e.ls=t.ls,e.of=t.of,e.s=t.s,e.sc=t.sc,e.sw=t.sw,e.sz=t.sz,e.ps=t.ps,e.t=t.t,e.tr=t.tr,e.fillColorAnim=t.fillColorAnim||e.fillColorAnim,e.strokeColorAnim=t.strokeColorAnim||e.strokeColorAnim,e.strokeWidthAnim=t.strokeWidthAnim||e.strokeWidthAnim,e.yOffset=t.yOffset,e.__complete=!1},I.prototype.searchProperty=function(){return this.kf=this.data.d.k.length>1,this.kf},I.prototype.getValue=function(){this.mdf=!1;var t=this.elem._x.frameId;if(t!==this._frameId&&this.kf||this._ch){for(var e,s=this.data.d.k,i=0,a=s.length;i<=a-1&&(e=s[i].s,!(i===a-1||s[i+1].t>t));)i+=1;this.keysIndex!==i&&(e.__complete||this.completeTextData(e),this.setCurrentData(e),this.mdf=!this._ch,this.pv=this.v=this.currentData.t,this.keysIndex=i),this._frameId=t}},I.prototype.completeTextData=function(t){t.__complete=!0;var e,s,i,a,r,n,h,o=this.elem._x._cr,p=this.data,l=[],f=0,m=p.m.g,d=0,c=0,u=0,g=[],y=0,v=0,b=o.getFontByName(t.f),k=0,A=b.fStyle.split(" "),P="normal",M="normal";s=A.length;var _;for(e=0;e<s;e+=1)switch(_=A[e].toLowerCase()){case"italic":M="italic";break;case"bold":P="700";break;case"black":P="900";break;case"medium":P="500";break;case"regular":case"normal":P="400";case"light":case"thin":P="200"}t.fWeight=P,t.fStyle=M,s=t.t.length;var E=t.tr/1e3*t.s;if(t.sz){var w=t.sz[0],F=-1;for(e=0;e<s;e+=1)i=!1," "===t.t.charAt(e)?F=e:13===t.t.charCodeAt(e)&&(y=0,i=!0),o.chars?(h=o.getCharData(t.t.charAt(e),b.fStyle,b.fFamily),k=i?0:h.w*t.s/100):k=o.measureText(t.t.charAt(e),t.f,t.s),y+k>w&&" "!==t.t.charAt(e)?(F===-1?s+=1:e=F,t.t=t.t.substr(0,e)+"\r"+t.t.substr(e===F?e+1:e),F=-1,y=0):(y+=k,y+=E);s=t.t.length}y=-E,k=0;var C,x=0;for(e=0;e<s;e+=1)if(i=!1,C=t.t.charAt(e)," "===C?a="\xa0":13===C.charCodeAt(0)?(x=0,g.push(y),v=y>v?y:v,y=-2*E,a="",i=!0,u+=1):a=t.t.charAt(e),o.chars?(h=o.getCharData(C,b.fStyle,o.getFontByName(t.f).fFamily),k=i?0:h.w*t.s/100):k=o.measureText(a,t.f,t.s)," "===C?x+=k+E:(y+=k+E+x,x=0),l.push({l:k,an:k,add:d,n:i,anIndexes:[],val:a,line:u}),2==m){if(d+=k,""==a||"\xa0"==a||e==s-1){for(""!=a&&"\xa0"!=a||(d-=k);c<=e;)l[c].an=d,l[c].ind=f,l[c].extra=k,c+=1;f+=1,d=0}}else if(3==m){if(d+=k,""==a||e==s-1){for(""==a&&(d-=k);c<=e;)l[c].an=d,l[c].ind=f,l[c].extra=k,c+=1;d=0,f+=1}}else l[f].ind=f,l[f].extra=0,f+=1;if(t.l=l,v=y>v?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var D,S,T=p.a;n=T.length;var I,L,R=[];for(r=0;r<n;r+=1){for(D=T[r],D.a.sc&&(t.strokeColorAnim=!0),D.a.sw&&(t.strokeWidthAnim=!0),(D.a.fc||D.a.fh||D.a.fs||D.a.fb)&&(t.fillColorAnim=!0),L=0,I=D.s.b,e=0;e<s;e+=1)S=l[e],S.anIndexes[r]=L,(1==I&&""!=S.val||2==I&&""!=S.val&&"\xa0"!=S.val||3==I&&(S.n||"\xa0"==S.val||e==s-1)||4==I&&(S.n||e==s-1))&&(1===D.s.rn&&R.push(L),L+=1);p.a[r].s.totalChars=L;var V,N=-1;if(1===D.s.rn)for(e=0;e<s;e+=1)S=l[e],N!=S.anIndexes[r]&&(N=S.anIndexes[r],V=R.splice(Math.floor(Math.random()*R.length),1)[0]),S.anIndexes[r]=V}t.yOffset=t.lh||1.2*t.s,t.ls=t.ls||0,t.ascent=b.ascent*t.s/100},I.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var s=this.data.d.k[e].s;s.__complete=!1,s.t=t.t,this.keysIndex=-1,this._ch=!0,this.getValue()};var fe=function(){function t(t){if(this.mdf=t||!1,this._co.length){var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}var i=this.elem.textProperty.currentData?this.elem.textProperty.currentData.l.length:0;t&&2===this.data.r&&(this.e.v=i);var a=2===this.data.r?1:100/i,r=this.o.v/a,n=this.s.v/a+r,h=this.e.v/a+r;if(n>h){var o=n;n=h,h=o}this.finalS=n,this.finalE=h}function e(t){var e=te.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,s=0,i=this.finalS,h=this.finalE,o=this.data.sh;if(2==o)s=h===i?t>=h?1:0:a(0,r(.5/(h-i)+(t-i)/(h-i),1)),s=e(s);else if(3==o)s=h===i?t>=h?0:1:1-a(0,r(.5/(h-i)+(t-i)/(h-i),1)),s=e(s);else if(4==o)h===i?s=0:(s=a(0,r(.5/(h-i)+(t-i)/(h-i),1)),s<.5?s*=2:s=1-2*(s-.5)),s=e(s);else if(5==o){if(h===i)s=0;else{var p=h-i;t=r(a(0,t+.5-i),h-i);var l=-p/2+t,f=p/2;s=Math.sqrt(1-l*l/(f*f))}s=e(s)}else 6==o?(h===i?s=0:(t=r(a(0,t+.5-i),h-i),s=(1+Math.cos(Math.PI+2*Math.PI*t/(h-i)))/2),s=e(s)):(t>=n(i)&&(s=t-i<0?1-(i-t):a(0,r(h-t,1))),s=e(s));return s*this.a.v}function s(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this._co=[],this.getValue=t,this.getMult=e,this.elem=s,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=ae._bo(s,i.s||{k:0},0,0,this._co),"e"in i?this.e=ae._bo(s,i.e,0,0,this._co):this.e={v:100},this.o=ae._bo(s,i.o||{k:0},0,0,this._co),this.xe=ae._bo(s,i.xe||{k:0},0,0,this._co),this.ne=ae._bo(s,i.ne||{k:0},0,0,this._co),this.a=ae._bo(s,i.a,0,.01,this._co),this._co.length?a.push(this):this.getValue()}function i(t,e,i){return new s(t,e,i)}var a=Math.max,r=Math.min,n=Math.floor;return{getTextSelectorProp:i}}(),me=function(){return function(t,e,s,i){function a(){var t;return n?(n-=1,t=o[n]):t=e(),t}function r(t){n===h&&(o=de["double"](o),h=2*h),s&&s(t),o[n]=t,n+=1}var n=0,h=t,o=g(h),p={newElement:a,release:r};return p}}(),de=function(){function t(t){return t.concat(g(t.length))}return{"double":t}}(),ce=function(){function t(){return Qt("float32",2)}return me(8,t)}(),ue=function(){function t(){return new P}function e(t){var e,s=t._length;for(e=0;e<s;e+=1)ce.release(t.v[e]),ce.release(t.i[e]),ce.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}function s(t){var e,s=i.newElement(),a=void 0===t._length?t.v.length:t._length;s.setLength(a),s.c=t.c;for(e=0;e<a;e+=1)s._aw(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return s}var i=me(4,t,e);return i.clone=s,i}(),ge=function(){function t(){var t;return i?(i-=1,t=r[i]):t=new F,t}function e(t){var e,s=t._length;for(e=0;e<s;e+=1)ue.release(t.shapes[e]);t._length=0,i===a&&(r=de["double"](r),a=2*a),r[i]=t,i+=1}var s={_al:t,release:e},i=0,a=4,r=g(a);return s}(),ye=function(){function t(){return{lengths:[],totalLength:0}}function e(t){var e,s=t.lengths.length;for(e=0;e<s;e+=1)ve.release(t.lengths[e]);t.lengths.length=0}return me(8,t,e)}(),ve=function(){function t(){return{addedLength:0,percents:Qt("float32",Jt),lengths:Qt("float32",Jt)}}return me(8,t)}();L.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this._db=!0,e=i-1;e>=0;e--)this._br[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._db=!!this._br[e]&&this._db;this.checkPendingElements()},L.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 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},L.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},L.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},L.prototype.includeLayers=function(t){this._db=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;e<i;e+=1)for(s=0;s<a;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},L.prototype.setProjectInterface=function(t){this._x.projectInterface=t},L.prototype.initItems=function(){this._x.progressiveLoad||this.buildAllItems()},L.prototype.buildElementParenting=function(t,e,s){for(var i=this._br,a=this.layers,r=0,n=a.length;r<n;)a[r].ind==e&&(i[r]&&i[r]!==!0?void 0!==a[r].parent?(s.push(i[r]),i[r]._isParent=!0,this.buildElementParenting(t,a[r].parent,s)):(s.push(i[r]),i[r]._isParent=!0,t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},L.prototype.addPendingElement=function(t){this._dc.push(t)},b([L],R),R.prototype.createBase=function(t){return new $(t,this._x,this)},R.prototype.createNull=function(t){return new Q(t,this._x,this)},R.prototype.createShape=function(t){return new ht(t,this._x,this)},R.prototype.createText=function(t){return new nt(t,this._x,this)},R.prototype.createImage=function(t){return new it(t,this._x,this)},R.prototype.createComp=function(t){return new rt(t,this._x,this)},R.prototype.createSolid=function(t){return new at(t,this._x,this)},R.prototype.configAnimation=function(t){this._cf.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this._cf.setAttribute("viewBox",this.renderConfig.viewBoxSize):this._cf.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this._cf.setAttribute("width",t.w),this._cf.setAttribute("height",t.h),this._cf.style.width="100%",this._cf.style.height="100%"),this.renderConfig.className&&this._cf.setAttribute("class",this.renderConfig.className),this._cf.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this._cq.wrapper.appendChild(this._cf);var e=this._x.defs;this._x.getAssetData=this._cq.getAssetData.bind(this._cq),this._x.getAssetsPath=this._cq.getAssetsPath.bind(this._cq),this._x.progressiveLoad=this.renderConfig.progressiveLoad,this._x.nm=t.nm,this._x._de.w=t.w,this._x._de.h=t.h,this._x.frameRate=t.fr,this.data=t;var s=y("clipPath"),i=y("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+p(10);s.setAttribute("id",a),s.appendChild(i),this._bx.setAttribute("clip-path","url("+Ot+"#"+a+")"),e.appendChild(s),this.layers=t.layers,this._x._cr.addChars(t.chars),this._x._cr.addFonts(t.fonts,e),this._br=g(t.layers.length)},R.prototype.destroy=function(){this._cq.wrapper.innerHTML="",this._bx=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t]&&this._br[t].destroy();this._br.length=0,this.destroyed=!0,this._cq=null},R.prototype.updateContainerSize=function(){},R.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,Nt&&(0===this.layers[t].ty&&this._x.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this._br[t-1]&&this._br[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},R.prototype.checkPendingElements=function(){for(;this._dc.length;){var t=this._dc.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this._br.length;e<s;){if(this._br[e]===t){t.setMatte(this._br[e-1].layerId);break}e+=1}}},R.prototype._ba=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this._x.frameNum=t,this._x.frameId+=1,this._x.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this._db||this.checkLayers(t),e=s-1;e>=0;e--)(this._db||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=0;e<s;e+=1)(this._db||this._br[e])&&this._br[e]._ba()}},R.prototype.appendElementInPos=function(t,e){var s=t.get_e();if(s){for(var i,a=0;a<e;)this._br[a]&&this._br[a]!==!0&&this._br[a].get_e()&&(i=this._br[a].get_e()),a+=1;i?this._bx.insertBefore(s,i):this._bx.appendChild(s)}},R.prototype.hide=function(){this._bx.style.display="none"},R.prototype.show=function(){this._bx.style.display="block"},R.prototype.searchExtraCompositions=function(t){var e,s=t.length,i=y("g");for(e=0;e<s;e+=1)if(t[e].xt){var a=this.createComp(t[e],i,this._x.comp,null);a.initExpressions(),this._x.projectInterface.registerComposition(a)}},V.prototype.getMaskProperty=function(t){return this.viewData[t].prop},V.prototype._az=function(){var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue()},V.prototype._ba=function(t){var e,s=this.masksProperties.length;for(e=0;e<s;e++)if((this.viewData[e].prop.mdf||this._ch)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this._ch)&&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._ch)&&(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._ch))){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("+Ot+"#"+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._ch=!1},V.prototype.getMaskelement=function(){return this.maskElement},V.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this._x._de.w,t+=" v"+this._x._de.h,t+=" h-"+this._x._de.w,t+=" v-"+this._x._de.h+" "},V.prototype.drawPath=function(t,e,s){var i,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,i=1;i<a;i+=1)r+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];if(e.c&&a>1&&(r+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),s.lastPath!==r){var n="";s.elem&&(e.c&&(n=t.inv?this.solidPath+r:r),s.elem.setAttribute("d",n)),s.lastPath=r}},V.prototype.destroy=function(){this.element=null,this._x=null,this.maskElement=null,this.data=null,this.masksProperties=null},N.prototype.initHierarchy=function(){this._dd=[],this._isParent=!1,this.checkParenting()},N.prototype.resetHierarchy=function(){this._dd.length=0},N.prototype.getHierarchy=function(){return this._dd},N.prototype.setHierarchy=function(t){this._dd=t},N.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])},N.prototype.prepareHierarchy=function(){},z.prototype.initFrame=function(){this._ch=!1,this._co=[]},z.prototype.prepareProperties=function(t,e){var s,i=this._co.length;for(s=0;s<i;s+=1)(e||this._isParent&&"transform"===this._co[s].propType)&&(this._co[s].getValue(this._ch),this._co[s].mdf&&(this._x.mdf=!0))},B.prototype.initTransform=function(){this.finalTransform={mProp:this.data.ks?re._bj(this,this.data.ks,this._co):{o:0},matMdf:!1,opMdf:!1,mat:new $t},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),11!==this.data.ty},B.prototype.renderTransform=function(){if(this.finalTransform.opMdf=this.finalTransform.mProp.o.mdf||this._ch,this.finalTransform.matMdf=this.finalTransform.mProp.mdf||this._ch,this._dd){var t,e=this.finalTransform.mat,s=0,i=this._dd.length;if(!this.finalTransform.matMdf)for(;s<i;){if(this._dd[s].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}s+=1}if(this.finalTransform.matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),s=0;s<i;s+=1)t=this._dd[s].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},B.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;a<n;a+=1)r=e[a].mat._cn(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},B.prototype.mHelper=new $t,O.prototype.initRenderable=function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1},O.prototype.prepareRenderableFrame=function(t){this.checkLayerLimits(t),this.prepareMasks(t),this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this._x.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},O.prototype.checkLayerLimits=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isInRange!==!0&&(this._x.mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this._x.mdf=!0,this.isInRange=!1,this.hide())},O.prototype.prepareMasks=function(){this.isInRange&&this.maskManager._az()},O.prototype.renderRenderable=function(){this.maskManager._ba(this.finalTransform.mat),this.effectsManager._ba(this._ch)},O.prototype.sourceRectAtTime=function(){return{top:0,left:0,width:100,height:100}},O.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}},b([O],j),j.prototype._cz=function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},j.prototype.hide=function(){this.hidden||this.isInRange&&!this.isTransparent||(this._bx.style.display="none",this.hidden=!0)},j.prototype.show=function(){this.isInRange&&!this.isTransparent&&(this.data.hd||(this._bx.style.display="block"),this.hidden=!1,this._ch=!0,this.maskManager._ch=!0)},j.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._ch&&(this._ch=!1))},j.prototype.renderInnerContent=function(){},j.prototype.destroy=function(){this._cc=null,this.destroy_e()},j.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},W.prototype.reset=function(){this.d="",this.mdf=!1},J.prototype.initGradientData=function(t,e,s,i){this.o=ae._bo(t,e.o,0,.01,s),
this.s=ae._bo(t,e.s,1,null,s),this.e=ae._bo(t,e.e,1,null,s),this.h=ae._bo(t,e.h||{k:0},0,.01,s),this.a=ae._bo(t,e.a||{k:0},0,Ut,s),this.g=new x(t,e.g,s),this.style=i,this.stops=[],this.setGradientData(i.pElem,e),this.setGradientOpacity(e,i)},J.prototype.setGradientData=function(t,e){var s="gr_"+p(10),i=y(1===e.t?"linearGradient":"radialGradient");i.setAttribute("id",s),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var a,r,n,h=[];for(n=4*e.g.p,r=0;r<n;r+=4)a=y("stop"),i.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+s+")"),this.gf=i,this.cst=h},J.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var s,i,a,r=y("mask"),n=y("path");r.appendChild(n);var h="op_"+p(10),o="mk_"+p(10);r.setAttribute("id",o);var l=y(1===t.t?"linearGradient":"radialGradient");l.setAttribute("id",h),l.setAttribute("spreadMethod","pad"),l.setAttribute("gradientUnits","userSpaceOnUse"),a=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=this.stops;for(i=4*t.g.p;i<a;i+=2)s=y("stop"),s.setAttribute("stop-color","rgb(255,255,255)"),l.appendChild(s),f.push(s);n.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+h+")"),this.of=l,this.ms=r,this.ost=f,this.maskId=o,e.msElem=n}},U.prototype.initGradientData=J.prototype.initGradientData,U.prototype.setGradientData=J.prototype.setGradientData,U.prototype.setGradientOpacity=J.prototype.setGradientOpacity,K.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},K.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(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},K.prototype.blendModeEnums={1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},K.prototype.getBlendMode=function(){return this.blendModeEnums[this.data.bm]||""},K.prototype.setBlendMode=function(){var t=this.getBlendMode(),e=this._by||this._bx;e.style["mix-blend-mode"]=t},K.prototype.initBaseData=function(t,e,s){this._x=e,this.comp=s,this.data=t,this.layerId="ly_"+p(10),this.data.sr||(this.data.sr=1),this.effects=new EffectsManager(this.data,this,this._co)},K.prototype.getType=function(){return this.type},Q.prototype._az=function(t){this.prepareProperties(t,!0)},Q.prototype._ba=function(){},Q.prototype.get_e=function(){return null},Q.prototype.destroy=function(){},Q.prototype.sourceRectAtTime=function(){},Q.prototype.hide=function(){},b([K,B,N,z],Q),$.prototype.initRendererElement=function(){this._bx=y("g")},$.prototype.createContainerElements=function(){this.matteElement=y("g"),this._bz=this._bx,this._ca=this._bx,this._sizeChanged=!1;var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=y("mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this._bx),t=e,this._x.defs.appendChild(e),!pe.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=p(10),i=le.createFilter(s);this._x.defs.appendChild(i),i.appendChild(le.createAlphaToLuminanceFilter());var a=y("g");a.appendChild(this._bx),t=a,e.appendChild(a),a.setAttribute("filter","url("+Ot+"#"+s+")")}}else if(2==this.data.td){var r=y("mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=y("g");r.appendChild(n);var s=p(10),i=le.createFilter(s),h=y("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._x.defs.appendChild(i);var o=y("rect");if(o.setAttribute("width",this.comp.data.w),o.setAttribute("height",this.comp.data.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url("+Ot+"#"+s+")"),n.appendChild(o),n.appendChild(this._bx),t=n,!pe.maskType){r.setAttribute("mask-type","luminance"),i.appendChild(le.createAlphaToLuminanceFilter());var a=y("g");n.appendChild(o),a.appendChild(this._bx),t=a,n.appendChild(a)}this._x.defs.appendChild(r)}}else this.data.tt?(this.matteElement.appendChild(this._bx),t=this.matteElement,this._by=this.matteElement):this._by=this._bx;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl)),0===this.data.ty&&!this.data.hd){var l=y("clipPath"),f=y("path");f.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+p(8);if(l.setAttribute("id",m),l.appendChild(f),this._x.defs.appendChild(l),this.checkMasks()){var d=y("g");d.setAttribute("clip-path","url("+Ot+"#"+m+")"),d.appendChild(this._bx),this._bz=d,t?t.appendChild(this._bz):this._by=this._bz}else this._bx.setAttribute("clip-path","url("+Ot+"#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.effectsManager=new ut(this)},$.prototype.renderElement=function(){this.finalTransform.matMdf&&this._bz.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this._bz.setAttribute("opacity",this.finalTransform.mProp.o.v)},$.prototype.destroy_e=function(){this._bx=null,this.matteElement=null,this.maskManager.destroy()},$.prototype.get_e=function(){return this.data.hd?null:this._by},$.prototype.addMasks=function(){this.maskManager=new V(this.data,this,this._x)},$.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+Ot+"#"+t+")")},tt.prototype={addShapeToModifiers:function(t){var e,s=this.shapeModifiers.length;for(e=0;e<s;e+=1)this.shapeModifiers[e].addShape(t)},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this._ch)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"butt"},searchProcessedElement:function(t){for(var e=0,s=this.processedElements.length;e<s;){if(this.processedElements[e].elem===t)return this.processedElements[e].pos;e+=1}return 0},addProcessedElement:function(t,e){for(var s=this.processedElements.length;s;)if(s-=1,this.processedElements[s].elem===t){this.processedElements[s].pos=e;break}0===s&&this.processedElements.push(new G(t,e))},_az:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},buildShapeString:function(t,e,s,i){var a,r="";for(a=1;a<e;a+=1)1===a&&(r+=" M"+i.applyToPointStringified(t.v[0][0],t.v[0][1])),r+=" C"+i.applyToPointStringified(t.o[a-1][0],t.o[a-1][1])+" "+i.applyToPointStringified(t.i[a][0],t.i[a][1])+" "+i.applyToPointStringified(t.v[a][0],t.v[a][1]);return 1===e&&(r+=" M"+i.applyToPointStringified(t.v[0][0],t.v[0][1])),s&&e&&(r+=" C"+i.applyToPointStringified(t.o[a-1][0],t.o[a-1][1])+" "+i.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+i.applyToPointStringified(t.v[0][0],t.v[0][1]),r+="z"),r}},et.prototype._cz=function(t,e,s){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,s),this.textAnimator=new D(t.t,this.renderType,this),this.textProperty=new I(this,t.t,this._co),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.textAnimator.searchProperties(this._co)},et.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty.mdf||this.textProperty._ch)&&(this.buildNewText(),this.textProperty._ch=!1)},et.prototype.createPathShape=function(t,e){var s,i,a=e.length,r="";for(s=0;s<a;s+=1)i=e[s].ks.k,r+=this.buildShapeString(i,i.i.length,!0,t);return r},et.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},et.prototype.applyTextPropertiesToMatrix=function(t,e,s,i,a){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s])/2,0,0)}e.translate(i,a,0)},et.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},et.prototype.buildShapeString=tt.prototype.buildShapeString,et.prototype.emptyProp=new T,et.prototype.destroy=function(){},b([K,B,N,z,j],st),st.prototype._cz=function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},st.prototype._az=function(t){if(this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var s,i=this._br.length;for(this._db||this.checkLayers(this.renderedFrame),s=0;s<i;s+=1)(this._db||this._br[s])&&this._br[s]._az(this.renderedFrame-this.layers[s].st)}},st.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this._db||this._br[t])&&this._br[t]._ba()},st.prototype.setElements=function(t){this._br=t},st.prototype.getElements=function(){return this._br},st.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this._br[t]&&this._br[t].destroy()},st.prototype.destroy=function(){this.destroyElements(),this.destroy_e()},b([K,B,$,N,z,j],it),it.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData);this._cc=y("image"),this._cc.setAttribute("width",this.assetData.w+"px"),this._cc.setAttribute("height",this.assetData.h+"px"),this._cc.setAttribute("preserveAspectRatio","xMidYMid slice"),this._cc.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this._cc)},b([it],at),at.prototype.createContent=function(){var t=y("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._bx.appendChild(t)},b([R,st,$],rt),b([K,B,$,N,z,j,et],nt),nt.prototype.createContent=function(){this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl),this.data.singleShape&&!this._x._cr.chars&&(this.textContainer=y("text"))},nt.prototype.buildNewText=function(){var t,e,s=this.textProperty.currentData;this._bt=g(s?s.l.length:0),s.fc?this._bx.setAttribute("fill",this.buildColor(s.fc)):this._bx.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this._bx.setAttribute("stroke",this.buildColor(s.sc)),this._bx.setAttribute("stroke-width",s.sw)),this._bx.setAttribute("font-size",s.s);var i=this._x._cr.getFontByName(s.f);if(i.fClass)this._bx.setAttribute("class",i.fClass);else{this._bx.setAttribute("font-family",i.fFamily);var a=s.fWeight,r=s.fStyle;this._bx.setAttribute("font-style",r),this._bx.setAttribute("font-weight",a)}var n=s.l||[],h=this._x._cr.chars;if(e=n.length){var o,p,l=this.mHelper,f="",m=this.data.singleShape,d=0,c=0,u=!0,v=s.tr/1e3*s.s;if(m&&!h){var b=this.textContainer,k="";switch(s.j){case 1:k="end";break;case 2:k="middle";break;case 2:k="start"}b.setAttribute("text-anchor",k),b.setAttribute("letter-spacing",v);var A=s.t.split(String.fromCharCode(13));e=A.length;var c=s.ps?s.ps[1]+s.ascent:0;for(t=0;t<e;t+=1)o=this.textSpans[t]||y("tspan"),o.textContent=A[t],o.setAttribute("x",0),o.setAttribute("y",c),o.style.display="inherit",b.appendChild(o),this.textSpans[t]=o,c+=s.lh;this._bx.appendChild(b)}else{var P,M,_=this.textSpans.length;for(t=0;t<e;t+=1)h&&m&&0!==t||(o=_>t?this.textSpans[t]:y(h?"path":"text"),_<=t&&(o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),this.textSpans[t]=o,this._bx.appendChild(o)),o.style.display="inherit"),l.reset(),h?(l.scale(s.s/100,s.s/100),m&&(n[t].n&&(d=-v,c+=s.yOffset,c+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(s,l,n[t].line,d,c),d+=n[t].l||0,d+=v),M=this._x._cr.getCharData(s.t.charAt(t),i.fStyle,this._x._cr.getFontByName(s.f).fFamily),P=M&&M.data||{},p=P.shapes?P.shapes[0].it:[],m?f+=this.createPathShape(l,p):o.setAttribute("d",this.createPathShape(l,p))):(o.textContent=n[t].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"));m&&o.setAttribute("d",f)}for(;t<this.textSpans.length;)this.textSpans[t].style.display="none",t+=1;this._sizeChanged=!0}},nt.prototype.sourceRectAtTime=function(t){if(this._az(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var e=this._bx.getBBox();this.bbox={top:e.y,left:e.x,width:e.width,height:e.height}}return this.bbox},nt.prototype.renderInnerContent=function(){if(!this.data.singleShape&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var t,e,s=this.textAnimator._bt,i=this.textProperty.currentData.l;e=i.length;var a,r;for(t=0;t<e;t+=1)i[t].n||(a=s[t],r=this.textSpans[t],a.mdf.m&&r.setAttribute("transform",a.m),a.mdf.o&&r.setAttribute("opacity",a.o),a.mdf.sw&&r.setAttribute("stroke-width",a.sw),a.mdf.sc&&r.setAttribute("stroke",a.sc),a.mdf.fc&&r.setAttribute("fill",a.fc))}},b([K,B,$,tt,N,z,j],ht),ht.prototype.initSecondaryElement=function(){},ht.prototype.identityMatrix=new $t,ht.prototype.buildExpressionInterface=function(){},ht.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co,0,[],!0)},ht.prototype.createStyleElement=function(t,e,s){var i,a=new W(t,e),r=a.pElem;if("st"===t.ty)i=new Y(this,t,s,a);else if("fl"===t.ty)i=new H(this,t,s,a);else if("gf"===t.ty||"gs"===t.ty){var n="gf"===t.ty?J:U;i=new n(this,t,s,a),this._x.defs.appendChild(i.gf),i.maskId&&(this._x.defs.appendChild(i.ms),this._x.defs.appendChild(i.of),r.setAttribute("mask","url(#"+i.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(r.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),r.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),r.setAttribute("fill-opacity","0"),1===t.lj&&r.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&r.setAttribute("fill-rule","evenodd"),t.ln&&r.setAttribute("id",t.ln),t.cl&&r.setAttribute("class",t.cl),this.stylesList.push(a),i},ht.prototype.createGroupElement=function(t){var e=new Z;return t.ln&&e.gr.setAttribute("id",t.ln),e},ht.prototype._cp=function(t,e){return new q(re._bj(this,t,e),ae._bo(this,t.o,0,.01,e))},ht.prototype.createShapeElement=function(t,e,s,i){var a=4;"rc"===t.ty?a=5:"el"===t.ty?a=6:"sr"===t.ty&&(a=7);var r=ne._bp(this,t,a,i),n=new X(e,s,r);return this.shapes.push(n.sh),this.addShapeToModifiers(n),n},ht.prototype.setElementStyles=function(t){var e,s=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||s.push(this.stylesList[e])},ht.prototype.reloadShapes=function(){this._ch=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co,0,[],!0);var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue();this.renderModifiers()},ht.prototype.searchShapes=function(t,e,s,i,a,r,n,h){var o,p,l,f,m,d,c=[].concat(n),u=t.length-1,g=[],y=[];for(o=u;o>=0;o-=1){if(d=this.searchProcessedElement(t[o]),d?e[o]=s[d-1]:t[o]._render=h,"fl"==t[o].ty||"st"==t[o].ty||"gf"==t[o].ty||"gs"==t[o].ty)d?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],r,a),t[o]._render&&i.appendChild(e[o].style.pElem),g.push(e[o].style);else if("gr"==t[o].ty){if(d)for(l=e[o].it.length,p=0;p<l;p+=1)e[o].prevViewData[p]=e[o].it[p];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,a,r+1,c,h),t[o]._render&&i.appendChild(e[o].gr)}else"tr"==t[o].ty?(d||(e[o]=this._cp(t[o],a)),f=e[o].transform,c.push(f)):"sh"==t[o].ty||"rc"==t[o].ty||"el"==t[o].ty||"sr"==t[o].ty?(d||(e[o]=this.createShapeElement(t[o],c,r,a)),this.setElementStyles(e[o])):"tm"==t[o].ty||"rd"==t[o].ty||"ms"==t[o].ty?(d?(m=e[o],m.closed=!1):(m=he.getModifier(t[o].ty),m.init(this,t[o],a),e[o]=m,this.shapeModifiers.push(m)),y.push(m)):"rp"==t[o].ty&&(d?(m=e[o],m.closed=!0):(m=he.getModifier(t[o].ty),e[o]=m,m.init(this,t,o,e,a),this.shapeModifiers.push(m),h=!1),y.push(m));this.addProcessedElement(t[o],o+1)}for(u=g.length,o=0;o<u;o+=1)g[o].closed=!0;for(u=y.length,o=0;o<u;o+=1)y[o].closed=!0},ht.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(this.shapesData,this.itemsData,null),t=0;t<e;t+=1)(this.stylesList[t].mdf||this._ch)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},ht.prototype.renderShape=function(t,e,s){var i,a,r=t.length-1;for(i=0;i<=r;i+=1)a=t[i].ty,"tr"==a?((this._ch||e[i].transform.op.mdf&&s)&&s.setAttribute("opacity",e[i].transform.op.v),(this._ch||e[i].transform.mProps.mdf&&s)&&s.setAttribute("transform",e[i].transform.mProps.v.to2dCSS())):!t[i]._render||"sh"!=a&&"el"!=a&&"rc"!=a&&"sr"!=a?"fl"==a?this.renderFill(t[i],e[i]):"gf"==a?this.renderGradient(t[i],e[i]):"gs"==a?(this.renderGradient(t[i],e[i]),this.renderStroke(t[i],e[i])):"st"==a?this.renderStroke(t[i],e[i]):"gr"==a&&this.renderShape(t[i].it,e[i].it,e[i].gr):this.renderPath(e[i])},ht.prototype.renderPath=function(t){var e,s,i,a,r,n,h,o,p,l,f,m=t.styles.length,d=t.lvl;for(n=0;n<m;n+=1){if(a=t.sh.mdf||this._ch,t.styles[n].lvl<d)for(o=this.mHelper.reset(),l=d-t.styles[n].lvl,f=t.transformers.length-1;l>0;)a=t.transformers[f].mProps.mdf||a,p=t.transformers[f].mProps.v.props,o.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]),l--,f--;else o=this.identityMatrix;if(h=t.sh.paths,s=h._length,a){for(i="",e=0;e<s;e+=1)r=h.shapes[e],r&&r._length&&(i+=this.buildShapeString(r,r._length,r.c,o));t.caches[n]=i}else i=t.caches[n];t.styles[n].d+=i,t.styles[n].mdf=a||t.styles[n].mdf}},ht.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this._ch)&&s.pElem.setAttribute("fill","rgb("+qt(e.c.v[0])+","+qt(e.c.v[1])+","+qt(e.c.v[2])+")"),(e.o.mdf||this._ch)&&s.pElem.setAttribute("fill-opacity",e.o.v)},ht.prototype.renderGradient=function(t,e){var s=e.gf,i=e.g._hasOpacity,a=e.s.v,r=e.e.v;if(e.o.mdf||this._ch){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(n,e.o.v)}if(e.s.mdf||this._ch){var h=1===t.t?"x1":"cx",o="x1"===h?"y1":"cy";s.setAttribute(h,a[0]),s.setAttribute(o,a[1]),i&&!e.g._collapsable&&(e.of.setAttribute(h,a[0]),e.of.setAttribute(o,a[1]))}var p,l,f,m;if(e.g.cmdf||this._ch){p=e.cst;var d=e.g.c;for(f=p.length,l=0;l<f;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._ch)){var c=e.g.o;for(p=e.g._collapsable?e.cst:e.ost,f=p.length,l=0;l<f;l+=1)m=p[l],e.g._collapsable||m.setAttribute("offset",c[2*l]+"%"),m.setAttribute("stop-opacity",c[2*l+1])}if(1===t.t)(e.e.mdf||this._ch)&&(s.setAttribute("x2",r[0]),s.setAttribute("y2",r[1]),i&&!e.g._collapsable&&(e.of.setAttribute("x2",r[0]),e.of.setAttribute("y2",r[1])));else{var u;if((e.s.mdf||e.e.mdf||this._ch)&&(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)),s.setAttribute("r",u),i&&!e.g._collapsable&&e.of.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this._ch){u||(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)));var g=Math.atan2(r[1]-a[1],r[0]-a[0]),y=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*y,b=Math.cos(g+e.a.v)*v+a[0],k=Math.sin(g+e.a.v)*v+a[1];s.setAttribute("fx",b),s.setAttribute("fy",k),i&&!e.g._collapsable&&(e.of.setAttribute("fx",b),e.of.setAttribute("fy",k))}}},ht.prototype.renderStroke=function(t,e){var s=e.style,i=e.d;i&&(i.mdf||this._ch)&&(s.pElem.setAttribute("stroke-dasharray",i.dashStr),s.pElem.setAttribute("stroke-dashoffset",i.dashoffset[0])),e.c&&(e.c.mdf||this._ch)&&s.pElem.setAttribute("stroke","rgb("+qt(e.c.v[0])+","+qt(e.c.v[1])+","+qt(e.c.v[2])+")"),(e.o.mdf||this._ch)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this._ch)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},ht.prototype.destroy=function(){this.destroy_e(),this.shapeData=null,this.itemsData=null},ot.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[0].p.v,s=this._cl._cm[1].p.v,i=this._cl._cm[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")}},pt.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[2].p.v,s=this._cl._cm[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")}},lt.prototype.initialize=function(){var t,e,s,i,a=this.elem._bx.children||this.elem._bx.childNodes;for(1===this._cl._cm[1].p.v?(i=this.elem.maskManager.masksProperties.length,s=0):(s=this._cl._cm[0].p.v-1,i=s+1),e=y("g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;s<i;s+=1)t=y("path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this._cl._cm[10].p.v){var r=y("mask"),n="stms_"+p(10);r.setAttribute("id",n),r.setAttribute("mask-type","alpha"),r.appendChild(e),this.elem._x.defs.appendChild(r);var h=y("g");h.setAttribute("mask","url("+Ot+"#"+n+")"),a[0]&&h.appendChild(a[0]),this.elem._bx.appendChild(h),this.masker=r,e.setAttribute("stroke","#fff")}else if(1===this._cl._cm[10].p.v||2===this._cl._cm[10].p.v){if(2===this._cl._cm[10].p.v)for(var a=this.elem._bx.children||this.elem._bx.childNodes;a.length;)this.elem._bx.removeChild(a[0]);this.elem._bx.appendChild(e),this.elem._bx.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},lt.prototype._ba=function(t){this.initialized||this.initialize();var e,s,i,a=this.paths.length;for(e=0;e<a;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],i=this.paths[e].p,(t||this._cl.mdf||s.prop.mdf)&&i.setAttribute("d",s.lastPath),t||this._cl._cm[9].p.mdf||this._cl._cm[4].p.mdf||this._cl._cm[7].p.mdf||this._cl._cm[8].p.mdf||s.prop.mdf){var r;if(0!==this._cl._cm[7].p.v||100!==this._cl._cm[8].p.v){var n=Math.min(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100,h=Math.max(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100,o=i.getTotalLength();r="0 0 0 "+o*n+" ";var p,l=o*(h-n),f=1+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100,m=Math.floor(l/f);for(p=0;p<m;p+=1)r+="1 "+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100+" ";r+="0 "+10*o+" 0 0"}else r="1 "+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100;i.setAttribute("stroke-dasharray",r)}if((t||this._cl._cm[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this._cl._cm[4].p.v),(t||this._cl._cm[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this._cl._cm[6].p.v),(1===this._cl._cm[10].p.v||2===this._cl._cm[10].p.v)&&(t||this._cl._cm[3].p.mdf)){var d=this._cl._cm[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+qt(255*d[0])+","+qt(255*d[1])+","+qt(255*d[2])+")")}},ft.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[0].p.v,s=this._cl._cm[1].p.v,i=this._cl._cm[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)}},mt.prototype.createFeFunc=function(t,e){var s=y(t);return s.setAttribute("type","table"),e.appendChild(s),s},mt.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;h<=256;)r=h/256,n=r<=p?c<0?a:i:r>=l?c<0?i:a:i+d*Math.pow((r-t)/c,1/s),f[m++]=n,h+=256/(o-1);return f.join(" ")},mt.prototype._ba=function(t){if(t||this._cl.mdf){var e,s=this._cl._cm;this.feFuncRComposed&&(t||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf||s[7].p.mdf)&&(e=this.getTableValue(s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v,s[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf||s[14].p.mdf)&&(e=this.getTableValue(s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v,s[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf||s[21].p.mdf)&&(e=this.getTableValue(s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v,s[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf||s[28].p.mdf)&&(e=this.getTableValue(s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v,s[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf||s[35].p.mdf)&&(e=this.getTableValue(s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v,s[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},dt.prototype._ba=function(t){if(t||this._cl.mdf){if((t||this._cl._cm[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this._cl._cm[4].p.v/4),t||this._cl._cm[0].p.mdf){var e=this._cl._cm[0].p.v;this.feFlood.setAttribute("flood-color",Kt(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this._cl._cm[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this._cl._cm[1].p.v/255),t||this._cl._cm[2].p.mdf||this._cl._cm[3].p.mdf){var s=this._cl._cm[3].p.v,i=(this._cl._cm[2].p.v-90)*Ut,a=s*Math.cos(i),r=s*Math.sin(i);this.feOffset.setAttribute("dx",a),this.feOffset.setAttribute("dy",r)}}};var be=[],ke=0;ct.prototype.findSymbol=function(t){for(var e=0,s=be.length;e<s;){if(be[e]===t)return be[e];e+=1}return null},ct.prototype.replaceInParent=function(t,e){var s=t._bx.parentNode;if(s){for(var i=s.children,a=0,r=i.length;a<r&&i[a]!==t._bx;)a+=1;var n;a<=r-2&&(n=i[a+1]);var h=y("use");h.setAttribute("href","#"+e),n?s.insertBefore(h,n):s.appendChild(h)}},ct.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var s="matte_"+p(5)+"_"+ke++,i=y("mask");i.setAttribute("id",e.layerId),i.setAttribute("mask-type","alpha"),be.push(e);var a=t._x.defs;a.appendChild(i);var r=y("symbol");r.setAttribute("id",s),this.replaceInParent(e,s),r.appendChild(e._bx),a.appendChild(r),useElem=y("use"),useElem.setAttribute("href","#"+s),i.appendChild(useElem),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},ct.prototype.initialize=function(){for(var t=this._cl._cm[0].p.v,e=0,s=this.elem.comp._br.length;e<s;)this.elem.comp._br[e].data.ind===t&&this.setElementAsMask(this.elem,this.elem.comp._br[e]),e+=1;this.initialized=!0},ct.prototype._ba=function(){this.initialized||this.initialize()},ut.prototype._ba=function(t){var e,s=this.filters.length;for(e=0;e<s;e+=1)this.filters[e]._ba(t)};var Ae=function(){function e(t){for(var e=0,s=t.target;e<E;)M[e].animation===s&&(M.splice(e,1),e-=1,E-=1,s.isPaused||a()),e+=1}function s(t,e){if(!t)return null;for(var s=0;s<E;){if(M[s].elem==t&&null!==M[s].elem)return M[s].animation;s+=1}var i=new Pe;return r(i,t),i.setData(t,e),i}function i(){F+=1,A()}function a(){F-=1,0===F&&(w=!0)}function r(t,s){t.addEventListener("destroy",e),t.addEventListener("_active",i),t.addEventListener("_idle",a),M.push({elem:s,animation:t}),E+=1}function n(t){var e=new Pe;return r(e,null),e.setParams(t),e}function h(t,e){var s;for(s=0;s<E;s+=1)M[s].animation.setSpeed(t,e)}function o(t,e){var s;for(s=0;s<E;s+=1)M[s].animation.setDirection(t,e)}function p(t){var e;for(e=0;e<E;e+=1)M[e].animation.play(t)}function l(t,e){_=Date.now();var s;for(s=0;s<E;s+=1)M[s].animation.moveFrame(t,e)}function f(e){var s,i=e-_;for(s=0;s<E;s+=1)M[s].animation.advanceTime(i);_=e,w?C=!0:t.requestAnimationFrame(f)}function m(e){_=e,t.requestAnimationFrame(f)}function d(t){var e;for(e=0;e<E;e+=1)M[e].animation.pause(t)}function c(t,e,s){var i;for(i=0;i<E;i+=1)M[i].animation.goToAndStop(t,e,s)}function u(t){var e;for(e=0;e<E;e+=1)M[e].animation.stop(t)}function g(t){var e;for(e=0;e<E;e+=1)M[e].animation.togglePause(t)}function y(t){var e;for(e=E-1;e>=0;e-=1)M[e].animation.destroy(t)}function b(t,e,i){var a,r=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=r.length;for(a=0;a<n;a+=1)i&&r[a].setAttribute("data-bm-type",i),s(r[a],t);if(e&&0===n){i||(i="svg");var h=document.getElementsByTagName("body")[0];h.innerHTML="";var o=v("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",i),
h.appendChild(o),s(o,t)}}function k(){var t;for(t=0;t<E;t+=1)M[t].animation.resize()}function A(){w&&(w=!1,C&&(t.requestAnimationFrame(m),C=!1))}var P={},M=[],_=0,E=0,w=!0,F=0,C=!0;return P.registerAnimation=s,P.loadAnimation=n,P.setSpeed=h,P.setDirection=o,P.play=p,P.moveFrame=l,P.pause=d,P.stop=u,P.togglePause=g,P.searchAnimations=b,P.resize=k,P.goToAndStop=c,P.destroy=y,P}(),Pe=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._dc=0,this.playCount=0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=p(10),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=Gt,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=e()};b([u],Pe),Pe.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 _aq(this,t.rendererSettings);break;case"svg":this.renderer=new R(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new _ap(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(t.loop===!1?this.loop=!1:t.loop===!0?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,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;t.path.lastIndexOf("\\")!=-1?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=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){}}}},Pe.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||("false"===a?s.loop=!1:"true"===a?s.loop=!0:s.loop=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;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)},Pe.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;s<n;s+=1)for(e=0;e<a;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer._x._cr.addChars(t.chars),this.renderer._x._cr.addFonts(t.fonts,this.renderer._x.defs)),t.assets)for(a=t.assets.length,e=0;e<a;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,se.completeData(this.animationData,this.renderer._x._cr),this.renderer.includeLayers(t.layers),Nt&&Nt.initExpressions(this),this.renderer._ba(null),this.loadNextSegment()},Pe.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){}}},Pe.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},Pe.prototype.configAnimation=function(t){var e=this;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._ch=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new oe,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets,function(t){t||e.trigger("loaded_images")}),this.loadSegments(),this.updaFrameModifier(),this.renderer._x._cr?this.waitForFontsLoaded():(se.completeData(this.animationData,this.renderer._x._cr),this.checkLoaded()))},Pe.prototype.waitForFontsLoaded=function(){function t(){this.renderer._x._cr.loaded?(se.completeData(this.animationData,this.renderer._x._cr),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),Pe.prototype.addPendingElement=function(){this._dc+=1},Pe.prototype.elementLoaded=function(){this._dc--,this.checkLoaded()},Pe.prototype.checkLoaded=function(){0===this._dc&&(Nt&&Nt.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},Pe.prototype.resize=function(){this.renderer.updateContainerSize()},Pe.prototype.setSubframe=function(t){this.subframeEnabled=!!t},Pe.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this._ba()},Pe.prototype._ba=function(){this.isLoaded!==!1&&this.renderer._ba(this.currentFrame+this._ch)},Pe.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},Pe.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},Pe.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},Pe.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},Pe.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},Pe.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},Pe.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))},Pe.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},Pe.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},Pe.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._ch=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this._ch=t[0],this.setCurrentRawFrameValue(.001)),this.trigger("segmentStart")},Pe.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this._ch<t?s=t:this.currentRawFrame+this._ch>e&&(s=e-t)),this._ch=t,this.totalFrames=e-t,s!==-1&&this.goToAndStop(s,!0)},Pe.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;s<i;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},Pe.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.adjustSegment(this.segments.shift())},Pe.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},Pe.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},Pe.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,this.renderer=null)},Pe.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;this.currentRawFrame>=this.totalFrames?(this.checkSegments(),this.loop===!1?(this.currentRawFrame=this.totalFrames,e=!0):(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment?(this.currentRawFrame=this.totalFrames,e=!0):this.currentRawFrame=this.currentRawFrame%this.totalFrames)):this.currentRawFrame<0&&(this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,e=!0):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames)),this.gotoFrame(),e&&(this.pause(),this.trigger("complete"))},Pe.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},Pe.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},Pe.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},Pe.prototype.getPath=function(){return this.path},Pe.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;s.indexOf("images/")!==-1&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},Pe.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;e<s;){if(t==this.assets[e].id)return this.assets[e];e+=1}},Pe.prototype.hide=function(){this.renderer.hide()},Pe.prototype.show=function(){this.renderer.show()},Pe.prototype.getAssets=function(){return this.assets},Pe.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this._cy(t,new a(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this._cy(t,new n(t,this.loop,this.playCount,this.frameMult));break;case"complete":this._cy(t,new r(t,this.frameMult));break;case"segmentStart":this._cy(t,new h(t,this._ch,this.totalFrames));break;case"destroy":this._cy(t,new o(t,this));break;default:this._cy(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._ch,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new o(t,this))};var Me={};Me.play=yt,Me.pause=vt,Me.setLocationHref=gt,Me.togglePause=bt,Me.setSpeed=kt,Me.setDirection=At,Me.stop=Pt,Me.moveFrame=Mt,Me.searchAnimations=_t,Me.registerAnimation=Et,Me.loadAnimation=xt,Me.setSubframeRendering=Ct,Me.resize=wt,Me.goToAndStop=Ft,Me.destroy=Dt,Me.setQuality=St,Me.inBrowser=Tt,Me.installPlugin=It,Me.__getFactory=Lt,Me.version="5.0.6";var _e="__[STANDALONE]__",Ee="__[ANIMATIONDATA]__",we="";if(_e){var Fe=document.getElementsByTagName("script"),Ce=Fe.length-1,xe=Fe[Ce]||{src:""},De=xe.src.replace(/^[^\?]+\??/,"");we=Vt("renderer")}var Se=setInterval(Rt,100);return Me});