From 794da29e0da2ce34fa9f764be7e1c10504bee760 Mon Sep 17 00:00:00 2001 From: ShakeFlower Date: Sun, 27 Jul 2025 18:45:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:opus=E6=8F=92=E4=BB=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 3 + libs/thirdparty/codec-parser.min.js | 1 + libs/thirdparty/ogg-opus-decoder.min.js | Bin 0 -> 111522 bytes libs/thirdparty/ogg-vorbis-decoder.min.js | 195 ++ project/plugins.js | 2101 ++++++++++++++++++++- project/sounds/floor.mp3 | Bin 1879 -> 2316 bytes 6 files changed, 2299 insertions(+), 1 deletion(-) create mode 100644 libs/thirdparty/codec-parser.min.js create mode 100644 libs/thirdparty/ogg-opus-decoder.min.js create mode 100644 libs/thirdparty/ogg-vorbis-decoder.min.js diff --git a/index.html b/index.html index 5fdfca46..9a0b7b2f 100644 --- a/index.html +++ b/index.html @@ -207,6 +207,9 @@ + + + diff --git a/libs/thirdparty/codec-parser.min.js b/libs/thirdparty/codec-parser.min.js new file mode 100644 index 00000000..fb4ac2e9 --- /dev/null +++ b/libs/thirdparty/codec-parser.min.js @@ -0,0 +1 @@ +var CodecParser=function(e){"use strict";const t=Symbol,s=(()=>{const e="left",t="center",s="right";return["","front ","side ","rear "].map((i=>[[e,s],[e,s,t],[e,t,s],[t,e,s],[t]].flatMap((e=>e.map((e=>i+e)).join(", ")))))})(),i="LFE",r="monophonic (mono)",n="stereo",a="surround",o=(e,...t)=>`${[r,n,`linear ${a}`,"quadraphonic",`5.0 ${a}`,`5.1 ${a}`,`6.1 ${a}`,`7.1 ${a}`][e-1]} (${t.join(", ")})`,h=[r,o(2,s[0][0]),o(3,s[0][2]),o(4,s[1][0],s[3][0]),o(5,s[1][2],s[3][0]),o(6,s[1][2],s[3][0],i),o(7,s[1][2],s[2][0],s[3][4],i),o(8,s[1][2],s[2][0],s[3][0],i)],c=48e3,l=44100,u=32e3,d=24e3,p=22050,_=16e3,m=8e3,g="absoluteGranulePosition",f="bandwidth",b="bitDepth",C="bitrate",y=C+"Maximum",S=C+"Minimum",w=C+"Nominal",P="buffer",k=P+"Fullness",v="codec",F=v+"Frames",x="coupledStreamCount",H="crc",I=H+"16",M=H+"32",U="data",O="description",N="duration",$="emphasis",A="hasOpusPadding",R="header",B="isContinuedPacket",L="isCopyrighted",D="isFirstPage",T="isHome",E="isLastPage",G="isOriginal",z="isPrivate",q="isVbr",V="layer",j="length",W="mode",J=W+"Extension",K="mpeg",Q=K+"Version",X="numberAACFrames",Y="outputGain",Z="preSkip",ee="profile",te=t(),se="protection",ie="rawData",re="segments",ne="subarray",ae="version",oe="vorbis",he=oe+"Comments",ce=oe+"Setup",le="block",ue=le+"ingStrategy",de=t(),pe=le+"Size",_e=le+"size0",me=le+"size1",ge=t(),fe="channel",be=fe+"MappingFamily",Ce=fe+"MappingTable",ye=fe+"Mode",Se=t(),we=fe+"s",Pe="copyright",ke=Pe+"Id",ve=Pe+"IdStart",Fe="frame",xe=Fe+"Count",He=Fe+"Length",Ie="Number",Me=Fe+Ie,Ue=Fe+"Padding",Oe=Fe+"Size",Ne="Rate",$e="inputSample"+Ne,Ae="page",Re=Ae+"Checksum",Be=t(),Le=Ae+"SegmentTable",De=Ae+"Sequence"+Ie,Te="sample",Ee=Te+Ie,Ge=Te+Ne,ze=t(),qe=Te+"s",Ve="stream",je=Ve+"Count",We=Ve+"Info",Je=Ve+"Serial"+Ie,Ke=Ve+"StructureVersion",Qe="total",Xe=Qe+"BytesOut",Ye=Qe+"Duration",Ze=Qe+"Samples",et=t(),tt=t(),st=t(),it=t(),rt=t(),nt=t(),at=t(),ot=t(),ht=t(),ct=t(),lt=t(),ut=t(),dt=t(),pt=t(),_t=t(),mt=t(),gt=t(),ft=t(),bt=Uint8Array,Ct=DataView,yt="reserved",St="bad",wt="free",Pt="none",kt="16bit CRC",vt=(e,t,s)=>{for(let i=0;i0;e--)r=s(r);e[i]=r}return e},Ft=vt(new bt(256),(e=>e),(e=>128&e?7^e<<1:e<<1)),xt=[vt(new Uint16Array(256),(e=>e<<8),(e=>e<<1^(32768&e?32773:0)))],Ht=[vt(new Uint32Array(256),(e=>e),(e=>e>>>1^3988292384*(1&e)))];for(let e=0;e<15;e++){xt.push(new Uint16Array(256)),Ht.push(new Uint32Array(256));for(let t=0;t<=255;t++)xt[e+1][t]=xt[0][xt[e][t]>>>8]^xt[e][t]<<8,Ht[e+1][t]=Ht[e][t]>>>8^Ht[0][255&Ht[e][t]]}const It=e=>{const t=e[j],s=t-16;let i=0,r=0;for(;r<=s;)i=Ht[15][255&(e[r++]^i)]^Ht[14][255&(e[r++]^i>>>8)]^Ht[13][255&(e[r++]^i>>>16)]^Ht[12][e[r++]^i>>>24]^Ht[11][e[r++]]^Ht[10][e[r++]]^Ht[9][e[r++]]^Ht[8][e[r++]]^Ht[7][e[r++]]^Ht[6][e[r++]]^Ht[5][e[r++]]^Ht[4][e[r++]]^Ht[3][e[r++]]^Ht[2][e[r++]]^Ht[1][e[r++]]^Ht[0][e[r++]];for(;r!==t;)i=Ht[0][255&(i^e[r++])]^i>>>8;return~i},Mt=(...e)=>{const t=new bt(e.reduce(((e,t)=>e+t[j]),0));return e.reduce(((e,s)=>(t.set(s,e),e+s[j])),0),t},Ut=e=>String.fromCharCode(...e),Ot=[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],Nt=e=>Ot[15&e]<<4|Ot[e>>4];class $t{constructor(e){this._data=e,this._pos=8*e[j]}set position(e){this._pos=e}get position(){return this._pos}read(e){const t=Math.floor(this._pos/8),s=this._pos%8;this._pos-=e;return(Nt(this._data[t-1])<<8)+Nt(this._data[t])>>7-s&255}}class At{constructor(e,t){this._onCodecHeader=e,this._onCodecUpdate=t,this[_t]()}[mt](){this._isEnabled=!0}[_t](){this._headerCache=new Map,this._codecUpdateData=new WeakMap,this._codecHeaderSent=!1,this._codecShouldUpdate=!1,this._bitrate=null,this._isEnabled=!1}[pt](e,t){if(this._onCodecUpdate){this._bitrate!==e&&(this._bitrate=e,this._codecShouldUpdate=!0);const s=this._codecUpdateData.get(this._headerCache.get(this._currentHeader));this._codecShouldUpdate&&s&&this._onCodecUpdate({bitrate:e,...s},t),this._codecShouldUpdate=!1}}[ht](e){const t=this._headerCache.get(e);return t&&this._updateCurrentHeader(e),t}[ct](e,t,s){this._isEnabled&&(this._codecHeaderSent||(this._onCodecHeader({...t}),this._codecHeaderSent=!0),this._updateCurrentHeader(e),this._headerCache.set(e,t),this._codecUpdateData.set(t,s))}_updateCurrentHeader(e){this._onCodecUpdate&&e!==this._currentHeader&&(this._codecShouldUpdate=!0,this._currentHeader=e)}}const Rt=new WeakMap,Bt=new WeakMap;class Lt{constructor(e,t){this._codecParser=e,this._headerCache=t}*[at](){let e;for(;;){if(e=yield*this.Frame[lt](this._codecParser,this._headerCache,0),e)return e;this._codecParser[tt](1)}}*[ot](e){let t=yield*this[at]();const s=Bt.get(t)[j];if(e||this._codecParser._flushing||(yield*this.Header[ht](this._codecParser,this._headerCache,s)))return this._headerCache[mt](),this._codecParser[tt](s),this._codecParser[it](t),t;this._codecParser[rt](`Missing ${Fe} at ${s} bytes from current position.`,`Dropping current ${Fe} and trying again.`),this._headerCache[_t](),this._codecParser[tt](1)}}class Dt{constructor(e,t){Bt.set(this,{[R]:e}),this[U]=t}}class Tt extends Dt{static*[lt](e,t,s,i,r){const n=yield*e[ht](s,i,r);if(n){const e=Rt.get(n)[He],i=Rt.get(n)[qe];return new t(n,(yield*s[et](e,r))[ne](0,e),i)}return null}constructor(e,t,s){super(e,t),this[R]=e,this[qe]=s,this[N]=s/e[Ge]*1e3,this[Me]=null,this[Xe]=null,this[Ze]=null,this[Ye]=null,Bt.get(this)[j]=t[j]}}const Et="unsynchronizationFlag",Gt="extendedHeaderFlag",zt="experimentalFlag",qt="footerPresent";class Vt{static*getID3v2Header(e,t,s){const i={};let r=yield*e[et](3,s);if(73!==r[0]||68!==r[1]||51!==r[2])return null;if(r=yield*e[et](10,s),i[ae]=`id3v2.${r[3]}.${r[4]}`,15&r[5])return null;if(i[Et]=!!(128&r[5]),i[Gt]=!!(64&r[5]),i[zt]=!!(32&r[5]),i[qt]=!!(16&r[5]),128&r[6]||128&r[7]||128&r[8]||128&r[9])return null;const n=r[6]<<21|r[7]<<14|r[8]<<7|r[9];return i[j]=10+n,new Vt(i)}constructor(e){this[ae]=e[ae],this[Et]=e[Et],this[Gt]=e[Gt],this[zt]=e[zt],this[qt]=e[qt],this[j]=e[j]}}class jt{constructor(e){Rt.set(this,e),this[b]=e[b],this[C]=null,this[we]=e[we],this[ye]=e[ye],this[Ge]=e[Ge]}}const Wt={0:[wt,wt,wt,wt,wt],16:[32,32,32,32,8],240:[St,St,St,St,St]},Jt=(e,t,s)=>8*((e+s)%t+t)*(1<<(e+s)/t)-8*t*(t/8|0);for(let e=2;e<15;e++)Wt[e<<4]=[32*e,Jt(e,4,0),Jt(e,4,-1),Jt(e,8,4),Jt(e,8,0)];const Kt="bands ",Qt=" to 31",Xt={0:Kt+4+Qt,16:Kt+8+Qt,32:Kt+12+Qt,48:Kt+16+Qt},Yt="bitrateIndex",Zt="v2",es="v1",ts="Intensity stereo ",ss=", MS stereo ",is="on",rs="off",ns={0:ts+rs+ss+rs,16:ts+is+ss+rs,32:ts+rs+ss+is,48:ts+is+ss+is},as={0:{[O]:yt},2:{[O]:"Layer III",[Ue]:1,[J]:ns,[es]:{[Yt]:2,[qe]:1152},[Zt]:{[Yt]:4,[qe]:576}},4:{[O]:"Layer II",[Ue]:1,[J]:Xt,[qe]:1152,[es]:{[Yt]:1},[Zt]:{[Yt]:4}},6:{[O]:"Layer I",[Ue]:4,[J]:Xt,[qe]:384,[es]:{[Yt]:0},[Zt]:{[Yt]:3}}},os="MPEG Version ",hs="ISO/IEC ",cs={0:{[O]:`${os}2.5 (later extension of MPEG 2)`,[V]:Zt,[Ge]:{0:11025,4:12e3,8:m,12:yt}},8:{[O]:yt},16:{[O]:`${os}2 (${hs}13818-3)`,[V]:Zt,[Ge]:{0:p,4:d,8:_,12:yt}},24:{[O]:`${os}1 (${hs}11172-3)`,[V]:es,[Ge]:{0:l,4:c,8:u,12:yt}},length:j},ls={0:kt,1:Pt},us={0:Pt,1:"50/15 ms",2:yt,3:"CCIT J.17"},ds={0:{[we]:2,[O]:n},64:{[we]:2,[O]:"joint "+n},128:{[we]:2,[O]:"dual channel"},192:{[we]:1,[O]:r}};class ps extends jt{static*[ht](e,t,s){const i={},r=yield*Vt.getID3v2Header(e,t,s);r&&(yield*e[et](r[j],s),e[tt](r[j]));const n=yield*e[et](4,s),a=Ut(n[ne](0,4)),o=t[ht](a);if(o)return new ps(o);if(255!==n[0]||n[1]<224)return null;const h=cs[24&n[1]];if(h[O]===yt)return null;const c=6&n[1];if(as[c][O]===yt)return null;const l={...as[c],...as[c][h[V]]};if(i[Q]=h[O],i[V]=l[O],i[qe]=l[qe],i[se]=ls[1&n[1]],i[j]=4,i[C]=Wt[240&n[2]][l[Yt]],i[C]===St)return null;if(i[Ge]=h[Ge][12&n[2]],i[Ge]===yt)return null;if(i[Ue]=2&n[2]&&l[Ue],i[z]=!!(1&n[2]),i[He]=Math.floor(125*i[C]*i[qe]/i[Ge]+i[Ue]),!i[He])return null;const u=192&n[3];if(i[ye]=ds[u][O],i[we]=ds[u][we],i[J]=l[J][48&n[3]],i[L]=!!(8&n[3]),i[G]=!!(4&n[3]),i[$]=us[3&n[3]],i[$]===yt)return null;i[b]=16;{const{length:e,frameLength:s,samples:r,...n}=i;t[ct](a,i,n)}return new ps(i)}constructor(e){super(e),this[C]=e[C],this[$]=e[$],this[Ue]=e[Ue],this[L]=e[L],this[G]=e[G],this[z]=e[z],this[V]=e[V],this[J]=e[J],this[Q]=e[Q],this[se]=e[se]}}class _s extends Tt{static*[lt](e,t,s){return yield*super[lt](ps,_s,e,t,s)}constructor(e,t,s){super(e,t,s)}}class ms extends Lt{constructor(e,t,s){super(e,t),this.Frame=_s,this.Header=ps,s(this[v])}get[v](){return K}*[ut](){return yield*this[ot]()}}const gs={0:"MPEG-4",8:"MPEG-2"},fs={0:"valid",2:St,4:St,6:St},bs={0:kt,1:Pt},Cs={0:"AAC Main",64:"AAC LC (Low Complexity)",128:"AAC SSR (Scalable Sample Rate)",192:"AAC LTP (Long Term Prediction)"},ys={0:96e3,4:88200,8:64e3,12:c,16:l,20:u,24:d,28:p,32:_,36:12e3,40:11025,44:m,48:7350,52:yt,56:yt,60:"frequency is written explicitly"},Ss={0:{[we]:0,[O]:"Defined in AOT Specific Config"},64:{[we]:1,[O]:r},128:{[we]:2,[O]:o(2,s[0][0])},192:{[we]:3,[O]:o(3,s[1][3])},256:{[we]:4,[O]:o(4,s[1][3],s[3][4])},320:{[we]:5,[O]:o(5,s[1][3],s[3][0])},384:{[we]:6,[O]:o(6,s[1][3],s[3][0],i)},448:{[we]:8,[O]:o(8,s[1][3],s[2][0],s[3][0],i)}};class ws extends jt{static*[ht](e,t,s){const i={},r=yield*e[et](7,s),n=Ut([r[0],r[1],r[2],252&r[3]|3&r[6]]),a=t[ht](n);if(a)Object.assign(i,a);else{if(255!==r[0]||r[1]<240)return null;if(i[Q]=gs[8&r[1]],i[V]=fs[6&r[1]],i[V]===St)return null;const e=1&r[1];i[se]=bs[e],i[j]=e?7:9,i[te]=192&r[2],i[ze]=60&r[2];const s=2&r[2];if(i[ee]=Cs[i[te]],i[Ge]=ys[i[ze]],i[Ge]===yt)return null;i[z]=!!s,i[Se]=448&(r[2]<<8|r[3]),i[ye]=Ss[i[Se]][O],i[we]=Ss[i[Se]][we],i[G]=!!(32&r[3]),i[T]=!!(8&r[3]),i[ke]=!!(8&r[3]),i[ve]=!!(4&r[3]),i[b]=16,i[qe]=1024,i[X]=3&r[6];{const{length:e,channelModeBits:s,profileBits:r,sampleRateBits:a,frameLength:o,samples:h,numberAACFrames:c,...l}=i;t[ct](n,i,l)}}if(i[He]=8191&(r[3]<<11|r[4]<<3|r[5]>>5),!i[He])return null;const o=2047&(r[5]<<6|r[6]>>2);return i[k]=2047===o?"VBR":o,new ws(i)}constructor(e){super(e),this[ke]=e[ke],this[ve]=e[ve],this[k]=e[k],this[T]=e[T],this[G]=e[G],this[z]=e[z],this[V]=e[V],this[j]=e[j],this[Q]=e[Q],this[X]=e[X],this[ee]=e[ee],this[se]=e[se]}get audioSpecificConfig(){const e=Rt.get(this),t=e[te]+64<<5|e[ze]<<5|e[Se]>>3,s=new bt(2);return new Ct(s[P]).setUint16(0,t,!1),s}}class Ps extends Tt{static*[lt](e,t,s){return yield*super[lt](ws,Ps,e,t,s)}constructor(e,t,s){super(e,t,s)}}class ks extends Lt{constructor(e,t,s){super(e,t),this.Frame=Ps,this.Header=ws,s(this[v])}get[v](){return"aac"}*[ut](){return yield*this[ot]()}}class vs extends Tt{static _getFrameFooterCrc16(e){return(e[e[j]-2]<<8)+e[e[j]-1]}static[ft](e){const t=vs._getFrameFooterCrc16(e),s=(e=>{const t=e[j],s=t-16;let i=0,r=0;for(;r<=s;)i^=e[r++]<<8|e[r++],i=xt[15][i>>8]^xt[14][255&i]^xt[13][e[r++]]^xt[12][e[r++]]^xt[11][e[r++]]^xt[10][e[r++]]^xt[9][e[r++]]^xt[8][e[r++]]^xt[7][e[r++]]^xt[6][e[r++]]^xt[5][e[r++]]^xt[4][e[r++]]^xt[3][e[r++]]^xt[2][e[r++]]^xt[1][e[r++]]^xt[0][e[r++]];for(;r!==t;)i=(255&i)<<8^xt[0][i>>8^e[r++]];return i})(e[ne](0,-2));return t===s}constructor(e,t,s){t[We]=s,t[I]=vs._getFrameFooterCrc16(e),super(t,e,Rt.get(t)[qe])}}const Fs="get from STREAMINFO metadata block",xs={0:"Fixed",1:"Variable"},Hs={0:yt,16:192};for(let e=2;e<16;e++)Hs[e<<4]=e<6?576*2**(e-2):2**e;const Is={0:Fs,1:88200,2:176400,3:192e3,4:m,5:_,6:p,7:d,8:u,9:l,10:c,11:96e3,15:St},Ms={0:{[we]:1,[O]:r},16:{[we]:2,[O]:o(2,s[0][0])},32:{[we]:3,[O]:o(3,s[0][1])},48:{[we]:4,[O]:o(4,s[1][0],s[3][0])},64:{[we]:5,[O]:o(5,s[1][1],s[3][0])},80:{[we]:6,[O]:o(6,s[1][1],i,s[3][0])},96:{[we]:7,[O]:o(7,s[1][1],i,s[3][4],s[2][0])},112:{[we]:8,[O]:o(8,s[1][1],i,s[3][0],s[2][0])},128:{[we]:2,[O]:`${n} (left, diff)`},144:{[we]:2,[O]:`${n} (diff, right)`},160:{[we]:2,[O]:`${n} (avg, diff)`},176:yt,192:yt,208:yt,224:yt,240:yt},Us={0:Fs,2:8,4:12,6:yt,8:16,10:20,12:24,14:yt};class Os extends jt{static _decodeUTF8Int(e){if(e[0]>254)return null;if(e[0]<128)return{value:e[0],length:1};let t=1;for(let s=64;s&e[0];s>>=1)t++;let s=t-1,i=0,r=0;for(;s>0;r+=6,s--){if(128!=(192&e[s]))return null;i|=(63&e[s])<>t)<{let t=0;const s=e[j];for(let i=0;i!==s;i++)t=Ft[t^e[i]];return t})(i[ne](0,r[j]-1)))return null;if(!a){const{blockingStrategyBits:e,frameNumber:s,sampleNumber:i,samples:a,sampleRateBits:o,blockSizeBits:h,crc:c,length:l,...u}=r;t[ct](n,r,u)}return new Os(r)}constructor(e){super(e),this[I]=null,this[ue]=e[ue],this[pe]=e[pe],this[Me]=e[Me],this[Ee]=e[Ee],this[We]=null}}class Ns extends Lt{constructor(e,t,s){super(e,t),this.Frame=vs,this.Header=Os,s(this[v])}get[v](){return"flac"}*_getNextFrameSyncOffset(e){const t=yield*this._codecParser[et](2,0),s=t[j]-2;for(;e{const t=Os[gt](e,this._headerCache);if(t)return new vs(e,t,this._streamInfo);this._codecParser[rt]("Failed to parse Ogg FLAC frame","Skipping invalid FLAC frame")})).filter((e=>!!e))),e}}class $s{static*[ht](e,t,s){const i={};let r=yield*e[et](28,s);if(79!==r[0]||103!==r[1]||103!==r[2]||83!==r[3])return null;i[Ke]=r[4];if(248&r[5])return null;i[E]=!!(4&r[5]),i[D]=!!(2&r[5]),i[B]=!!(1&r[5]);const n=new Ct(bt.from(r[ne](0,28))[P]);i[g]=((e,t)=>{try{return e.getBigInt64(t,!0)}catch{const s=128&e.getUint8(t+7)?-1:1;let i=e.getUint32(t,!0),r=e.getUint32(t+4,!0);return-1===s&&(i=1+~i,r=1+~r),r>1048575&&console.warn("This platform does not support BigInt"),s*(i+r*2**32)}})(n,6),i[Je]=n.getInt32(14,!0),i[De]=n.getInt32(18,!0),i[Re]=n.getInt32(22,!0);const a=r[26];i[j]=a+27,r=yield*e[et](i[j],s),i[He]=0,i[Le]=[],i[Be]=bt.from(r[ne](27,i[j]));for(let e=0,t=0;e{const t=Ws[gt](this._identificationHeader,e,this._headerCache);if(t){null===this._preSkipRemaining&&(this._preSkipRemaining=t[Z]);let s=t[Oe]*t[xe]/1e3*t[Ge];return this._preSkipRemaining>0&&(this._preSkipRemaining-=s,s=this._preSkipRemaining<0?-this._preSkipRemaining:0),new Rs(e,t,s)}this._codecParser[nt]("Failed to parse Ogg Opus Header","Not a valid Ogg Opus file")}))),e}}class Ks extends Tt{constructor(e,t,s){super(t,e,s)}}const Qs={};for(let e=0;e<8;e++)Qs[e+6]=2**(6+e);class Xs extends jt{static[gt](e,t,s,i){if(e[j]<30)throw new Error("Out of data while inside an Ogg Page");const r=Ut(e[ne](0,30)),n=t[ht](r);if(n)return new Xs(n);const a={[j]:30};if("vorbis"!==r.substr(0,7))return null;a[U]=bt.from(e[ne](0,30));const o=new Ct(a[U][P]);if(a[ae]=o.getUint32(7,!0),0!==a[ae])return null;if(a[we]=e[11],a[ye]=h[a[we]-1]||"application defined",a[Ge]=o.getUint32(12,!0),a[y]=o.getInt32(16,!0),a[w]=o.getInt32(20,!0),a[S]=o.getInt32(24,!0),a[me]=Qs[(240&e[28])>>4],a[_e]=Qs[15&e[28]],a[_e]>a[me])return null;if(1!==e[29])return null;a[b]=32,a[ce]=i,a[he]=s;{const{length:e,data:s,version:i,vorbisSetup:n,vorbisComments:o,...h}=a;t[ct](r,a,h)}return new Xs(a)}constructor(e){super(e),this[y]=e[y],this[S]=e[S],this[w]=e[w],this[_e]=e[_e],this[me]=e[me],this[U]=e[U],this[he]=e[he],this[ce]=e[ce]}}class Ys extends Lt{constructor(e,t,s){super(e,t),this.Frame=Ks,s(this[v]),this._identificationHeader=null,this._setupComplete=!1,this._prevBlockSize=null}get[v](){return oe}[dt](e){e[F]=[];for(const t of Bt.get(e)[re])if(1===t[0])this._headerCache[mt](),this._identificationHeader=e[U],this._setupComplete=!1;else if(3===t[0])this._vorbisComments=t;else if(5===t[0])this._vorbisSetup=t,this._mode=this._parseSetupHeader(t),this._setupComplete=!0;else if(this._setupComplete){const s=Xs[gt](this._identificationHeader,this._headerCache,this._vorbisComments,this._vorbisSetup);s?e[F].push(new Ks(t,s,this._getSamples(t,s))):this._codecParser[logError]("Failed to parse Ogg Vorbis Header","Not a valid Ogg Vorbis file")}return e}_getSamples(e,t){const s=this._mode.blockFlags[e[0]>>1&this._mode.mask]?t[me]:t[_e],i=null===this._prevBlockSize?0:(this._prevBlockSize+s)/4;return this._prevBlockSize=s,i}_parseSetupHeader(e){const t=new $t(e),s={count:0,blockFlags:[]};for(;1&~t.read(1););let i;for(;s.count<64&&t.position>0;){Nt(t.read(8));let e=0;for(;0===t.read(8)&&e++<3;);if(4!==e){1+((126&Nt(i))>>1)!==s.count&&this._codecParser[rt]("vorbis derived mode count did not match actual mode count");break}i=t.read(7),s.blockFlags.unshift(1&i),t.position+=6,s.count++}return s.mask=(1<1&&e[De]>1&&this._codecParser[rt]("Unexpected gap in Ogg Page Sequence Number.",`Expected: ${this._pageSequenceNumber+1}, Got: ${e[De]}`),this._pageSequenceNumber=e[De]}_parsePage(e){null===this._isSupported&&(this._pageSequenceNumber=e[De],this._isSupported=this._checkCodecSupport(e)),this._checkPageSequenceNumber(e);const t=Bt.get(e),s=Rt.get(t[R]);let i=0;if(t[re]=s[Le].map((t=>e[U][ne](i,i+=t))),this._continuedPacket[j]&&(t[re][0]=Mt(this._continuedPacket,t[re][0]),this._continuedPacket=new bt),255===s[Be][s[Be][j]-1]&&(this._continuedPacket=Mt(this._continuedPacket,t[re].pop())),null!==this._previousAbsoluteGranulePosition&&(e[qe]=Number(e[g]-this._previousAbsoluteGranulePosition)),this._previousAbsoluteGranulePosition=e[g],this._isSupported){const t=this._parser[dt](e);return this._codecParser[it](t),t}return e}}class ei extends Lt{constructor(e,t,s){super(e,t),this._onCodec=s,this.Frame=As,this.Header=$s,this._streams=new Map,this._currentSerialNumber=null}get[v](){const e=this._streams.get(this._currentSerialNumber);return e?e.codec:""}*[ut](){const e=yield*this[ot](!0);this._currentSerialNumber=e[Je];let t=this._streams.get(this._currentSerialNumber);return t||(t=new Zs(this._codecParser,this._headerCache,this._onCodec),this._streams.set(this._currentSerialNumber,t)),e[E]&&this._streams.delete(this._currentSerialNumber),t._parsePage(e)}}const ti=()=>{};const si=g,ii=f,ri=b,ni=C,ai=y,oi=S,hi=w,ci=P,li=k,ui=v,di=F,pi=x,_i=H,mi=I,gi=M,fi=U,bi=O,Ci=N,yi=$,Si=A,wi=R,Pi=B,ki=L,vi=D,Fi=T,xi=E,Hi=G,Ii=z,Mi=q,Ui=V,Oi=j,Ni=W,$i=J,Ai=K,Ri=Q,Bi=X,Li=Y,Di=Z,Ti=ee,Ei=se,Gi=ie,zi=re,qi=ne,Vi=ae,ji=oe,Wi=he,Ji=ce,Ki=ue,Qi=pe,Xi=_e,Yi=me,Zi=be,er=Ce,tr=ye,sr=we,ir=ke,rr=ve,nr=Fe,ar=xe,or=He,hr=Me,cr=Ue,lr=Oe,ur=$e,dr=Re,pr=Le,_r=De,mr=Ee,gr=Ge,fr=qe,br=je,Cr=We,yr=Je,Sr=Ke,wr=Xe,Pr=Ye,kr=Ze;return e.CodecParser=class{constructor(e,{onCodec:t,onCodecHeader:s,onCodecUpdate:i,enableLogging:r=!1,enableFrameCRC32:n=!0}={}){this._inputMimeType=e,this._onCodec=t||ti,this._onCodecHeader=s||ti,this._onCodecUpdate=i,this._enableLogging=r,this._crc32=n?It:ti,this[_t]()}get[v](){return this._parser?this._parser[v]:""}[_t](){this._headerCache=new At(this._onCodecHeader,this._onCodecUpdate),this._generator=this._getGenerator(),this._generator.next()}*flush(){this._flushing=!0;for(let e=this._generator.next();e.value;e=this._generator.next())yield e.value;this._flushing=!1,this[_t]()}*parseChunk(e){for(let t=this._generator.next(e);t.value;t=this._generator.next())yield t.value}parseAll(e){return[...this.parseChunk(e),...this.flush()]}*_getGenerator(){if(this._inputMimeType.match(/aac/))this._parser=new ks(this,this._headerCache,this._onCodec);else if(this._inputMimeType.match(/mpeg/))this._parser=new ms(this,this._headerCache,this._onCodec);else if(this._inputMimeType.match(/flac/))this._parser=new Ns(this,this._headerCache,this._onCodec);else{if(!this._inputMimeType.match(/ogg/))throw new Error(`Unsupported Codec ${mimeType}`);this._parser=new ei(this,this._headerCache,this._onCodec)}for(this._frameNumber=0,this._currentReadPosition=0,this._totalBytesIn=0,this._totalBytesOut=0,this._totalSamples=0,this._sampleRate=void 0,this._rawData=new Uint8Array(0);;){const e=yield*this._parser[ut]();e&&(yield e)}}*[et](e=0,t=0){let s;for(;this._rawData[j]<=e+t;){if(s=yield,this._flushing)return this._rawData[ne](t);s&&(this._totalBytesIn+=s[j],this._rawData=Mt(this._rawData,s))}return this._rawData[ne](t)}[tt](e){this._currentReadPosition+=e,this._rawData=this._rawData[ne](e)}[st](e){this._sampleRate=e[R][Ge],e[R][C]=e[N]>0?8*Math.round(e[U][j]/e[N]):0,e[Me]=this._frameNumber++,e[Xe]=this._totalBytesOut,e[Ze]=this._totalSamples,e[Ye]=this._totalSamples/this._sampleRate*1e3,e[M]=this._crc32(e[U]),this._headerCache[pt](e[R][C],e[Ye]),this._totalBytesOut+=e[U][j],this._totalSamples+=e[qe]}[it](e){if(e[F]){if(e[E]){let t=e[qe];e[F].forEach((e=>{const s=e[qe];t0?t:0,e[N]=e[qe]/e[R][Ge]*1e3),t-=s,this[st](e)}))}else e[qe]=0,e[F].forEach((t=>{e[qe]+=t[qe],this[st](t)}));e[N]=e[qe]/this._sampleRate*1e3||0,e[Ze]=this._totalSamples,e[Ye]=this._totalSamples/this._sampleRate*1e3||0,e[Xe]=this._totalBytesOut}else this[st](e)}_log(e,t){if(this._enableLogging){const s=[`${v}: ${this[v]}`,`inputMimeType: ${this._inputMimeType}`,`readPosition: ${this._currentReadPosition}`,`totalBytesIn: ${this._totalBytesIn}`,`${Xe}: ${this._totalBytesOut}`],i=Math.max(...s.map((e=>e[j])));t.push(`--stats--${"-".repeat(i-9)}`,...s,"-".repeat(i)),e("codec-parser",t.reduce(((e,t)=>e+"\n "+t),""))}}[rt](...e){this._log(console.warn,e)}[nt](...e){this._log(console.error,e)}},e.absoluteGranulePosition=si,e.bandwidth=ii,e.bitDepth=ri,e.bitrate=ni,e.bitrateMaximum=ai,e.bitrateMinimum=oi,e.bitrateNominal=hi,e.blockSize=Qi,e.blockingStrategy=Ki,e.blocksize0=Xi,e.blocksize1=Yi,e.buffer=ci,e.bufferFullness=li,e.channelMappingFamily=Zi,e.channelMappingTable=er,e.channelMode=tr,e.channels=sr,e.codec=ui,e.codecFrames=di,e.copyrightId=ir,e.copyrightIdStart=rr,e.coupledStreamCount=pi,e.crc=_i,e.crc16=mi,e.crc32=gi,e.data=fi,e.description=bi,e.duration=Ci,e.emphasis=yi,e.frame=nr,e.frameCount=ar,e.frameLength=or,e.frameNumber=hr,e.framePadding=cr,e.frameSize=lr,e.hasOpusPadding=Si,e.header=wi,e.inputSampleRate=ur,e.isContinuedPacket=Pi,e.isCopyrighted=ki,e.isFirstPage=vi,e.isHome=Fi,e.isLastPage=xi,e.isOriginal=Hi,e.isPrivate=Ii,e.isVbr=Mi,e.layer=Ui,e.length=Oi,e.mode=Ni,e.modeExtension=$i,e.mpeg=Ai,e.mpegVersion=Ri,e.numberAACFrames=Bi,e.outputGain=Li,e.pageChecksum=dr,e.pageSegmentTable=pr,e.pageSequenceNumber=_r,e.preSkip=Di,e.profile=Ti,e.protection=Ei,e.rawData=Gi,e.sampleNumber=mr,e.sampleRate=gr,e.samples=fr,e.segments=zi,e.streamCount=br,e.streamInfo=Cr,e.streamSerialNumber=yr,e.streamStructureVersion=Sr,e.subarray=qi,e.totalBytesOut=wr,e.totalDuration=Pr,e.totalSamples=kr,e.version=Vi,e.vorbis=ji,e.vorbisComments=Wi,e.vorbisSetup=Ji,e}({}); diff --git a/libs/thirdparty/ogg-opus-decoder.min.js b/libs/thirdparty/ogg-opus-decoder.min.js new file mode 100644 index 0000000000000000000000000000000000000000..9525201c18fa48870b4e5bfc0a6a9b5e186cae71 GIT binary patch literal 111522 zcmZ^Lhg(zG_BIx<@u*1Xy&53&gdR~;nxH74BA^o?KokNb0i^dT2+|dh-iuV}@H}h% zW8ZrM%*_4W`wcUYoU+f_YrX4TW$!b-o{o221>TC1Y*nFmwlb?QTdC3dIOgeeMcOc5 z-&~b0ujHdoR$+m!Qk$o!@ckcGJ9_%wELCV6brNm3POifr3pPN7Duk^6;fB5*QXf8mqmtB&qTXojvdm zba!{oE>}NQ3*dB?%W>)-ZTU$;JtR4RLaMvFI7ja9FHy)f|Dn%NNe)z~h>-gWS9r+- z@Pz-o0yp6jC>vud&Mpd(e_~GM z6(CW01?lmI4|17DwII<0K>uQVom?%8KH3%uFZ$$4x+$ z(fNgn3my#D_~@#tUVQunNqw@FIV!a>NmE#))aX=7tym+e)P+?-10~8Zfgj!|6`#Qo z)sn*Vqh~~nG0y!H_ZFzMN*|398Y)$a;jh)zlKlU;`V6eXJ%Z(R9v8%?0+O_mD)}4b z$46SNvfyKWxey|XU<)`2MhX)Pa4Z48YkX31z(<#-RD&Vp5B}FJIyfIl?r+gl_@;s| ziT?rQy~ug?M)uavk8K!C29|e+Di`71|t8a_A~BQV*H{D zg$cTms3b~>1_UOqEC|y{;E8IrGGFlhFvK&3fE(=@=(599=LcRXbjmQL<1g$ga^+YF6&(zCY2-yoGRN;j}@H*p3-NiWt&M6|a7b1J;e2Pl6 zd17t40uxCu%&e+P&jfd#9o6_GLVhL8caAKLPZ18}V>-f z3Lh@MSp5Cb!rDq?CNej(vM>|5TD#zKvs9X)8A}K16Ps_4CM zkgd#8YA&;aRF-;?tfI_BsTiXs$XaUsSomD?!c2r4&1!L_RjPT7%u0|TRV1@E#~g6E z)Z(2J=Au7^!?;vtEsTc)K^DRTQ*ab_$}EMWQkxp7)!C2%XQ$2%+rD$cG%;L|2!hyP zJiQbcSbywX4zu&)QcDcs03|^lb3wWqnWdx1K_qC-vIcTXtstmg2AnW+z$phj8wc&A z7MO^&FuK$ZL)Qjbr;0v0iJ(;Lv%6D8XX0UK;Z_HSS~Dx^gZ$=#3eC@EL>(@|fRNG^ z3ZRxCSRuk3W~mXxwW@tDs2NA_D5+(w)S^Z|9h}1?&xE!Rj=-c=QtKKSE`o6SBWKT~ z9Si+adB!DG6mKp{Zi9R?v$pK!b;yUp(9n zR|ywD*clh$0-VG&&OW<}YJva*K@1E1xb4umg`iG6Qa>F0L(rTcavBh*|77{W$r>}X zOoK?m3BcH*2B$2fHnoCpVFq}}`4oaI;>~RZ^Z?redIZ0+#-a0Rr90_??xIHzzy#UM zsN)}S2;cQOg*%wZtZdiY}=Z|;ak;hXS8{PB}oz7{>x zJHCLNct8bD(0_6j=D2NNBLl=zuiDkfgga@*wnpY87)zL+fIFEpJY6O_v*5*VoHBP6 zIa`R#EHMw^5f&0)7vc+KBTBWb34+5!n7anqeSlr@$uY=Q3SC+TwSjX8 zegR`%Jkd4?o~8%AU?Dr84PwAkG65eb($U@lQ-nk;90Uga9Qn|?vk~vwVie%~|Ip(y$9OE_}q3 zarw6S88?~hzw)-(zrQ~D_ZQc6h;J@+s7bXIka6bRdWOVPgl7sSgll6+S2G_$82yk* z!fpC9P)(|y5dU>6#DQi~At3&o4-g>Sj!C7O0mF`VP=eI4Ce`LY9;#VYZ1R4kCY2r7h;1=tDU>7o8J&sgDeg#PmrdX2=PE*jT-6s+<^fB3K&oXdP^0h-j`a{0&@89!563W93wmf7g)ene=Gj)kLSqU zndo{+YNY!3a)x99s3MtNs)fuR|CygTF>Z3Lbv7573;dcUP--`(re`J0TOZ#pTj3@| zBmgbd0r%R-U@pB^A{^NZE^bu=aZ>3U?zGm^2k zxbLyqRXe>1UonuSFwlQ#Lu%`476h%PQWw+(<7GHmf*35L%y4xQLU;MdT*BFY*%kiULK!qDWDU=!NKwC|6V_qE-WmBB4>=|@)ruM zeAH3O|4+4|LJLcw)~S&5BfYMyM$K|w)`%;WUy2GfI&GM;8U@68Hm|wp(}>S&Hl-R# zHA*$4>Zn{a`kKnQ2<-%CRLvLP3zR4x%bhR!4Cr7ai zKIADCMISyYv`XiT&O?^`qKH6iB|kjhOD>ftg!<^Lbx|V85}Ft16?yjA6^^HX55@$)JQe9G@)F?jYE5n@pBq&A0#89(v-lr6|>p#5EH{$eN zwew0bJyWO=FX}^WI0{336@>y=FO~*l2lh@-+EF($iNTo+dm^eEK}a^I!F`ySrYfcppV}Hta2_Oh%cQhO+X5zBt$F zCx?L&P^9UE5>0=3jz)=oqVT-)yZ`R3p>RGsR_Y^Mgi;*3JG&{~Co5m6KnLM`kZ7S- zcn(1=3QE-A0)qZ&EByUzkG~sIO1Uasml^Jd9*Z(u_~PZI%k*NPUhwp zepKYA2q=70sQIkaR8?s`#2)9xyrv{ehnCZMV*z!y(7X{0q0zUp1^++ms;KnsEhqI^ zivZWloppGQ?I{&jgK$-D%xsE(#2<0wWOdhy97Rb-lbCboPDpBL|q(m z@)PLbtjVJjD|`xzgk~O$33z*iISbG~d%E(>4RB0vva^F(@~nT^PUvjGn!8<;43~_p1 zCOVSkMeucjsxF#)D)2$Iwgg>Ev07581_ub|&-~9-e#QVkiE+E~ zp-PvAcqudGvH&kcj`Sdz@J09(8Z3MY2=Y>f3uA#C!*Ok3raTC19qH0wdgD1>i9Y$bNH_j>M^q6QlogZ{8j=-a5y*RPMe{)X3?P%b^D=CcTtvvB+rWa2rc$S-^ zaA2c0i`(ePs**OGXoLsu^1uh)biojfJkFE%c@UFd<_&5w;t?OlVLW6~oQI>oxe4F5 z`Ix&!Ce)9Kw?t+5)zZqHr?huFQtPSWrBIKWm)vB{JA4}CMF+GiPo(~QI!1?}jv6CW zxUG$jd6i~(C6^~?{SD7b>}ki9M`=x5Kr6ghVO&h}m#HHN6Yh70R#yuBads$1R7NM% zkVfBWn2%tDBiiE@R}b#uZn4u<`ud3*dFHMo9r849(UNf-wM&fOau+r8ck05yHtPI9 zJ@l2n@o+8FJx%KnuY-P2YY-1#ihoPT4``WYU1^(^45PW5w{Gw*EhPF7XNw7>%3S)vv+y0n)Ysm=@fXvFJH`Hk;iUX@Q{|b zvxSG1rbqDPZCI69b)i7)N=Hw|aPl;baPelwpNct1Ut#^s5jH)^Plm*82AG#+R}3$(y}j-kBa zkQ-B>yn)#)mgMK~j~i9=I~fp|E96ey9XUhqM})pu`w7OutR9(_%WEdgQ?qe&@jSb2dD}b9@q66ngXZZJ7TzOkYoZ zYVI)LNmu?#JHXc9JvaX8&+Qs@SdMTf&(R(%g~!q~aJc1V4Uzh9RoRF0aUpMqdAH?JprVf2ZbRl%3+lgo?KM<1`JATQ z>GU%FEX|Lh2JV5Y&+yo1T69kgqC*3kgsTk)IlaF_>$FI9IQa|4IiwL|?!IPFieVe0 zxFvy3jU;!{?s^$QHLaiQc!F0FAn@cXsH_p|IL*q>Z!@^7JQ^Cc^MC74OL=_!@;x79 z8}j@^rB$|V}PQ%Y0xJtKyiOsLJ9J0Z=!3ICu;9xY0K>usC*(uBKdB7&Q! zG2TT*jn4ctf`1f-!$}VG*ZmAq0SkS1t6X@qfOcywcnq2xOXD8yy8+>O*_FOl(=4z) zc(eEejrm}#6WXe#LGHjPr&rz@s%VUMzdU>S@)@}H+cP`<8N%JKz+Zd3NWHX`m`?NH zhix9Ad83DyrC`B&nE#Yp#ndfNyu|APG{^e}++}IU3ueZcXa_gmbl|V|xm9V#qjv&n zI)aa`0>h*9(>=e;89XCX(VzsX231zlIRAm6hHGAAaqk-*rnOoCsR?tR<7IoBcrfM? zFY?}7nxhT12`y{DT`hE&>wA}bZ}56Pja6iWecR)3-M1QAu;D?2PoSlqQa=QM6==DS z79a6y%@a&&jCasdyo-@|&#QpgOstkx*3{IHD)CQozL%3<<-E2OF&omkH8g+VC1@rgHt2|LdU$3WX?s3Cw%=9dK*I7g{NTxMSQO%S$rT z575t=iH5e!X^0oi0Kp@3aAX_rP@hCz%>d^W-U;RgNQQq?ZWLSdbfUQeA!mjMJwAlf zVv4ORtT_4E8FbO{k*1vU;r`3CT1~%z$7No1<{r>m7-+YxP*!;f3jPi-%mqDH^I@bs z(W54mzj-?H47EN4+caJMObc1AYNh-8K(KVbuhDB>p?PQce~Xnr2Kfzo914u(x$43c z?ylso_SE|hvVG!xSbq}^K6xwX!xQd(mdLyOtBim6=w4Z5!A{68;;6yNFvp7euUVD6 zDWgAWX(2Lxcy>Q;-Q&)iysFHxqeFjy@((hK7G5#p?Gg{JL*&@dLA!fJG;VzB z*)1CLv_qoO!~@|-jmCK~+=d1!U+56^j>37?x(G*qQDZU>7t)HMd1yqXDSb1#!6V6Z zWSb1GS$2vjHZgpSS^PmfUgQ3J-haSN60w%HQt1bGK=f|V{xt6hp>oF?&|Z8GcOQdo zrs+>IH$HX~)1ce?YHA7O{WzYMR+|9#M^!i9!;Wq6oS%6->IvccDxr}9n$=uGinGGQ z6||j|l1*a~UtYXJNSKrfIOQLgcp{Rvc_Kk;bmemuX55(oa886fdLy1JduWp1rd`E? z`yn5`$)PQX(toEio_^e;(YueJp*rsIDSCn?tU&?~$MLU1Zja?Zz+2bdIGV47b=rLq z;C7J1!R+^W-V1r-H=ws1!tO(kxx0Z}pZJM8!;A~8c_8T_ZQjPLhj>VW{0}y}O~-z` zf5Rw@d+&1n1E&n6&Xay_h`rlo4m5e^QH;u7n1JtFJZuKp1j6Tu`7^4&N}Hy@Z~fIU zFw=J^sV?bmEbm;S-4DooIyBJs2^x8Gz@`1?e4%}mahc2c1(@~{4_2)v8ZsQbyb_GvdE5V@K?$oTZh~~QB z3R7-|B)ed@9vY6-kG%xiA5KAXwXOy8P4lnEw@RSWWBPH6dXVj7oNZ9{VVWziT5@M3 z04^k)qn`4_Vwh+Gt};e_k-Yvq1Na()w&%eWt=YWc1&z)i_;;zw0i{mrt0J zOc?jQ;hzqcv}5E%tLYEYjIMD*`CHIgZ)tQSF9DEq*}UgOLfY1Qjn;YS?uWuansxBV z!PHyD33$d2km^Rw3*JpMt$Yv8Xf9#okMlv8P)C+4H&b`YLuxXv6kr=CPppK7kFw#$ zMzkfb4xyn3w3U$09jQEEc^yh?vn$|L@#oqv4xsSkaGrn1tvtp1wcJ3RT<1l*wuTSi z;+e2Jc&*n4naL*R)EZ4c9}3#Ikrxpin1`Ak$zBvktQ9<(b>GROSU)XSt~u9=mFe z6FpDgcscO8Fa4ysM6mD?#M_rwQ)?zSS475IfUFz5?$fR*X4sU>^#-QPkt_WPh6kP?q-;dN-%gD@#QaB|_`;XIewIp}$3Eqb3LZ8r27*_3TypzUdK^fp zPGyCpf60zp@9=Uu_kw2D^65`W6c0UyR+^|&i^Oo~?pxZayE z@(~L=OEIw?V^t)yJ;yCClR(qQ4oKwt?h#@rpFV(;!#Va)Xb`R$tkIE>;uo zelp2`+Ex%9=8So+!uuKZR#tuCo_HPgMo@zS_iy+DLu1vn1I9T9DRlE(G_6(9cAm)x zZg%8`mmso6w+N)a9e4T1?c4ydGLXl81soRyrTNl#pj8_jfTX{HcQnBUUrcB+t|ZT@ zBJIite|64-OSG7pRYffoykl_}8O3Za3^YYQs(A#oizwBQio|ro$?YL(w^g1uybW88 z7tnrbC~rghpI$Wbl6!5lxI5DJKG#W+A-K8m#3LTL?*kTHroERK@sD3N+@LoZPPWBs zx2WauZ9~M;T^@6DoqbHr1+T5TMBSsKN#q*naEZ9FI7jCrt`LZdJsM8X)$e6#!rl-@eKYt7K zxi1s0MW{m?sf2z!PKYwP4VV3SH}@{2Ud0o}cu-*p;LX6!hpz+a=La5w;pgBy-%4N9 z7Atr@)%0Bi4R}A(zT^EGTFfwXLc(%XODFG9N)PaM!23um8uz5;46qr>#8)xYe923c zk80KwL1>u2KH;&;IaO4jnL!<2xWO8cqSFe#b?hnyF^?cgq0us+w#g_o=8hfA-Q$Q1 zq3iY|IO8AsbFZ}M9Ubt|+lLR48SdE>-H=vLyS+QyX8@3F_!MZ5WCKktp0$SybO_Kx zx2_aP&0wx&>fKkg@Fp8NT=o58WJJ4Os1p@RPk-L0xzfx0E&t|w3$p?|VDlEr!#?VF ze#k>Kt3{C9cELpxj^UTMqgIn1We77Yfg8Sh)2L&*!lLTIWopjkr68J$kA2JEKz6+r z55p==tmM_jQ0=4>EZ<36&uG%o`4QxsG1LI+txYN`C8QgdNT4Df;>{0(EZn;H!IRMBiLj2T2t}~(WtHuEjP+j-%X?Xx2 zCcrAcdFVAyoAZVV*sSBdHZ25ySIxOgLLFw&NRd{Ars^QgN0dBy z+;~sLYgs&Mm`Y31cO!w23*=5Y4CD;c~OnLvxxXmmd3o#K4BO|y!> z2f~3`5q7tD1rhTn9UD3&U;TT(`jB1 z@7TeA+Z>VcEYi|z95RjShNzX~R4N>ai`G`6t-2Mz0U*l!7DC&=Kv5{r~Lg&7)$_% zEp&;x8Q|JARz7-^|3s4h0%tbS!LO%D55r1sEa6EtZ)VVhB9iO#705A?kg;@nA&f7f zl@bZVHI?a8#x?e{Tkzab%-d06l-LyU`j;V3+keqF(t-2|SA z0}d8MSiR`S(pMDCyHHC!>^mi|HZe!AM!n>0&Fws#5vf73&{#xk0oSOZSS(LW1MGjJ zA5S}uH2Vep)NTHX&MboGkYND-$>sL9Nw&TpxHY;8slW-J=0M3Kp4=Be-waHP!TWt6 zfi?7E`e?v7%N{8Bi6r?4k0k@fw0~2BRIKAVh;;^6{d)P)2VT&C=(`w1Ygag60e{Fn#qDR_YGYKBC8!CZQqjeaGvUU3pGuzV8)c!u2$qhjhC!Tf=`GU7(;1 z>hwdv?R@_k$zTIdWgu?$fCOd@N^A-M^bz0_Pf>F>5{O4KuK!#>&2J?1L&bxJ2~vfk zvX!XN-=tt_!m?Jo8Z=Ue+;aX_7=OFWQ{EyB`pc6hK60IkR^2e4 z1JKK;Ktb@(4f^#F<#G27?p7=8&_G)tbjOx>pbS`^M=somZtX5Sx`9S33~p1?<(eD7 z|Bi2j6auX9Kn{}nmZVBLu4c3#)<8}}alp-tKj2nRqaOtj_2i0pKG8Ke#uxHKOa&`s5c#+1V==7>Gkp|t}QtWTifD8eJr*f5iV5;Q(`_#e*7Ifkqr*!4@H?YR` zGfxp6K?6UZUPYRbh$eH&4Pyf{IO}oYV>%AzrW{YqY!jT=ep2 zUuKuVX=}H6_X{NVq5R!;y9QmhrF_Qud=jn}B^r z!h(z7iHpWYVQ{xe8h)3+lb&Tysnw-4InO5B+!E7TqS^T8yj4uUqj-&*;Tx0aMZSJy zNCTxJWiXmP^(g3R?%{PmyCmLz^;o6=Ys_C3(Ow3Kp{@E0My{{b1aWs!A)+_1j6TQ! zEmKnr4SYa691W(9>`TQoXa+V|q^+`efcSTy$P^qhQ5F46Sh4QFARTy28;#I+FJE}~ zx98G$A+8v_RwK;r@}55RpdK4qek4Ia9QH(eeyi{y|AduK;gE+k_|ZY0_=x}9v$x9m zfbwz+Wyuuxp;DYecGAwB@jAm~d)`C~UqtJcJCkXm=Q{V{nw%B<4tqBH}_Q85SBb1qdoK$0cMr=9~ zK?UDj0nm0{HR3%x9*0flAoF@sAsU}{nb?pZd2ag_mGoXx2#{BqVL8r=%WCg^BIt8jE=EB6vW@%D|sRdiA#?PYHG*wDjmvd zsUe*vu$RGwPiyHY<0>yJtMT}g8d_4-fXrKHl=~DkZ}}W67Nx@G=meokGNRRdSbIfY zokr_VUm}RLfqQCkpK;vL+-%7YcWZDf9_@`=S81EH8bktg0YFs5anQeb-rcTVvJw=1b3 zNcjqB;|cZWz`=L&z!Dqa;yz*ZdjwD@%+fkLE!A>~mD#B|kADZW&B^8pZ z;dU!2D#58608JOy8DI+C*S&;ly$%4}hyM*fOaqFRXxq!~GUDY1?|`GZ18qw9>=ulH zx~lR9HD9ATe+0>C==Zn=N?b)Qxp6fb@v*-$(I$hx@!B;Wl;zQpVS*R6g>yrW^cB{9 zyu5h3h-QH$VT71ZhF3^p?eXOs)AJTzC?s`irPV_aw!ks(Q z#mG6Pg&2WW5}|FhmJ8U9@u3vz8Ulv8(rR3wh&?{N&%5#0c_=$tip#rFKtnCoAdLxR zY11Dq0Jd)2GLQLpUgeWS#JPjy7clvONaJ^<2&YG4u0mZqnF*|^4w=LUi3oE$&01@wF<$dpPPMBpHcTs-i}6#D2wLra=#atwCxgvZG%x~pv{4M zu7Vc2fX|k60AIXONY&2P-lQKvrf?HsQSubz4J$4{V+Yvz;RG?hCc=^H zu%d2>P_Yhg;gNSB?8Z-)+=@hLoTt*LJA%eh#Q<0<*QwdE1ipwBp&~jh;(;KZDh4mi zaDNW>^C(Y-Lti5|Jdm1txEbBJaf905D~)c%IYC8e$5UGxsB{u@ud_nu^Ep@@jp|o? z@=)jnuX9(y3*6s|y=A~Sx@c{0N}Mn?6qB!W;SR^VB{R0jgUhVa=5;y=k<{|fN8G8A zBBVhHebkwgYp3J^X9V(!n<~&FZ+@ngWd7#%APBb|(oxAxKxCh%DydGxC-L~w;s-3O z@ltVVEDt1y(10C=-{wDgw#Egtfptw@K=j;>;OBC0aVkT z%j;3$q4!j@a2?loqM?3=2JgJ0?k~{Jp4Z)!iaWGsbdzV1^B~=yE#;N;cs}8|ci1?0 zJ00ciE*db^)NES(3dPE(RK#OB)LlbOj#d7&Vgb0fg(43ck>x-0l_&be173a4kudd? zaJQh^IoNm=wmifFLz>jU*aZ)+q95?U+6S;)3k|)yLchb*uPSND)zi^lsE%$2TmmO{ zK5zpX$LL3aBcHy^ri~5#M81qF)UAdX>q(Tf&nR*hjN zAJM!m5`-2ce)By3rdZ2kC@`aM24%vCGe)z_-K);jRf!638wS~#6t+}BpA_pEk zr37_h;n(UtDvE&{)W)4sqz&^9Jnf>zvBcUmd19E5d#;w0=h_z()3>Me4Kd`q2I{QxMNofpw|((a<30|-~q;1)%W`>gE7Cuq;rU>{Zc#F{`Gx4gTlc#=r_)x7wEMuP2biD=lw5BLYVxR3iS0wSTE{zpQmqJ7rwMHeo~xz4vPT5gdP>vi6nwD~g7tkKxDR8_(cu&H z_m*JQHl7MH`NYldi)gooMw1j*`F9z0TigV$_GtY%9og`zi7~YY!=^)4)Kv2cWpRu_ ztcih%wt%M!(2H0OzTyr0pb-ty9VmcWf2i&k@$z-gX8}mtepwsy)a$#3@45Z9TW)Sm zJ|g}x_g+QSK6;bZ3(>9qY{KXSe59$y8)V#jC~{{kAa~r zqlY}_Yk^Kjf0>b&;t>!ygr7y8j|<=#VFj(p%O6JFNO{4V0Cy|k-^%mCml^1&69C_; zz#lZa!6#7qI8DDcO^H)O(+emIH|YRf&|F1$X$Y0grNzc@nQhO~es_&G(D=56dv${;~O^Sa)!(~VrI_b|HI!#XbgcVIddIm}5 zcqlE0B6fDu&q~>qAQw=_cscFdp~K`Sr4F>9K&jGPOY3F+V9JG0+>ULCrU7&sg8R3@ zzhm6<#Xf{b4X~pUXdiu63h};KRpCWwIuaSdOY3;gB<~V;DnZ7}V#IFb@TsCp)S70F z$a}!^Pm&XmJhbut2jqV{07x^md@44j1}Q9iKr=6N^6IiGUJQxF9tvK)tG%6bwIJ&b zjiqDfS0Q}&P?z)urOolZOn7uFb!ng7xz0<*bd>O#HiJI%W)6mL`XY9xWv+j8yQ0|t zrPn7@Fu}U$Ppq2>UInB54!Mj{x9CG!WHgjP-yBl-Pqa3Pj=b*Cv5PGIv)@xlvtQ{11){!t15Xz^2|YY)CQn3%=9U*v z#_*B^6nq2O>ujDm{nq7jeHl6m18ztosICOjri+`YSxrqMBq>eER(gE-mpSsUB{#+< zVtI9vSv=OF$BZ7wfT;F)nCFr~bGx>nu4#kd%4__aPOZTU^&y}eY#qB3LAw#i9S%Pm z(5TYgGKYFh{SbSOQCQmvFoouukfbj@2SBHg1N7rP1qC*xQkpWWkYggQ*)N%Vgx0D7{<{<>_8rfoILTmPjedDwjn|=3_<#pbE zSU}5pFx9w(J9ALbKrK^A=!XL|b5_nunl1bM=F9ar{3{45IEfTilQ+?dKH-;qed^X4@w(lMyS8Bit z3pWN}KL+>exY-w8IuVU5Y6Ps?{+0*0548wMcZ;^f(8D4fzPb)`OodT% zMM)VzKM;w+s3jYF;dnO$Dd{FRW?Z645p|i-`b+Ev;V~e8@|FqJhtjZb(T4!^Ta07M z19L)nFOHXAhsOD20QaZJp#H=-VxxL0AA8XRV)$rvyhY7JIxIw9H)4m^4?aBLui5_h z1WM$iIBW}+SHt2h0QaA`YwwFdYr=aPTh#6K*@c?3cmm&cXch4snKKf*dYu?-3E*!T z30Vmm@+Cas^#qh8u;nlSFc0}L1AUJl8y>&VyiSKLPHGNq(;&yWaN8i^cxD%FIu~p>@QVA0p6pN02`rx$Mca zISS-Mr|{493Y154Jdo`HSx@XV5)L%fS^6Gf5^Mpgq(*7;<%X#CLr$1uAZX!tIq#QD| z7V?0n4e!~~h9Mt(L8aPX!z=f)jgzw=<@~!(KJr8*&m@{AWbkGdwLW-=P1f{1hgyR9 z82g`5eXT%-S=ev1k|u7Z@$5@cHgvQO8GrlHZizXZdc?ihOaTmcfK28r-{ju3_xCZu zHla-a+iEp8D&ZNwks-{4^WZi3E!qI>X|HIm_Ey>_m~^fbI$VSY?OgNb9ec&CSMc68 zL&FTDlAF*K-r_-e-H9{>iwCd4Z!4%>8+a)35j8%~M$-nKdO)KJB$|H;c*4R9CmVP? zHbbWDS4>Ui$#O&x(S=YR|^=q&2^zy#ZPUKU&<6mP(82aU%g58W!h z59R!T2G>B8yI9qu$*{~E{0ua&>x-`9B$|Hj3@qt?t~*_`iOjJkPkfqxhnxK2=7F1 z$-J1b^7xI`vypdyMSG=zjx)okvHFWQa;-fFn#P+9V&U?2&zxISk2MJ%dPzNwnS@G$ zI<(O|oXsZ%?`T(oZGR#@$&Pgj#%}j)u)_kv@WPcKIM#yMQ&YyeljtTCi|l@w>d+B@ zL0f$bg~6xoc)%O9&J1sjUQx{%xDndfC&)XvEjX?r3dxPqM?~z!L z=1>Ywd<}#H4?>=;Y@Eh^fCHK+@}^aaO25>FaUhxD%IsFs5_CyQlFP2CBZT$ z;@u`;&rd0hCDYnR@ZW)gzoHi7x@0o)nc-~% znn*7z;4R0%xC9p(c>|GW;au2GchBPkbh>*TO78hAeG0k%ARKHwqrPkm(BtQ0VG>6_HH%e&?&%!m-^^9+=EU&3D|2c3;cpw^MqTg@Nypz8^^z0zo@wL84V>P za(7v9JGCdEHCBL}We^0l6~WDgv;-j=gNri@sWsqc9`0Yqy_oP(9P;`#58kn)0W4vG zJDN*Td@gW+b}cUn2=@rg0I@}IINWCIGA5~ z%_9$JJV^>5$dkmP3$dEW3)3{z*tX7!=Xbo%!0lmTY(kd3#n!pkxVihDu!K1Y=0##!Vw%i-Zmz1& z5!v2_+y|)O+^me&WY+-%Y?gxmZ58r~ldxPesN>NaUec?==RVW;oH&RuMD<|^#B%`s zGEV^nYY1}>l)$~iR9ut-aLdw7cV2ei~$HMK=u!q2(9_|C|w4{;k0fgWV%@O zSf*n$7-1alg6tDWTAIW`utz^H$GMg8Yz2>2 z6!Ot0BM;gP1!1nz*T)ZdrSKCJ-A}#c-ZYhnsu?e`l!Zt@lihf|HVQQJ1F2$%`#pG3 zH?p5qplXU*o$foKYk*M=Y3sUwFs+CzViW0Gffu?itJHjj7jFQrbD6cs4|lNu`H}~U zXx=yC<6}Zz+QUmmF!69zO}0owXmjrQgej!Fobp)MRJKmz7D)TPJ%!7w_%{s(@>B|= zi^eO#MJ{mlPD6ii(K=Y9)BXb@?@UGkZ{(J!=v##=%~t_*Gk8RQ0xy8#c%y=To0Vh& zN*z3(o{eUDtBs`*2nS2P@DuEGLmX+o>}CCkR*Uie3U*=9bQZ$@7ERwrw$n%pCE%~- z8~h{0pS!V;#z&HX&uH6o*JB?jqa9IgSjk_F6|npt+6$&51dyc|{F)7Z0=(k=0zhYt zHn>@MdFbF0bc;+AnjAv5dYJzZXLm6hv?`G=psm!UMhnM-MlyklIq=pz?L5KRMl@WU zY*Nvd*78DP5q}TGek#J=lVvzg6r|`zp4gOue5VZwCH4lo$mmDHXYRHIPzK&M;ThPc%#GVj;Ogx#_eKdeNFqC@sW|R>@Bu!*X7SmIzdJ!^$1k8Z zycP0_cBw)2mVRZL#zdPTM2?wI`weL72T$ek@W;X%&bO>TAPf6Wq)I~D23u^&)thx{1rm|Sc(T6W`>k-eJE}bUZ}y6oF?K%j)?;q^WQ+!0S}^t)A z_RWH|`gG_RS(NjTkE$fZLQwx2Eu%FfyzaZsM>igzolsiNEqEi8hEQdUy+$V4{E#=0 zgaI>utmwNVil3iv1C7D|(`6!r7U9K|M!@}-#QZ511a4Z@@H)1Qq8Zot$<*`>M&5jk zhwR1hQBu|;iL+LmLCfj>v}qe>L9-zbP1Se@miMBb-5|VJi$&5;*f34ISlK{6IIF7x zAP&N@KTMt|F~<~6c^yvC2vy+yx=6e$UBdhEphmpDeN_zB=)Ze~7w$h$1@r7@##@5J zA&{>*7oF*5?17IJc0;uo<)OKNRU7_|<*@-8c)^E{YSCJXce;gEVF6-g(>0jj54EGW zz`Zxo6xgfyf))W@c!uw`_}(;n?o~>Q_`K_lJm@&i=RS{qhy^8VUd^+kMGZt>)PQc$ zj&-LFEIL45EEyOGr086Nu5O&0VT#)e00aqafTRh~Cf=dC4lBd}@xm?( zB;O;x#Wb8&Ys}-O+?oPsS%OuYYml#PMHl1MBwoZjjjz<%^wj`uMhPQ9daB3Z2*?&` z3JphwVl4r64R()GU!@IJ)g8lL6hPq7EcE_+L0p4XS; zIF2eB%$i3_Z=(EYp#tz}@#IPTj}!1(MF`%keqF*d={Y={&xdg_SR9roM&~hVR4mZs zU}yd&Y_pO76y?<@q8B!Afvxb^UGCDrOY60d@Rl%Kw}FoE`n4Jk(-Q&;Z{S8Oy99!J z@NxvNnO&h}yjBs+bKbe`X0m8=-U&q{!Q06<=&LE#Kht@`ohIKTaJy+G_x(SP&cmDQ z|BK`JW;Bi{N})9Dk+_RaUmhIOpDf?Du&8&iB+;e7xVU z*L~gly!*bcRutM_t$6w5p2gYosqoGYAo1RbFY0khFyLyn%M}H&bUV}P{5}t$eo}TL zp$0BDyfV8-{!!#rDKkZRoX#kj*py2;3>4AcJZz(rp#e7g;i!QFAs7RHj`$q;C{vHh ziP4pZYIj@~K;E7Q@2=dG`CK1ueq=8@DM0xz48CWwp&OPrFX`EwM~!?! z#dz$&u;|mpV*UIMm|LK}e(Q-2zA#$K=4AL0=R683_2@K|Yz&vbIGsy|^S`M?ZTB5L zMI<{`+Z_#tJmx8raWQ$)D^pDGxLE`Wuf`*lBVqecck}TwmkLT%Tl_y6w)65XJ=(GQ z{R7J!u+m>P-UsjLU^IQwd8ni*#yJ2~i$^dcIzHN(!InGHS1F$;-g%5*5@y%_kOXbK zD2+L9&97F(hf6nvticVUwxv-=sQ^OuYqIHN(3ZXIvawQzp8H961r=hH`CLkr87DGl zS`Tb|xe@g8TvFto72dJaR;#T0 zMoNC3=-+*UCV{XJEO$j$k6h5dfw|J>chTc5EEe;9r7-BKrtwe7}#(NTnxTy=_U zD9s*7XNPwFgZpD?S0JaMl zk6$PqgMh?Y#)3;@3IXIE*?A(v6}NrPxnb*VvXff*Qfm1i2#am05IiFGUw}&Gf7Gu9 zpbB%J>4vss<3Nym%jd-BVUh2K!pN1M1)};cLC{} zxq$y4!!bg(W^{;GZfhH@c|+wK8OD_inajixz>70akT;`5A!rz?NgkjE{ z#G>hx_WS4p_;6B}PU8Q633-Sv!2G=bfS~DnT|apeWoFnHnR~R|`nrxC6QlTRmDn=I zbE3A{CF`PP73k6S68ic(y1y(4PDQECO3SH>0mS)v*DA64Ti$nck$f0}Qv+;%p=?(f zOQO5)f?s96^2af2Nx|_VMcH21ZsrNN*~##i`qkohhS1Ios;QTv^j}n*JIgr zmDW8FZqZmHK+#+!8)bNkIB!4scE?TQd$JOyKkVL|VVHn+0g^tq5>LW_BLcLaN8(3i z>_%w_P3kOpT}E$3X#F*x4Qqd+QDK8*OfL(3CdU_kc#n8F;J(@NCvU zPcYTSfS47QIVxLMC}N+HHQkITF^k51Bi~gj-LY8Ui`w-fd=E!t?S`6OEoI~1{pIJ) zy)2qYR%|x>`8z8K)4nBA>Z3fg8}-J?8_g8G#0@bmD7ZUE?o%jmJWO%8j$Zq~;s#@V zU$IualW4G_mRG^#u;*mBtii1E??0)RiNmgOAFU`4kKzFN>@L>Nk zdU&+9N@l{Cq`})3{C%a?;-b5>o{r2Q<#S603OT^F0vxU%0KIQ9}i~Pu-IOmqE90gleFhth^;M(6;9vsTh*^E={b{!o& z8FcDDb2LdC{59=w_aG$Eq#+~z`_x0Z+~C)WjU zegn39a~|wXqd~st-zyMrHtw3NJKuV3VRch}7KibcZ%7jzBrK2|d2wYF3^{2k%ZVqF z6@z>i$zS;(8)s1+J4nzjQP#MNQL^)b5%5j;HOnUd$zr;+7I;6#E@+p!m(uvWs7kv~ z%*~Y?B#-Yw`}{@YeIpWj5Ixp*7)~5cyZ*jhH^cSQGu|?ov!<3AvjC^T+j3<)4C!D8fN5=S+QHx0VExa(yn|b9y3n6ntVC^UK=ej zJN`c7uQ{!D&>si$EZ@oEnF3Sm`_kxDT!m4fwUpN4!_PjtaYD8N-D7myA<)6f@7App z+(sG`D&vgA5_tGf+HjhrC)nDjj6g@-L7m#P+EcH$oF&0s{obk-5qCLL48_IF?GNype z2;iS0`5T1KKR!DjVI*YQOJpbzx1$lR{t3ZbA>7Pm8m24lLL9HWK6cCY#@oniENbbP zQ9%1y8XqDV!}I{KFbY&>)bo7wx>6(bS#!}0L@P4JQYyE32?@*!}1l( znqxii zgAaa?kCu8fM@*N`p^uS--9pyazXt+MB;;I;ag&;h=Go|ppRAvx?){XQi^t8Rzi6M1 zx@rCGRQ)Y~p2}w*EH!%T3h$-xshZUH^6#MZQ`9n#jI`lK%IL$00-kJCX8pFfpx-j8 zTri(#Pz}}{ijs1q(f^oqkyN{hiB1u)_dc{e?J&6Z`8i~&Y64R&FeVxZiQ)rm(<8$ZZ+uA5>COQ}qE9x>weRsu?XZy1@aw1d!ErMb zCZ?eG=nmmyD|Y&ijKD`7x=m6no97I&@@1`d;{#Our$0TImX!Pc;~9Go`Fslo8mB@- zYh02m^y{s3Tyov9c~Tgz-_8=Xra1XFQJ*!f4i7&2>b(BF>6gqZaPOD`l;AES$K`h{ zbXzUfr3+$IX)sXB8e8YH4B>IpwyL{E(3keMFr9|p-)#tnQ|ES)PPDE76zMz_y}s_K zM*7d_n5Zq*-YDuoyx!_pr)N<2tH;x)PYba`f9UdI9`_Alzk7~~*ZWQd*fKG1dx>`mMWE>$OVt5f6@w%sKrI=Kq0?8t9>use%!&Bx<~sf%0MRETeO%WVy>g9T=|!*BK~}_FzQw&rdX9n` zd#$|>j#+wv_MK@AElZDo^^T?WeS8_4iW9Vb<&xh;sV}>f3`Q-60+7RJ?TX>_TKR!r z(~pZfhbkdVT>>`#kp3HB^N{pp%A_+}_!0^LP9cLh-H+ZUAvV4FymZ(VSy|ztc9;g@gVQpmYPy<1*8UM7NwN5HJyE`dBA&^wV>j zht!8x=}rdkXw}hk@-+}@t{lw?l&?kl<$w%betSDN8G>w>z;a{^}d-X^4S-;CP?#O^l4VJ3PN{UV~BJ=()ky;x!UuAi3e2p=jwE> ze6!~Zx+AbO!9_?)BFr+O96}FlCU(!d&z9N3r@l> z^lhz$^Nq?vK7O(J7mar?_pg&?RC`lk?hz%O~c-z03th5e+N9G8vOKAtvLi& z?zrgZ=qCq@UfzL<6G8GlU1#=2dEUSr+k9c}E4%g(lo5Zp-9JsGtMCTA*C*8>x~3~{ zWH$LZJlJKY17}g-@+Y=TX+{J&h9l&Aw9pOhDHE@>#q6FfB>sI`{?Ku3jYrsfnts;3 zI^+P>d|@1hbl#(!@%T|~Im3Ca9X%ke2RRZ-OquqhpS@-Gm=oYoFFO}>=`bYg)UJ;? z&u_@=$&i=?Uis&e?AR257IOyYe=RE~L}s#U+eAn?w8%u`ui;g z$L^aD8{;opT~5jnahF_-QUYT{_gBqz&Q$*v0YDU>j0T<5Rnszyz1JTAZn9#2(dSyQ z^a}+>e|#8+rQ;7BFdXM1UMlq*!Kj@2c&)K#iGATkH$A028Gmr|BkZ`Svx!f1<(75_ z+2?pBpsl9h;hie2-@`n5OFQ{?I8whdk!&3T{`r7KT&w-J4?aY^cTKhR6^#?g@-0wS z_JNRXvhsw0Ym=@-oJX(q*{b!plo|8farZRC0C$mz=C7CQCnz_CEg6kOjF?4vat{Ay-q$U@7)mF@S^m;P91Gcn;(WG=y3R(+n{48Ja2R!89Nq!>psV}YvIy8=h2hJsFki%*t;V&;uIvTFLUCz+R@$x zP^Lr29vSfzrlmYPj=;AtI}tTu`0q&K!oy&UhtC%+$bh|*Ix`u*e~3KRfKFrQh3iV? zYqKYBGO2l>D@V4^W9$tbPuY)cwWD1g?%r&e0s)c?QQ92}Ppya0%XJDMXEe!$yG1uJ zc9;UBe_wdJ`?0ZBaH%>|XZ&=<8!#S|iTnp|fP{MOEYulW{id^rFXe$NQ(kvGEM8(J zSTb+sUPLs+MSqu92z`Nrk+SL(6qe&h8R>%$+H{L0EJ`2oMm&=lj#%g2NcLAL*_(@@ zy1{1go21U^7^~_lW5iz>H4!Mjwl{b5n|Zn=h&Rqg{%R9S&luV>i|&|`PZ=^Cr5*I} z#?op6UUwUbg+A}lCvUT)?*ue3dQpZBW?W$_UFi(XyCL&$Lizr<{&6`CTx{y!Je<}1 zTTkW3xk5l-NE$GG}j2JnfA2K2>X1@CgveYt;1D|_PI^5~HJwsQMd`h~1`dTF# zt(y$#k7UT(M?|O5J?dJj4fr*;*I##|!oYS?;4+k;lMnxk^m(XTN8F_W?*f?Wl-gsd zW!MORLDCT)8GJ@S>Fr5vh_|~MbK3L~?68grG?b$=H(~q-o0|jg=|kE&a z4POtoyM;KeCRcfJq~i|C{F4D8Sa+PM3p3@eEV7;5e7z-$S1a;3!OtKovyQ@PQDq?K z_d_}tyC1`-FZc}~t@neOT9INbqWv5l^O^&EO=6|p16-z6 z_ZR&tZ<~T_tEg*0fM)KBK-M}UJ-2E3IF&13;tKhbEWh9G(atj6I38+?VPXW;QaG=E zhlek{P}7XrwJzg~w)HcUOWdNREmGT_Q|YY_HZld+>$W0LoryWzt2dXa|ZXG%z+Mw<>NBh7z|3e_bW8BCXzOYgMn zr3^bDbM}{_}xyi3rcWwG?s6fbBb;S}hBt zoTjfqyPy6H*n0l_B9{4&n`xQSY0rgV#Fd9-#`4`82r=Xw8vv>`QEKFC*5=~|M2@v*ItFJLkK{`Bi@-l?n_4Lt! zbJut(ffCr3$)QG>RO^0i&h>IT{gV8)bUNU!e|~I6{|K|2+8lJ%A7wYnFD&OIxL%Pa zRLg4d<;#as6Vk|(Jb;OoD?Nez{=|L67rF$qRliXKb5M7A(w{>z6h$}@{H{k1zX$8T z=W00ijclV@ChRFSt|HRcpmT`_Wi-nT$^n(L@X~44-<2J0`XZWm07Z(JYkice^FkO^ zCJHEQ zI(`o@TP3~ZkK%65f3?@$49(GSkSU0W-q7nX?ew_;hi<$!m}NCXX@E>H^2&(RN?_XE z_XfmZq&MByHfv}3TyX6*vRWq_Ph9EOp_&xl@QrY2jDdkL0C=x5O$M3)Uns_r=J1aE)h*71{8Fq+W_s8N6k@$8E zHiwnI#=T*yt;8yj-uR0wnTfJSDZ#jdQ0e`Ta*k95k}h0=x;f~Y7GTead$;O_J$N() zkF>nZJjs!C5NyRr`FgVoDE$hU8RbJ?ElOVrtbr3C%##_&etAyX)5`!cn)s2T%@jjD zgF`!L)0yMNfX+`{x{Kg#pM1hu*X+LyseZA!;pg-TWmm$0#`uml%n_DfpPOHPe7|n) zrB?dB>3Q9z=`k)5&%cx3t(CzCvQd;^e+K)h4MSwp1#5o?!Z%^rZNDxeo|YR(D7M00 zr-MpKcIMh=F?{1b2k}|v{0n`ryGTz~4!^R)yQU1S#MthL2fjH>RJ`N@|No5A4XH^B zl`rvZy{(X00AG5_ z?MTr>Y4#~KdJCCaVg+L|8|kYbKKoxbV-$pZLU^iWy~ODpa68ECM^3&!1FZR#rI;h* z!H8MCR}zxhe^cg6-yW8(+&5=s^*Ql_F{9b0TK<+2DK%!3wd>di)=d)7m%aTPZ)P`)@fkWeE>GZ3^o;u(ff<~Es5t0fW7yM6Mb_NhRBDVwto7QW#OykxI zcXZNL9Hbgd)1^fH^iJvz%Pwpez@I$N_-pPSVAV2?k^>;>Hw`+j{THa+ z(w!^PZtHu|{P_$2+pMiS;%dy}qq39^t*5<={NtDt={d?MtO~TY;8G?6U`#n}^O2q> zZvdIPQ|`BQ>Lt?^!LzUOCtkl_M20bM@e&GKGIWi>7tz_uNXLOOp&9*9it_LRR+=nZZQ4^?-%U$a?-8%%;^s zT(!n>Hn3%xewmgl${zs0o$zu$Vpk3i@B&+CsSMK>ytUB^&QnLd*6? z7O>_vc|~q15aZNgCy4N6kH2B&0<5!Fbe;%{bGFXh{l5c1u`R9lS7TB@^FBzhbx_8R ze+YEJ3h2{~SE0-`FS%~Qvp+{_y+^>)iVBqcuh$$BJqk>{Fndv2ap5AIL7DN48f`9{ zYz7(ZE8J_QQ|}HTaEmCxwzNXb*xx0LMY``>QVGYQ#xkXz9OT7Qv;<_Bl?7 z8Fp<9DK6m4DT1D6IvdYgyS@LDiQtoOj=982Q%RTwfH-Xl zw8lN_C4}d~2&;IeJRNh-nGbgKdmyD-BjU7x}I<4u7DQPj2X9fGf69cZ~Khi|qC7 z09n{;7A!UY$!Ee#Uk;_XWJ!CmNpb!M6WLB<|4q!EmewShr{&D(;b0~;K{gpF(?6zh z2cF+zf&HM2e)73(fAPR68IsR$Qm%){#LGQydsC$?odHPlnW;c2vgCg&ErT+BV}leou(dhUxdj+K${^+YZW;NP&YQ}G5L8!C(}!4 zRdxYw8?~Ews!5S7*dqfndRZufpinT&Bi6+sG5NH7If3?BvWDtkwE0p#=Fp7Ni$4%W zDyis=c2vDn#_XE1%`*7Yc8icH@$>*R0d11t;xM`x7${@e% z7vaiQ+5+|GIq^T$ViIDf$dzWIfSbaA?~ zl=Jz+{#0RWZyronW57VYwQe7Wg%{6dr&#*a!*-o>t4B7suEsbyNcFzBh{BYR-~&94 z+JmP|e$$0lfb#Hb{NVPiJ;hPMPqiDwLoYPprF$D*;m<;pE{gjGyO_mxX>xxp-*BkL zjVkcp^4I3X85#0O*CG9q5MOi!gPTEivhcO7e zq#^s9OS!ZJI-YSv&yQ%Id*L0PgFTOf2r3R7FiO&lVHP{Zh7MwJV@!keL|-;bKe%M6 ze_!i{PS}P-XQcnXcn6}^?fqD#yP22aNwha6<*K$&#|d1Fgz5J{;y^`D({<;+yYk2N z&fYVroC>bIjwDs_^a(0KmBgxc-Pe&csl{2P<%36%sM%|iq_uG*pY@NO&yA07F5XBu zd6@PGB=lDZD{7EW|Ji{_V{Z(8UnZ9ocg9KRtYZ|v(FDn*D^>`}C<0&`9PlCxaM(D` z-18W8M%_z4qN~h!aYLcb#GMFaAlS7-CE8LzOI?n%&`DcznDEWcecdu9|IC^?hesX` zrbi_oM8}KSZAk0?>Qe!e3`l977IKGG6BLl=uiG+v&&z_DlNGiNXRv6tCp5e;kwqo+5aObOYb(>M^09Zrb zl{1`0ixop!bs>V=#|Aj9P5I)Kyg&AuwiwjhkvbD>fFD>OzxL`@yv-HA=X`85m@}q9 z`EDFUpfmLiM$~pP%l{V(1k9b!^E-C>F$Tm2rPjMnwuoxqNBfXOn7#pS?>J6r5ewgf zntf&t2`N|nkLuTtCbxAbB>5RSVDbdPiy=IyKBKg|=GHN+G$Z!5R_THc9j4j+@Oi1v zI7njqBUK)`HZp!jchYpx#@_nE5oO7(g^4!$&lwH<0`%v?C3Je2{E`mJjLOP#&_;#_ zK%00RTdd~ftC=k;111;{y;VVcr%vZ?%C>3VW34-JHRibV*fOD$|K_CWkIkLne5_Hp?}z$J@7p?FQh6^gBPTG+GRorui63oCAcjD_uaoYU@Z|L;SWpc#b;-t4 zl<3idk9YMuH7b72$@g`)7&}B~@ZTS$aMBGIW%Rf#pWG{(CV|52oSHOUJ-{TJ0~}%h zjf|(q9y^AV#WNO$%O%`S-Zw1u|96(T$(nFk&6YOiQ?^+3!i^Qq>3AgiYP0H`BSyy7 zzN;09<`^s_-X7`t{K$%N5e}gy`6;a_ zvT=-f1IP$Tej6%AyoOEM?xe_QoKF2GjTcH_<68a1l?vR+{@LDygZ|8f{u}bI zGV{d#V%f%I#xH#P_K36>GR)5RYQ+JeH}dI~99^#v;(Qg*uKw`tk}J>P3`Xi{M?AGt zm;7_dgvxL3eZXDmlDZSe&g^0K%6;9Yf#jl2#=bvqr4-Y5%koW+n=eoIH0WU_6cJwsWv_g0l0bWV4_x|Jhqw>J+`o<^O3X6=@{D z_;eGQ6_8_4eo|oTO?RHxD~P<|?M4#k1dQ@q=7T}Pmdi0RSBB3NW|%c|5j?v?Yt3$P zImAZ@LOq-=R`H9*K*t_g;HJZ)=k7l81vGZ~&Nl#m3gGOF$hlgPz+u=jKMWrF^7;@~ z$ppQnrMIr2$5Nadna&FC=U0iA=oay>na&ww5iUMcRH}YXcF1wZf2>j6kP+W+p$2YM;nE z-tW*F>xPEH4A#+$tZ4zyX31!XXHHZDcI#m7L11;3YVTK={1cXGw@pK68fKjh7#>U? zGzRR|8$9I0%2&1h<11~v%;3IfGG`89sFGG2?~L z`=%oyHFvSFs6FGJ5}r3@o>pWoJ&vv>H;+QA@BCzn$~PXZyH@|D+3rQ@87RK+wu~SC zx-VaY*m`>vtb)CFS(hk;zoAPcIr+A@(o$M2v456;v1T1XEsdGn6)t(>iW0jN&XI)3ZO_;8 zyIh)*q%8rxv~{RRs>{f$>H0-S?UaEhzCozrjw&ef!~g#_?KDg=b2f~rUv(uR2{3Xs z8hp)|#&s4OIg=n_zzgo>c#?G3Qx-t_X`}97LD~pmGCaBzq#uSEa=q-g1U>G?gh6#D%?Y^j5l7hYg!FKV~vBU#RQr$it6QSaur((_Nj zTvM*DIDupKY_{{`!OH6v((;z0Xfw4ms+!x%WbVV^*i+mtLShHxTp(gMdpoY|a8$xO z*`;<75%?3MHKzlm#kh(KAhz{|t~fo>hI#NS>&%6Nz8OAv1JyA=v5tJe?VGSYpuH67 z{EWN@vM|`38)_MhoQl=Xyrs@dxJvNG@?QHp$m;jwx?+#ztiwM2 z@IP*8LZ9|Y&+Aw4@H&qJ5)Qc?VJrv+DXh&jnZ2f*n2`*%O64z-+xPd!>M|{wj4R^f zw8h)&wmrS>E^Y+cyR)%KxrfR6oYWn;#5Wj#84CBV;>CQvcakyLIBDZTHN7X+1>bIA zsznm`!gLX^s=@3cjx_J?Fe={HvcjRJGX^)m((;m>4b$2KJaw2zoxOg4bn>;CaVsSm zG2QlbtfK6VE><`03a~8WfG$vj8!jDM=K+WJTOQxiU#52|UCl}^0?>+3Oj{>kpG62dP-5To5G%E=BE`IZ6eOueW6*wW}6+(F#? zogFE%(SN5MWA0ibxg7-;-^u3^e=Lwj?JACme@;^W#7j&E6pztwzOKI?dm%W3!i4a7 zituzO=EC9W$1&!{(Q16Q?^lnBjcJ>y4>G)r^ZoxELB7&@j9xAD`g({2&VvUqZ>rZon z1sw^pb@X)= zxvGP=FZt>CX`v{aYagzI13M4&UwnY}MIA8Jnd3fpwViZi8wftkf1gbe7A0M<|^{n2OQZ^>Hh@j#x^ zQUX^G-FYm{ufU8F%6OpoOPWr^xJ&U4wJ9a#p&*w+!l(~6FH)9d_+EC7{ z)mOI|V-K8c$YLb2Xhc<*L0pvtxfW4xn}HzEuzWES#xAWNFqc2?b>50z+B0lo8?(0m zGRO9LZ;F%dynb-~HrC1ybVH!lh*X_;TP&?6WoU-}0NqI^J=FP5wjY?nk^PR& zsn2Bw)Q-^^UekmpkEry>_<0z0;0cDy49%$f%zR-FlJZz`&dhz5T|*D>!0+;j)@{`O zcVF&Zs)LkUnL1YZh#I!lQ^b#x-XnhFF@(6^({bdHT9EOISx^Tr?U%o1z{!A(4Ck6T zv&pa0bvWr{rPe>v@enutS(b|S+~PO~q%+mK1evJT#k>Q-@WpQFk?Uu)z6kRCGTU?5 zkihW_!*ywrFIL6JnF(jg$D7LRr23@^Bch(lu)Vvj3{=LsP|gB^Fr4ePoi3lqk;bP< z4}d(QxcrlBKTapR4NMue;Zt$ORkCE~-~m)tEKZnFsi_PZbcDG%F%X4p=5noi5`VlVI7rMaaSWRU}p`cbJ`K9vVY!n5YBS89Bh; z5xihtCun9wYd3o7P}GMA`pua=UZ-t03DYtEjRZfFS?Q!_AXFAAwE>u4l1VRJD`!{i ztrQd*)A?Mj-}i)jc`|f_3K!x|G|ObbgvPA0#U#cF>h~)`Ug7thY#l>Z=*?7man^%b zG)>m><;lhOKxp$ji?>hD36}38!ux$PA9h4G;?QAJgm-v-qq*-J<;E9nIF*R0vVp`z zvD%i~8F1tiK0y7vPM)G0Lt7rv)>{QjY!u@vp!JN;8?%8YJQ8kbUDbQO`^i#fLP?sh z8t@sxc0Js$>6iykoJ}&E=ss;dW3tE7Ut8@t?>XD|GO_<7fj5#PCcqXgKjBQAIq|`p zw>EMY0V5ap%KX)eL-Oea+`4>9m#FfTnj?8x*Pe#rXpB|xoH3N~CuBuebGen(HC&f( zgi~&OURUnC(0L!`IUpfBme?$fXUqKIgXY6oobZ+|`H-l?6)MqcM`VXW(z6E-9f2M_ zLB%o|5`G{WRnZ{Je$-%Agxm#Me`AVudO2UMDAHf&a`(trqbp&76|__#yql1unYMfe z>y#&f0lhce3lUgKqb-!0*!vzrDMwwND^|>xV9G&E<2_}FnqpU?P4d@ACn98_3dg{M zD`Ucp9HRaRysUk}6*LDr>qG`oy8G}t>E0FD&B}~FhB4GEtsjW0>PV>n32dh&8+`C8!g}qM3z?;>l@Aq)bGM1ATT%|K+meNvC`Ys$m zUjx=!wA+dci?zWcLVxK}A=of^&`W;=r5Xmr6r=H!2)#E;S-}oljq=t`xU<<58Mqtfc6u_Lx031tzJ0C38T{ zm@b#`MPDd~%G6Pgewqsq5Rf_T28y<%+6r|#2nzq=2zvJye$3AYm{#xkx^S5-o7^yw znWJ<8U4gB>9H+xrdM+f}qF<};IR$!1lbyB`*^zmF)6>$PV-du1n)Mq4V5RvON@+O$ z99~Zk67w|?`^G5T+I)_!xp9Z383WV4T#4dtJf+nBAIqyl)@Q82iv(@FBi|k}h7l;* zhCht*y>0NSD=1ag-@AFqk_FrQ#vC1OMbF|m_sOT5S3rk4{Xs9A6&DwIfYDRZ9?cGy zF_eG9SG_q=McSK-mAz<$R9w$JgW$hT-hKN)r<|bBa=_F401WhFsB|#%C(hV8!Zyu& zAAqB~PY-f4@-b&{X$6CL+E%|~odO+Xf>vO+)l6M1mziS-*P8UlIe=)h<}w*rXpRUh zUY1FZhZm5LZTTUcAEXiY)8vTxo&pYQ7ratlZ=HWR%Ke_tPBUrXTaG-%q97QyKn?Os!^m>#=#~9NZrtZ2+ja<{lWaX_F&mi36i&*IQ&A7KjnT-M*@H3|We)Oe zv6QYC&~Wx7lpWVeN27&c+}>z^Z`ymx5iPKCp2OP3IH(VKnag&EUU0g9LS@!6`*kcz zYTFolUk|T*A^`OYz4h6kp$r^i1Eacg#$6|#dz3p>akE?a_55QW?p}Tkv&`r(Pq$N~ zQ%}-`2aqK`)9wd1y`=u7`)#XAj;O=#85wbwkD+)B?MKdldnomTCs~|j*OG22^%y0Hbp+Vz*jMV}C zdxsx%KBdR({OcGlxk+d6bda~v9Mi8OC&9}hvy+z`(IYKDh~dtT$VjI4ym|W8=Bcx+ zGvD670=2aPIO@g)X}u%8F!9$w+q6qEhRtYb#U4mYio`$Z`AajpInkwE51s9?=-Qyu z0^rh5lbE&i?Io8GSyrWkg{P>Ye`{1ajmA1l^>L~3#SdxP&rraEgrix`flPi1lbSO$ zoz#>?U}log5<+)6s`H3nd*Ne;%DV}&9_@7pLf81(Ya=RU6sh210;aPSp3&M8!Hbhc zDdd4!FE~Hc7jmJ?0>su^X-r8cFNT*fDFg7ghI9X!vRwnUmxbjtOG`~v)D(OHyO$#|ZNj#KSp z>Tf8zVKB1?I9%6Z9l6YhkRIsPjQScb*X>KOG|JrJaRa)+ydf?^)0HAwysKQ2!jK3* zBWc(S(ApVIPXCBEb_Ci*>9QrK(-y4j3AE%>*2%)QZRw*wrCSF~?fLuQlY0b&wCA0J zBdgku0AY7^B23#Zr%26Vk9#QCP5r!ATGQb1rQ6RyQW%=SUnX4bVR!cIJ|dOP+8%ia z{Nc{HN)+%mquNl%zViD_CYBXpi&xO1-zY;`OfzoS?#;cEA`^c5Q=~V8cQ05TFMg2m zOt(&JN4c3cU5F^qxlC#>@rpl5?=hax1wd5e2bamu6JD}?;ykv%SFmxo#Fz)&9T$2` zIv+iz?GSEXDFp|%vp#;q7Y6kn?^tJ`!7Vt4hVVALc@hYzv6DlYj0*O`5qeAfbN_a&j4ZXeitgszNEX0K9V zMS6ZxM-BpEoca<&N*&K95Ctzwx!JWWNHI{ zqZ5qK5B04wbe=#Q)?>lVVh*trUzAEMt#MNlP`TvEmojpYx!E*OaEQgNzK3$7%tgVB zSwSrsHHVvy=TPw*DYB@TKpuBxl(3Y1dFz2tEglSVGymuU2K3rq%axzNUAvbI27B@0 zX-cTk)pPpW*3IoaaV=_-Wx2rVIkMADlf~WJRI+VJodc#eQ|STbMIP{-NlNlNhiy}E zsXKd2022x#yqNdTR}H#zooin{0o{Wq>3`y?A=F5~VXA;GBSor6!`6lq=HzO(xCp=@Sr|2}5kT&;L+1F`$~JR02v zebWJXzaW9N_c@%#7uPX(*#Z{XfC3lCwb3dMnERx)ca=KyrlJydh$SP#R*%m|bBeRN z68j;^pvmLs(!~?6Jkm~w0t)u?Alzbt3x#8kt{I`GxvMd;h)6>e-LdXmCPs~mZk2kM z>OufSzyN&bLD+U01Yh{zV2Wpa95(l%kw(8hmhKk>RK7Y%W3l7gmm$FGH!Dy5r^`4$ zMy2dHo1eIrWTRg$yHaBqVFpHbB9pyLF4d+d@zNfwU+wfW`EH#ueNMXJ4oF+AbwkVwB?7KNO=@ zSG#QCj`>@Ubovb4*i=|Yqb#T4-VKPeYbSG$y<$Nos`hf2et7mII&pz>Lon9yx?b4_Q3j82RR{{U)}QN;uQQ4%0dsUcR;M6A|1oGGGxxN{T$Y?-VAhG_ z7Lg~2N0qr^rmdcY3~Sb$I*nFHa%XT<(Q_WQv^UU8hJsR0+y`Ciw88JFgD&aPe|Gx! z^mA#|x>xzx9&s|1XzyM04nbTravU3m@tY~LFJvWGzfg)Re-GM~vtIHJreRkzbH`wv_Yjwea;P)`|=+-@d`5qpKA$eyEs#uk}ad z184HZr)2KfV>U@Y(Os_-Wj2>T;;Qt*hWC!eY4xpyN_6EHLt;`xJdfzyWe^_r+3-cB zxN&D48(2>ZK^2UI+~ii6d96*}^WS?bf1iS&*X)CqG;KeoyN{$H0iCh-?1=fTyH)M@bTE~97utErScb74Bn+cdQQWfjVcw6 zhD9?MgBw;0-nfI`J4xA>n3ui(=tGPi+RFWOB%30T3#1Zg@ZWn=m$HGK@8I50tTGD+ zW}*!-U>~Gn`~wEfDxIj=^j7=Hk8JrFA>&!G*+}5u2R2%Jpg2gT4&ZzZX!QX+{w_lH zupZY)W6v$PKTZDc=}E_8-JnnOrh?qsd?z(r{&;#`tq9d0kL91E%sObbw`rJk`=Q=u zxv%GwVezBlru}l^UqVVFOo8%2&val@OdpH5$zo?CpR>as^jwvEl-@V`>r4bDYBOGW zd%EG*I{(LM45R9rv$5+*fQ8FPxZF;vZO6ChV!P1QFree6EqOT$B(ti zDG94h5LSCVW?dl-Jxci-4hDm9FYzJHZR z6BWIF_G(4A4xBD?1GQ>t__ey_h_G*i>P<%;Ur#@VcAvV=B}YDSToyw`@bOpfAjPk8 zkL=_N4>8|o9Hh;YMQj|Ee?FvI<=>^)L;Q~}CEVIb*W*#J5yA~k`u;er%a8y z@M}5=7*+3c1n%nsa^D!!dw_2U+V2D;5)|_PzoKdi5hmzNT1e-9spZmOW*M)$<-nN6 z1WX3eKZ0gtkG{Qq7Hys;Kd;%LTZT@v;f>2lP~waHj8-lx`xS7-`}9rBb!|m?Rcme1 zyS!2g=vex?&v9Q@?RGhb(xPk-TVfzL^rUW6Hl_`<)ZPB*^D61O^k-d-$$6im>(`#? zk4zTWpdH1xwCyZrE`l)bd;BpfSDJJDUpYJ8<4!3m2A>5>-E(h@sr3MCsu^w-lq>tM=NC8fp6-R?HedU>BKL8?GN6At3frkET$cmd>l)m|N6}wIn@;5gAZ*Tc& zXLNPd(g7!}_YcYpzQ^V{1mQbFy>9X0_JYhkQpfb!^eDbZNOZu2^u;W&MrSS#(Dr_d zL>x=v+D1c#;p7h(=Ya{=4PdQbE_6KQT7X0ia{#|FKzB_q$~Q8qfI?kNO;^hR)h_M6r@c=K zDR2~I!MOJetZN+1GGwh*D~K2ARVYA+ugV?6gLiX48G)m97QI z7MGb2aQmKP1^QYoZo2fL^@he>I zptJk12PSdRP?sISLP7ha4$^qEhGY-I9&4Augkgi&pX`zhlH0}UZk7d<(qVV1g`G%4 zU$$o@5zJ~2uuJv@N+~PucBa=XMgM&`=6N;7goda{Yw37sgSB2$PEiIo?9S!tXtK0u zyG<49hUlL3bKw;Cz6XT9n&hc&0@gSWp zWuyz%!8SRY#vm!2kefPX8(HirPL>Ufe41fa!?SvGUj zq-b;EQLCz>419w>uo|4)P4w?&8M4j1Ya4&imI$l-EJC|XQipFAd=?KzX!X!D88!ro4D*+Q%1t@!UOyk+6xII4>)}7x8us>p`JVmRbh7ZFDpD zT43&z>j}E8!|A?o7(4Z+Im%sLG{)NdP#izOhOR_lvk8^6!lqga(Anezyh2{@&3mJh zku18=$&TQ>^2Af?P1`xltB+Gc|L< zN7qiB17?4u$~UtD7vTG+yVjq%BL5hz`#}0B)zi)^!xTMqKe<@YGsU`3=2WLb)}^hs(sdH1i^74x~Tla*HT7`k~-}5eH%{ zTvZ5i+sZNR?6YUb-*oKI8{w+Cmgi814$Eurfsr-tvs2@`i79F#wL3Tv?)uIYaxDA- z$k*Vg9gat7#o3ESX?8@g2JM+e0QmhySI)2v+B|Mwjd>c0uu$=Xb=g*SB?mC!7A@|Y zLhR=3^jjoC--?X`Jb$7)r$id9jcKPCklL1q!7?75#i`F6HD$Fc=S*|}6uC#8Bb#NC znDzum$)^(CJ;t16Y4N^gCOa0e*aZE=(rRI0BmbzK)^6(S`SjJ844nz(&b(|&4X|=AK>cTSzSAqL}l>Ds?reRF1)=-dSBqC?*RkmwEy56-H@N! zmiaIU$62?{q|Lbm4L_=1YzxpxvoG25q_r-%-l6^rUZ7Tcm0~k1C5u?3tDa0? z^VL;L{`pHLXe=wBmMpeZQCtj-ke&lz@7%+?uT9RU$Q0H9OZXZYD!a+>A#j2eKY4o* z@JONXeOxzP??J}DwuguuGpt(v1xhm|1+1Em>OZAg=ff|3kzb{!Vw}_UlLdy_&Al>b zNkH4#3l5_S0?zC&^OcR$#`Vq3V8Zs(#K`#fDYnJeA`sPq*mzFxo9zKeipwXu3!|3%|cHy;V*0R#~rb3-SfrCWF9+xv5{$X{-wm9f`pT;+$U zLTg6VIYKK<0kU=jhG!;-PTnkaET&|hdP~$=t({c{NB`vngl*-nw-ZQuJr>hMy0koh zC1aPoA02o`{qu!0v`BH7ix|pAhh=?8)Dc-P+@sU(9x}zvQmxVrPpw<=MU%{1N}C5b zy)2y%!qEDbNx%%%>4hv)qULmH?5B5r{c#~72 zF9ykw4}HP~TI~Z2ujFZO1k(;>)Ft@#e*F}ty@yE@!xnu(DA3+#M|Ch-=DdJ8wCAB@ zDl((?=ST4FB>=1@M!r3P_vvx6FVlf%(t5e-0p-Y8*uU?9jcvD$3+%tYk*;f5+}Goa z;u;1Q>xAAeoq1^l%VxoLW`>7rOI(^QQe)iXF;dC#*1nHp$Nlf)&_lcS75owdfmh+0 zIX?CKXmSi93CGRb1!@g5t3Z|;;;Wx|)s(wk%=qxpBRsmD?+(Vz5N$k4G&%78bRtIA(S!O|EuM13;+{LjxYV41n$ z@T@>Tkz+vv{l?;1{&@5~1MXnhK~55f&Z0opBQIdJG%7S2G32rSvM+-@Y~vizEITs! zDBl%9+;)t)lP*gal3}wRM|gM!aiR$^yp*lgp%0naR_t1-pCW{+q`&zj-QDsy)%8#+ z;G!eQeOl<(V|ShXxmud5LwQY?PLcJx!(+ZyCMT7|f=vvV?Rf>_)F@%GY8J^{0sZ+Q zOJ$`?MzU zo&$3HOWUI5cPNAPA^~P(kiFT>b(ZX_P$JPoa9vmKBj@$nY#eLgGPrMb`k{r6eYoUB ziMu~vxXZxWq5y+y_rw2&T-^vb`@f&Id^nGI*zjYWWMQa^)%r~ACXC2iIWh*#))PK= zk+E1{b_5rVg1l+zdW}>1hng+8BBZO*8+P$B65G#V zrc7!rrSZlCS@brb#wls`LsE!>P6K-eNDCUV8y*{pTHw3i(5XH)rB+u@y0Nwsx9Eh{ z-IG}|rLAv-bJzM_J8jFxL{J@B$VxZGBMcJ{Sw^~*PolOXaTwm+_qx6pSW&AGZ~xB3 zF06-hiCrwBaq+d2vBm@z3Y4H(cf<|TyK;;b`o9~E809<@i868i3a}C>Iw|ecU@?_Z zzFUVVZ2`w+@I<7pA+oZ46`(rgeC7lqGkn61Tl8ZIXLK`4I%V82In-ouZe=;Y$nX;< z=TaHHtD6K4rRJD(GPL}6!sWXG$D1u>_`p5;6b~7C|Ay?#@2vEXxX@1Bj1V$oVL8qz z9@L+(LLD?_@yj)$!+j@HQh3A;ZTKJe<{}a?Z}BRa8#J3)X!lDeKdkvqI!eh&M7ynG zq4noUsXByU(>THYj>A%rqV%IiNg=~zPqgQW&`{EC3H`i|nq6a$jVd^{XpWT$wz+ys z+CWCIZ^+*#&TMqG%!Htsw6F5AbGlxP6aJ|T{g|=TU2~rDJMyuP0i2We6lGA(r^^(F zR_egvyJmD(OApJ#DcUny)^T|*9qBj$v8?*Qw8I+p4?-_XO79Rsr*i(0UrB3=YrV*ipsC>)0n6%q!S{7H}s0R zu(kvHDOAly7BLe#@=B_T_7zf^Tk%1*AEPPb4jha-*{e-rTrG|XFSPN*x#O7rHD8or z7KYdt-f-o8V0;mJ7Mz=%tRgIOFN%v%{R5wMS^;qr^#&F6Xy;+&TtIYzt%_7}2e_6Bhr6pS{H?h$tY)KaBC9QjZzm z^E&Ds50amAHfH5+2H&9u9{))CP#Qdgxk9519+#@~XzZ|VdZS3YvPuav+6phQ!0%{> z@QxnHI?c{~KX;7s#3L7E&?GwOHhCEtJ)q-e1sCt=FS490CVX^zA4gFZ0hM7!T0FbX z0FCC%5L|ste6Dj+xU9q6%x!CZbcP}w-j&IZBXK1ekU!EjcqjcB5h&gE4JLMS6IP~4 z=`}{_w)hq&<_1XL!D47PuB z8@YTN8}MJn>6>)l@6ff#o{w7?9Qiwsl8o9Sg9MH$@@!d!E)q7r<0e;-gBEFY)aL72 z6OeKf^0GvhsMj2QHt^eSqV+xb6MF|^&fvpGSHQ}1HpPYJ(slb-hE%)bT#oBRcG;d& zzE_K->4^@$55=wZ`+8F3by%r5tiRx#Tz(cETuV$LTmL*X!>lxS|K(6!xa632TSr~6 zXS&51tE!r1-%9Kfvc<=Z!r%8X@O>G2`wbw2K??A|cT z)Sh=jky$o}n%glZNz#}X4KyIX*Tc}HlO>rCUfn_|tKiNPqeb-x=44raQiZ&XN1>O9 zess*#UlR4Hw=Uc^XlCm5r_tH49ZbnX*KvcRV_m*k!(fT2{VQ9kMEb8I9F&ez+?NMCB_Em;r zzsJyyA*^K4@k=;RR+9k6#?32?A2ZxWTserg6@_W$6T|sf*(P_RaBSitds5}a+R@P% zsJ(F&r;lHzl7vAo+C&RKYGcXSVqK;w>d7(k+}~h;;sAljHN1Igw*Nu+9b06(O&2Y( z#Xp2b3i}u3kGS{Wywa8ju>M^2KXzYyu+c9_D(xp%n#8Y#i(-48%ti%s9dDA z?tl>uf`f+9c(FX%lGHdw;le*-t~PR|V=ohqUvsG@P$N8fGI5(z9^b9^Fg=pvRjO+XPv&V*jq_#^1^BA{xT@Y18mC(lLckAklT)XYNP(VLD~jkSO@3u zh>MYloE-igcerJRK(F{g=AtwD(?d3G%#BvI4(*F_!-BW-5I+e!{A0{xV?=~6-in!J zxA3Ox+E2T8|IrL{7KQP@mee)UGDS<^em|WGb(hb9PTJ`chc?hmax+iA?&CE(L+%}w zt%6578Syae4jNmN;=pN_ptdyM)$P3;^Nirz*dqV{Ii&yMi%~1EZDPJKtLQH;Pl23n z_|mx_817~I{-YQq8>8}D7=7HJv)8h8+E1E2bmcB-hDZzcZcK+#UOAK_QoNQJb5#yw z$vV@d2VgKI1Ez5$@g4$KQ=R*JCv!hg&6){}qSEWG(|6M;a=Kn(Rc7!bw;Tr}O&7f5 zhKoE#HNLG+T8=?PR0GGDtB=4G#ROtrcLSOHgK48G643!7?!tfQuOpA}=z{?WT;s7w zK=x2UFe}$<{UVrHMb$+szDG8goAjFi#69-CuXrfSG*nhzE5Z5DfS#Oa9qkV;X*&{! z+ij5D%;Ymrqx|KWN6$Z%DhJrip6O7SxAYuGioTiVdt(h|jONs8?uuP*I!Lt-=BApT zk0OA(`FwZC=$xiZs6fBwT?evXC%{SR^!Yde8~k%+Fr3Zp2Q3Y0bHF8C+UF_1ZA$`xFm*KkBZ8=j?5EccmNg8(P>oa1`2AuFE&?LLo zkMIMulJ76D19^_=pUXb`_`}LO!+k)V@?09oWgN$Bk@}*Yk9bKi^0>M;|JD`o$g2La z$aj}7sTj=8Fsb#^&MaL!90SVfzzs9bM0f2RJ|SNH+Cd2lW??3W@Czb3aX3V3vyRAw zg}H1Wd9RD7Q5O13X`!|;N0WYCyaHb%udv9{P^pf28r2D7mguf6mKxsGOx^V+(3lrr z{O;B{elQz>{Ej`n^V(kracrx;GIC5eJkH>%(Ut=dvY5&tg`OvGuK5=s0laUr^+O2s z%X7pq?;XM;ZUL>j%VjX^khB*Nt}}A!wHTbXG^sIHI3p3GE5h zNfT$O3L)DA7?=$DK;Nb`hU)NLjvVuJIAy(kdnKGlo<0!r5)`rdTD!A}q|*vfy4UYw zwi705nNx2BK9$-79oL>`G2TwH5UhRNKvpX55k9HSyCSnGGMDsPy7y*iXHgK8(iOUL z0YBK6tiw<29E$^`&duh6%)~y%Qv8-4T{$Led5%;fyye~2AF=hVrkIZ&_PgG}Q@RhG z)};tHwE3&9*}EB${V_DKS=#Tvs3f37`2{ZzMHlF3(ec<_#B^M?bI9bduEzP5Y+VR) z$nXaS_nFb6$PTq)FWZ%V;KeZRx8SF>F~K^%Pku%}znT#vQ%rJ$E))@I_K)}g9BkMh zevJ&_b*##W%|oqD-KX6V*rjFWVBQW8sD#IzZ|0P9t==N}dD362aB@>AIF=23krB81 zbJf*Prk-B&VF6K!5|HC!ysUpbTuFB8m#Ow-G91kgm7C%{eq7{VA(AS&l(3{OJ^X zMSC2L#`iqIk!><_Q$NF1QTo`4XYK(S%(+mQ>6VK=c3>*jFR=j2R60NZkRVe}-pa}z z%;BsR4zdgE?PWwRa4d-MM5%rJgGli6pO@zx5UUlW5KGsH*o;Ie+5aWk;-D?RK2c06 zQ_*0Z4t9cCEg3&=ox@3U;-CrdvcZ2%oPMe>BVRt{L#ya`6;x%!TE?lbl-k1pQ@RKF z;Gk^Yd3aieip@wQC+M*BgRu5z!C(*_p2n4{Eo^W;UBw8=(4i88ENqEcyx|WbrAhIu9lvabmvvoU^KT+ez zeU1B%&@ibZH*#H_0Gdm_uzPBgwJcqrH-t%gGI|gNAd@JaEVMyMvLl~kK$Y{a`SYLs zxIbeKA(j0ryB<~uD_!*vgpFgOzIdY4tAgGI>lgBPw7}1J1g|iXQ*dpKk zk4NgSR{=U_k$}S})`k5iKJtYx;l;cpxmg`EGgJYS(c>7E=mf%8eI`3crTz8+YnjL@ z%0RaVk?N{kaND4^8-?3HwIc%i(2g==+E3`Xj9AM+2_iU#PyQx#nbL7DA2*aQWBI%( z2qzcI_`_X)#GOdiu{~@oNZ90gseFH@Uu>8=5MP3V_rDL5=2!7>SQ$QYKIw3Z(#~J4 z++st&Ts}*iSO{xC>2BV6ki-02maERj^So*36ZX7Szny=6pm0y2%j^7)9~0u3GWS1dF7qugsW%P3`dB*8^{g^yT;A(yODPIb1diuyPr~yOWhgi%$1=d zc9jp|EPE9Em>>e{4@IvdaBElFlF;lnzY^do&Ti&~t|jyHfmk}y+^?OK&Qq7L{e-8l zL`u_5AUr3M=!7Ea3-mqYsk66rBIXPl(}{X5?umR7p_?G|e_s2rhKpt{|5Xs8OFxk6 z=ztp*>Oey%qz<4xqSJo5u{Lkpu zU(l%tX)3qK(?3x+5)u22*9p(}7fX$0+!fs{tCU*QX$%{)@q)+yr@Jp?{V*H)6Dlpb zcpsAEw6VtX8U;EqeemJFe62e5RGW&l@n+FI_PSBO$gC;O0SkFrw=J+>D`@f`s{m%U zgVl8R0{5Ne>m6|+vT}-YqDvu0tx&V`%NIu|*F9{lOo^d|Iyed#)EZ-p>1mVpAZfaV zCEp21?Ka`X@-2{UYRjt%jfDPtmM%p}VmEUzYNasqi;VUnLVztq;m`KAjY}u+T zmKew@?$n-VCIt0!OtQ5N0fdjvm@3e$wS1QjIBiX$DI1%-N)vn#uk=~wuLXZ%5*5jh z?l*oUK?RSGWg0Fjgf!K|5_IzD;%Qm+q`k!f57J@(Fz=mVoc0$A5w4-LR>(1Mgv!_# zzD42k3zk4#NYT$G>6rL0^1A}nYs|1LkGoSO+p=_*r@Cx^`Uy5{_ag?B4(p}Bmj+$_ z$XTnsP_j75@Y@LK!tJ<+@+6EC;o+*Y%0VdWs6j>LriydokoI(NJ)>XKW!hH9j&rcSeo?+B#C$Nkq*@&{!S)XFvg!mB$IQI5cATs?ETQTE$DXqXfNWTXD z7axE$Ox=O<8%?bd3vd{h7MI)6aG zTP(a$8%Ul>$NZ0R2MRqyFX77@mEt|JS~>!=v+L8am)FqP*=#<&s>@G5=%4IRotO4l zeA2Al17F(9@Fo4lGM`<}wKwI5iG}?s9m$j?D<@Xl^WNbAcgSsx84UebQnlv=(Sk*4 zIZw$D>(=HNK&I*d`UQ*Lb)mGi8x0zK$s-PE_w_LCe5R8nVP0pl4`^F#B!p1xc0okB ztOQB-ZLGpCp0$gY{>p1M%fDyRd-K!_S=oyuZsE=IQLHr9dr+VcE7zG#u8bQ*^* zn#k_Rx>0d4`G&ouT~25B+;r7idwk1)&jCX8hzaRm{^>_y%2`|Q_oaU67-N#nhe5k* zAc5Zf#`boFf6{q|MjPA?a0QhDNy>eWiBeUEVSk2(?^7nHy%Ok2ys zLuZV3h*&_1Vg}tewOoChf!=|*DJTU5CHt{KIclqL&S4ttSsR>JDi~ywl z0|fOs!aPfVAd26yEC28kohV4pQKY7WV`tN+L;UEouGqh3`*_$ISu;ECc*Ea|QO^3i zNQ^Qmm{t1yU8VnU28&a52iG;P^G}eACB6-BBtWw6mV7CU{KR}LYBafB6=19SBI)K6 z)(N_F9IgX0w2Yv+=tCPu#0?or*B@bwt-={K%9l^_{UUQyw2qk$Ujp+E?GH?gjb++< z?6s?Gl0l%jtyA}p63sP{`m4{RhpBkf*Ib1^K-+lBUkKVRtPqdbP_kO_w{B~*Pn32U zZ-Zg@A>XMsL%ZhD^#uR{I9prY4!+bKvumg9Dllc6XG`|x$e+XV^Zkng{8E>-^zzqF z6|8OtsIJB5fnnBl4E5b2luv8sA&!MZsd&ecgb1!Mc`Qq6o*y}kW1amNE+Y|p=-_(E zrAA#@jVc;%Tn^u`bq_fE&Qm+%v>9VacY;n?2I$WUX~<*$c2EsteA29sxdCiaWKpLa zJuRR)-t{?0?UXbzueXD@SdsPs9dnj%$8B`oOg7D+sCs)Krvee4IUn^Z0}BO3ccFJO zWht%fZXHj#Mg|0FY6-WvaSlAys6$rojT$LpfS+~zwyiW3GrPt@IVkmADn=L%SrM;m z$7}b!(AlUkY;=#yom6y@FnKh9y4J#7hk@}g3*8GV?#j%i5=Z;s%($EM2A)ey=F0s( z`YSq1>+jw^!0Io&_R(d>%f#|9;CzxT2EM+}Z#y<(gghL*9 zpMf~oZu}ASrPtUTgQcs7#wDb!Bk71td-Ft{ATR{Yoqrq-W9zrhAC*3&ycI{bZq!h> zl$Fvl{$Is${;?s_k_GzBxld+}nVv9g^MCObA2JF7b8G2{G1M~%_}CqpmVf>nyUJcz z9U{!MA8%Fd{qnq4xp@|seIz05u3NA1o+YyRhzUuzlDvyDLvoBYCNouiT&jz6Q2fpu z3xg&f$(|{7JoPFbbT=$>iGgQdNoz=bmu*==1Df=iAsQ@x`kN}=L5N7<83OxEB`&kBqy`=h;-w~ZIefLtTf&0ZN zc>3-O9`63P5`7Uw_$^wrPYA*VN4XkDo1imN8+Q5@TDX;pf1#2*;d%HiZS&Ld!rX&z z64JfajG{I{ah?qs1GX$B*^kY>z9;ytb6 z{ewBZz&?6E?mFv1W+OgG+ivL8BRW|saJ7xn?Q;l|(wP1bB3~unl#2zXmh2>qR=V*3 z2v-|(_bPV`%L&sNrm8TdQ<}WZ=_fbTYgD&RS)0-*285f!=(Zn5wZ_rT`Y@e3mvsv3 z(G3ebi_x(^Q-*D<04FkuVsnUE3jgg$v!%fuhSL!#fzohKAReX3jQd%E>l;y zv@8;LPvPpzF}}tu;Sq(Qy6TJY z4nmpCu|5H6riwc;`52QIzvtfiSp3StE#ML!a?Ij_9V3;bI)-t;d!^4d2IsxP^$h0M zmc6mDHZQzCXzf1TFuyAVyS4hwHKPOJAOCd~pbP`Ac{5fDQt;JGl8gAs!N`XvbFlw? zx(*q}E-P4tSjmf?#rW;M&i(Vbv^CBxE;vr+@q@%>Bz^XPW#9)2F zG7SY&?v0)?*DWebx11D)1<3Ef1(Py(7mN8h)u=5QxrLKxL-MyE*SLUzlKQt!(s+VO zCMMt(S&5BS^XoaO}yky`C zuYCD>JxzA3{Bhij%tnzY&y+Ssy^Opw)Cz=p!&+M_u^rWufxV^%g;ol*trmXV!5J=si48)7nxIvo2UNWhN z#RkLiU)?^fmhYD_`JKY_;O~g%3=fb7_I;f}hb+8zm^Q{oOMSWlKh|=+_NS1eO)LTo zt%g};>G)yrWCg_yx1SO4IKe=Ge?ki2IJar!@%nE1{!f-x*n=OSCEo0+e{3E{vc*8% z3P8!HO*kPoUkH%Rco@Kb9Q7qHQ6nwdK(UWg>C053nzw1+Rc1@FrcfPI!^%R|NsmW* zGU`c6PU|x=0`AC4dLlRN#)1D}-G=X#Kf{=9c|OtJ>-LPOI_yGo6<%~Vm8@+hPHg__ zanG!Sc+!nR89MLe&Q6TxN>y@#?A|n@H^c{%{;R+g-noYD0<6%r*b(r7YqwiJF>;bK zFY)u7WqS;`5G30I4cWy2nF_<0?cTs-WBBrP*y}vRF$fsV9-yyy8OW|cV>_K?5`zQ<+_-P^=Tw1xWViu8~LNH zM(rPQeml}xu(+gZ_dA3FF50tE38`;+s{V^e{(>QMx`^p2l^Gs(`Aia9y;5#yeiaB} zS~_GLL~T%;6RbbY8IW2`wq=feoH_o4r(ZzM>#0{c_JL$ARX=adaVix541>VeElE{% z>a?4#nSJ2&Jocdyq(?`NHt0yUOE4P$+lqru1GnRbXIY|tU6a1Mk?hbwnQr;R(I-Qu z@P6pjEv{dD4U9o2egW?3Cx}Z18OFgQ)t)(|yYGzIAZ-rDnSKj1GU5Tvg;7lY^Z3C) z>KCPnd3HLSg{K)}@5i2UryuSI3nLH2_{mUZwCp+*@4uc^7_IHEiTKA|%_=(;5s-%% zO-r+NjC50@!2hPBlc?#lmW~6`UCLCUn}xTK_#I@v*J!fIaQ`p_%+Ipt z6WZ;fjiy=^BmGBHv-pt9;nLSg_w+;AE~M+hN`JUmK9eqkY<*j3Yq|Il?=fnk>u!gG zp4>(BHZdn%2!21i13U>dL0MgI;6{cB&Gd43SUu=`<0g=^nYj+yS&Rc(r_70JLZ-f4 z%VM&vY?kX%u{jm>324oR^kg1lAr=@q#tRZj2g}hqL(gP&if*PE^EiJV2UyffzjGM` zKRk4fE8LsF3T9Yfvi`+5YS%ucQK&q%j9p_;5`ysqomuxxyq+knho8xOC>C%^ex+Z< zICBJSz8Cp{5{E*cSXs80IuGOsuT88Yrs(2vp)0S7bI%&?XH?eM=VjJ($?c`-jUt`) zeqd!(j2lIQJsc&K*X6jdE#c7ShxO` z$0xo{i-;d57Mgakyc@QU3<9rJX*-U{PJ5IWg_aq~>Ay)b@JKrCrRU5=oa&C!+%#?y zVJhtj_p;f6f$~s9p@0AXPU(O6K!d}hv&KA%s!t3WX62X9`^)De*R(p>58tvJt-T(3 z)RzQb&WbBGR9ULcj!5lG)~Y%2T-eP>e>Z$mzJ9OF&8l>LvnNyMz5HZ{*;8x#l0SM_ zJ-g+S!o;6Fbd*x=j+pm3>qMc^3zQVXmf=G>w7L{l)H{Gs8blA#A;VixPyRJH}NKD>~sPp^>4k%C+udC5^{@}SQ0;PPx{>u*{LJ|m( zTx8$>;H*XhwJ``QH56uU1m4Gdjl&p!AEf1gKP>3zS?KWi!EmHgDSsXJHb4m8X+{1d z$={L}WwQGQ-XB)zccF!2p?tN2!6}K4>=qWiJEy(+Co9%DB27CzGC{<3X2%s$jX6p? z-<&DYIZIq>gSkTX)j)WI&?oVr<58COw#Es5S-W2cM_Ro!zpR6YIQ6*#k!LI&-voxs z*N++0T4U^LV|}&D)ZCt`k)+Dd4{ll6RL9Z|UMAi#U+%&fPSIKj|OW zEXIVoxLu4og`?Sse@>2pt%7VQ4gcBxp7Y~H{S}G9Y_=$+3I<#8?@%jPS+p>&`QmFzKwMJpfzDvJ5MFbw@vg}lpgIgbcr`<$z`*3{iI#7{uPI@UM zHAI++TUHTLpHLd%;+I^cYq`9Z4w?d>Hsgh<54|S0D4&1l7E*EVeXjH#PcwEl6@zN@ zg^x;gTzLk-Ga4MTITjI`&dw%n1gMs!hHO+t|UmIuIf0Mkq9a~C)b z8>QuceIe8-!#*|a$;-eeq{IF)mg0T$2v0lVn))G%B^`W=&tSSyDvo2kGLn0fpQ^DZ zRkJH!(y4~CDcpAr0Q@bg2po}?j#(d3x}Njcaq6hMJy3VSAu7QsWL~C~!B300SCTUiShq!v3yZRS9yd_Si)>v%+UoT$w4qlI`N-^3 zu+1vMQiIEzwBlBL-xW~&(}ZtzW86D+?8JR~ddxt<@Dny(unW}*9*?$LGg)A-25fZg z3NUIOU-wPFc^^6{i*O(1nxkZcPKKm3TH`z$G2*-W?R75dIc9S8HlJTPX&Qf$Y7d`8 z8U@aB#MN56yL+YD(wBC`1KNX}Z0QdN-Pp(0f>4|;zcD(-sGa?F&ofOYz0b4Obe7wd zdp)E+we^-PIeFWHohm#{=?QU^9r|4?s zy8bzg&SX%uUSWV2kHib|y_7>|KWedbmW^xE+8mA?9oRX>bYPV`uz3wfkdfKT=XAj3 zjQnYvV@zgg-r0-z*XxhHw%lkQv0>;Y@@`b5 z;xZccCY)u62<*y%nA~k00>QPStR$GSrT4VIQN=xF-~$^!Z9a<29iX4~!d+n1Qu=xJ ztq0h^)@srHgzga`G z#WUAag8mU_Bu!Mm?t{%`CX3cSGBf&%3&>{fPwU0qJQiF=?a>FA^X^@BHOc%nfy zJk%H2F!sFTEp5;7JZ&$>kQpxV2MoI+b6Q)#UM%xNNTainibR@c#RAr{o=GdGH!5Xx7whChj6o+$ z;RJX`8NTlB;j05C`X@Uvj+g(A^H|g_J9g-Q^rJC*j(9q=6UN?Bh7Ry)&(IEt+UNKn zd_G=4&Pg5cHWD#Am#=Wdn$_B;7=mRVZAC-tZI5|y&KNx81C~6GaE_K!^vofIk*FAq zc_mU}%JS7k1*6zi&Q{WtBR~D_yx8yazx7`vtnTZQ1lzCaZ zc#7++#(~@#uRX#Z{E}8!;k4eMI&I*ZU*lyhoR4(wrvna`*J>Lt8;<-_e*l%HvbjG9 z!DNS`VtMFUcE+e_A9lFo6K{&G8n8nL)?{p7Qn0q|p^h(FcY}>;Ori$ZawcF~BF;wh z>@?bYL>g@>=|dRl~RgiGTs0ut@=nVAAL9DK*EWSVjbPE53nYxOm)mCfhc%uPEi zess{@;B=c8`DU`OfjeP z#bsT^`S+n0E!<>D+F<6_;XUQjVWnMQ<3g+mbJDdg&yU3#HPZ&$mk)v3ds1&6VE)u0 znK7y4)m!pEluEU1%S_Pzn`i`8jkN^_?&-h-?e+sVtQwe|)4px_#dp+#NVCz|y%l{| z+uUq;wM{}Ix(o{li4*dzy67l>9#p0|%J(>=waV>fE(UL$mb>B**NfQ>2k}N<07O6J z&pjlmL%xN(5u)@gV_hcjQS;Wm;ZGIC`vYxG5?rOk_=G2ISj zdl=D$kNBZ=l{cOx9pnl>DdB>KgBPFiLGN1dBdb#HU1X8-;XcN5ns9+pgV&(rV8(yf zJdmf=(g*VU%n3eSD_`E|z7@N%c1F~_zJx#NKLaWW&H0qvd_RNqhGqpJ}Ij}Yi%l} z>%PwsZ4H*?BYe7EdgZ%4>BJ}Hd~@vn9(12nFJ}ImNtQ=E)JWgp$ghh8(QV+_Y3+z7 zM(G!K$6ja&?9c^SKERVqS1>i~@yEmrEBMAUuF$0Uxe&c$cEpj#xQq76JNGWa`Tc}S z7@_@FhCPDZbnGF|HUvu9O26n{Y^IC%4XfFG@_zb-xQm<;TLZ7eR6O?CFEz=2FCx*l z-hS!)^D-ta+1I4U<8p|6Ipem6n{7RC(B&|;yxt}CfYyLXwAy2D zZnp9jf>viu^2`Jx_3Ui(7)!*l5mjBh(F1gCY1HYK`RGB?^;HDA<+rj$IKER0q z(+^U0cIl)+7dv%9f0tfW61dC4)Msr7JoJ_!7N0n>-7X3~CDVloENcH*UA%PZE@x>} z`Ln6~J;>=x|K`8fZd<%pjs7_Io{@f4*o3YlCv+)VH~kqE@J7}k`IBxC^|(VxmYXy@ zJml`1$rk^}y1AOVN zyX^4(4s5fGOba<8v>9N4K!H|Zk&)M-PM7po`8)ZN@*X2>ntwN5>X5}!t#T;Pu23v? z8>Ixkn z95z_SY{j_J8}-}uJRBR;>T5>~%fOuK9c@aM zrdWo>xT8obmt`{Z#WSoNd@1}l2^yTcae?2#M+q@rGJV9s%Shp^oOFPb#tRcyn*z(6 zfrjyNv(oaR0*$P}57*vIO~(4-^B_4;Iv3|{UTN=XOm3(2JESDbkc|!`muMOFZeWdl-H;@PK^ibKfne> z*0OiQ4+yG7gfSfqi#@}G8Ep|87eYP}QZc2JUH?6KaD=7keMfV&KNhj+{Y}7EKUcek zLu)-JV^7JH^{3FTTc)k|_9(=p?Q|>Q&^v>j_ZwD&I#F+I0c}iN=r`+3&{4lqmN=%> z(MhlFhGojvHsb`*<4CM}cW&ME-6iQ-@ufQ~I&8M{lvWqM|rK`l_Fb-AfJcTkp2 zm)l(847wvzMrms6!JuGc`r*PQn$!`OAHD+l#JHD^`bP)p=&J`eb@Xl4V;$8YMp=(C zc@XqKTJIDGsZm*0CJpM?M=bN28qD)7&zN;NhIZ@}rrh99@4$Ky8-zN|IMF=Onf*F; zF5dyC73yJNDBbbbvAy#9ypGW&O-Z>+WfYb8(sqm7fb87UF&W;Q%CD;#Pxw3~js-fF zdaYQ;j?v)Hg)?}dG0@*1w1XoCuBwaQrvowRRAHJCXYx#jmZ$r|${|9syG37gsH!3baMaY+B)=@U|&C?xI-ktW- zHB%D{p$rhtL!)jIZqKk~Dsj&*ogoXo4i;DI-n~u4y+~ z@{PW}RA(Y9+m-V9K01r(tHVKceSl3pT56x8k_RyYjrWZHz7Y)6I%I7K&74_&fejM& z%}SSpW$HS{%J9rIq(kl$bE)KiSfuTx{!OT$dioOCx48A(s$Tp){ zeS*~crkr|G8F%{t$5r_jeCdX> z&PRYRFNMZ}JJw?^NmV{XU00eCczZV(r-I)<$MKk+D#Q5UX0BeE$Bl43b3iadRXQQhK^TdbRZ$Wuh_~aQ3_qBTc@AigiB)q>Lc~ zv#HwVYmPJA`!1S;GFkMdnBzRzMBT|$6;ZNDS+`;k!7-T6qE!J;%@KZm1>S0gi6FRTKxFkHK0!FM-O!u& z-8kUR>*f)z{0EA>Gn8PPOY>zK?2U?W=`6*&j>Q8y8jl^;dS5H~b1XD0n++i+2*5zG ziex(U7+JGtZ>^AT*iD?I{#de6IzJ`2WUY_NyZ>0pHQqykI(-hF79hl?_7Ez%_E_s- zTjR^85^i1uSN5F8xz{A)TzAi&ys!^OYjZPAqOVyuvZ}?wT6>~WRs+)9xmsH+R&;>%T*@d~scXoy^cM$)@6+Xnq$~|Smx(v_`Q6oKFOZ<7gyN5k#B)z z@PbRtDfV+T;e)oM5-wmS0Zdi0kgi6XksciyGEPsl>Twk8m9D?=0ZC{ z{+x}i!FDg2P_QmFCh`xakk=OoDlG$YIy`6!OLvx`54>-wG#tO8)%Wo2-%zq)T?=(a z4F1S0)z4uFU3HKV^Bo9$M-wt%{-caa?m2)?cECKtY$-0)7&! zVPGr{v?Fg%OZ$T;r^-ri#EOpH4jsI$w2snx2TC1tLFDJ(q@#XAG#}h4I${}l+)Ad5 zzvBpN;?KQytMn9#5w+?*F1RX6s;w%pOG7bi<+#jw@t6}@7b6oV_kYCGLv~>}{KVw{ z%d|bRiITQV8M~$%u^e~lYp#4t;64B3Q=`?r+Q13r6$KvvYfE_Lgy%Y!br}_Aaz#fm zj7@g-9Qi(@8HC3$O6`<>Ci!?d(3>m$8j=hhq-M za!dHG?DSi>O)j!MNIz-1ZZj9-D&;0sC0N11lvh5!RNV4fi`plR@3qFAB%G6edlHiy z4k-REjiLX=KfqO!_t})HcOR%8lwWVGS&+tZ+;o?rG)za}UY`pHXXheHP5MoS5`*bm zk}i*T6*6uRI#bL3P)1H*gFx1;(!;mQ6QXFKQ|DyQSVnpp~gL9 zhR&E5wjmm-O&Pvmk2v%nbCXUUwuL@roaGvou<%}jr15tYpPI=~lzu@ZiGm+I@8FuJ zlZBV%d)}U-vPt+VB}jYB4Gcx(V8>|8ZDDYqxhz?_pjZQU9tJ;gmCdBMQa6Nc`;BF3 z2o7XcmZM+lDAUp#ku`u~$(gsG!1(8$mTO&v3D2?;n~?PZ57Psdm=(rTek6i&lv|Uc*=YM(o&&m4p*og=CWnHV}CvCer0ob49>^5DD#B#xL1F)X8HDp-6 zyM46hr_yVpV_`N|bncq$1nF#1o^0*E$>R_rM_?GBQ*Lu`e;i`>RQuXOveHXPRWGgQG<{8!=lR5v{Vs~l^tXm`>9ZuvF4Bp4@_$a1%9 z^+jC%Y!Nmf54dRbZ>+NH->y9hy@zBL)P|$DjMn40<*B!X)(;`5aPN~61HexPQLU!U9P)qQg6KGAD%L@? zg0i2$yOACa(u9fGJmYf=4dNjYxN+D@a-wA2Kjk)uO!_s<(a=@~M}$iYinR*6rjN9S zDy-;e95DD%l(7?p8R2#RAM99u;)J0vdS-ryP?L>SCnw^&! z#blWB1`r$ii$SczL?HzKm!}oywaY@uVf}}j4(1m6GX`Oxe$*G#JI}gzYLhJ>$UBm8 z_V>kT)%)#!kA+x_#1~D;PWTzr@HZ}*p7;xXA*SHXl~2Ke@-xd;cV&lx2kgcMB-`DG z_9V;1r&p)6g8!@*yCE{3r*-2}#&@wD_IXVgrMY`5yy6Cu< zyAEEzqL>#hIl)#;0Ay%l&&NU-|CjEtij;Dxt~jo}g}PapLV&OFMv-eOFl__~{!F+0 z_Q-gU)RnPU|Fkdv1s;az{y9{CNxCxW`_fu`|MEpJQunFMD2Bl+-HTn9qlqKz^JXPy z;7JLyNz6|+!e*U^y)ecLULdFeBfNme8e^(pAmKxlqwa9Ur^*{=O|KJ4pjtH@ks7>4 zWeLJHD$S9G;<)N|vK)P>A?aG5a>(qdj%mNsflr5! zyyilZJzD(<57KXLz!s>TWZ8uY+lkZt&BCm-^Yt1zgqU=i*fOB3I|NHyXr1??1?3YKc9Gm4c&468pF;8!$ z(X@~d&?~^_9tQM0hBLR{@cXPgq{Z*J-aK+PLba8N?&eX=Ox7Ufov7W-f`{@TK z?4|L(oBVloARN7+Us=DzzYc#v$(W@K23qn8BN&s}=#r-u2lTs>e~NaQnIPBmJm?PY zxJCd*%}9h1Lmack>TZ=5N}I2I=UoqgpoTNOrQOo`!ih)Tw$VgQh$~9V4e9iV6uOp= z9(t4v5*`;gGqsI+^RFDC|JKjRoQ8S9dP%t_MVE$I*H@##K;eEzh4O) zfxl!+)BTfoP~2acY}7jOryXs7#!Qs}HgrnsyeJQ~wa3mH6Z4GxA!FrP?|+E_LEhNk zzoCIwGC@z|`7JmUj+$a7cOMDN4)g`RJ|999RA%!MFtJb-k0Dq_JKXPpI9CkN7w%8m z=MEz5!z!)Z^#)biuTzdN!TVGFx5t}*{>#l~(>NZ?oMN%&^&7GNPFof;TzPUt1;oLTIwLSUD zoX-HsfwS zdHi7&nh8IaX@H7v`4!5tZCGZ~JA`i=lm$;EAoVGY!e0a8P{XW!_hZ5fjT~1$m~P;_ z@5w{j`uYU8-yr4vt3L{ku+)F^1GMfCRyBb`%}A*AQ3Q4FqfFe z`&IGPy2l^?_vaQ)HPJ)yWUWG*BX*?A92T^EWc^qm9xu|rA5QS?U`jtx76 zCur+})-mTSiwRp|NU~Av#4xTLTLKXV%aJafe0W+qFjhbxgyQhp=lPzt! z9N?+7r>(W=WuQ!zCttjuhQ*nZDPF%pYBTw5K>ptJgTnxOwQ?at{_t-zLglso@ODEy zThXyuFPVJKqHUd$xs$p3J&q*@$;?@!nV+e&((QZQnbd%EBAn8cCEZ>T2cvkR4&#)v zATzd%9s*o>dFXnVy|V^RCG zkA>!f!1W>=h$g<_Wn@;A{$JN@&*U$f}A6QjIH+dYArr*$&j zQQ^2N()N>2(8T*s=}*EBY=p_e(da8O;aWhSA)-V><87n=ck-U}?n6#H@n=ooI^Q!d zbjX-5@DKOaSZ+hh*;}6o*6N?uI=kr??QtzSSuSg(p6q|Wtf$LptWKPMW`4zusG;sU zhs#8)>-&Ay83^dE$!(c`#0Y45Td&H`GV(1kkIgy7%yKSXM~;(pgau!?=qD8M2m@%5z>e&y_Gb*!UZe?%O?KLE3NX46D9ySaAVu0NUOq&W<1F-inERQECeJXt%yVG zpT-AKF0HnmINGadVM2{qmbqah|u77EJt zU?v)qJ$S``XnYsJ0V9G_p9UDFY%Ba88aDk%=P$C7bx<3UEx|%hKgkRa)CFq`YP(RB zEe^{iy7T&tbR@sl`4_pbQwZz*I+K9tGZ^@h4*6m~7Fe_n{q+o1p2Dy~S&TBU%3nud z^M;Pxb;mGELj;JgIyhLrTgX7BuDM`6s{s}F4 zuWMyaM0ctYx$PKy@+8N$p6fc2AuGqTwC+@*bnEXM=S^aiUGg+4 zBJ-Hx4U%&$Mfrz_gf8`>hMpHb=G_e$dSXumZ(Hml#9L8Lam{JDyXCw5>AM7Ep|L*Wp1b13!p zxyxE(cLUe9sXNvOK^2@cb2$7{2D8ry7W6UJ1dOm_Qo=)jKWObC4X!WWOHc86>CY+_ zu$titjId9u{7#ql?1MUF=ME71{@QrlZ{VLbZE|tKZEWA+*j!(UeFDX>u3ygb&AJDK z3%1!W%+;6k6sfqg*aIHHScNao&*lcc*LiE(8(vo0A20P~EOM`{qwJnf%VU>1%#LB+ zs{sm2`L`V@usVRT>|rz8@&8qb$AabFH}}Hy|8;gIeos4lZwv3YzBbSjG z7I9!iR8SOz1aXMT*mJm}Y zLQtEm4&4>028d2hc^5L!kUt4B_Z+MHB@RXB-4}>+w5IMJ`Hsi2Nradewe^Jx7d4CK3(^g`)kPi&p2ci@9ICew(x*=@lZo-3H;!7_Zl$whWq)b z`(-@=WaM}}wpb2K=nZwV>x1-N-l1{lt zM+Y*{v-7DCbG)?1{fJML0?L){XMCX3`|XJbYnaOi-iOgRvd!ZS?Dy3t^7PN;@RavP zAD@r?3?ZHAopCR2aDVbJYkh}I;az>|kt%NE@aikxXK~s-!R=)4w^itG7woI^-n5pi z99%}^xmDiBj}4(RHuv~|Wd6msC`XY(aKd>k^W?oQb}$nHAm0l9{0ise;d;H%L4B?yYo2`YN%wk#clBoXvynaSZzf+QbI)(!1E5?D&EfYj1slfq zj|LByG!qJLVBj8nyXLV_-{DF)`ULp!^%n25JCArT-80#MD(bTPO|q?1(BT*E_42*Y z^iMb7sD0a-`a4Hd>;1)HdiSp9ydPR5a3)vBIv*Cyw|uh1Sm&KBo%SxY zjF=l1wGOT0tbVoG+Rd?f*}W9Mxppsb`r3Woh1K3?&$wssKuLKo)GzSf+`Q^OSY+;^ zc;_E3^^QF!oGl07!^M0J(fx=Oy;cIR+{hMw+`VIicP7)Y^~j^%^Bu^v5((&|+-C3U zUZkQEZSE`G<*00-rckXP_IN)ZYJTkY2KS};<@4ErS86iEayxNAV$a_GSPf|Wy7yyi z|1NgqJ+Z*yoah~&W<}n>>!QUwZxI~k;eJebc&35DK4)_~-1BS@4lp(Dn_&qZ^(O@F zB_i+q;{LMUyOJPGJtyL2@9nK{D4&Lxx__=rLoi;0%;9|r(7z5!JL$eKZ4OV}4jueq zi}&7W-)h)U!h(4(Zm#go?RH-$4ui4%viDC~)uC(q){X&w9D8 zg{LTC@geKpbz-e0+n)5kvssRFkMHs>uQwj5>z;ByUH^>t;e78GxK{LP_!DuR1MK(G z-8ZF{cDYw>s)r!eqlElm10(t5;qsDBhlei+g7FkV>?ZHoNdOTpoF4IhUe*URUWVm= zePP#1L&Wq`?$u83i{6`N zUSbNS?tjevu{?pX;Kb8gy^D8w?`Px#fASrntxb@pQ|02e_4&b_9| ziaq7MTwb{|YLDHtYP_5i?OyP{TXi?G^yi3>+t<&(cd2_d>YZKhUEAjoB>O~IBf@1v z=8BMadLr4@eM=9U^1b&tac1b~+*7x7$^)OL#w6nX0SI1!v-|cD?mL4oIhDvDm<=H( zxZ<(*tKDzI?kVr&z~mu=Gkpqv2D$dRvPkU_kNY4;!43c6NI&m>`6MFd@fGgz`<9|> zh4=n({@#X-5{K#eHKU!8Ugmzivthn_xtvw~ZoYd7xv0}Ui8&oo%=aY-9?NUr@pa)X z7$ioQfk+9L9eIjySDZJ@9Kev+D}StU&rW)m#*Vn>)^xgWt*>%FzI&o(m-q9-#$!1m zpt&zRR=&(T3Y-%j{u+culeeR`-{QRI?eP?J_;#zn9h7E|?Azg9YuU5UJ^c_+@;eyg53}`tPU;84K=^sS=9p}AN@0qw zd4Jpm1^(p0=e&1Y+r-bL$NTY7T=S>ysUtjd4h8eVr4EV-WZ3soO~z#CjxCKhdmr27 zD>*x_PC~VRfvfdiD9Q7ovwO!G<*%#8>&rHmj-xj|3L^ar#B}h9T*Y3 zEKK*~X>qjv$vfKLUkYP&?I!nyCz?2sZ>H`e?)AZ}`%Zsz55)5tiZ|wX?4bKKo&!Hu zZ5@pF17F{O=U&-+yLjlK4i4N50^|;Yh~UTE zkMaQgwJB6+pg3qNcfUSeHO=Ck_FkK}po`AFi*gm#`;Yhh6N~8KGmhZ*53j?@2^Q`2 ztryyc@ff@b@dII_B~-xk?#J#|oPgtKp1jYxIb@vU9~S{j?Ev0oxZKOY?q3b<>p}3J za@e4x0MIdB`5tw35xz43ilP)BMuB^%@ONhj2BNYW*a~CUiJ9gIeawa zlsVwU;a*w)MCI1hrk$%Ao~&-`Y1tiXTv65f%;sGc>!@}X#K-4f!ItlOr+Pb6I~$tH zllhk2>8|?C73-S2_wKp*7RGRG(F3R!{&R3h@%zoSBo~;<|aNoFz8=GLC^Luu-v=WB~i2Tn26>{a)dHef7 z8Eo@e`O^DG-dDXazu$sG&*Sh6O8IR!M;(*r67T3dP)-zZ{^em*Gp!uAzli;ahlzK- zx6%9kJ`VB6?mN>cgC4roef^2mJ9c-~4jdu;%-8G^MEt!~OWb3<%=i`V@ciU`d_SOg zxr=S|esj-FiuV1)B%ks2UfjDB=Ic@Sq@1gL&_kHW=R2ADhr5=0e;sC)eBg)AlN@rt z+dj_OKIxvFx6iu0w%6tRFWsSOXgc@rfxd6Hj*N^nHL*SC@+|o88{E&m|AfO~di?Vd zK$Sa0?x$^l$NL=3vumIL%htdL?~Nn4u}|;b?w*UuH%Y#7f7!jT7jXQUqx4bA`*ykaVwRKtg-5Vl zcIPabNY30@_ig#|(Y3yL?q}5TWz z@(rc?@9Ou?jCmK#Ew|y-vs9cEKHRn==6wupP_}@3MDz2b`*sHy;*|kr#-;2dW|mFC z`!|*G1XrIhLi_IE;0$uUfqF(KBEaE}UM2t$5t~ zx{hy~Ec7nq$M0-e#7xh*U*ETa#Ubb(oAd|QbtQD|DQ-*wrdYgq_Z?ytytzlN!=JCh zeQ1yO^8R6Jf4#oG#MsviS$n<1deptNsoDGaA@8MfNW_mwk<6Hz`&hg`*zcXly2sHz zyw-E1hsIB~hG_d%_YXV?%9!GtyTu*o{F)Yzz#XUzzEQaTSbb^NzNYGJ9mJ|xzPV$| zlFS`DM8y2vJvpB*8c*EUy=yAl`+)m?^}J^QzUQ~Ne=PP+JbLfCC;4s?+^c)O?4F0+ zYX{vQ-Cw3N?&~e`sRXX9x$s%h?#k`A1O52Q-1`JP8u7Eza6H$C?jPA}y6?0zyHk8$ z-t>NhFf=zmj`K0+<7e?H<8vA7I8hftf2VRs3?SvD2dW+KWV3f{4~@UZCl~N%&TZw) zW1#B7t@5nW1)_B3_O09_nYOON#;kM?(*K@Q$-aI zHFkMN7jxs$`{3rai8}^?6|9ye(`Fby)E(~86pnku+*`Wf(fdpI?A{Ldr*8LyIvltO z-Q!*GzPW4ZQb73@v?_f3>dQ5^xIf=KK2-v2oMgY{#>3ea_3pJ%VIEUs?zipkON+VY zHa1BJu$t!3eE0^y6Q&$fiT6iI1#|s@XoFK|jop{-+W}rXxyAeVVFbIA-o+?iWY4v_ zZ{6g+-ko4Y&vNiUfGqpfk<f-LJFj+rAz<%>SpBf?TwR^7IJ^Bn#erb!iZhi68zAZLD_ZeS} zUND6#k^2UO=EYr0+}HOk8Qr}^0zJQ4FRlaJuuo4csrEiA<=CCax<4$|vp0dxYj{Vl z@ZM?5Jc%bW=K9`mDv{|u%GV+$UaZUIXMUsM;~C-zL^+q^S(TQgYYH^rF;uRKfk`b zoU6!Z_@Z-Y6)5=AWyEYVk3g8uY~3&46JdwHikXw%(M_l*P7m~!dY|4wi?8xI@AKX# z-jyEIV0#Iynryqr`}3)VEX{Y`ukG%abqx>Hv!1_Y_e&7?AI1)jz$%W0z&U>*SRs%e z;?VyA6u~TcFW-N&cXb;)&~+FwJ`zj^r?xCyKWFV5_*l8;ALrZy0XYvf#_LOs5-`?pYaUL!KbN@TiHUT~=Re$IP3|Q;@7$APiwk1X=OpB!#*Pmg=Y=e2lOd%Pd^ zKd|l~M~Dk1=7PGXM7#6tw)uFY4xsu&mpk6+eY9!-HH2t=E-bDC8{lx{ezJlu5<+(0 z-R^yeQ0iW`(71jb<>Jj*?1LRG-gVs52X;2J+~HlQ7=JXG$Nq(~u@o|nqK&+;`#9|?w~FV0Xvs4F1l=* z!JQyH!O_Oj)boHn_eMlVg(=7TFz&v*i|4<1zCgjrA(zi0K9A05bX%@FgjKkt699Py z>%8{@nEnYU{(JK)2-)C%ysX51iI36@xaX!YHhjFdaWN72akpFkP{;nK-S?+=5xdPj zyZG=UQ<(A|T9=sTo?3i3MB?Lz+@qwLK_1EnEoWXMV!tYeDB1B)oI{EKGP(wkQEQ3b_}KENp}l zamxZ9LVz){tNo58k4syu**UM;AYVw&~>5Er8)|Q}YRu-ZHgd7034E)WS;6&B^ISs|m)o&^s4d zPx8avoS>gD-EvJ<$hdnRvHr0ZrKmtyxr>gDafr_EgBLrNbK#PoZ{YFVD7fO?TsHBD zN3fBz!^@{xfeR~9N`CMZ=l26{I(!g$7!xfy7YE6?IJ6i&$HRo#UCD=IF_&C<)cf{k z4%izs^pX1;9J(v=+E4D~1;~&ngg&cS=6yQ3!+nXPdU|_?N+-Qb_ium3J@(xFAY&9x zpzxgc{Ej%R(97@?d3wXWkRec2jz{h-k2ZEQ`qR98Ar6{3;~l?gFwS?iZU)1{ zd>9Px3|FUzwl8A{$M_tAdoj9_tTQ)Rxn=GjH@hz`;mZl4@IQYO*H*YyOsy9~AbQZt z7*k<4KSG|mGM3=^B+uW($F}hJ8js)R#`f?ix4iLt8Q;(IJ3N2SE!@NId${Cr(HaEz zN1TY~lzm9qkGXO89M6|{J_a7cVO=fC*H1!k&Me&$mXopbiDl65OT?z+i{99H(q%0E ziMZGXE*Y%#iNrGRWZHPxJ+XcnYW7PglTK{m(p!vEY#BuBQY^tE(#ePE*dCr( zmW$q{_+cK;EyDo_+ZT@?Kh7XOK0u@ItbE)%(R+YK--$oIXu0>!&Go(6#cby}_uX~w z`P}2TFZbTN871P!qg%-R-F+7=;^D{dTJD{_d2R0~i*xc}E*66+&%4JSzh^n@958s$ zJLR5A@L3Hm+qv&L5`pjCL-P5!cc=Nb2Vb0EqUhi0i0mY{Qc$~!wk zpuCQ~V{Lb~OApVFZ0mT2$eZ5l8@Uioz?F?$U4~0~WdpaKi2b(_e|s2)Uk|Y#e|jI) zVpO@x|Br$&e&sxRZ#?Mzx^*?Iz#n&PN!*ugyQ8IsP`a&KYVRg21^m%@_oMdv`TY>C zix5N?+*-pLk}Cj6f0fyA9CM;3jRfYK(K1!5N2CL-D?j@M6UBCqh7dy0=&cpqAr z{wlnS`8xMSEJGviD+?>U3kwFl6R|rU6Lkit_uD?qm$)-4ch@EEpAhO{?}7yPd&7I_ z=_c>X2ks*t_*-bh;g4S1nV&z5)^pN9ta87IyC0|UPhcC~#8mrySQxn_iQ%5D?q?2> zUED8s)66S(yDzL=0aN}(8>jY!dl_}5cY0}O2PSQB%Q5)!?{NqRh>mjrz6D>4Ebsn2 z43Bl%JJz)XX7(Hi?ij;;?@{+mYG{l5+s1jT?z@*O{cuUY*LwJRtf^%8iBt4-+&lF+ zfcKO4p~)fUp62l#5$O3JsQi}gbB~Wl_vPXJD#J~%L}~^ z_j^}2uV+8cJQK)kM5DUt$J34A^9$B=+d+{;%>a=%lc*OgZ zNY)h<54Nvb2xYp?H~glO`TcpgKupF_t{F}cQ=#!rw)zyD>ILt5O|B7RTLoK!F|{e= z{a){#XhJ3AzH$%iaK*jOl6|spKPMUL@VI;Kaa4atcB8iUKI)arJMPC@mmImx`{@Xb z=(W8SSpIk44FI8MUyn9trT6FFXBtB8@jVZ&F+1HC58S1O97u-=G`Md9_*!@U_`_(EC(f96$AfvBnkq?G4ogX8I zAwQ?eykZY4gw` zm#}_|?ilW>XJ>z-hrc+z#D;YLm~>w{%ppH}w|8MtJ!1C@61{{kWPIzret+vdPd~Ku zfvxv%eGn*nPo43jht^H3-O}ZKedor5G=Y2GK>}9|c(1LUaDTtoeQ!?$Hr0D6TEkjh z_1@v*$n(pY%hd+&Ekxe$THUV+oVv}u($0d&hwYC(kmR#GAKlTo)O-EGd+*4=7|px0 zA(?;9`>>t%K{D-+wXeioSUjk&A4Cg&yLa*MqRsStxx+o`5;KLn`4=&h{ZP`eh@}zI z2RC-ydpG^m0nRVM$rK#1pr02+ksfecI%{)#ZKD4)XkD#kvIG@V58qbERv&4-R|ZR&3wAZRzcc77()T z?)i7zdh3#f3-4UKcQan zbT>rh8ux_2mT!75mhJZbvu02JQM73H!IPcx@W8@-B4c?bG zHSVo;Kk;6P&~WOo_r+#7$_r0(;iJs2_1M9M3!3hG3a~q~2M?$FfWcEt@X@_oV|y)B%Nlt%LTd>!xD(QML|!f3WMYuJ&zp)!Y)@`@83F3m=Cj+L>UbjGpL zj;YE@b-mI^)EP1}rKJpcr`g+R+vZ5`@MN^8I-}~3M2hN7^<`-+WF?&_^U3BMTP=fG zHN@TZV7)BTg`osL{~#Ij8_>M1+vP{p5yzf!DAYcdmbq^8=EOzV{x z$eCtxOh4~T4(W%@$zlDlG1(V%7|9QeW%?W|n+c^E*Hk_-m5z?^y}#c5W}g%7HwUbY z$xuekoMV}GY1)_?NlcBWhsVr>%&aXvTAE6g$Bb}$$Bxc@>l-)jYuvsm5o*tvp=>TR zlFgYRD?@#&e^qwO31tUDxpZdG45f2}V%OM#+uOG% zLX8|Gc zt@fK`HQP7rYi?{|QQJ&5W-?ex+592aV<2q}%S$~RJRcmlsdFS7t>9~uI#H3?Cr1wG zb`4m20uWUYE(N=ijxKVXWQBgR3r|+z$#jycgI&=^eQ0xzF>`4A!DQxE8gf>ux3Z4W zJe*BCm2q{(B6a%ka%j{Lf;NX|wOMCJ_eE{f(f##-u~hA`LMLOMT@>Csv&H+vxWcDB@YoK&_DcDcp z(>{|!TeKMwg``7Ga*j&F8|6SaSsyS%BVzz{uUS+-3jEs+Xe~6zQ4W_mlcUn06Va&M zbb@V&)D4?X2#OJG+gNmSFl@aT)MdE?ilK&{AuCdsGdT*J@%oCAl2SVv9=3Y3qhmI` zS!H4VmV(owtT5PidOEx#b0CwQ$mkh_p;Vyy?64VCn4#2;FoKGRF$KCB9dp(zJf2XU z?TWVR0nzI|J)|KA3TN2qkXfoB~1FApc zL11xaE_yg6C4SG{rL2t3o3jL#4|o!*W=W1}hN{qzxC< zU?$=^V~1p9A`O{DOlJ&8#!#eTNT1qa2lhnu*XJaMr>9HfNmftL?6A|2sxV?biBv_8 zk5k*6WZ(3(PpKxHq*!e<-`)}SeX1CQXTM~txAH@CFxUahku^gxLW@n*&bR09E(F1M&t?9L`yTLr&O7=BaSl z2oL148EA$Pwyl0sexaSYP`D>L0^3{u;LW1xxbF`P08WJ<);Tv?FY) zu-%S+lP9yxfuY`?MIs3sp)dd*5q2E0BpGgPZVDSalHrkTCObNm%~*Y*QhAPqje%qs zVwN+rVWW-5F^J$;rax?qCfTBBG-^YspItGP+F=YBkfDqkZ&{lWJ~)={&!u&1Or$zm z0bL@$IvUdtHNnGb{m_#FZhP{f(iKy7(Kz#wXN{30?T?nmjWGaM!R}~jrB1{FZ0uUOhZ*Yy14en#q`%7=`kjf>aUfAeN9x4mBr4LynVw@O(Vo!T#{ZHQCw|6yYvZz-Z4 zHd>SW%EHZK!^0W4`>@drIKpW6g^k0>W(tH}lie-ZV-WcMP6q%S*}#?qyc@{QQMV(x zp)4G$2^;I>p)wveRwTnBCxnfyJeYQ0&Qh2$Y#by##(34l4kW|o$S91rMISqpVV>lC zb)@_I!IfcSGg+`rayT|7!Isa-vN^WH0j*YNp*1G+>LFL(`@Bzrz1Vc zqHL1%=IjWM+vTw}9hB^mWIHeFHF;W+9XV@Ut>rFBb@$RSTzhypJt<>=ZRgaAtj=NO z8QMg%FsHB?;U>Xewwe~$F+4JAG6DGY9A({RPM3fcee%`VxFJ|v@Mc(Z8k^D<+npwj zu+@3M8VwuZdJ@?IRD_N3nN%!nwCnnfwCa;Yz}iVR@-m2Nl(w7GBi1l2Z<&?bCBgwJW)_F{2zqE>aMPpB6pOf5AyDdONYw+0Vq;tSaGc^YUrh#uK*-R}TlDl=P)!*F> z)Z3=zQlmo^ZE%eBx=sN)SLn2!{8ru&<^u@l$;!YtcPf@RT(;FQ4v;sh;BlvuJRsc; znSBRrIj5WTY&PorPQ8u(w3~uVB;`z>87^ZK+h|HNtpK-^+~!E;cJ)9f832=8I?-w7ED(e=Y5F;VlwE+~93;!hI)X7OzE)31Ma=$`@o)24q$_0Nd@;bV>heUtiU zQ2%u4pI-elu7BF~Pow^6v6C}WoPpDjh;H4MIbj@PQX**P#s!IVlIl(Ku$u=F5`i(E zGT97I`*@1gfPzCCwr>E$Y@vHv%Qq!Fy>R>R_;qHzld_$jItogYl~p+GOEG~$uy}Y8`qeT{ zP+Ht^q|hh|lRBq98LzIcL%53^wo|kXrFVLgJi`pA97!|2+Md0IBr~UrncC_(sJE9C z@6u{XA-^ZDd9@8%iqi?6WmjR=?DANRlGo=5bV;i&VkT)NR;?Q>)$-h4Gtwj7#H!|G z%Q*caI29Q};SE{h8ovxCBxs22c$IEUX0F6Von#J0$u+Z5wX;&IXQgUpr5JcoD~z`& z#Sn{9g+b}=XO+#2MQvVPZh10k`)lK`b*Z^mH^v-ISqGo>J!0mK4h|OVq$5i4VD0^r z;6!s~|5zWIVL5uD0xz>=S0V-w9H>HORT3S1sjZY<79xP*lv(NpdBd>t#(K5K&^M9M z;JHUO45f1$AUApl#tJ)$oK$O6A*mU0BUWM57%>vY8l&2XRT>CyF=MsCmK$4DQ!8Zu zOPrqi`l@N3IV@G^I+Uby(4H&cC_x1p=c_LuaJ4HHnB`G@g+_fwP=pj!lX54IE@!4> zw)E2JfI`yBxDYIyvQrEUXGNeAxv$e%1s?FVE}hPk!NO}LXQxxnSW34d7fIzqj0HwK zBDkZhII}0RcJ1nNs|1+M`(oUIIg?|1^q?Wv{`4T%S~-yFwR=$fr^e++*MfF0ugL2H zodXG%U5881;v*zn(mT!cfkGa%e7P^+Ldb(hh&X(-uke?KWBF7UT?xpDeoxJ9f3T<< z9Kh2-4WP1l*B`AkSP@8b{(?0-N|mN+wiZ2ifdA@LZZ|DizUFGbQ#!TYNhsmS%G0@? zh#F}=pBj}R1(`dV>Io+kNda{z6ZMErkL{W9=dV1RLDSANGyl5ah9lfn{ z2Euw4#-X=a!@eG=KPHr^ezU1D1_rp;g)#S&@obxA+n}k?im7HNA4>C0_bDsyn}!5+ zh5C@m(J2(rL-bkW*^L;mgv~A#`fq3YLr!i|3etl}AJJ$1-di1g2n%BgmP_NXrW@=V z3#8zPnHf{5%{_@gg`Zl{!xs7oVw+u1^w0>_N|aoTVZHo47kmL1W%xT}rP8wD^b<+#aC%D7SfNOb1Zv1uc|+ewm;Tp((mbT56$E2YFiMq_#UfD`UR8F4aMC0THD#c5x~@D>W3Pd{`4W zP~etSqlDQ6Hei7;YW4WuaGn+v;dj6V}m>5VE*OM!3j;v-SxI(sObtPCd2P-u_T~n(b zV?0*J)FYaiU`JSEsXn_As4Bp3rUqEBXRZFq@pyE_R1Wn`Uj0_}&1Y70+mW_Pa_Cd0IA zAouaubS|};hgcO4wLGlmcTE8pO+g>YSVdXJ5V+hWn%vporZKu&1xNmB$ddUvGE1G5 zxdCTEQYPl4_^V50R!)k)Iw?JBe!@S5jy0DB;UE?nJ6GZWR92_MrWyUZ;%&R`}PGH!LgZ zLt%1l?Mj%wGAr_=U1mp+IqK_Ga+Mt^uU%=cEVWnFPD8H)NemezUMz#y77_qVSx=I# zSGJq9UCQ4oArir3c`SH_;hTA^K(z4>0jgTj$YEYHay*OmuM#asM$OZ-%Bsq8mQ0Vw zT6wID%VR7q&sDYRxrXPwF(fTnO0Ck8={FCBjVw9iXwcH~OPj;|wxA$Jx8zKQwC0s= z`^YvzZJjeYW8{douwQ-$22kIs(F|K<{Z?6@{FM=r91D_+s!%$n239B?V{8NJ{i)Q} zp2Q(oPP7fxBl*!Ky%SffI9x4s-H*N@4OvGZ<@w}1B7V@if zK6U~OgH>}{oZVoC27@+=n~u$HkalWjx8pZMS2C`k86?!=Rw`z-Qi-39(Z<5Hbu?`X z`Kk_9d6cY{&h}L;O&ds!%q&P7R@Hd4I#h~goz+k%S5$oB-J#luqbW~0^q*xK9EAi2 zAQr2LS2Js6?5Rz(BTLB2=8alC0a<0XNG&rO^foIW7v1-$m5)`{#%jweQGCyBvzPX| zXkfh1SlnM$-9jvAAr@O5pJ^dIGpb2in4pEhLJL~QnXsL_F`=fs&o*L-{fur>CHG4* zTwSp$Rvj8asUx#6Dih%i8(O+TTcWYm;k+^EuN62#fB_g9V54McGdW?gJ%~Y^BCzf3 zvi>nVRRUchU zkqMfZQIs-+rJ_C_uPRg&>ZrR*Cr7MQysAX1^vHW@CXey%kbQ&7!^s*|QR)p?so|dg zQnxQDqJgR_UT9Ab^7F7l0C-rgq4cv(UBo^rix!^ z1$Y)*PD#9{C)Fo7LEfMsne3cBcGa1XjI^ASR4lGvqPArIZK|p|cqggrm6Y@e7NYjk zn*OV|g^Pe8Ocsf~v3T`L832D6{VLUZnJMo^jOD8K4OVn43Ea_QrCNJlr_DhtH6|-d z7l5OmebRrMv?;V0b(5yr zXcNTj zhcW7eth=MuTQLYs&0&7JjCsL<_z5-x{=-iQ_&5SYx}vNSn$938aOMcK=~4kIM?fnO z7XpXUq*eT~ob^>@jXdUJ(KY+8H5Ccb%qzplq<8>M0lQ@Kty zws(a(N6kKK0Q2^SY-Ye3xtKClsvfi<8oeyX8?K4r>i%Irpj!pY zbfs^Eu98}nEQYRC?bq^6)j=)1GpJP?(9asbmT$YBsfG0!zKR9Yt=0PVd~3C;S7gjq z*6IQw-8}>R|C*3Giej!7GMEuEm=f8~$U&|66NjI#7E!CRXS$M~8vH7umYO)?(*!CX ziuitlxPVxLnNrh$Xqv;eIYptSky@IRChMUnvyil+1%f}?t(1s;&`1!fpqoZ3B@*3C z#^1<}rms#irmEFxYSv<5H=qe6Fg2`Btl_zj=7b8U`GCGj)>NpJPophJkrZmOIZXK$ zE2Z9(ri6$ck~A*{=^Nm8MZGNQcT%4XEGd;H(YPW!YC0jbr&AiDMiKp)$i0JJ^e1R%AMGG0%X;YwtvW-bWSyaC4MP!H56dbPeTYZBg@2<#O%9}In~l zNy-XIN@JZ&3=3WAo1se?=u#i}PVJyj>e|?vn9R9SBxez!t9Yp7w;DT6^?xDJ*<`$; zYPGyt%^NkmQNtVYg67mrwZbb<1*)2D2zRgF9!_MH=)K#zf#^M(63SXRDgJ8OBrD~l z`0FQC%1^M&i06LdU(-SbXo}xd1a%HAlvQ_R?R9?wTJWSna)wfhEntrWT?v5NSBpuT zs1JDwATFz^s;{q}hDM83LLLC5wQJGbC^fAZ7z>Lgnu#s=ou&5mL_{y3ZHZ{gY-70y z#{s?EKZ7#Cn@n znD;3?<~yZrDOU$LQWhlfWzynFs!!FFNewW8{Mwn7ZM{x-_K0Uu=kS5xC&s)@g- z;0pbO9u%vmm>;pJX%lG7H#(ZiAQ~$&;z`XSE1o2aY>JYcvEzv`waBJOs>r5Ds>r5D zs>r5Ds>r5Ds>r5DYW8sEjAq8BNX?nC%&{p7u_!UcL?wfynoQj{F3#xQaBp*bL9IMK zV=A=44b}~L#FULD%`)s%N6*YIX&fOAcK$g-Neiwluy4(14dh5FWqfDX_NK={ zXsm%#i&Y5E7E368E>^8L&5k0@YKBn?cpWYA&*qb0@HA6W%qFo>7#3k!0*+-4mjp8r z`0o{QW^k%Y;HqE~#CAAG-XpL#}ft`#MKsuAGsjADANUgfe+O^48 z#4amSMh1oYW_!$AxXk3rk~M~f-;8jH^tL=%Djb@VvU&;zHnF(WnbXPAno3FUJxq7GWiutXr)P_MVf@)WxVucdZDpC)btjP3qyhplOzsXu=M0gx}CHrbxh&xbBYtj9OI|DCFV z3iLKPQKqa%Z&jr_@H6I)HLvu3$!eglc!N}KS*>i79!xg5!isV(^pd0g6ER@fzaP2CNSI4e%>{iG zkG=B$ufcyBdC)ZEF;*2c{XeXV8f*ntsF~5uS{YdmwUaE&zg_7KJ)G~Nxo_ykoG~^_<+wte8)vgu z1x;E+i#D)VGbVDuJC0xVnasVAJIEh>_CDKiXs$oWn9!Y{PMVFT%CH{1brn3K!}G}&kTVfg-fF# z5^z7ImJoq8@(}68v+F>e){KaQQCV4D{_}TxM#HFXmlf`m1zs{fc~UabEC(6stKb3? zNRP_(pv)hzU7xIuSH){5fq{qg9=tfb|` zD{mUDmJ*i0a6b7pm9*Mwam8%rs-S8Bmlfqnrr<(45SNv}+lr)k({T6Pgs>Nngx#~t za0K!Pky1W3J2Fc5iCtISFKTW@X{wa%q4acaNrX%&mQJFf_9`-0G2A z3(C*Pzw%yOD))l1G!3(W>MGLm<@n2i0D`l6@c%I1DV8uW;rT~PQDT61weUq+RT!(# zPAKAe5T1ku{?*`#bdGysT^#$+C`NDa%Sfm{OEiKEcbbuiqJ=)kNw8RW**nvx)sa^D}qBI-Fo>^r!Ld$FmJOnfF&C7|&KwH-> zT=oLKM%M2D>t_rV+c$;qt6lm>*S)`a)+s-5y$WDYphMw1?yYDhK#u6l+OMCrY6pA# zfDUX2mHzKNnX?JPH0$fK>SWB?fSofNfRgba=cI0V78FmLm7qTowXuMiXlvm>V~LTx zu@Qw-XG`nW@@z(~ST&K{(A3)HC%2K@JlUJGP(p3uIm6Yl?1cC?;ZI0<1k2voNV(3~ zLk1TSO`Uq0l+uQk&*beQZ-9-^HHbrl=gU;e!gFIIPA4rriB0^h5J!#*?fG(pqBup$ z6XphGRg@_omm8GTP^R=uMP=KIxMWx zqBXifne?X=RW~S;{%UJ){GRluG*|N8Hocrr7xf3$_FtS+s1{V|u!`Q?Rs5#1K;EEG zy{WWWQrM*X47Ly#C^ibKt)AtaQYlkPt{c25n~!tYjbBuKD%Drfo58y3K5J@czZ#TE zpQyxUjVCBmeJUI3jhdAKDJP?%!eDJxpIEVHw;PnwrzqZL^%;~&pYZ}H`wJ8l$~^J= znf+$4E4t4DH2bdxrP5~sn&*_MJ`3PHr;t7a6(9VY_7%261r?vq9g6S2Pw$k+ui}!> zqk!ht2mx(Tk1;$pHT|uCO#MGN{5ALN4Yr5ZAnlkJX$de$o$2J*}>p3E8i5~_JEU^Gn_ijFQfxLQ0gka zPc3F(WKFY@>42My)s$-fjAcDoTp-+%;(jO)1;hlu*`Na4l)R{TMe^Aj;zDgkI)wia zt=DF;8k37rM0N({ka#>%GJB4NJyb6`iY17t-R_oskFx{#A<_*2N}{P%3w+QZxh=qO_YvA(N5;4g3ELR9i+roBfAFmWs{SwED!@eqIL&ad3XZITupIu8Vw-eQ78>vCAgQ*X+b@%u zAnXNYvV=4mB$+s@onKX;$Prl5t+GrGYo!yiAut_5nZT1HP^C)+FyW+wq=pCn2GW`} zgFXJWW@YD$X2r(!y5K9NdW>=%xS#}zaw%BpagY{@y{J?SknsN|G}ErE`Ts5~+onc` zqU-1rR!i}Qt>_&%!WaZ(fWq=i`Iv}N{uAmP)=fuq!h|7Pv(lFRS|wUeTTXDm$NF!q zm9S0zb2+T1f6;8ruCHh)_w%`)tNa#rY5^UuHC2FSVFyU=hN8I&PNVOEAe&1dxpYXm zjwvjwN>yY5k<5z(adT#C|2^}WQ-mTAo`So-wc1LVVv3fQt9l8-&kY4>pvjI(ziUCa+Qdd5*0WARKuU2xf;AK@-7$RUN zV;K_E3uwnc=tBzAkEB!{7@ihJvDqjtD=@poA(wLVmHNH9KrY2fwx6|Dy)k!Un$*VU z+_M=HyA78`hEgN6h2)nS<=6U~Lz2SSmf=UeKzZG7Co;wk8|5{GE1gdc`I>5MUq*VC zM9#(!{U4fYRte7;A4jqXn3wzn3+1p{8hgrgxk49UPgxe!lR$vHB` z0MQbDF*qXs8qu2n2X-a8LU2u%2n#ntw4pYqfMu0pkyveVxHVH_3;Pzx(n{4B0U(t& z38K$A1tZSZ$NETEqfpho^79Mvns9Z(E9ln<^1PE@toS(1#^rj1`qfdt)d^8YH^^+Y&PJ3B1RIoViK@LWdJ|(?L`Sp| zoo;qeMFIQ={M)U9t%Uv&1N-GZ4))m)Cr>}K49=?aNjut$VSsfaD1eTMN7hK%KG4%( z3uq;51#c+Gi^x)&-B3XoTA6K|#GGAKHH-4F`4$>+ma)hkN$I8}2QmaZM5rI)e)Zak z6juWT1nOcXM{KU(bHzLssncZ6)FoC_)vt%`Dj}SMe{&s^ePoJ@2EGemRm$F~9D5z2=s zqY|Ts7^Tbs$BTZYtQ-+-YA8+YP;QvaloPT`@tb)w7|UuFfHjYD*K)`jaKs>uX0tFW z<%FQ;J7a;d)Q;efP+zYu9{?cnQh%h82w~W);8`;pjw8S=%4cE1Za59r1z{w3yw(6tNhD3z(hkQ`;^JKXLPK5KTF6ir)iHRb;Qe9xF z$atjEs=dz~T0J24h*eQS(r|?xXo7Js3I`|eDYKoi71eOj zdlfNF*#Fy`gg712z0H;!h%Aubua1yXvC1OKBJIPjM zx?s2>LStD{%!0c0c6GTKs8cV2-;y0Zl(pM<-qDcIhM=ww`w?H=ZYf>7{tKH1=M#W0 z$7F6h9NkeO#=`q?V1ixRq837VFz8i=O>FGZO!pQsL8|58EEUwi(UyWUkWYp>ZQqJF z3%P=lf*bsS+P`4yO8>7!edhdg=j4E;N5!3!gZ?9-g5-S8#Kf3;_%-1stb)K^v%WX4 zo)1Iyf+N!4M7!+-cp$jelqyghOOn8D!S{Kd=Zb z1hVWPC(#G>rC!uY|;3c|syn5&%7u#SGtRdp?8^v%V!QyXlA`VKo` z5&8udaRpdHIHIkviV}fDg#lL+JjkTe}f1p2mC{^+aC^*OLRX3)=)2RB#L^F*t@`>)R_iTJJi#d&2{ZX6yKe5IjMshgxv)r0WxYP$Z+dh#n};!^?7cTjjDQ8=x_ zr+bwIZRJg$cBV0P6}M(ObZgkZ%z~A|6>zEYvweu^}jVC^H{FNJTr{! zpdJNQnIPu$j*M?|g=k2aqCRfXju6|Si_p^k$@J%()~DoebI!|7sg7o1kZ;4&NLM7p zg#ScD3IB;068;kb2gkE;Q+|>#5^}1QIalYYrKpCD^ z{CojB&w4+v97q5|HHK}p;X@4X2g8z{;CE7e+J{4BvpNp+Py}tT77yw^<-wk{6%Dm3 z6;r4prb1?r{TUSTLJp#wVlkCJplU-0u2#W9RC+tiUP^+6sMH=wNw5$m znJL+18+4Sh>B;8|8R)a9*!3;wk@O*nWhU~89|%}r4`wI`Egmi}7l&uNygXbME)OG) zjhbovTFci&1m{{tai$RDQXML`Tw!bpkNWqhY~g1zGI9uXnE1l@I*EuT2;4tZESnH) z2|X|VC3tk@l``|jRa8iMspC`mF*Dg{^mEz8*g?QOW57(VFxt%IW@FS$ZZ`-tpLUE1 zGr7evCe0*da}ZA$+vqZrS=;9edgt&3Gh|;5aZyb1>FJs9+k{5d*iSe}qKLzl@K>K3 zcm(mb0t~ctB2{KxTS4RO)O$PZgE;>|Yj#WC0<9(yWwd zFeX(XJ@v$525hjrFzNV#!qo>Tf|ZtK*DLIk1=2d6xcYX1j}&nu31a;V84Ia?ebpHs zF_CXS_+l{uf>ZtGjH4bAe@sqgogflFR)1lSr>Bd?&+4l;k&RMqyrRXkDL-PyMzLCD z=6;o7$QVgv^U0!CSOwq=Sku9X*-+K9%-^zz^N%m{D2)q17hpb@8k4L*GEl2&5%o%5 z0=KGzVr!(M30lMnwCEB0AOw9~-E%aJkBGNdxB}t4B2LDxxu_ z*`ac1yID?1G1aB)h#xr=w84jvEMIwt=NB```^24q=$fby^PbD6{%G+s>B*Z4kmoR) z__iv3vnQXk3XoA?MJX-tpT*(i|GHg1VfaT{;?s2dzIa0d`5nqi$v%6c1OWk!~P8Y zlcQXQd_PF)l9M1Nphr0l$hMC6% z0SIk#cp#Dr&m}P79=R6eMD>RWB6W*bt$HG4XUB4VCdvZw)!nhZH97aKD52t``$d)- F{eSff=uZFu literal 0 HcmV?d00001 diff --git a/libs/thirdparty/ogg-vorbis-decoder.min.js b/libs/thirdparty/ogg-vorbis-decoder.min.js new file mode 100644 index 00000000..0f030ae9 --- /dev/null +++ b/libs/thirdparty/ogg-vorbis-decoder.min.js @@ -0,0 +1,195 @@ +/* Copyright 2021-2023 Ethan Halsall. This file is part of wasm-audio-decoders. https://github.com/eshaz/wasm-audio-decoders */ +var t,s;t=this,s=function(t,s){const i=(t,s=4294967295,i=79764919)=>{const e=new Int32Array(256);let r,n,h,o=s;for(r=0;r<256;r++){for(h=r<<24,n=8;n>0;--n)h=2147483648&h?h<<1^i:h<<1;e[r]=h}for(r=0;r>24^t[r])];return o},e=(t,s=i)=>{const e=t=>new Uint8Array(t.length/2).map(((s,i)=>parseInt(t.substring(2*i,2*(i+1)),16))),r=t=>e(t)[0],n=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((t,s)=>n.set(t,s)));const h=new Uint8Array(t.length);let o,a,l,c=!1,u=0,U=42,d=t.length>13&&"dynEncode"===t.substring(0,9),f=0;d&&(f=11,a=r(t.substring(9,f)),a<=1&&(f+=2,U=r(t.substring(11,f))),1===a&&(f+=8,l=(t=>new DataView(e(t).buffer).getInt32(0,!0))(t.substring(13,f))));const p=256-U;for(let i=f;i255){const t=n.get(o);t&&(o=t+127)}c&&(c=!1,o-=64),h[u++]=o0?o+p:o-U}else c=!0;const M=h.subarray(0,u);if(d&&1===a){const t=s(M);if(t!==l){const s="Decode failed crc32 validation";throw console.error("`simple-yenc`\n",s+"\n","Expected: "+l+"; Got: "+t+"\n","Visit https://github.com/eshaz/simple-yenc for more information"),Error(s)}}return M};function r(){const t=Uint8Array,s=Float32Array;r.t||Object.defineProperties(r,{t:{value:new WeakMap},u:{value(t,s){r.t.set(t,Promise.resolve(s))}},U:{value(t,s){let i=r.t.get(t);return i||(s?i=WebAssembly.compile(e(s)):(s=t.M,i=r.Y(s).then((t=>WebAssembly.compile(t)))),r.t.set(t,i)),i}},T:{value(t,i){let e=new s(i),r=0,n=0;for(;r({O:t,channelData:s,samplesDecoded:i,sampleRate:e,bitDepth:r})},v:{value(t,s,i,e,n,h){let o,a,l=[];for(o=0;o{const e=String.raw`dynEncode0114db91da9bu‡*t“““t“““““t““““$#“U¤¤“U¤¤3yƒ†„‰zzss|yu„svu‡yÚ&ˆ“4<054<,5T44^T44<(6U~J(44< ~A544U~6J0444ˆ†545 444J0444‰J,4U“4ˆU“‡…Ò“7U45“4U4Z“4U4U^/6545T4T44BUˆ~64CU~O4U54U~5 U5T4B4Z!4U~5U5U5T4U~6U4ZTU5U5T44~4O4U2ZTU5T44Z!4B6T44Uˆ~64B6U~O44Uˆ~4O4U~54U~5 44~C4~54U~5 44~5454Uˆ4B6Ub!444~UO4U~5 “U5“4U4ZTUŠ#44U$4†64<4~B6^“4<444~Uˆ~B4U~54Uˆ544~544~Uˆ5 µ“Uä#UJUè#5TT4U0ZTTUX5U5T4T4Uà#~4OU4U $~Cˆ4~54U~5 T44$6U\!TTT4UaT4<6T4<64<Z!44~4N4<U~5 4U”Z!4U±_TUŠ#44U•Uˆ6UÔ~B$544$6U\!4Uˆ6U¤#~B44Uä#~B$~64<6_TU‰#444U”~B~6~54<Y!44<_!T4Y!4<64~444~AN44<U~6J4U5 44J4U”[!U#44UŠO4U~54U~5 U54 “7U6844J44J 4UJ4UJ04VK(44<J44<J$4U´~54U~5 4U¤~5!TTT4U$5"U“5TTTTTTT4U$"4VK,U54<(6U~64<$6_!4< 64~6A54A544U~6#J(U’54A4U‡[!44J(44#~A4Uˆ6U“‡UŠU…[!44†64~64_!4<64~54<6T4<4]TU5 T4Y!44~44~AN4U~54U~54U5 44J(44J UÄA!U5U”#UôJU"UÔJUœ#UÔ"JU˜#U´"JT4U´ZTU5T4UôZTU5T4UDZTU5T4U$[T44~UO4U~5 UÔUô4U~U´$.U5T4UP[T4U~4~UO4U~5 U˜#<Uœ#<4U~U2$.UÄUN 44 ~UO4U~5 44!~UO4U~5 4U~4~UO4U~5 44J44J(U5 44U¤~J@44Uä~J<44UD~J844U~J44U$54U$5U‘54U$54U1^4U1^†!4U•~54U~5U”54U~6U4U^/65T4T4U$54U~4BUˆ~4O4U54U~5 UU'464U'_/54UˆU”~5T4T4U~4BUˆ~UO4U54U~5 U54Uä~4U¤~4U~U'$!44~5U5T44\T44U<~$6U\!4U#aT4U~4Uˆ~4O4U~5 U5U5U5TTT4U$"4YTU5 4Uˆ4~C5U5 U5U5444$4~64~\TUŽ5 4U~4Uˆ~5T4Y!44O4U~54U~54U5 4CYTU‹5 4Uä~4U¤~4U~4$6TU54U\!44Bæ4Bä~[!4U~4UD~4U~4Uˆ~4$6TUŒ54U\!44B†4B„~[!44U<~4U4~$5 4U"U˜#$544"†Y!454U^!44<J44<(J454U~84­U”N!#%'+/37?GOWgw‡—·×÷Uä;U”9$%& !"#`;r.U(r,e).then((t=>WebAssembly.instantiate(t,{}))).then((({exports:e})=>{const r=new Map(Object.entries(e)),n=r.get("puff"),h=r.get("memory").buffer,o=new t(h),a=new DataView(h);let l=r.get("__heap_base");const c=s.length,u=l;l+=4,a.setInt32(u,c,!0);const U=l;l+=c,o.set(s,U);const d=l;l+=4,a.setInt32(d,o.byteLength-l,!0),n(l,d,U,u),i(o.slice(l,l+a.getInt32(d,!0)))}))}))}}}),Object.defineProperty(this,"M",{enumerable:!0,get:()=>this.B}),this.F=(t,s,i)=>{let e=[],r=0;for(;r{const e=this.B.V(s.BYTES_PER_ELEMENT*t);return i&&this.S.add(e),{H:e,$:t,C:new s(this.B.I,e,t)}},this.free=()=>{this.S.forEach((t=>{this.B.free(t)})),this.S.clear()},this.J=t=>{const s=[],i=new Uint8Array(this.B.I);for(let e=i[t];0!==e;e=i[++t])s.push(e);return String.fromCharCode.apply(null,s)},this.P=(t,s,i,e,r,n)=>{t.push({message:s,frameLength:i,frameNumber:e,inputBytes:r,outputSamples:n})},this.instantiate=(t,s)=>(s&&r.u(t,s),this.B=new t(r).instantiate(),this.S=new Set,this.B.ready.then((()=>this)))}class n extends((()=>globalThis.Worker||s)()){constructor(t,s,i,e){r.t||new r;let n=r.t.get(i);if(!n){let t,s="text/javascript",h=`'use strict';(${""+((t,s,i)=>{let e,r,n=new Promise((t=>{r=t}));self.onmessage=({data:{id:h,command:o,data:a}})=>{let l,c=n,u={id:h};"init"===o?(Object.defineProperties(t,{D:{value:s},N:{value:i},module:{value:a.module},Z:{value:!0}}),e=new t(a.options),r()):"free"===o?e.free():"ready"===o?c=c.then((()=>e.ready)):"reset"===o?c=c.then((()=>e.reset())):(Object.assign(u,e[o](Array.isArray(a)?a.map((t=>new Uint8Array(t))):new Uint8Array(a))),l=u.channelData?u.channelData.map((t=>t.buffer)):[]),c.then((()=>self.postMessage(u,l)))}})})(${i}, ${r}, ${e})`;try{t=void 0!==process.versions.node}catch{}n=t?`data:${s};base64,${Buffer.from(h).toString("base64")}`:URL.createObjectURL(new Blob([h],{type:s})),r.t.set(i,n)}super(n,{name:s}),this.K=Number.MIN_SAFE_INTEGER,this.R=new Map,this.onmessage=({data:t})=>{const{id:s,...i}=t;this.R.get(s)(i),this.R.delete(s)},new e(r).U().then((s=>{this.G("init",{module:s,options:t})}))}async G(t,s){return new Promise((i=>{this.postMessage({command:t,id:this.K,data:s}),this.R.set(this.K++,i)}))}get ready(){return this.G("ready")}async free(){await this.G("free").finally((()=>{this.terminate()}))}async reset(){await this.G("reset")}}const h=(t,s)=>{Object.defineProperty(t,"name",{value:s})},o=Symbol,a=(()=>{const t="left",s="center",i="right";return["","front ","side ","rear "].map((e=>[[t,i],[t,i,s],[t,s,i],[s,t,i],[s]].flatMap((t=>t.map((t=>e+t)).join(", ")))))})(),l="LFE",c="monophonic (mono)",u="stereo",U="surround",d=(t,...s)=>`${[c,u,"linear "+U,"quadraphonic","5.0 "+U,"5.1 "+U,"6.1 "+U,"7.1 "+U][t-1]} (${s.join(", ")})`,f=[c,d(2,a[0][0]),d(3,a[0][2]),d(4,a[1][0],a[3][0]),d(5,a[1][2],a[3][0]),d(6,a[1][2],a[3][0],l),d(7,a[1][2],a[2][0],a[3][4],l),d(8,a[1][2],a[2][0],a[3][0],l)],p=48e3,M=44100,y=32e3,m=24e3,w=22050,g=16e3,Y=8e3,T="absoluteGranulePosition",b="bandwidth",A="bitDepth",O="bitrate",v=O+"Maximum",B=O+"Minimum",F=O+"Nominal",_="buffer",V=_+"Fullness",k="codec",S=k+"Frames",q="coupledStreamCount",H="crc",$=H+"16",C=H+"32",I="data",j="description",J="duration",x="emphasis",P="hasOpusPadding",D="header",E="isContinuedPacket",N="isCopyrighted",Z="isFirstPage",z="isHome",K="isLastPage",Q="isOriginal",R="isPrivate",G="isVbr",X="layer",L="length",W="mode",tt=W+"Extension",st="mpeg",it=st+"Version",et="numberAACFrames",rt="outputGain",nt="preSkip",ht="profile",ot=o(),at="protection",lt="segments",ct="subarray",ut="version",Ut="vorbis",dt=Ut+"Comments",ft=Ut+"Setup",pt="block",Mt=pt+"ingStrategy",yt=o(),mt=pt+"Size",wt=pt+"size0",gt=pt+"size1",Yt=o(),Tt="channel",bt=Tt+"MappingFamily",At=Tt+"MappingTable",Ot=Tt+"Mode",vt=o(),Bt=Tt+"s",Ft="copyright",_t=Ft+"Id",Vt=Ft+"IdStart",kt="frame",St=kt+"Count",qt=kt+"Length",Ht="Number",$t=kt+Ht,Ct=kt+"Padding",It=kt+"Size",jt="Rate",Jt="inputSample"+jt,xt="page",Pt=xt+"Checksum",Dt=o(),Et=xt+"SegmentTable",Nt=xt+"Sequence"+Ht,Zt="sample",zt=Zt+Ht,Kt=Zt+jt,Qt=o(),Rt=Zt+"s",Gt="stream",Xt=Gt+"Count",Lt=Gt+"Info",Wt=Gt+"Serial"+Ht,ts=Gt+"StructureVersion",ss="total",is=ss+"BytesOut",es=ss+"Duration",rs=ss+"Samples",ns=o(),hs=o(),os=o(),as=o(),ls=o(),cs=o(),us=o(),Us=o(),ds=o(),fs=o(),ps=o(),Ms=o(),ys=o(),ms=o(),ws=o(),gs=o(),Ys=o(),Ts=o(),bs=Uint8Array,As=DataView,Os="reserved",vs="bad",Bs="free",Fs="none",_s="16bit CRC",Vs=(t,s,i)=>{for(let e=0;e0;t--)r=i(r);t[e]=r}return t},ks=Vs(new bs(256),(t=>t),(t=>128&t?7^t<<1:t<<1)),Ss=[Vs(new Uint16Array(256),(t=>t<<8),(t=>t<<1^(32768&t?32773:0)))],qs=[Vs(new Uint32Array(256),(t=>t),(t=>t>>>1^3988292384*(1&t)))];for(let Ye=0;Ye<15;Ye++){Ss.push(new Uint16Array(256)),qs.push(new Uint32Array(256));for(let t=0;t<=255;t++)Ss[Ye+1][t]=Ss[0][Ss[Ye][t]>>>8]^Ss[Ye][t]<<8,qs[Ye+1][t]=qs[Ye][t]>>>8^qs[0][255&qs[Ye][t]]}const Hs=t=>{const s=t[L],i=s-16;let e=0,r=0;for(;r<=i;)e=qs[15][255&(t[r++]^e)]^qs[14][255&(t[r++]^e>>>8)]^qs[13][255&(t[r++]^e>>>16)]^qs[12][t[r++]^e>>>24]^qs[11][t[r++]]^qs[10][t[r++]]^qs[9][t[r++]]^qs[8][t[r++]]^qs[7][t[r++]]^qs[6][t[r++]]^qs[5][t[r++]]^qs[4][t[r++]]^qs[3][t[r++]]^qs[2][t[r++]]^qs[1][t[r++]]^qs[0][t[r++]];for(;r!==s;)e=qs[0][255&(e^t[r++])]^e>>>8;return~e},$s=(...t)=>{const s=new bs(t.reduce(((t,s)=>t+s[L]),0));return t.reduce(((t,i)=>(s.set(i,t),t+i[L])),0),s},Cs=t=>String.fromCharCode(...t),Is=[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],js=t=>Is[15&t]<<4|Is[t>>4];class Js{constructor(t){this.X=t,this.L=8*t[L]}set position(t){this.L=t}get position(){return this.L}read(t){const s=Math.floor(this.L/8),i=this.L%8;return this.L-=t,(js(this.X[s-1])<<8)+js(this.X[s])>>7-i&255}}class xs{constructor(t,s){this.W=t,this.tt=s,this[ws]()}[gs](){this.st=!0}[ws](){this.it=new Map,this.et=new WeakMap,this.rt=!1,this.nt=!1,this.ht=null,this.st=!1}[ms](t,s){if(this.tt){this.ht!==t&&(this.ht=t,this.nt=!0);const i=this.et.get(this.it.get(this.ot));this.nt&&i&&this.tt({lt:t,...i},s),this.nt=!1}}[ds](t){const s=this.it.get(t);return s&&this.ct(t),s}[fs](t,s,i){this.st&&(this.rt||(this.W({...s}),this.rt=!0),this.ct(t),this.it.set(t,s),this.et.set(s,i))}ct(t){this.tt&&t!==this.ot&&(this.nt=!0,this.ot=t)}}const Ps=new WeakMap,Ds=new WeakMap;class Es{constructor(t,s){this.ut=t,this.it=s}*[us](){let t;for(;;){if(t=yield*this.Ut[ps](this.ut,this.it,0),t)return t;this.ut[hs](1)}}*[Us](t){let s=yield*this[us]();const i=Ds.get(s)[L];if(t||this.ut.dt||(yield*this.ft[ds](this.ut,this.it,i)))return this.it[gs](),this.ut[hs](i),this.ut[as](s),s;this.ut[ls](`Missing ${kt} at ${i} bytes from current position.`,`Dropping current ${kt} and trying again.`),this.it[ws](),this.ut[hs](1)}}class Ns{constructor(t,s){Ds.set(this,{[D]:t}),this[I]=s}}class Zs extends Ns{static*[ps](t,s,i,e,r){const n=yield*t[ds](i,e,r);if(n){const t=Ps.get(n)[qt],e=Ps.get(n)[Rt];return new s(n,(yield*i[ns](t,r))[ct](0,t),e)}return null}constructor(t,s,i){super(t,s),this[D]=t,this[Rt]=i,this[J]=i/t[Kt]*1e3,this[$t]=null,this[is]=null,this[rs]=null,this[es]=null,Ds.get(this)[L]=s[L]}}const zs="unsynchronizationFlag",Ks="extendedHeaderFlag",Qs="experimentalFlag",Rs="footerPresent";class Gs{static*Mt(t,s,i){const e={};let r=yield*t[ns](3,i);if(73!==r[0]||68!==r[1]||51!==r[2])return null;if(r=yield*t[ns](10,i),e[ut]=`id3v2.${r[3]}.${r[4]}`,15&r[5])return null;if(e[zs]=!!(128&r[5]),e[Ks]=!!(64&r[5]),e[Qs]=!!(32&r[5]),e[Rs]=!!(16&r[5]),128&r[6]||128&r[7]||128&r[8]||128&r[9])return null;const n=r[6]<<21|r[7]<<14|r[8]<<7|r[9];return e[L]=10+n,new Gs(e)}constructor(t){this[ut]=t[ut],this[zs]=t[zs],this[Ks]=t[Ks],this[Qs]=t[Qs],this[Rs]=t[Rs],this[L]=t[L]}}class Xs{constructor(t){Ps.set(this,t),this[A]=t[A],this[O]=null,this[Bt]=t[Bt],this[Ot]=t[Ot],this[Kt]=t[Kt]}}const Ls={0:[Bs,Bs,Bs,Bs,Bs],16:[32,32,32,32,8],240:[vs,vs,vs,vs,vs]},Ws=(t,s,i)=>8*((t+i)%s+s)*(1<<(t+i)/s)-8*s*(s/8|0);for(let Ye=2;Ye<15;Ye++)Ls[Ye<<4]=[32*Ye,Ws(Ye,4,0),Ws(Ye,4,-1),Ws(Ye,8,4),Ws(Ye,8,0)];const ti="bands ",si=" to 31",ii={0:ti+4+si,16:ti+8+si,32:ti+12+si,48:ti+16+si},ei="bitrateIndex",ri="v2",ni="v1",hi="Intensity stereo ",oi=", MS stereo ",ai="on",li="off",ci={0:hi+li+oi+li,16:hi+ai+oi+li,32:hi+li+oi+ai,48:hi+ai+oi+ai},ui={0:{[j]:Os},2:{[j]:"Layer III",[Ct]:1,[tt]:ci,[ni]:{[ei]:2,[Rt]:1152},[ri]:{[ei]:4,[Rt]:576}},4:{[j]:"Layer II",[Ct]:1,[tt]:ii,[Rt]:1152,[ni]:{[ei]:1},[ri]:{[ei]:4}},6:{[j]:"Layer I",[Ct]:4,[tt]:ii,[Rt]:384,[ni]:{[ei]:0},[ri]:{[ei]:3}}},Ui="MPEG Version ",di="ISO/IEC ",fi={0:{[j]:Ui+"2.5 (later extension of MPEG 2)",[X]:ri,[Kt]:{0:11025,4:12e3,8:Y,12:Os}},8:{[j]:Os},16:{[j]:`${Ui}2 (${di}13818-3)`,[X]:ri,[Kt]:{0:w,4:m,8:g,12:Os}},24:{[j]:`${Ui}1 (${di}11172-3)`,[X]:ni,[Kt]:{0:M,4:p,8:y,12:Os}},length:L},pi={0:_s,1:Fs},Mi={0:Fs,1:"50/15 ms",2:Os,3:"CCIT J.17"},yi={0:{[Bt]:2,[j]:u},64:{[Bt]:2,[j]:"joint "+u},128:{[Bt]:2,[j]:"dual channel"},192:{[Bt]:1,[j]:c}};class mi extends Xs{static*[ds](t,s,i){const e={},r=yield*Gs.Mt(t,s,i);r&&(yield*t[ns](r[L],i),t[hs](r[L]));const n=yield*t[ns](4,i),h=Cs(n[ct](0,4)),o=s[ds](h);if(o)return new mi(o);if(255!==n[0]||n[1]<224)return null;const a=fi[24&n[1]];if(a[j]===Os)return null;const l=6&n[1];if(ui[l][j]===Os)return null;const c={...ui[l],...ui[l][a[X]]};if(e[it]=a[j],e[X]=c[j],e[Rt]=c[Rt],e[at]=pi[1&n[1]],e[L]=4,e[O]=Ls[240&n[2]][c[ei]],e[O]===vs)return null;if(e[Kt]=a[Kt][12&n[2]],e[Kt]===Os)return null;if(e[Ct]=2&n[2]&&c[Ct],e[R]=!!(1&n[2]),e[qt]=Math.floor(125*e[O]*e[Rt]/e[Kt]+e[Ct]),!e[qt])return null;const u=192&n[3];if(e[Ot]=yi[u][j],e[Bt]=yi[u][Bt],e[tt]=c[tt][48&n[3]],e[N]=!!(8&n[3]),e[Q]=!!(4&n[3]),e[x]=Mi[3&n[3]],e[x]===Os)return null;e[A]=16;{const{length:t,frameLength:i,yt:r,...n}=e;s[fs](h,e,n)}return new mi(e)}constructor(t){super(t),this[O]=t[O],this[x]=t[x],this[Ct]=t[Ct],this[N]=t[N],this[Q]=t[Q],this[R]=t[R],this[X]=t[X],this[tt]=t[tt],this[it]=t[it],this[at]=t[at]}}class wi extends Zs{static*[ps](t,s,i){return yield*super[ps](mi,wi,t,s,i)}constructor(t,s,i){super(t,s,i)}}class gi extends Es{constructor(t,s,i){super(t,s),this.Ut=wi,this.ft=mi,i(this[k])}get[k](){return st}*[Ms](){return yield*this[Us]()}}const Yi={0:"MPEG-4",8:"MPEG-2"},Ti={0:"valid",2:vs,4:vs,6:vs},bi={0:_s,1:Fs},Ai={0:"AAC Main",64:"AAC LC (Low Complexity)",128:"AAC SSR (Scalable Sample Rate)",192:"AAC LTP (Long Term Prediction)"},Oi={0:96e3,4:88200,8:64e3,12:p,16:M,20:y,24:m,28:w,32:g,36:12e3,40:11025,44:Y,48:7350,52:Os,56:Os,60:"frequency is written explicitly"},vi={0:{[Bt]:0,[j]:"Defined in AOT Specific Config"},64:{[Bt]:1,[j]:c},128:{[Bt]:2,[j]:d(2,a[0][0])},192:{[Bt]:3,[j]:d(3,a[1][3])},256:{[Bt]:4,[j]:d(4,a[1][3],a[3][4])},320:{[Bt]:5,[j]:d(5,a[1][3],a[3][0])},384:{[Bt]:6,[j]:d(6,a[1][3],a[3][0],l)},448:{[Bt]:8,[j]:d(8,a[1][3],a[2][0],a[3][0],l)}};class Bi extends Xs{static*[ds](t,s,i){const e={},r=yield*t[ns](7,i),n=Cs([r[0],r[1],r[2],252&r[3]|3&r[6]]),h=s[ds](n);if(h)Object.assign(e,h);else{if(255!==r[0]||r[1]<240)return null;if(e[it]=Yi[8&r[1]],e[X]=Ti[6&r[1]],e[X]===vs)return null;const t=1&r[1];e[at]=bi[t],e[L]=t?7:9,e[ot]=192&r[2],e[Qt]=60&r[2];const i=2&r[2];if(e[ht]=Ai[e[ot]],e[Kt]=Oi[e[Qt]],e[Kt]===Os)return null;e[R]=!!i,e[vt]=448&(r[2]<<8|r[3]),e[Ot]=vi[e[vt]][j],e[Bt]=vi[e[vt]][Bt],e[Q]=!!(32&r[3]),e[z]=!!(8&r[3]),e[_t]=!!(8&r[3]),e[Vt]=!!(4&r[3]),e[A]=16,e[Rt]=1024,e[et]=3&r[6];{const{length:t,wt:i,gt:r,Yt:h,frameLength:o,yt:a,Tt:l,...c}=e;s[fs](n,e,c)}}if(e[qt]=8191&(r[3]<<11|r[4]<<3|r[5]>>5),!e[qt])return null;const o=2047&(r[5]<<6|r[6]>>2);return e[V]=2047===o?"VBR":o,new Bi(e)}constructor(t){super(t),this[_t]=t[_t],this[Vt]=t[Vt],this[V]=t[V],this[z]=t[z],this[Q]=t[Q],this[R]=t[R],this[X]=t[X],this[L]=t[L],this[it]=t[it],this[et]=t[et],this[ht]=t[ht],this[at]=t[at]}get bt(){const t=Ps.get(this),s=t[ot]+64<<5|t[Qt]<<5|t[vt]>>3,i=new bs(2);return new As(i[_]).setUint16(0,s,!1),i}}class Fi extends Zs{static*[ps](t,s,i){return yield*super[ps](Bi,Fi,t,s,i)}constructor(t,s,i){super(t,s,i)}}class _i extends Es{constructor(t,s,i){super(t,s),this.Ut=Fi,this.ft=Bi,i(this[k])}get[k](){return"aac"}*[Ms](){return yield*this[Us]()}}class Vi extends Zs{static At(t){return(t[t[L]-2]<<8)+t[t[L]-1]}static[Ts](t){const s=Vi.At(t),i=(t=>{const s=t[L],i=s-16;let e=0,r=0;for(;r<=i;)e^=t[r++]<<8|t[r++],e=Ss[15][e>>8]^Ss[14][255&e]^Ss[13][t[r++]]^Ss[12][t[r++]]^Ss[11][t[r++]]^Ss[10][t[r++]]^Ss[9][t[r++]]^Ss[8][t[r++]]^Ss[7][t[r++]]^Ss[6][t[r++]]^Ss[5][t[r++]]^Ss[4][t[r++]]^Ss[3][t[r++]]^Ss[2][t[r++]]^Ss[1][t[r++]]^Ss[0][t[r++]];for(;r!==s;)e=(255&e)<<8^Ss[0][e>>8^t[r++]];return e})(t[ct](0,-2));return s===i}constructor(t,s,i){s[Lt]=i,s[$]=Vi.At(t),super(s,t,Ps.get(s)[Rt])}}const ki="get from STREAMINFO metadata block",Si={0:"Fixed",1:"Variable"},qi={0:Os,16:192};for(let Ye=2;Ye<16;Ye++)qi[Ye<<4]=Ye<6?576*2**(Ye-2):2**Ye;const Hi={0:ki,1:88200,2:176400,3:192e3,4:Y,5:g,6:w,7:m,8:y,9:M,10:p,11:96e3,15:vs},$i={0:{[Bt]:1,[j]:c},16:{[Bt]:2,[j]:d(2,a[0][0])},32:{[Bt]:3,[j]:d(3,a[0][1])},48:{[Bt]:4,[j]:d(4,a[1][0],a[3][0])},64:{[Bt]:5,[j]:d(5,a[1][1],a[3][0])},80:{[Bt]:6,[j]:d(6,a[1][1],l,a[3][0])},96:{[Bt]:7,[j]:d(7,a[1][1],l,a[3][4],a[2][0])},112:{[Bt]:8,[j]:d(8,a[1][1],l,a[3][0],a[2][0])},128:{[Bt]:2,[j]:u+" (left, diff)"},144:{[Bt]:2,[j]:u+" (diff, right)"},160:{[Bt]:2,[j]:u+" (avg, diff)"},176:Os,192:Os,208:Os,224:Os,240:Os},Ci={0:ki,2:8,4:12,6:Os,8:16,10:20,12:24,14:Os};class Ii extends Xs{static Ot(t){if(t[0]>254)return null;if(t[0]<128)return{value:t[0],length:1};let s=1;for(let n=64;n&t[0];n>>=1)s++;let i=s-1,e=0,r=0;for(;i>0;r+=6,i--){if(128!=(192&t[i]))return null;e|=(63&t[i])<>s)<{let s=0;const i=t[L];for(let e=0;e!==i;e++)s=ks[s^t[e]];return s})(e[ct](0,r[L]-1)))return null;if(!h){const{vt:t,frameNumber:i,Bt:e,yt:h,Yt:o,Ft:a,_t:l,length:c,...u}=r;s[fs](n,r,u)}return new Ii(r)}constructor(t){super(t),this[$]=null,this[Mt]=t[Mt],this[mt]=t[mt],this[$t]=t[$t],this[zt]=t[zt],this[Lt]=null}}class ji extends Es{constructor(t,s,i){super(t,s),this.Ut=Vi,this.ft=Ii,i(this[k])}get[k](){return"flac"}*Vt(t){const s=yield*this.ut[ns](2,0),i=s[L]-2;for(;t{const s=Ii[Ys](t,this.it);if(s)return new Vi(t,s,this.kt);this.ut[ls]("Failed to parse Ogg FLAC frame","Skipping invalid FLAC frame")})).filter((t=>!!t))),t}}class Ji{static*[ds](t,s,i){const e={};let r=yield*t[ns](28,i);if(79!==r[0]||103!==r[1]||103!==r[2]||83!==r[3])return null;if(e[ts]=r[4],248&r[5])return null;e[K]=!!(4&r[5]),e[Z]=!!(2&r[5]),e[E]=!!(1&r[5]);const n=new As(bs.from(r[ct](0,28))[_]);e[T]=(t=>{try{return t.getBigInt64(6,!0)}catch{const s=128&t.getUint8(13)?-1:1;let i=t.getUint32(6,!0),e=t.getUint32(10,!0);return-1===s&&(i=1+~i,e=1+~e),e>1048575&&console.warn("This platform does not support BigInt"),s*(i+e*2**32)}})(n),e[Wt]=n.getInt32(14,!0),e[Nt]=n.getInt32(18,!0),e[Pt]=n.getInt32(22,!0);const h=r[26];e[L]=h+27,r=yield*t[ns](e[L],i),e[qt]=0,e[Et]=[],e[Dt]=bs.from(r[ct](27,e[L]));for(let o=0,a=0;o{const s=Li[Ys](this.Ht,t,this.it);if(s){null===this.$t&&(this.$t=s[nt]);let i=s[It]*s[St]/1e3*s[Kt];return this.$t>0&&(this.$t-=i,i=this.$t<0?-this.$t:0),new Pi(t,s,i)}this.ut[cs]("Failed to parse Ogg Opus Header","Not a valid Ogg Opus file")}))),t}}class te extends Zs{constructor(t,s,i){super(s,t,i)}}const se={};for(let Ye=0;Ye<8;Ye++)se[Ye+6]=2**(6+Ye);class ie extends Xs{static[Ys](t,s,i,e){if(t[L]<30)throw Error("Out of data while inside an Ogg Page");const r=Cs(t[ct](0,30)),n=s[ds](r);if(n)return new ie(n);const h={[L]:30};if("vorbis"!==r.substr(0,7))return null;h[I]=bs.from(t[ct](0,30));const o=new As(h[I][_]);if(h[ut]=o.getUint32(7,!0),0!==h[ut])return null;if(h[Bt]=t[11],h[Ot]=f[h[Bt]-1]||"application defined",h[Kt]=o.getUint32(12,!0),h[v]=o.getInt32(16,!0),h[F]=o.getInt32(20,!0),h[B]=o.getInt32(24,!0),h[gt]=se[(240&t[28])>>4],h[wt]=se[15&t[28]],h[wt]>h[gt])return null;if(1!==t[29])return null;h[A]=32,h[ft]=e,h[dt]=i;{const{length:t,data:i,version:e,Ct:n,It:o,...a}=h;s[fs](r,h,a)}return new ie(h)}constructor(t){super(t),this[v]=t[v],this[B]=t[B],this[F]=t[F],this[wt]=t[wt],this[gt]=t[gt],this[I]=t[I],this[dt]=t[dt],this[ft]=t[ft]}}class ee extends Es{constructor(t,s,i){super(t,s),this.Ut=te,i(this[k]),this.Ht=null,this.jt=!1,this.Jt=null}get[k](){return Ut}[ys](t){t[S]=[];for(const s of Ds.get(t)[lt])if(1===s[0])this.it[gs](),this.Ht=t[I],this.jt=!1;else if(3===s[0])this.xt=s;else if(5===s[0])this.Pt=s,this.Dt=this.Et(s),this.jt=!0;else if(this.jt){const i=ie[Ys](this.Ht,this.it,this.xt,this.Pt);i?t[S].push(new te(s,i,this.Nt(s,i))):this.ut[logError]("Failed to parse Ogg Vorbis Header","Not a valid Ogg Vorbis file")}return t}Nt(t,s){const i=this.Dt.Zt[t[0]>>1&this.Dt.mask]?s[gt]:s[wt],e=null===this.Jt?0:(this.Jt+i)/4;return this.Jt=i,e}Et(t){const s=new Js(t),i={count:0,Zt:[]};for(;1&~s.read(1););let e;for(;i.count<64&&s.position>0;){js(s.read(8));let t=0;for(;0===s.read(8)&&t++<3;);if(4!==t){1+((126&js(e))>>1)!==i.count&&this.ut[ls]("vorbis derived mode count did not match actual mode count");break}e=s.read(7),i.Zt.unshift(1&e),s.position+=6,i.count++}return i.mask=(1<1&&t[Nt]>1&&this.ut[ls]("Unexpected gap in Ogg Page Sequence Number.",`Expected: ${this.ss+1}, Got: ${t[Nt]}`),this.ss=t[Nt]}es(t){null===this.Rt&&(this.ss=t[Nt],this.Rt=this.Wt(t)),this.ts(t);const s=Ds.get(t),i=Ps.get(s[D]);let e=0;if(s[lt]=i[Et].map((s=>t[I][ct](e,e+=s))),this.Kt[L]&&(s[lt][0]=$s(this.Kt,s[lt][0]),this.Kt=new bs),255===i[Dt][i[Dt][L]-1]&&(this.Kt=$s(this.Kt,s[lt].pop())),null!==this.Gt&&(t[Rt]=Number(t[T]-this.Gt)),this.Gt=t[T],this.Rt){const s=this.Lt[ys](t);return this.ut[as](s),s}return t}}class ne extends Es{constructor(t,s,i){super(t,s),this.zt=i,this.Ut=xi,this.ft=Ji,this.rs=new Map,this.ns=null}get[k](){const t=this.rs.get(this.ns);return t?t.hs:""}*[Ms](){const t=yield*this[Us](!0);this.ns=t[Wt];let s=this.rs.get(this.ns);return s||(s=new re(this.ut,this.it,this.zt),this.rs.set(this.ns,s)),t[K]&&this.rs.delete(this.ns),s.es(t)}}const he=()=>{};class oe{constructor(t,{os:s,ls:i,cs:e,us:r=!1,Us:n=!0}={}){this.ds=t,this.zt=s||he,this.W=i||he,this.tt=e,this.fs=r,this.ps=n?Hs:he,this[ws]()}get[k](){return this.Lt?this.Lt[k]:""}[ws](){this.it=new xs(this.W,this.tt),this.Ms=this.ys(),this.Ms.next()}*flush(){this.dt=!0;for(let t=this.Ms.next();t.value;t=this.Ms.next())yield t.value;this.dt=!1,this[ws]()}*ws(t){for(let s=this.Ms.next(t);s.value;s=this.Ms.next())yield s.value}parseAll(t){return[...this.ws(t),...this.flush()]}*ys(){if(this.ds.match(/aac/))this.Lt=new _i(this,this.it,this.zt);else if(this.ds.match(/mpeg/))this.Lt=new gi(this,this.it,this.zt);else if(this.ds.match(/flac/))this.Lt=new ji(this,this.it,this.zt);else{if(!this.ds.match(/ogg/))throw Error("Unsupported Codec "+mimeType);this.Lt=new ne(this,this.it,this.zt)}for(this.gs=0,this.Ys=0,this.Ts=0,this.bs=0,this.As=0,this.Os=void 0,this.vs=new Uint8Array(0);;){const t=yield*this.Lt[Ms]();t&&(yield t)}}*[ns](t=0,s=0){let i;for(;this.vs[L]<=t+s;){if(i=yield,this.dt)return this.vs[ct](s);i&&(this.Ts+=i[L],this.vs=$s(this.vs,i))}return this.vs[ct](s)}[hs](t){this.Ys+=t,this.vs=this.vs[ct](t)}[os](t){this.Os=t[D][Kt],t[D][O]=t[J]>0?8*Math.round(t[I][L]/t[J]):0,t[$t]=this.gs++,t[is]=this.bs,t[rs]=this.As,t[es]=this.As/this.Os*1e3,t[C]=this.ps(t[I]),this.it[ms](t[D][O],t[es]),this.bs+=t[I][L],this.As+=t[Rt]}[as](t){if(t[S]){if(t[K]){let s=t[Rt];t[S].forEach((t=>{const i=t[Rt];s0?s:0,t[J]=t[Rt]/t[D][Kt]*1e3),s-=i,this[os](t)}))}else t[Rt]=0,t[S].forEach((s=>{t[Rt]+=s[Rt],this[os](s)}));t[J]=t[Rt]/this.Os*1e3||0,t[rs]=this.As,t[es]=this.As/this.Os*1e3||0,t[is]=this.bs}else this[os](t)}Bs(t,s){if(this.fs){const i=[`${k}: ${this[k]}`,"inputMimeType: "+this.ds,"readPosition: "+this.Ys,"totalBytesIn: "+this.Ts,`${is}: ${this.bs}`],e=Math.max(...i.map((t=>t[L])));s.push("--stats--"+"-".repeat(e-9),...i,"-".repeat(e)),t("codec-parser",s.reduce(((t,s)=>t+"\n "+s),""))}}[ls](...t){this.Bs(console.warn,t)}[cs](...t){this.Bs(console.error,t)}}const ae=S,le=I,ce=D,ue=K,Ue=dt,de=ft,fe=rs;function pe(t){function s(){}for(var i=new Uint8Array(123),e=25;e>=0;--e)i[48+e]=52+e,i[65+e]=e,i[97+e]=26+e;var r,n;i[43]=62,i[47]=63,pe.M||Object.defineProperty(pe,"M",{get:()=>String.raw`dynEncode01a33fc84f8dïoØå§ä³¨s¢þéõ?§šæ—ƒQ¬·ñì>_•å”è£Mí'…ËÏÊí çåzmòeúaݐ§¢é,šî= 9z…ó¡= $.JõT¬K„'¨®ç ƒä“Ó·ßé‘àäà(u¾ŽÃ÷¯ÃìÍH¶3KQtíŒ;Çø=}ÉóX=}Çã»°£)½SÉVy{oEqûUHhéì8÷7ó[Ÿ”¼ˆiÖ¨A2º»ƒÈ(ä+Ú»‰Ðé*7šç}ìÏց@ü€¿À¿B;?=}A?>ýÿûüÿ~{xÎ#†ë5X.]J +=Mi=M°UH +˜5šâ’ª±ÀéOmrn¿¯2Ljª•˜{• ÝájÔֆ ±Û©bŸÕé)j{èüül8üàJr/¡™¨‘‡²Ýþ^UÜàÈO6܅jÙ5èâ×að1º€HH=M2Û6íÊóI̧[TÜïÚÉ)„ÁW|âßHeF,l Ì¥ 'ž0Äb8ÏK“ß è!Œe‘€J +vÑz–Œ& WrnV "5Êñ ýkwP”4Ãp¨‘¸RAx[p¼Ïóƒ;š7>ÃÑþ¨VU?°Rˆ›q9~ò‰Q”ڃw‡I=}­žœ• f›òÔ·rñ¾ª¸gðx7QE5-±®M߀ãl–?£Á•ãÃE óØ{ËÒÂÌ@µ –z5fñ‘}.;¾ê%Mi‡‰_³ZU@å.ɂñ‰î¾Þ€m„Ät†×¢. ,ä²BB;朤‘äûûZ_¡V)Œ‡ŒªAUµ¾BfÈéŸ Ò&§¦$¢Š»ôåÀk£z‹(Ÿ_zܟ^r>†ï ¾bˆ>ÁŽð/ªÄDTçQŽlÄIÒ°Q}:8_þŽ!@ßvñ!œOö +\”\ebVpȜ±Ö~\¥NÐ'eŸBœb·#ÈN¥ŸY ßà#W´0a]¼!þ½\nרT¿¿‡¶çÉS­îäx7óÎ6ñI-ììùpfåh¸Çú,cµÔeiÂeic ÓÂçˆ#ê²up¹aÛÝb0¼þ7–Ÿ™Ü”>F3ÞÔTþñfkï±bxö”€„öfٍ†ˆ±…6H„”ΟÊß6 šÒ°ÂyV¶Á?»‰‚@?{¨Q¥+=}¥±ÿԓÌá9%û!>Âì&¸Õ@Ó„Uùq÷?ñqt˜¿“çIU+÷g‚y+5sä +¼¬åí• GÖ®‡S1Kƒ;…B\©™f‹hX˜d)ºÐ¿²Uw ûûX1ƒ5°Ò1„LÁ”-Œ;j= piN:}îºB¯ÅÉwXtô§¶¸3Œy¶¯oJáàLž¸jÎn®În -ЏýûÄàsT ½ÎòÓÄes ´{OsèÚÎþ´ƒÇ“å9SekF†‰TV³úŽK-”š÷WE¾OÔ +µR½‹ø*ٞvVèJ°§†¼Å¤ªàCŠœsr²^Õvü3ããÔ¯/´ Poü|$ RÞ§KuÉ#þ‰[ªß{¦ÑVú>ý>Ôws~~š9ž=Mz¶-ږ•hiò>ñ²1ždüÿ!ü>ý>í¾¿ñ赙À ž/«~yæ¨Êwór„b0©ì!ˆ ~°»Ïžøj§Ý#ß88š÷AlÛ¦3¹ÇS8“oK:xÜ×'dAkÉÜ<É;–)3ÀbÐ{í«Û5?þ +ÈNøRÙᾙ¹/+ß>ۏ¾6åô}mzQ|p÷Mž¼ðjÑí©;2½&Ì#g×g|/[k*Zõ8ZvãXƒçàF–ª¯a*÷«ª+V,\¨rÏâ'É:G-àëˆW£óÿ‡ˆîŸ‚8rpÿ]k€=Mîéû|]´$Î"’îá“VìDŽ_d%~m¢>aj%U6¨^8"žb ]¥®}l†ì­ïèÈfõ lÔ֋çÝÜIÃqÜ;ñ‘°[‚ÙåTàÆä>í•÷™õ{¯oí½3*iú•D¿gÔæÁ@sÙ Ñèځ=MÉkáÑüçuêÕÙðw¨ À ³Fô~{ï_µ9Ѭ5,}í5×0ÿ>_6l*{îò)¯GjE7(aôrÃbôÚj˜Ç½ T°ÜÃÄgk;ß_߇Â֍ûÄRZðùÒ¸§=MX*gê[ÉXÚ©^uN„~u~® +:Õ_NøW‰ëP\^WpÀttØ÷2ÿ2wTØï2þ2v6y6;V˜ÌۆI÷?ªê„̶^&>&í£F]VBfŒ¨Tße|þîõ¹ù±úÁ$˜]ö wá†yƒÏV.îbÁۂŠÆ.Þð¡ØÛ†ïtnZ$þ:—KÌòñӘð?«Ÿ»…±l“â¶ +SӀÿZ·ƒ©'7 +s%»4äcL+øÈ{ +^ÑKCU¨n9ðÑ~g³/rӆV$ +[cÉ6 &›(¿ô‚qðx ú’Æ6ÞYSÇO×Èò{ ’-L;áèÚÆUhk(öyžÄ„è7´Þ1CY˜¤Dèé׃40,ä$Em9†¦S£"¨ü“ÇkU€ô¹ŠË UgÎ{>%[2\ösiUîçÓ.œÀ¨ãôÂÏûÇ~që¤ +˜$¼À&*ãhæM#Ïî8å#ûûU@·I‡§a†Âú[Hc°cŠ¥öém¶«è䪪ˆ#÷‡ˆñg;ß¾óºš/9í? g~ïB9¨'Süß.›),‡gi±Æèzåëf¹,Èâ^k¿|Ð= ”ÿÉUvˆñÚÍÖـ"&•|ª[Å¢lŽy‚D¸ÖÏñI´QCÑWõȉà°zÈ2_Ǹß(ËÒ¹pi}çkU̇-PV$MÍ)}éžD×q¹{¤aä†.|í+/ýºIë¸××I¥^bü½ö?Ñ/ưuCH¥g±•‚|¹MÞ#L²„ææûºÿ 'œîA-÷B¿7<ޙԭ 9ì&Ô¢fÓ1EãÈ/ cE%5ÙO‡£.uK~¨¸;Ëíô°ÿu7uRö¦×³…®= °~£3€0Èö‡ˆpI ìx‚ûŸ)þÏXËyey„o I%Ùý°ðà8­Kð!9¡ƒ‰C£'Ý Y0¶±Ú}îùÛÆze"ߦ[ÌM…ˆ÷qAš?¬;QW–et„ bW¬ýÛ)aW–et„+*˜¾­j¥h8Î +ÉëÎ +~øqù|ô*= DÑW©â +q'$iÇùçÆ®sç4|¶¢USæK|cÅÀ(46?µŠƒ#ËM0÷rYNAP÷r¦á«Ò×{²¶ÁØäpg´e—Ý|¸ìH=MïmÿOn@óå+(÷Ð MI3“ìñÈó倝Óz*^,áÿJ²Úz* [Òíxê|Žfp˜„ûÂûûBŒf4þs*þs*ö [ñ‘bG²ÐnjÄ%Àßñ«Zù\è¬è ‘ K-ÚÈ®”Û“×ΏVyT­´1˜bØüJÅZÕüJÅÚ=}›<ó´nul/6|@{æÔî½àb|é ª³½wTŒAª³uêÀ.¸šNvΘ‘æSUL-÷h›rH7ÙV +VÕ-pL¿ã.PÒ¿êÃÿqÎÁE­k…ÜŒ¦ÙÇéÙ²—l¥(t³p–OYúHp’cÖ¸ó„æÞy5½¶ÎÕ9Ȍ³˜³²ô³2§'6Š­´É‘»_9Ɏ^¿Ï«;ÙËa­&rb—f±_ZØÀª%#ŽÎh?̑;zÀVš‰j¿Ž2lúꋆGÂ^hì +ÊÀþߌðT†Gximü1Oå®&¥ïߗµe‰cË/9/ÍN͟ê¤MÎü´M +ƒ•]Fökj®òJ¤C©K•'îO§•GiÆb6ô¡ØfÒéþ‚h°¶˜À= µfŠaG€Hߵэ¬Ãà ÖO¥*–Ýh·s-#ýtúø*³D¡S6(t,ÀF0(´¡†¿nƒ,Ùádý˜Y@²íۄâÀnhé9ÿ{~@øJèT\†VåԞOó¢üdr턦ür… +¨& +ÝJB¸ŸV%tr­QžóӞO—Våâ SBi¾ÿڐçܘÄ6OLi.p·Å(›Õ“xD¨ +D¨¼¬ ؍ª¼L9¯¨ÌšÓn¤° BªbêtÓ«óÚ;[K°èî¦AÀ—Ο™0ý'ð§|ÌÒÌ÷´rq½ó ̎µazûû8œm´Ê/ŸœV:È&®¬ØÌZ& Uk£‡r¿Ãî9>ÊR‡rѤçśz"ÈBw&!Aúÿ’‘üd˜–&ù¤º¤ûë©ÿ?þlâSwÉ£kl¾2ž9²bÏáz«–­®k€(Ȫ-Ðgýuäƪa­ß÷Ðî5A3*®ÖÖ»­·G‚V@øb1r# éof:&z:ryG~qb˜f“ÜVš\Q°%¿¦cœåþ„¤6á0n"՘a•Õ:¬®{ ™$îN³ºüÜ~=}Ą6¬ÁÛÏÓ¥Y¬ŒÆ€m‚šÝÜÀ,ØAà64æ0kÐÇižL#=MMôk%9ÿ[þ|Ä[Á<0¯ ý¥þÖváÐ\yí¬-zÌOï1ä@ ¤†ÙÙ®»…ÏÈïõ¯•j¢×ì”=}G›þÈÌûû¢r5·5¥„ƒ×ZíõÅä֔þ&žRX*ƒü°Q:ýBÖ.ùžkô){©Ô™B­>´MLZØî’Rf," ŸÊ⟢¢p¦Ò"ìÖ!¡o4•ºÕ††z0ŸŠÎÆm0'$¦g,ˆžòߖö k†bßì°qºU‰L?R©@c‹4¯Öçî쐁 U ú˜Û‹(ZEO DXzÄC=}°×D$ãÞ)é]S²œÄz¿¾ß‚ÝEL·kÍMVañ„%FJ +4ôñ=Mچ™fÒ¶‡AÉÂíÁ|…Ô¤joÁÏ3ÜV5íÇ-:5rKÜ[uò¦\ŽÀÜ]3ނµÂ«âQÙúх åô=}*´TLß8Åî7>Â'±„:LCdh úÕe÷͏M73ëFrԉmÝР“†ÿÀ’ÓM|"6d‡@O…¹‘cs‚Z¡g%n’B³ý£UMŒKÅÖ0Ý8ÒõÏu·ø¶g͜¡ñš¾€ÚÓN Š0þR)h= †þ‘P{nøQ€I3Åß314™’ÐT‘= Ìy”Åy¾–l܅= ÚÃiUCg´WœQ(ŠÁ$^])Ù⑥þ 2­Û·>å˜ms&b¼úªèôQ'Yè¨FüyIr1ýÎmaî0' ÇÈýªÿ’#}^W_W}2QjAÂ*ϐšO¾“rûÿ +Dñöëß_\Z= Â)¡# ú„⟡]ôö¯öx1ÓȒ6γ5_x}']Ö+—ü\c°”O×ì9¯g_³Šd‘óai"©[9ûЀC¹^\:R¢ìŵ‡ýrt‡q׉Çܹ–‰'ÆY[7lÅ4ÓtÒ¡SÛà -W~ üx¯d…ãG@fýÉOsó–Í@O¹ g.æ ,ŒHåÑ?_w‰Š•XÜi~ZS(E¶²ü×¹RJ=M¹Å_=Mø˜ÑL^ålZcþ‹ëÙõðÛà„¸‚õ/ð±Üzé/™whW:ÍÐFÔ #ÉG´ÂÈWŸ²ÿÌM+ínríî#ÌDoñ•„L}ª.–ñ¸ŠçpƒÑ}Ê YW’õ]jãN¬k¸Áç÷F€Lã äªÇÔ)üõ¤ùæÈð} +æ® õ9~%žñõª÷èþæutµØî «ï‚h w3ZyVÖfÛÓÖ/fOP= =M»Ô4ßýa3‘øœ¿„‡$±äšFY\ò[¬)¢Rø¼‘fلO ü71w¿ŠæZlý֋° +ÓÚ? .)fsnW®Æù–«Iò‡Í?Uñš¥A1ƒ¢7+_꼉ßÝÙâÕЦ]s¿îs¿ðS9šÓšŽú ÞWLs_Iu™=M¨6ÛèÝë§bCgт {F¼©¦¶ÌKDZüMv•)Fº»ý»è eI ÏÚëÆ*$&Ù轔Öe´XSX×øØê½ñ4 ÍàG+ôgÒ  ÈVæT[å^~×?|#K·ÇlLÎØi;ùV'j÷œ0ðÀók—=MîAxyvšJbÞà0ŒVHÈA€¤M¸;O¸‘/(SÔ«¦üÆ3؍kU´Jf³)óg»1W¾‚lÄë§1ŠTõù݇’†d%=MaPu™í(pD\0Þ0;7àe“(ÙД´¬µ o6˪@L$Žë¸Ç×cL›Jß¼Òó,]þ&5µÒ‚&ñ´…tÉvâPŠx XŽÔ šÔ8ç‹ÖHëKÊ0]f ê8-rüºªå±­¼(óåНµÒ3äóOôIø—Áþìj# = —bF%4»XîÛð«!@$¹@Bl‘ý’U@O‘EDç/ }òªT3Á$È%nJµ’Æž„[gÊóÀ;=M5»Ã:_ÿq¿BßÀ¥1æ-e ×D¦»6*„Û¿×_ +ÔQ’¦sá0ޏêw—Š]ÂÕÌ6Y£>3CëxâF4!y'Èw†±Y¾ŽžñÕõ0ww‹*·ÕX•3ógg5^/’S–Z.´‚ËÆK†9éÓm"Ž}bŽ}âV|‰þPê¬t¤]pbŠ=M»tJ= ^¼-ÄÞ˜=}žWȼ"¾ix=}žØW.¢µ}d=}žÜôwŸ·}S‰!/þ·KÂãŽys}ؚ±Wwþ¿0—˜&)” +±}Èóðí×=M© ~šÜPAŠ9Z†”ƒ*Sό؜ñÑMN·c¶Hï–ëŠB¹]h_þq^&Z=}* „’! ÓœÿÉÊìíƒv‰™“×®>‹BŸŸ²Å2!´4œp_ÊݛÕ!©diŽtÓ7Ȳ¶–®â.;Ù1Ðëb¡º÷ñF"inˆ/­­¯YNÓ(ÐÿÄ<š–›(ÓC–9~õ-­"‹§7LQ‡<1Œ¢‡­ŸAäHÕ«´Dî‹ù–‘PŠ€= ñc{?ýW:Í;Ԃ]cán¿˜¼üÍJŸ£)™Glú!¯dئ:PNÂg½ÍŽ^–JÑjÅ^¿6f(ÄA?anD(°Hsn +$R§Ärkx÷ò­ÅáwۍÈo]?!$"A""÷ð lÄ–ä¾qLô;±óðŒýó;^ð=M,±ð(&²ÀMªªÍü"Kb(6tÒevö&h„ÌD}ÔeŒ¼<}TÑØõnzÞª 7º}óì.$¦‰„1Vå Ç=}5Mþü²!ìm¹™¼6ˆj¦š€›ƒDƒ©èÒ·e § ‚"ŠGœÑÜ%ɶÒÏYa[Jðe#¥ïÔ/;}¿:óöª +¨ÓGÄ< 3mN¢¥¶«Ÿ°XقK—Þ°2ÞŹð¤d|9c¹õ.“J3¼«+™|°*Oôž‘ æï1²„/½©°„ˆ¬·³'´öÛ~ö|õJÛOi¹Ê·û† Ø<¦í>;°HÜVßÒ= &XÀîŽ15 ¦ðöƒÊ0ÊÀùl†=}¯~ñkÄÁ’41qø?ùÕºÏO,K,N¥‘EPÕ§v4‰Íøþú•³¥Êˆ‹k+*5­çr#1DÛ<窣…´¯|{Ù1¬‰ÇÆIje¥Yàkadž°–ÓÊ 3$AßzŽHÇ·Åö­Ë6·Uœl þq5!¢×“EGm*°¥þ6¶ÔùWøJéWÅN$p õ}ÙÕ/}°•,+:Ù +µ'ãŸã²_‰6U˜Á|á÷*c»\ÆU,g*ðÜÆl1ud™ 8¯à“-y÷I ŒÌxÉü.ù†e=Mɔ=Mk«?<çNd2o:Sò°ÑXtÅÝjVZTÃïÎòê;èXúQÉ6ØØ91Ï=M1èpî®Å(è(P I³p¾[Ÿy)$ì$ö®…K÷„¥{®!nP‘Úvä6œÐ’ÈVþCr¶>èqvÉ2ÇtDd@«=M¤c¶ç¨·íi«5A‰›,¸Ôfª/ْX¬‚š×ƒò*2® å¸oô +{ë.»Üy½Ct EâaúÅç¶Gtœd‡nòÔQº5Ñ66/Ë1=}wk*—l$¡J_!JÄ©m,v›À„p£re /7P$Ç.6TAE%8Ō7RÓ]Vú¨µpžPßGOëüâëüÂGO2GO2HO2GO2=Mëe›HI@Kgg,p^›OSü5ÏÆyˤ˜&.‰+&Adëg=MÿšŸ‘O[¦çŒÀ‘mƒØa% É­V­8=MûŽPNfýú’‰0uÝ'|!·‚ÉñjŒÖañ÷eWÂÏÍø4M;ȅ0 À'ú4¨àª¦~F>Dïo6¼.r]“gO:¦]§½„”Xhg†õ(Ýۂ†š‰@´¨¯ß£éD˜üÄF§ƒÃ»y©õŽ@€= ´LM‰ô‚¯[y‡B3솆ÿºw•K)¢w¹ÆFY=MäՉñsÏGBGˆ'÷@Ki=Md¥”Ck¤­3v»Õ=M÷N®fºŠÍ;Çà“³8MG>†Œ(’pÅ ²fÌ ŒÇ$‡€î2Ô.ÿ8ˆ…doÿ£©æ.oŒÏóSÛpX¡ ێzÉw%šUµ¹ÍîԭہMÁ†5fg +ûîBÚþdŸâõ´ñŠB­,ײc‘ÒŽ Pþq×wŠÀ²©Ã= BOµ%DىϪðõ™üQqÀ5 +ÀRÃgèˈ‰øÅ7IÑÜ" eŸø;âqæÞ±g&:ã'sÆk®¨ÏíLàôoªH'÷:'E÷df5*îx= £ñlí®F$«wmٓõîUT¬—»™åÕHFÔ]ò&÷*$Þ)Ê<{\‘ΘÍ?Çâ›V¹"œpžAn·{‘²Îbu¾âaÍ«ªáéĊ9z_KW´ûS§%í ©BÆÝ®¿µt&ƒdùë³ïú7ô£ NÎ'ð µÅ©ïz0´™î¦êUtâKΣ¤=MdTrzU8vM[§óѳ±I„[‚ý¢wIÃÑyn·QÔÝUæµöېðÀ¶{}IC°¶"ë®ó ß›ƒ^vèZ\y}׳BE6’°Èʊ’вJQ$-9Çê~>t‰m w¿²ˆŠ¦¨®®(|nÈÛp».„ÛTÀ^æ©É6•:ݽ獲=}÷ ÕjÛ¼Œ!ÙñI¯Ž.y_ŒüØ5ku–á"P/qžÕ¡>FˆÕëfâ=Mg4‘_’q|= lrö™RCD‘žö™zê]ÚæšKN4_©vÚè}ò͜p[üÊãᮍÓʃ.ÆiñC˜ÿêÀž}2&[»ïmá­rÍ=}ĺ2x>ÄÂéèÖ{ÝÎæ—íǶáN!|Äώd[?9èH^ù—®µ;Z\º¬yI‡ì²p>œÚ¾POŽ?@†º“ý\zþ}53)¡ÐÁÍç6 O#¤ˆáÊcËc£ûÀ¨Û¥Û2¤y£ûVBر«£Š›_ÅcpF£–¤ƒŸËc=M¬ƒ¢g£(þf!yÛãO“í#·ƒm£ºÞñ#Ñ£ï:£áÛ©¢næâ¿ã#/àÁyÏW²C ‡'՟X؈%¦)Ü p¹€ü˜CQõãÓÛ}~¯$OîLàHJ¸cø:«7í­döº¥ºXJæ9Ô÷ÜÀ›ëé0þ“õÕÒÈkîщȺ–õK,þ‰H‡í‘3:?77nóŽKÔæÈÊÖ÷*¯Õw¼=Moøllÿ8#N5£ØÔQ]Vóú1(=}•®ëdɌüŽ×üNihó.ˆF¹Uø†bg…³n ûæyª(…âïþ¨5꯯;Þ_ï «Ö­&tÊBƒ¨Å|’ø ö×P = 4o™Q…”&@²ªÞ= Ê—;·iª*[€/³‰<“{O +ӊ(Ӄ &;Õ8 „8üÂÓoC“ý¢€¸ë€ÓQž;ÖËÖÒߨŽÄ)¯Ï«fqF¹ÀÆ1È>›'ô&9(T•j²õÚÙ¡%¸&ù(”F" ”–0†cÿ2S s +{“¦O¦>©Y'®ë=McsԁØÞ©ú;ò}›°1¯‡û{VH!t;¬OÃ?½‡Ü¶q £Î eÃpHXzÿÞ¿žýxÓê¬ P‡\šM'È¿…ë9þÿ„}‚#Î'́ƒ}”÷»é¥¾åzt僵´„ÈAú.C„\}!iÔjÛAڌ¶¾;’ðOŸ ÞÉ(àp’ø;åòXCy¹JùŒÛ51J.Nòvô.=M@ƒo”g1f”ë+³­1 +kË;´«ô7À® Eˆ»¹éôäxT/½1¸xâ{Û¹ûÝysäzü°>;‰{e«j'S†ßMqÊØ>ÔÏzöp‰ýP³5=MX= :¸Š[ð1·u1ºkĒÌï¬v+FÎoŒÍ0Ûçs•2Eî§tävòÐÒ×8Õ/ ž3ùŽ»¤.\i8“{Ô#¤)eÎç³^Hšòtéæ»e½¶g፻¶^À¤g4x޳©3èô;¸¹-Ks—Á%ÌÂ>Ð= /³Åas8,}F9ÔRšrsh¿Ø³ú1jé ]Oš+E¶™ÛM94”%k’˜H4v|ß‚Í±ÎØÑLN ¤0ãÀØjj®0 i+òwÝeD 缸¶ëûº?k1Zp½r¡ ¢ÍV=}OHV+?®r7šâÔúTÃ\´æ~ÓY^‘É\9<„¹ a§ñ$‘î;òîâ3öuJ?­"ã¡Ãoœ3ÿeKJŠ}T^f[ÞÖQõø|R÷©ìȌĎ랰Y8¦}òþr5IPò„8/0x¼v‰SP—|IëÞ(æ.ɇÕéH#2廗[_¯ÈHÇ·y”-1“c’©ÈQËàH‹(DÛËvšìR Œ„£Ú"/u¡D$uDT˜Â%Þûµ«HÝ>f·!Ô0ŠŸL‡3¼m!_“À÷4{Çýàrá©-¯ú”Êðÿ(jˆè€‹²ÅÎÃÌĖUÒ±T§#i(9í97­öºÛïH¥v•%!ßOWª·Ä~ãÀ½<€A i޶…/%ÝØ²1PŒÂé Ú/¨Ueiñ$ÛÚOw±·Ü9C±0o»>ôí±ã¥PuÔµ·Ü=}C±0o»ãУ¶åËgí…éð£"}3£Éx{F"S^¼±b^Ù v„wsõ×ý½cë=}P£i,Ðx' S¶¿£aDŠçH‚Oó>.ü,LœD…º‚Lý.œ6Іm…™¹ÿS~©'È3>§,à:FAú4{vìÆùHèâ~ëAú$çpq¬…%=}AúÐûV©¼rf9Ø y’Ñ0\î«ï= ©Hܓ‰±(äâ°6^€ÏOнڀ/}KŒZXÊ]w˜Òbþ/U}Ôn$q2èÚ3¡ˆdüzbP®µPÔ0‰Õ˞í6¡LK¢oЃE¬= Îèt¬ZóÉk+= ¬˜ý À²‚­qAå¬'þä²'þì[¶'2ã[6'㛯'Ӗ›v{Uj˜²^¸¹îŒ,¹<ªJm=MÖ¸ʎ5,ró±Â.Ó=}txHë2ÿë'±: ò>A6Ü3ÚȖùaÈÐ=M%Œmٌ$UÀ°²åœ4“ä ÝÞÇ8èðSæ\ö>qâ¯}ÑxO…üx͒¼É¦;çÒgÿ;»D.úâoÆì:Ñq|Ѝm}'¤@nÍ +Ác[)•Ôph¦ýI”Á­×Åà+(w9¥¨ìGkÁ,Í òש%t’°gX C°C€ ©}½g3¿´‹„Û±F£îÔòêÖú™¼ ÔlÝÂÓª±†FOkéûT•b–l›SOÀ"4²äqǽbê¥,ß*i\ô;S€‘FÀÿž$ªAÉÞF¸l”UKŸÑIè$u¾Oå]É×ʴ̊Œ´Tö>[çƒû ³Ü™¦dÍO =}¿fW,u&Gâþø¦ì>N=}ù»F‰…½.Ö]MÌÔ¡‘c·»vTø02ƃM1†«Mø°=MöÙr /*‚R +ÙÔ ä +\.ô¦Î0ƾ¸êÅé#îmQ‹k;ÞbUä€Jrr ý¬È˜ ¯Mo†,ܲìºBë®N­™äè $*{$ô²ùn]/!§¶­!ª ¢OÖ³©oIz¤4Áeîô[&ãvÃÉÎ{HÍë©Ò\Îú4¥¥ß£»‹œ±WðNÕÔs{BµN+Z‚,ôToI5yhÐ}naO,dèDqU È0q¶œÍRÝÒ4LÜ2¾á{å¬Ï]<º† +}QÅÿ«^pY½ŸŒ.ÓÖv•UÓ\)Œ›ƒ³ I’®Öй q̬vÔ­ "8w¾ñ +I°ÅîHõøì˜úÝwܤßi‹%aƒ0B*;Ó´±ï5Û|ƒK´ú¥²IéëÕ!¾úÆURD՟J7žFEz\û.*zlîAԓ¼…£·”Vä)•«zp!V[á»DBÿx³Ãœ‚Â%:WŽÄËÙ¦ˆ6ó{³Ûyµ2ã ~Ó= !°'c¥‹þóí1ÀëÚ2ÓG„«¦š[ÖÞm3Má0j»)†ÃæÃæMª¼Û]ŠÂ +“1œ½W¬ŸµAEçRè̵·×GÃ;ƒK£ø‹àÇê=}pöÄá²kéâ@§oÎDEÂÈ«™F¡U …v¨bò^ÄÏ×í*Y¿KÝÛގã=}ÆÊ<MâH¡·Ç˜ØßÃ.JpÀ)ñ*,Ë)ШŸÏݘk0-<Òq™ ÿd‘¤7¸¥ƒù¥…W'B.2WKà§Ìëz_و +Žäñ!J^žÇÀf Õ‹Ÿ£…ìµÜ¡ÓÅë Äî€öÉò¥Òimu³Ô(ÌB邒€"‘—,ßà"]!í»1ƒ§=MèCf/WrëF,O(ÄCC1Å*U$J\ŠìV]•AÁ†ò¬ÑÜ'‡Héô2Z>,©ï‰¶Hö¥VڀCJAuĞÿ“ÔKG”;Ë5Þ¿*ðÚûB{½ rèJK+”ˆÿ zþ âÏÔx½†ãõ'»ÞL+0¶Á¯²¸cšG‰:ù=  + +´æVüK¾ C0‚ÎSý‘4Å0= ší⠒-~Šˆ¥ mÒRU…ì8c¹sž\E²¼ïû n¦¸]͈60ÐÃù/Æìâ$Å}}#üİ^;¥ŠøKBÍùe…æ!™Ö ˆ lB9Zþ O>£ñop!= Ö)T]ŽÒ"•>(Š¡üâ>?–¾ !zöù†þá›Ta–\‡8 LI¾ºM‹Ä¼ÈÍ%Iãù끞Âz†^Úb{½æ@å@ j¯®[ÖrŸ’Åñú%®d‚m‹FvãüÓÇ},/3ÓÎr¾k:†>Dx²tÁ7_ÔfŸ²ÖJ¿=}òޑÕ|AõEÒ*ù"O& }¥Hˆ0çôWùØ!… +Çs®zã4‘æœr„ ŽPÅgû›lâɝøÑ@ þ~ʰ¶¨ú’퍾Y YÓ·¿~a…²ÆÛіS,‘|Œ6ól\ŸÌ—PË_Vy†Îù ±J¥½„ræÎ•ùìT®G[ù‰BnWôËieºNúûi¨°×@S¤••‘ˆaýP?ÒdçùN:"°”þÅÿŸ[òœp™dÄPÞ02Ùâ¾Þ†אŸŸw +ðƒAŒ, (–<´£é8oŽå¥’ ++»«4D‡¬Ø¥C¹À»ÍÒ°9KÓp*ÖB´¦£¶ÑDfœ’Eƒt8ÔÎÍY˜0ÍEW¢?Ÿ >ø¸ãè#Ûº?b҈®íq¯~Èëî·õ;œ‡î¼P£x~v/Ç!eÌ·5“Šî4_7ÕÊòÄÕËuPÔmN{ô~Ò:!%ªõ±Fc3ÑHüµç°ÅF)wf8—('¬Dc=}ƄH'"må/Á­£7p|© Ò  =}TÍ}œ¨6†jÐáèÔÝyh¸È¬Ôz®1ô2âô«+ùÏ$Ý 0±Á™ +­j›Œ–P–¶™\GB¬žÖ¾šOÂÖù¨½¨¸$%EX,=}ÉÓ(GAӓ=}8Ž%ÅÓmÎ= •Û@2=MÖõ“Ézr¹ý»Z+ïuûGï;ï&#ÇüüH]X•ååd¨r¯Œ*É՞ñéx&*¯ÕX¸ç7NO k™CaàOB„zrSEs®8·Œþ{:4G= —æô‚«Ò„éå©#EÜu]õßºSÑÍ£ðÙs¨G6ú‘!óñ‰gÔ" ÎLiý¦Qð +¤º,DÃ'óö¼Gâ{ü>Á’¬¹(¯â2©ë£ЄèïDI+Àgï k7iï8¥ؔ“í3ÿð(—èsnĨÀ†Ï•ꪦßHAu-/ë¦ÜX'mÞ=MÎçnKk fõMÓ<–ùŒ +͍ÆEÒ̚®fÌóV\È!”ÓñQq¹^4SyáèÏ-=}<¹×3ýy À’ ·ðmå6·¡­MI¾<Vrº2F}Õ²jAŠ¿«Êðå„w°F+i×?_˜}AÒð(ûï~wÖìzW|Ô]ÇA¥ˆ³l<@gúæ©GŸNà­ß·v›´Ósx)™<›ýޙƒóAЗ|d4hÐ\k +'Î6­óbö¶Eaó-”œdcóöçšë)<7*ãkcëÌ·ãk·ۄ¤ £·q¬²þŒ?Á2ÿ²m †>L š”ú=MxoèÌìŒÎº?€LŽ=M¬V·Â÷¢ñ÷¢0<èäÇå“Áü—ðxîG5,ñi¤Á×׿±\rˆx\.)¿À¾c{žùÀYKž$öGÍmÓa°ÿ)sJÒCÓØw‡øè²1yÞ±µü·æ«wê /¤"+œÅL‰œýÓª*¤.ÄxȂkâw%¦6…eºå¿æÃ.|„sƒ!-07ê¿#ð¸s*IY±'UZ¬@®óõ¦L·Î¢S&k@>øþ8g{O qèª ³ÄE&õ#«CIþóö‘HL)Cd±äbãûÁ úb¾àÇóQòOõ »¿Ç‘|c>/ã—˜H–û7».\ZiéÊÌÔÐ1syìæjƒÓ¼–Ô¤•dŸ—A·Ä;ïpÜÀãזìW7˜€·[~yäÔ=}é3Õ0¡ÀX¾Óqä@>Ä{°÷¯ÕøÃ=}Cã×ÿH»B»ÕB=MåÛ¬o=}ó'Cä®ö +'=}=}¦M…ÞÖ0Ts*he–óÁÃtÛVXÑÔSB+¹f}=}9”íÍþgҚ&ucõ›m6~ + ÀH÷ý:Q¼BÍ)³’#Ì'žDDšI,ˆ¨pDIºUŠ=Mѯ ±w'A¾ì¤ì4K+÷ò¤ˆ¤Û·&æ{«§ô‰:|U®õ"ûÿ~S+Yɋ¶±Z•˜|á,NÐoGIöçJ€-°º úIÉ8·Ù­®¡¹'_,È +Z±LORŠü Vpêh«RÜ IÀÑ¥o騋y㵤†æº ±dÒ@T¨àNۋ¶fòn×ÕçYӄ} Ö¶Ûø° ]_¤€ ¶ˆn ¥š†* °Þú¦=M/ ^N©òߌEŒ®Ý†ZÕs´ +1Wޔ.«:àÛ¶UMÖ'ø*TM̱ö딤Ïv]zœ‡t'I„5=}¶þ‰^cˆì^Q‡Ô—ÃÏöv;ïÂ-rŸ¯" ;»º»1è«[&@»R=M]-„*àç½µ×µä7כ@ ‹¼=}'ÀáŸæÄÃú‹\Näe-^ö•ìý¨8§pöè H ð£º&ËÆdt#Àȁñ²²w5kÊ_^RÓþ%c}ç:—DŠ6ƒN¹ø-+Nuº·‰cºY\kÔp]Ž´"É»K[¬‰=M 0Õÿ‘ÖÖ ×½¦)Dδ{Ôºõ´šÍm7º©l¸<ÞÎdú*Y@ Ž+ÔG;Aº5*L?¬/Ðý˜3ŽšUïUÇkh¬è£Q1 Ó~§ÏççŽ,i¹Åõxs£îþÀPû÷ÀoʑD6¬Ý= È¼DýMË34²C Š^‡¸¾£±¹hÁéKñ€˜ózŽ–¤/StÓ¹weP—ͱÆBů0²Í7ñ1ôfãËßúp[^pô’Ü8Ì2÷It0²‡>Â.Ì46bà†­/”YÀ–=}ŒáånӒ‘ÜûôQɹcœ$dJ´d*+©ytç¾ìVY1´©eo?s;’þÓ|i}kÀëöH‚§‡ZõFÜN(µŸâ¾Ì/C‡B,\¡g®E= z¦G ʁ\ÙZN¡ñ{:w”WQ½%zÎôÆýˆ:XNü®l2¾þï- €¼âë*6_E.²Ö>†¯§Ñ²«lÕ bo”ÿŠ›T¼=Mô¡¥5»Dðs‰ìz”7÷,Ç?]¸vŒÿ±v[Òð­Òù)h?/Xði³Ù¦î7Áš%Ë&ü\×/–Ò6@³xÈ7=}<ÂOR'ŸrJ!3ueh¼#H+[¶Ð!ã¢Ö¼È³ˆ¶»½±_Þ½‰÷Œywñ&C§&Aþ¦bÞe?Ä´jãÍÿ•µÁÇfø¶«ÜèEÀŒöñ(ÀâèèéÝw¼ ¦%(Ó?{Žò¥˜kŠÄ/©yxÓÂ;Š·•æ„74‰Ö5ٍ®jëËÊҍ>#g¬ûkMJOŸËHIÉuTä‚(tZr»“_‚§U‰¥_wßڂGNE‚m e(|¨Š“,=MYz»¿Ù™I*‡èf/k]i jÿ&rpP;~ß]û4Èv¹HCa,Jy1”Y+LÙT((CÀV‰ÙS‰ý1Ð8ÞnÊÉÆ<ÌòÎ'¹&ìT…̸BÖarÄÿîˆÝǰ¼9“°¨2¬ø—îÛ½³q;Ô5rë\“ù?€ÆÍâ²x©çè v‡÷BA©GE)ãà×›AõüP‡ÌÂe÷jIÔ鈁4pèUv=} þ¾‘¬œ;/ùç4ìôdzóÃÐ&³urÐÙòˆònUmh+ÍlÝEí¶m„¥åó!ë¹gK€áQ¹Š…t­jR…ª÷ÃÊ2Œíd¿bm’ËrÝÎíY­_»o-o½;úÞÔ +DSfí,Lú«&ÂûöW’'€K¨Òâ­IÌ_B†zQh^9šF˵éW:=}ïì×-²ÏðÑær€–c€üù¬Ñ/ԗÃDEù´“i¼QP4%Úíö”ð]¡åŠa–E×òg$€ éÇbÇìUbÔ¯Â×£¦Ã£c™lê¥õ3)yÉØïnÿš—Ùïnÿš—Ùïnÿš—ÙïnB°M]ù£)DÀˆñc±[^ŸÍÜ2ÃÌ8 +v†±l8‹22)vß îóÝÏ?xÎÄwêÚËéÂx÷ù…"¨xÆÑëÞ-ϒ-ü^Çgæ,r‰x"Վ2ípÔ±­Y}QË&¶g + oñÛ²[K(ý ™â8¬—Z¢‡Ò¸Î&\@¿®Å„úÊ Ü‚ª9ƞ÷.8‹VâöémÏ8pO{ÜT1Oâ‘p¬Ïj=M9Â=  *7ɲÐÖñ튕ý} µŠŒº-‰VžSlTüuŠ";M·y +jƹÿn±1=Mꁄ& OŒÛ½‡íf· •⇍T09*ÂD9qôq¾—ž/‡ŽatŠ6x…‚¥”u»™=M²–$€“r&áÛ߁¿fœ †¸{¤[Q ¾ß|±*‰q'¢<Üݐ¥ |‘ {ƒ06ô¡ëM±e0Á«Ì,£œéj}û›*Ksåʤ¶THiý°}xã-¹Ê]ﱅ;+là1gR¿ÎܙŸ‰€g”²*ïY£ÝiÍh+hém{OÿˆJ^:SUú4óˆÉe~ìo‡ÎèDö]ûÁœ÷xDZ¼}4è9±ޜǙ‰= ²î\+ÈzR +Y²šV¡Ÿ¯îv= l}aûiÍ>t(= iWƒæÊÝJØFfM· úCát¶ ;¦¨u<„éQHó–wƒ]=}¯uÚôõZ‡ ƒ£(2òD[]öØ.™‡ti¸Ë9âDÀ®t=}"átnPèwŸ{òý<øòb= >dÎóª&°ƒ·% šY;Úf·‚P]ƒ^ ²Ë®„,a+±½«ß» Š)deë'‡ýe+µ•¯’0ä~I”« .Ø 6ô ݸP"ñj5–Vó‘†#¹0T󐯔.Îïêpêö3ªMúDxÉÂєæZ£Ï Î«¨Z%„н-@Òf“ï§õÚç”fË÷wçHÏmð…3~³*w:ÍÀ-jñš§WÙñ' űûM0ä¹½;wƒ\©j=M„7Gh ~ýŸ94ï…[Bk¾j4¶¿FR7Š[ƒK͇»üddNÜ'1î°¿™ð¿¡ìmÇð¢x¡j/øù9n/Ož‚kXAš,Ì.íÌÀ-7-† efzñeTòΨ–öŒ%,î$’˜ÂdHîÊT!Kÿo¾ʑƒÒ±0ûÏ!_Vô_s”3{o¡_ûX“1Ɯ@[֘:ÖbÈÎSf* +ŒŽªÕ‚tiÛYÍ©n€Ø2Ð諾R °ÈîüzÂN<ìZÐÏŒÁ™W¢´™GÌ&ø¼Z ‡TjZ’U°¨HvÙÕO3ØrŸh¥éÙTc“9—= ¤H›XIIטú-v.qéšJo+dw +Œ«}?QCöHçI†¡Éz·Þsϝ8ˆë„‘– ºÝ¡È;9‡èt'ö¬„ˆ¥]Ž\']ùÑJ#xÎìØЌá‚ãœnYsÑY&ŸðÒ’ÆŽ"±4PvÔM¾=}éÝ)ÊLt¼Õ;ìÔ<Üw‘“¸}a˜½ý.éÐ= ê¼®Átêöu“º×=Mt¾mÿ™$ÑOå(¾"óqµ}“-ìNG”Š=MŒwH©U™5^o­ ¬Ô뺕 ‹©¾CÔŸý=}ú¾¯*±À=Mz´’K։m^eX +ם®Ôøàԑð»Ôf,=  OÀ#I\&ƒâw¥¦=}°ä2êæTö14AÆsL‚ˇÁ09O“YØÝŒ«ëÞÌ$¶äx£ /(‡[€?£†ÜÙ+.ÇRìSŸ×¼¡Ñös™„÷;TŒû" ©I‹r%@rÏmTj6Ü+=}.Ql1˜q¬L@3×h¸´¬~â²vQpj›²‘óùcõz®-ف»‚dªQTws²Ú½ŸsRsÂê©cŒçÃiO¯%RÓ¯®ä«¯(*ݯTFftLÓ¿ÖZé—;ëß ¿¬YË­.^èÆÖƽ·¦h»Gï.(–æ,¿Q‡h¢ ¸ï²Mø² ‹?Î+j—4¬Ë8# BµS÷ÅÑÒí'f ç›ófcô°j=M§¹ëzy½Ë×»7C¤H S™H©9Ýý{°x….= ¹€…Xs~LhHÏп ô•î.ɿѠÛ_§1?Œ¿½ò1®ô¿nºwPŠ‹>otØ(FÏjŒn¿¬ZÛ¿Á{âŠû”9æ™<†Œ‚1Ј¿Ê"í‚NÛyx'w÷zûÙûØ×…{È š*fòãò•øõÌ 3ŸœRTÒ$ OUÿ G "Þúôž@üM}À¸þ9I/Kõ™= õŒ¡Å| +ö$UèÊ<“ùÊOéÑ;T¶—ž®(Z¹®À7>'úž±¬‡šåžíÄÒìêÿsNP›õæïpÁÇaaÌ1ÂÖäoVAÈ1íºF',1p[›Ñ\;XP QZð5Yú¯ï7!íOyr´"ȺNÅÂ-ºa·€žÏ½qѶþ xAœ±‘eaôòØWÂÎoYY êSÞ ­‰Ô®OI= °.¢Ü(àÌ@p¡x|íòyø£vR² +î÷,Œ¥ùú= ;НY?X¢U5È:R°ÙTۜÙo +ºÞÒOÞkU‰Áüúv{·-pb1 o 2ŽÒVjRTaZ<&Ÿ¤ö‹ˆÖ”ُp¾yŠxêùžˆ¾~zóo/úÓVüxˆ}‚oÇçé¤@þópÀíKòîç´Ðý4¢ Ù‡a^àð2ë‰v^s²õ‘ìsB}a—_£Ü¢ñ=}mÄ×Uìñ4ÉF ëÂη8—f(tF¨Kèm- æþòIR¶JupˆÖ‹€|Wbfÿ…Aq'V÷äÆ¥_ uÀâÕ9ªô“1óØ+G^»íN÷ôè[=}5ÍÛ0më:›TüíÐþÒJ¶Òú3v„ÇM-è}bzóôJ×Eàðn~ë9ÞÙv*KPÖ Þ\°ìà0vE…àg’’ÈF6žLŠ9&õ ;U_2uS jlcÝ8K݀ %Y×ÞèêÍñö|JV‡A=}CvºV̄—è=}ŸÕ|BîÿHØ>QöBXÚ ðu]^Ñ€BùÐë0ŸÔ‰œ—çþã= œ=MƒÒl„½U›Ð(Ò ò@ùGÑÎâö“=}RGV„Þ= ÿëYº6ŒAõ•€ñ²ú33•.uÕMk—ï°¨ytd?‚™íÆ\™*¡ÅffRpƒ›= Üq  $ò(Д_몾-ÿE*ȝ»õ#Þh) '9èi{f§ZaXeÒPô¡T°_®žzÓ–ßu¤‘>%€+á@³6€¼Æq$æ=Múßâs°Šêl]Á+ü™ºIəç ûÒߖ°PæÂ~=}4EÒA±*\@žæê£ú±ãdj$Ëbâ« Ò;ƅ#¨ÁR½/ÔÔæ3†Ý·»â¯ÚªmÔpە¢À1¼œÆ˜oë¯{ß­¬tF4Ünµ)ü„N4¥²aÌSœ-ØÏZÎ4ÁÑCqé' )∯J–«•ðã'š»ç2¿®N †‘¡Û7¾2²A¶So…_žœÚa}:i¹0ÉåRhÇ@'ù.ÊæOÀ5¾“ß­õÆJE^hח¢×°ÚZñêF€¯=}$¤Ê EFžÏ ؾªV +¦!™“Ž#Qü±;†Ôª€˜‰ÅÃÑ =}ÆY8ÞåXy¬*ۆiÀ +/“ä<ÎÙhU› p°âÀŠÄCÁßx–”}kÀ¨~€ÔFbªI?—cHʉe 5ºÂ„qïßmš)F= ²_– óÜfº©š cy²úR›Äë„2ÀŒ¡;¹#0þ¥ƒQÂ+ïøÃ"²ç¾*ÃWr°e.€·/Ȱd¼%ÖÚæÃZ«h'xDKϰh;LÓò¬fü= —¯jl?—Ú0c›ƒ«»‰èÃTÇ©çÅÓÞµèéô‹Œµ¨&ôëP5QFYÕ½°œt{}ЩøÁԋÇ©hÔkÀµ.,Tëq+h@UûÁ¿* ¤Sâ·*Ғ†ƒsè(FÖø›WåÝÖÿùDðH­é¦†ô†¿2ŠN…4ÔÁ=}uïA#±6¶“ÌÙ¤ +šÊ€ §gyÇÃKúÅeÊÉÅÌÏ´ü>¶D6@+3š,K=MQi!=Mç{M´Rii¸=M·Áôƕ)½•Ò=M—I$ö²°Î×óryÃÍç&ön׳6Ø "]ásÖ.©ÎŽHÐi˜xSå®8@¹¹–WS¬z…åЕ٠ԋ#¹ÐòÔÊò®VjýÌ ÐOíXûÿR(&Áêé1ðàܗÏÛ¯Ðܙ1„[â<&àjòÚ11x¿²…Ûq1”nÜwÛßÚw‡žÜ·êÜ­vÛ B‰óÛ‡ kˆ;"&|À1‹ª¿&A¿ÐƒKd•é­ž1†—êÌaÒuž¿"ë-ÛíîÛmÛ¥¡ˆKQƒ“œha5FO-fK)FðÐê6‡üÀjq1ÌbÜíǍ©Ì_ÇW4ÆÕ[,ÆôõÆÔ¢fÒôìYëÕÇúȜ5²5Åì(GýõÒ 7× ‚¢¢ë P½€\4xj~\ùä(ïTC :ÅÞDëtœU<$o|ýt8˜z2Œy1ž®OhÕ +2ñm/ˆR¯Þˆvî¡m‡.8ÀÙ̈z±Ì†oÖ8qΑ͒=  R_HêóÞW¸}'˜³ÉX׺=}ý¬ìžÉ«®2pµ½©«¸¹„%†ÑW"SÿÛI^ñË÷¶‘lš¬vž¿º¥ +A¹]m´‰›‚³]qÇo2ȗ”è;PͺÍÀ¨ ”GZa[!{¢Æ«Á£f£#Ã#pY~Ÿ>¾X~Y~Y~Y8C€^ZtVf Ž.æÇJ%·ªrt4N—žÀ½Îãú%BvS¢Þ]5 8]: Hà"üËM;>uÛ'Œqá ýÌQë*œø,ðï6í,Ök3±Z>u—¼Î½9XF¸°ñˆFÞ¬ºöÝæ£@@²ÄÎBë}m¼êéz5 ~i¯Õ@kDP&(GÜôéF¾=M‹–Xéƒ F’½>ÀCl"÷6Úð\.l^·œú#–=M«˜Pèðt©[jéƒÙŸ–|,Ê!C½aªձfô_>â$i† +3•œß)ØÑ$ژÍÑQa,>‘ãl°{[‹ÄM»AC̆Ü1°¾b‘¶ñ¨!hðŸ'dÂ÷Ô# À®*UF2(¾pœÔõÌ'¦™ƒ9å{à܋RögnüÈ °Mƒ J½oýדRü®‘P݃y&¢+¤º¾fVÌáÂÚ*§ü–¿³X(X<à×EÀtw¯r0K]Ф´äÒ+[žCMd²ñž¦4žÚ»‚ÀæRÆ¿íúEëĩޭ†cß´î6ÔýA-~ÚÕ3A¨r<¿·V‡†ìäÄ ‘8ÕC¯Zñ÷ÅeQ½Ec|£Š= p{ƒ{­¢vÀó¬%y6g:˜†Ór³Ÿ90%|¿š‘ò¤0֛NÙ2¨%ƒ¤Cu§£cYzY""‘yY~Y ~Y~YÚVMBÛÊÇ;ÂÇ, S×ÒnÓÈô9Zvˆ\œý$=}ýè-yÍVnü(P¦xë\Fñå<©Îz˜ér^²¶•\âmU¦L]ß«P-dˑ½mugÏÀdƒ#4ûÒ½08n»r½ê@€ ñBë9€Ç=M ñ„Cn÷׺ðŠ9¢¯)Ñ@h3'|ÿ‚Ô:\–û¤A5.[¢!Ô¢éæú$?ýWˆ=MV’5Ñ&ø—¼=McèPH ÒF˜­é˜hêzxÏ~U¹1ÿ \$ÝPð»9‰€NPo€qc_À{â~h0\[ù[º–Zž4xÝkžæÏÚße‡ðj;N%æaʔ_=}üöqµø1ªbÒS~È9š= eigNÿÀ^ØÚŒù^pwFÛ[ÑFʂ†Km z‚Šu¦Ù[àgŸjÆ‚ ï•DÊûQ- ‰Ö…ªß +[›®mnÓØ¡Èø‘R» ›=}[º ]—9ú‚”h)o¢#‹2ÿõžg-‘ò_L›/ñ}º™*HyŒ¾È)‚Ô¢¦˜žâtÜ¢.o bl{“*h"4?¢2ì¶°ÁgÂømÈï~ej­ö=}oSî×ÊÛo%<á9WÛýDp€âً YžÎÞ%Á}–I¦²ÒÝ5u,Þ*?ÜV~¨nÐQïþŠézw˜àÛDŒ,…ÅÒ=MŠv)²ZɞÕ_ÂmF <Øß#ò&¦<àëHad¯¸e´Xóm8f›P»q֜«oÆ :1…]÷×6Èó7+Hb¿h…¹hFÐíCPÊ4‡AÇu5´˜GSÿ7->˰¦T¯=}hÕ¬·reýžÊl¿õGô:l†Cá¨OøËG÷T+ÚmhOóÐ#Ìp½‡˜ÑÊ= ¨| ÎL½û(—3=Mi°N˜+ý1MfïàȆ½»ÙT4Ð6>ÞX¼=Mò­ù„ï.Fq§¨\ƒ^y(ò9QËI[UH@¾~\tžP¾pÍ,a‡ñÿ/ªZÓud6¶ÖßÜud.a= _›•m®ž—ñVÚ{ªŽøá络×e:؂œ†jBî!/“j@â(ɤÓÅ#Ž¥K¯g ÃR¥&˵g£p-¨–•ìÓqŒÄû¯„[Ëù墽m>õËÜ© fë>¹iœbWK°ŠtŒ7´A´då0ëe=MżÕ5$‘ôÛï1EzšË¹êZâ=}ayÔ¯½½&z.»iÇhÕ ðÏô†;Î0t(ÛÕ= …üØÔAØÂ†lrï˜)§9É5Ïìi<çiÝʄ×ŬtvǕF5ÔÒ¼n‚l ‡JÓö­Ž]GuRÄ8Ò*õtÕî†åZןÒG´„7q*$Œç‚íÊgÞ&ŽÆÖ³ßoƒúãɦjU‰ìÉà&VØá®0Jü°mIŽ[Ýám (±Òꇉ±<‘\Â3îgHÿù|‡Tð8ê˜tßٌŠVKÙÂBPœwXÑÃË^#X®®ÛŸa#A·÷ÄjRºõþg¯ü´•àè_úï>±oÐi‡èÔ¥’µÙ™Ñ„4µñÌÈÑR7MHûßÎH2þ¼àø«:4€E¿R›y2̊hé®Íø÷dn¸/÷d¬^íù×÷…[]5gZ8•KåÏNåYT­€òø·ú&E=}f¾N˜D=}ðÁØ;ë=MSþöfh:Ø;ÞwuHI9\®=MÜ"J9è)»‰w„Ôa1:ʎ+òûàò]z†[TAQR<€c„E©Éð=MCpL©ïý×ÈC´ìÆáî½\V´pÉW=}ûwF,þ=}{™C,£àÄ”å?¬<= ék‰å‡ýÅQç-[R³ÔT+Š:èßÈ /2;>øqò·ÆÝà †ÞԖïțÉìó:ó_çe~®µ¿¡í‹Çù17n HþÈȉM7ap÷Ýl›;ÈfX2¯€HÕ9B8”ŸN/Î GTY,‡OAÏÊ:?¨²‡oNÃpød=}ï¨Þ^Ìórù“ b% ò·? JÇlèìr×ÈèÈÉΔ}Ig”)5.â8[>K«®øtE÷è2aÍ9oøÔR­F^ÍM¢Ÿ‚ç0ôS=}D¨=M9öÖ-½ð=M­r¢¢0½@±€»—2¤#X¦­¥Ë;ºwYÎMñ~Y€N€}YPCY~Y¢É^üf79)ámÖ°ÖÙ»ý@Ùß=Mk¼Tî\úgõb)ê.¼lÝjÕ&j¬n5ª9íâ϶ÛÑ +ËŒ ø‚WN†³j˜ü1¿Â±ÝÕdžۼ”7=}nÖEGJÀr0™AٍjÕЕ¿‚ƒÌ{vŒMJò™BApT¦Ôv©‡®ÇÇ[ CNc;$œ&¦ޅce$*¦Br§Ñ€±¯!¸›˜Æóá)sÅ<óÔ.“RCÓ½„äØÄ¶Äê„D’„lÄz¿Do­Ä‚©„‹„xÈĊàDgîÄ~º„ŒâÄgõÉô•JúM‰÷í¸ù…9óÙúó­zõiÚù™XôqøY—ö/ËlêÍöÊÍÒ Í ¹ÌùÌLyÌòYͶšÍl1̈́/“U•9•D¡(Ն= õ>•BÐ#¼Õ¯FÓ?~i7U~YŽqY~Y~Y +M¡z“›‘ž„AKö»×Òµýº¦Ð+*]Êä¼öDVŒ”= ±p-%Šé<•F…èó45ËðܗQ5žMFs9©Ëôöw]Èý{¹À+ñèžEÜ ó6¤Ë™³WÛmؽPÁ*ÅïåøJEôÖs]| ‚ßWÄýY§˜1-Påbyj’'ÙäLYFÄÞt8€Ëqá÷…#Áå 2CäjóR¶KtÌ7š/ŠBæÊqFºô-n z¸zæjRÞ"¶Ð= (å€äx’jàžá-³ˆ'MàéPACòô2 +Kfwƒ¨Í¡µH(¥béJe¾÷„Эš±Z)’ôk² Qœ+±ýLò‹/8Ÿ/™þ‰Òqþ‹RK(ÀTǂóÊÞ ôaFMÙfû?ÂK_°Y™wŸçOT°V¸Aý“Ë$Uùn}û¾Ö,PZ{ñ~È^šTàZú™q៝! ha|š"a–" ¢= ÂC†D]Ÿ©ý£H¢×N)®ÙòmdÙaŒàڑš?ÚcÚÎcÆÛD¥ýÛ= ¥/Ûï‡QۆHxÛjÆ£ÜKºÜ)8ÓÜ YîÜãj ܪ‡&Ü ÿ7ÜboHÜ©Ø[Üä8nÜ ‚Üà˜Ü[§d¦#»ë·¨S}Y¾–‚|OP~Y~Y~Y8GO ÁBZÖ°(ftA® (^oҝúÊ Ô¢š¶>ÃgQ¹ÍU¶=}o‰;´þWY²ÂÜր‚ û#Ë.Œ,ay¼ïüF+Tƒ½ùYb@àë½AÖ/b¨,>QƑrþ‹R*^ Š^¦7L/a9ADÑÿIʌÚl02ôp0B ’Bד¤ˆ ¢?7t<‰R‡Ÿ42IºçŒ?ÏÀqöɆµQsI[´ µáåiRϋ#>°ýññúÝz‡ì²\ŸKÔ+-àeŒ^»=MÞ4ëÎIõìXÑ.a¸ˆ6ú ¬ €ôì¢QNÊbžÐgÐvìMÜ × !'OÉ r߄”›¿þ(W,ØsÑþ2Œ‹ð{Œ\¸øYޓ>x_X~*¦ªD¿§)¸j”~—ÌÛ@ߪ: +º”:„¸;º*¡~Ûc²2õ«:ñŸ£ÒB4ܘ¾×§¢åê¢b‹· «0ˆò4”¥Ñڂƒóxõž/Q^¿[Úm06´Ÿ“ôµéqK5éh 7ø%VK­¥§xCÄK$EýÓ:täa]Á­o¯ˆ 'î¬ÉsMÕ&¢'¨™ü†¢’4f 2p‰1{>„/q¼úk‚—ãXCºI¦ sۍª­gGéÓqø'…“œ«7Îé„𯗑hæjÉ´"Òîä±½Ùù vB|k2nh"Z®Cºÿ§ŽH›Ð_¿”Ke °ÝAzf_^´n7ý™ãÞyèeø² ¹S³ÈòꓘۗFÊDÃß&V:ŠDtZ+È%ƒ¤S­££CY~™nY|±Â|YÔ~Y~Y^kàü†y®P¼ ›“_ÒòNžu£Ý%©•€u¯*Ó…ÓIaÀñ’Æ”´/…ÿ  ¥÷iÕK¿–¸ÊÓLŜÍ6õâ(Ùdי˜A$~<ÿBÛ>Hé+ÿÚ2d– Ä x.›–¬z +ÏF|ܵŠùE€S­NR›S!À^uy¶—Æö¹ êo¹Ù+Yu\Þ5sºnڐˆ’j“uäi/ào”‹Æÿ/8*ò³â‡·^Fñ–ƒ–üAÛrh<º Ñ= g°jÎ02Ê!Y§h°5«8éõþ9F‡Œõ´„õªLµóEi:ó°¹ý ”—†¯‚ˆpØÄ޲+ÔÿB-²²3”3cª2‹ÎoÿpÊoúmã( +'nßêø¨˜µÒÜҔ-bµR”4&b—þ/‡ÄR—AdÂ žÆH…òϝ<bcZR/t¡é+ŒÑÞ¡ÃošÊ¶E"T֖ڞΡSK†ÒÈæ¢–]ÙPÎÛ_êºd¨àÁ̎Ƙg#|b°ZØ;ÔE¶Þðt> 1 P¨nòý…Ih—yÿYSäÐe9N8oÁ„#šÍêy?…ac¼¢ÑŸ¯èY0DßTh6·ÌÒ]væ DÒÍF Ì|Ác8ãџ®… ӆ^åSþ´i,GaèÚ×5Žôïÿ¾&aåÏà—…û=}¹r5Ô,WÀì…z.©œJS꽺ë +&Ó&å:ïÇýUS;æSúšßG^•Ì|ükIŠè?²Ò ŠKõýq:ÄuÑÊO[%e8ø'®N´ªysÕU1úŽÜ ycE9éŚØVˆ®èPK +vN±åvÞ¼ÜD>£¯¥¤£™?~_Ä~ûQÐ~V~qØ~Yþ¢*¤o­½#€$@Ó«žCä[â;@6*ƒ»Ù'ªò)Û»…)ĕÛúº2‰«¹Í1gfËA82ep×^š/äM¯‰q¥?ÞÒkîäÄ}¥'ë Å/{¥´_Uç“óºè^»ô7^1艍Û;ÛA:†´9>c“P¶Ü‚ß´:ìo5†i߂juÀžT³à#„¤ÁG“fÄ/²Âii´Ž2ƒ¿·P×à1}}¶_½µ‚/6+^?užvëÁàfr=œu_’3éʉÏP9ŠSÁ> ºK>´(y..a'(xIb_åˆDN¯?Ò&R¯LU«]†'íÒàðm(I•¹dZ< *¾Ò‘u"—Á¨î’Ög¦ºâV¢æÓ'm.jo۔'‘8ò<ě¯ˆ +,qý*ºß4ì*oÎåG6ݎ°îªaÈEƒÐq¤’ëSr9ò œ4ªù¼Н,krB¡'6 +õâÆWž®r!DtúOðaêã1¶Â‡[sË*E/ßìL•~FãgÒ¨AÑöçõ4híO8ú…Jµ18´Ìói‹[­µ„ͯ~EíX^͘Vx³Ôó†{ _áKV_è@k>½qxã;É*eØ\_ø®°ÒЉVn÷>û´ÀÁ̋S]úª„Ê]/Ow‰Èà1HXBÔä ×@*¤p–¯,ÔØÇóo+çÆ©½Æ˜m»>© ×d҂'Jðü¼m[€ /˜Ú|©Ñ;†]c¥ôî®WÉýUën5O4ù{ YåT~-RòPÔOXɗ]°F­[Äîñ5ÐZ±{Ä» ê7[à‰âôý†#->¦Y®¿ìXm÷ÊŒÞôΏo®¸ +ɱđF®É€Ñ_‘mVéúá‚fQ0N‘Ïqêø}&äLÁK”/Êè^= ±™åä>ºb= ^dªÂŸú›uŠ…n4(!›|TyÚ!; †‡‡’¯Ø›ñ[{²ïØ"“üƒÊ7"Åڟºù"´Ú“Ú¥Â!DŠÚ¢ žÂ_B¡úvÍŸfO™Âú’›VauBlÚ¥³Ï°ãçÉ3\($]·g.Ã!?® ùÓU +åëﮢlóõ5æ\ϯ„gÓ%²*–ØÑ?ªÆû¹¶d[ 4/1-ç·vÅE{[Þ=}Ît‹/ÄÐÇ)|Þ¶¿îa÷¿*&…+5/Š ß赬«ëaçż¡,‹-Êqâ,H…l¯šòI=}·U¡H3çÍl¢õlÆ0I" «,JVqâÀ¼”¯/ Ök·r ãɲÈU«²kaÙM$|쉓ÓË*½LÿÁ©ŠuXà²83ß ’oÊÃ×Â|¨«)º“ÄòÅ­üaZ+kş™¸–Ä];fªí;¾þå’dõU†íœ[¯~'Õw29–ÑL?ªjÎ3ðLƒelíGv¡¢¸ŠÕM[ÏppO=MÁBN„ ñ°=Mº=MÔrNh–õÀĨLJTKAôU°oÌ#Ž0ë:ڕ— ¶ý8ð[€ÉM]}óu1øîÞâA³zyät.ñýÝݼ•]®t‘ÑIb Ú΁šSYb*˜ÂüÞS28BžûÛ[B žô›2D£+&¤c nYz]:Ö!oY8Ô~Y>€pYþvt…ú)¹ Wë®,AÙêUW,=Ms y´°‹3FæF±dj ÕwˆQÑ,f¼ÿ:þé'‰ŽÔ'Ážñ‹DEòù$áXƘ|€OrÞ¶¦®°³1ÕCõcµöæ1¸½• 7Ä}½æ¿o/«ÍÕÅ!W´ /k×ÖÉVk»d Øi›<<ezôÉÿú>S€w7”(IWÁí'}7òÉ ÒÓF’ëÖå=}p[ñaÜÄÆo áñF¹oäðö®¯2XClc¥P¿®ÚûŽS¨<9ÏkW‡PȜªÐF _Ìÿ’p4ºçªœÓT@²2¹›³!n*ñqaï6›UEÒÊòœtg2ÖÜ!P˜‘â"–ÆÔBZ= Ÿëñ©èTR·– +ètŽå·ô‰tp1I]Õ½.t/Àpš#»G¢jS ¯Zqg¿.Ïd&”}³.„vûQiÔò¹êœ›ÛÀ.F‰¿b††Œ}àAFî…T_¼òQ¥€­¶KLðCê¥ ‚Çó´3+žb,ÿ@?ë0Ý´ª@Ç ÈɁÆ,Qî5{à,²ùl[‰È¶<BÈFŠ««ãc(á¥]Òº“„)#±ù×¾O©æ¡ý‹²Ív»ÿ3é>m×µÚI”ˆ½î?u´·JKÝ@{pŒ/"?q¸Š¯oîÕ«Plé´2ÖSq‡ñôÉÖNÕì~;l<ª<·ÞTÜâ®fDüRpEj@ύOVLnmI¢U9 +F"Ð>°I܇H‰sà*'œÜ/Þ>fÜ@ÿ!j‡…sѺŠL\»ÀnˆqŠÿ¹¨‰ôÑr†Œ+ß]o†mVßŕŒ;rĜü˜šz–üýã¢7¥…^· + ¤ >®šX£èóÄ(ßÍgþÄA2­Y΅ú ´=}èwÒËe¢ï´¾! ûÔ°mñ0ËéÔQ2-”YÐdÍF' +àíûàJ§<]'ú틍mèÌ¡ØHWýþ톘õɼ8ÔÕQ/ÑPn+Àúi†wàÌfkQ?¤Œˆ?ù1ho519ö—Q?ÿš­å®Í›yR%°®ÍËâüdXÒ¸·œ­üý͇|ęî('A¸µŸæ+ø#+ވН¸4_ïg„VŅ"+;‹Ò‰õ<»@Ä¿:+TâЉjºÔ½¬èµžîûàò%ž¬¬¦‚ì{ŒÅˆ97ҀG;͈máÌîAëôûl›5ÇFUX/ºÆ5ôi­ÜÞ凳m<Óç14¿öX?h’‡›Üλ:Qƒê¨Ñ†¸«YÌk^HÃè, K5N¸í½©Ì?R•ôÈËlUôÔÓìh7¢÷o ót[í(•O­jr͙[¡;?¥ˆ­#»ý~Y^àXP pP~Y~Y~†ì•¾ª0Þ{º3/¦’骆QÜû•~deñ)zu5_6¸>@7_„qÂÊB^˂èêdèO.Q¾÷= Å™òºŽU^Lnpb>Ef€—ÿˆ  üڊá[\=}qf4-Á ™s\2*{–à/â‹Ät¶²D'y¹™J,:ÒU:r†_ƒxÈÒaÒ… —ÔM52@WŒˆuÂ^š›Û zj4"á9‰•Fw•6nŽ +jãâø¹œükr:ê!íi®sÝ#Q¦×šªËßÛcŽè¤IÀ­ó—ô#%Çp¶GæPÃFä9š®U3ü%‹Z&7Ÿ¸‡=M‰³$íÄZ²ôx±Ôõ+p¾å?ܺ…>³~6)¼üÛï= ©›fû¦™_;"ò;ôÚf›¹‰ÿ]«Šíê{}ßeÓÔåp„´ÁÏ1ÃÀ+’ñ'MâÆ—nÃS]/cD‰¥ª§$¸æ¨Ï·Ë^úƒm°¤šº$nLçí¸¶,Ù³ü…¸|€êr4>ç?¸Ì¢å‡ ÿ,±,8Ç ÆÔÿ9{Øï…¥,þ^Çñÿ4û“ñe6ûÉ <xUY:¼Cmÿ»Ñ6DïTÕ8Ñn·"Æ6Ï$eˆ¿­æÎ͇LS×O3!#%Õæ ©(~Ê·áß+ŒÂ­ÚöNOÌOÅwõìxì$I5[í¢͊YMÇßNõ‡,½†Ê8… Øõ·t[ôöª0µ-i™d½è + /C”;éŸ^½â·ìE6à:q2•ݪ=}‹»Á@7€I1yì[ójZð +ˆ @~²×È֛;nƒÿ& 0°½\¯A<©}&êV°=MÓ» gƒc°&ª¯jÙ7‡ë6,xð½ZÕŽÚŒv€‡žË¶Šß6¾ðÂÔì"fG“Ž;¡ºJT@rè® +.’НL¹Â©ûW?ÔLhœ¹Âòýga”ŽPhfûÙþu{ûœùS|ycI=MÊ>ø%ðEÙPi{¯>V@p™ Ù>Ñ{o F U̶Òm ôˆ2µZå7‘˜F ÂHóË-bþ7tfEÏ?™B#%¦.¤ƒ|YžL~Ùâ6}Y~Y~YXÔBjÓ7DjÏæ€ø)7^¯Úñ½×Ÿ•?Ÿ^92aXכjUÃ@ˆýnÐâwT‚{•Ênh¤9<†ÐxŠüû¼]~•xÌ9–òÞ¡"nôŽ®êr‚¿öÛÉ ¯Í ÷t4Fa†HI1¼@¿\©Û0‡?;ae”eÙê™f1)º¿¦’É¡Ašïjv’î2 p6Ñ\ŠÉr‹ŸAWßÇ“¬¹ßò–¿‡4AÄVßÖ9‰ퟒ–܈Ì"p–fÆra:¥°‚®_”øC~R$Š5©MG²or¸÷דhãdÝ$MµKxÍóQÖ#c +F¦jJ)§ž$WN¦Zɪ¥ªñ¨Õ°¯= Â[›ÿ‡ŠÚÆèá1[Æ!2Wð½44uÜÅ¢¹-ÒÀ<ùØõ_!‡9é=}X-ß|Èõ^nSkÚ¶Å8 +é©Ñ-OÿÀÜ_È!‡Tk–4œÚÅ@Âé­áÒ_™)ӊ¦Dƒ:elÂ(m"¬ž6¬Œu¬ V¬J–¬‚ºº­:ºG]sPaÓã'áp(ِ(=M€(× (º*®Îi¬˜J¬’p¶iÒ¸¡üÎïÅTê û{훝5ó‰Is˜$ӎ¼–nm$Zµ¡DUˆ®qšír‚7-¢ÍâHó1HøÝô¡kPOËK‡ÏDOÒJGMM/KPß8MI FŽG}öœJb5K5 W•¢çˆNŒmö8.7ÄÎ7uŽ7ZË®ÍșÎú2˕;„££å.‹Z~ylY~nY~Y~Yr]v0#b~$i2ޝèªu= ®}B,Ö.«â-Eb¬¢ÐÉè³NF-@Tg›êµTÅH»BñWæ·oÑ¡qÆñ·³ --Hg\E”ø0“ùêzóKL[xõ‡ÊIýߌÅu™·P-ܦh”D…xë”~Û´ 5ëÓðgBÈEp¶bϵr:-ÆÎh/XE|é4ƒ{ÄI’´è±'–t¢[+ݓ@¶¬Ò(}N…b>EŽÀ†akû¯ÉÑa·Ô-mÂgsroIÒp˜oºâ;¢"ٔ!Öl¡¯–¶¢"¶Ô5œÉM\¾€-ijذµ;7,p–G ä­öÐXœÜ@ü9d·Æw ÔÀUªÿÑvÒ2œábŒõsßÐ͸Öþí;KHð>U ò–Èöa-¼öp¿N´XðM]Iå †)„= Tüw×Áþ=}&Pp$YdòVñ ñêÖWV €x7µš×B˜Ù*;ô ¥r£¶óƒÁ°Ø *>ÎÆïrôÉq»VOÌÞá›A³ßðÕBñÔJ=}rJ*¿Öo†<þe‚ù>\T€ß~á×‘ْԐ°á™¨@ӒÚÂìZª3\f£#fÐz»u…~™9 i|±V~Y~~ +~y6pR]›"¼"’(W™ò™ûšha‹pF˜‰±=Mút?¶[¢v;bOèQ”jþqs6¢Ün¢Vò.Á·=M¡î(ô„ivGÒÓû:q.ـÛýú +7é@dUû= ýJáç P­¶×ÝɝHð5EA 3흘ÕÕ¼6M¼vÍp¿K3Q–%ý¼‘ªÄWxX򫔻 ¦D×qyi舿À@FgvËú:ŠÕ ×t= Ê5M‰þ¾N[ê½x®ø9(Ó%(ycûy(‚7õö¾’lçyAšÇ¶Ë2‹i»¹U@®_Ç'%ȑàPŒpëIT'¿ŠÝrœénj7³ËRKì¶Ýs0¤¯ß6;hÅ9T1P„³ÊÛj¸2jߊ°Â›o!”2óe,Å)µìÉ8×ÕkÇ>¿lÆB¥­äj*s–¤à£ןt.Õ£1£¢+®Ø:kdØóŒàÙZš?ÙэÙB~Y ~Y~Y~À®)±…}ŽdŸë¼%‹¡ŸX¼q ÜÆüÎÖ-5at+"ÁnwMkß=}ãqç‚?oj—ÌËB)‰7‘q‡ö”Ïà*9\k«o +m›(+‹ÑÅ" µ9§Ðˆ…˜ˆ_Kþdî”øÿ_)¸¡Ì\^ÁLa°oÕ'…tÐ×ø2m’~,xѷ׃’,= ÿ‘}jÇ^¦ßág”Üê“òÜm(†ßÞµXTJT.à&= eÜwRƒ|îoÒ= /R ø1Ÿ\1vL>/?>X¸2²œ¡´*òá‹U +{¯!¤èÒ¯!pۖZÿ3rRrÂ4]–¼d†\Z˜Þ.9ŸÇ=Mm±¢îzâIŸ +þ.£Ê¾¨ÜÒg,ÝYy,Ó\75©ÔÏ=}h\zÑd+Áì/ªìV G¯1¶üÝö±L蕷Qôp±èAÂùå˜%ÕQš÷+NíoØ%ˆwTÙsãoü6î„ýïotÉCô**Ƙ üCrr@©×ÿׇi¾Æ¿h0ŒÔÙ +CÌr•p³ÖêaȍžP3 pÞ´¾±þ{ÕÍy1#ÉosäÊGÝÖï|(²aQg÷[Ô=}ªz±ŕd®Æ ¿… »‹*¡ "¡â°ƒ_ ö…%«»µe&€D×!¯†FøÛèh´¿=}Â(up 5÷»?¿nEì”_3c©(ç‰ÈÉtàÜ(+NL+ ITÔÒ@‹È<ÿ 8è_ÙÞ]3â?êMáÕ®{SO+æB-ܵóeY¬ï= ñ4 ¨&MÛH=}–½šwõTAF¹° ¯ ŖÖÆ¿þûÝI0°r}ü¼wd›¨·¢Œi×^*Ηtò³ß£é¤££·Y~‰òzU~Y>~Y„ ~فžï'@àōfmþ \ÓaÂP´ »˜LâΩ?Ú# ½¦¼!³ç©mÓ9ò)“óÿv*•ë»ý*)V= ‚«qž0C‡ëMú0…œËQ<2ɕi»ÏI2HæÛ9«˜¯ÝàA#t¶Ëò;#_Ÿço2ï “l1>/V·/2ñƒK ‡ÉðX=}rqp7<‡ +qS”Ïo‘qi Œ¿Yxq6jÿOaoæäÓBUD®“ìüã2qåÒEœ·>º¸W'ðUî|¼9ÿX?¡áÎk3ûleÖN˛3È ÂD÷ +*¼2.eî2J»<àZqŸ$“ˆîµa†Lz/µ_„…Zïÿ›±d‡š‡² ãæzªy ‡ätʅuá5“(usR»"Æ}”Þñ¢cքª² ‡gò™ŸEòƒÒ/Y ‰&zGÙ+4Åilx…¯³J<§®Ç3ûÏlî썺ët Éh1œu<í– A¯ +ïÚò9öür:(\¿Îºm–cõA—h­ŸYôƒqèaÝË5Sý,Qíï}Koëúdßó¨$ã8L4MÏÝOivçØmòNÃ÷ê‰M©™œ½¯C,8ÉZ^𮀒}¯ÀK&6?±­†ÔxtH 1ÁRO˜ûaéB¼+‘Ùcß}#J¯¼?k+Þé¿KÕeŠ@ÔZèï³k; _Ì9©IÏþéTN¼eÀ‰+g; O¨ð\¹§âTÇOx5ÔÎA0T _$Øî‹’fÔôþµõ´bjn=MÞwb{öàw$}±«¹ÞUvv4úž?뢎g*^q¿‰%[®ý¶ÿ¼„-’éگŀ“[ƒñ¢Gâû„lýæòÑO”eØw.= Š_¼ù‰pCÒἈ.4,Ò—/Â6RœYBË,£ﮇ;öÃÚè&Sì²t.uª'³E¾å‘=}óyé(…Ð/šðß3®ê§¸á´ܸlA•뛸h6LtÇ^疋¯þ­{™Ø9z¶†k/†Šdq¸g–¥)6µ¼Š5+’4Ç×î5S8ïx/·‘JӄÍPXL/7¢fhÈ"´)¢è‘y⚟æô’âÜþ'¡Ò}~ש0î +DÝB1 +sZݦ"\ï:4·6hEê|[¯l„(±Z±‰Åø9îaÁr:‰VÍÙBò­Û×E³*åyBËELQ+xiτG¼ùÏð~ ]÷;÷Ðf” Õ mu~ÅnZ¶U/Ô6&áÜçÒn‚äANæ‡úÁ¨Â¨…ÉËS“H¥M„-ïBF+šÚèÉÎTHµîÇ7üÿKoQm_÷ödHä(j÷3ÕöbÍ!z÷œ‘Mi|t=MIi¡ó‘oôê*Ý(Œ½¿ÿJä#_ÉŠÎØŒÞKì#4¹}= ýkÿxåxð¾zT}w_w G±i.;ÆO.þaњYŽUëö2"þ˜ ÜJêB&áVꋜLṄ©/ÿ#/SÄ•°,| +E1´rÝ/[!l+ªQi+/ÚižPÔ&†ðau'üöaù<ՒKÌè9 ±ÙfŸ4¼yD‰'ÑÓJg%àè¹»VE4Èé¢ý“1È ¤ùgrTe0î$Ø´O ÕW âÙkXDÖs9B<ÅêTÀ-ª=Mr= $™_2ÿ'¦ÄîÀ»Îkj=Mêñݕn,œ?k"Š'ö-Öý>?tsdIn(w¾Ñïc8 +ÿ춆íL¾˜êsXŠ™ëY_ +UªnÚón62àA›”õSºµ.= »Ì0ø@ÚzrÖrp*aLáן—DFs:,ª ܈*eËâ=MœΰmY&+D⾪›vžwBO[£Ezª3O¼ë Ѩ•Ûß+C8äOú±iNÆ;–Ú&œâÛ'“HÄ»Ì'Es½-•˜óO¦fë¿i÷\×*6 Ð?ޤ´wÒ1ãîá5nÐ4Ï= Ál;CËéÏ0I×~Fœ!Î=}kS»9R/dûÐ98àTgß+è³¶j4˜Ïs, +…¢”ïÁr‡§‘òc{×41´, 3ë!µ²ÉÔ|á$‰C¯qbq! É&™ +u:hClüϳm‰Ù}:U ­k„‰U¿w€Bn' +\gI‰D= Ê2Ryœ_;;rÞä¤ÕبÿÑCàK3ήsÍl#Åÿ‚·Ñ^;¤*.,Ìd¬ÕÕHëY:Eb·B›Õ½Z:TpE¿X¬ˆŸÒKãGY%lúΓ°N‡†]홻÷Ôç¸ÆbùÔIO=}(ŠNÜ´ó&›M½5=MüÖG¹FòXÏËQfŽÀL +}-mW¾«¼u#ŽJ©ßí½,ázëã¶îúؔZ<'„p}/è®JÒXs¿}-ˆ)ù¾Z¾Ž¨OQ +ŠPiÃbV&§~ñ¹ñ’çýI.¢]]3!yh%oµ1Ɗx–*„#’åW›YPX‡‚Y0rnY–M|Y~Y~ib†æapڟ‰ j¡z¿a¶•‹ª¸Üâû÷/þa·oµ +}ìñm+FÁËñ JÛ~ÙìC˜ã%䯬A +îóÜø5ªêÇ µ:çú5œ5›R6…d̉¼ë4AÄ(y ‘¿5 .;×v GŒ4IP¯üëz:ÄÊæ)mlU—À5Q[Ï^ uÉ.lB·žlFB_m¡ìwWÏâ™.‚õb‹±›hVQw-¡‰ˆ†‚¯; éXƒÚ>‰k4!ý±T‚±:Fã±2P•+b5Š%@ßE¸•oûEcƒ¨=}ø¸K0úC!WÅ@¥èiôç{æ´ä6ŲzËDê,ç¦ÈÉÎ]Õij8Œ7ô‰+ÕA m+ôä H­ö÷óQóaSÍYúø|NDíì5ÍU†x{ã0}Â=MûM”[†rºø +o¶-Ðw¬Ñùj$©ýºØ3útƒú_©­×t|N,€Úðe= ØÌv…ÉÐßy…H(¹™hý×Ðs žÈ‡÷XÌîs ’ÛÀOšŽÓöï*B!ݟxH&‡â]ïQ.Q0ÑE¸]g®Ž”…]Á–W˜+ìvæ-á^2ŒÖåùBgó /©˜œ[f#.’°{ˆ=Mcé¦‰RØi âÙØDÄΉ¾TE´ +÷08 'ye²½vÈ/ 3ÔҞ/”{=Meðے%æ= ¬¶z;•A̜ÉI?Ï×Èa¼žÑ<´H i|ÖíÊ=}–”+ÜVo”­ØŠ‰3Ü6ü³™t%’Á¹XwÉîõAû lz­îQ-ûTž)¸N˜P;>hG|y/à +pÛIÉûV _°>±|ëm)Äٟ½WdJÐhÂ<ˆ nLÙþ·èë" jÞÞAú~´aeÁ„Þ™+¼~öør|¨±'*I¦A ±@‰ëƒìê1mÞ5º†kŽÔñïáƒ'6'¶º&@³½eJÖ²âÜVn<• +¢„€îº±Û]Ób(™ØQGàhne¸6Õú79]Äf0r©ožv–´b‡1%)Þ) ‘[ð–Ô7ª°­Áï.šjòÁÁ™çòi6wòÉ2“…wÁÒw"ô»ƒh)!Òg6 t>p v¢R²šž3„f„ÉÂ%ڛUŽLÒ¤YaP”È8Âú‘žô‘*ç<Â.矬[ŒrðÆ"i¹†TÓ#z¥;R¾ãý£m¥ÜÔ3ܽ$·J¨…Ûà«TÖäÿ÷±å×Ì+l6& áÁïIÿÓdTdÛ1®d›«=}UÄËê)CÛÍ·ˆ D ë)·½-= ó»¤%Óõ"'ôº»i;dÓù Ûja)–}Ò¿fµYêӗÔ%p´_‹-c!îǰ’ÅœjÆ5r4矾hoÚôß0ÅCÈ-|"ꖉ× ñt-i¯Bj“Ä)M»QP2ȘìÏʏ,N0ˆ›}ÛõÁhhÉ1UÛP1ŠR*” ýhVTÍA‹8¬^BcËn§͵ÛXÅ4A^,û;Êaß4tn6“^6g¾VÇÙ9ÈôÊ5/ ;ÉV\×uìqLñÁËu4,gWÑIAeãX.X p‹ ¢œ5x^\Atð˜OÁëV*üào?~.„ˆùŒ—…?vn™œ 'ÿ†+Âl ÿý{òd˜!¾—öøsr6h¦× ¢£R0© Ò½ƒ= “Ã@Úªœ•Jî©ÊÕ玐Ä;°ôÙg&ˆf7À‰=}hӌ¸fûq³µ7¡ÎÇûëŒP3ãè볎ÑÇ»4ÄÇ{|ÄÇ֎Ò$‰b§¢ Á#/ñޜJY™‘N~YÙ~Y4@}Ù¹XŸé’í洙äÅ=Mñ³”n©´¾q-[žõ'ºö^[;B¾.üÞûoX,o>g7ÞÒI’ÔÖ¿µ±:3“],'“ó¬XÊî»]üe?®µ±= 4“oÌhøí­pG½ÉˆBÌõù4…E7ŠHû€Õ-99tS\/¤f/<Íhù¼*UʆVþ1V/?%Ї÷ ññŽ ©IˆŸ@Ð +}ÜÎà­Y:ôE(%n‚ÌÛðd^W¥è1¥–ª¨%CÇ=}DÇîÈèaúõ=M]5Õ87pôõ„&5-%--¼ÍmZ÷ô™¸¼vø7k÷ôËêè•&-CCi4Dé~õpŠ’wß>I‰ýpŒØÞ‚Nb¡½I9t“ê®°= bvs=})/W)Y©|°Z€ý±7yU[\9â* âønZþXÛUWßNbîj—õݝÙvô!;±n·Àzڎû äj²÷Ô8wD,Aüæ—;GÊYìr@¹= uvlÃ÷ãƦ¶ª¼Kàd#&$p +¯"cØK+4D°/ç©»ÜÙykƒXé'öéáØutåkg%]É͗Ø7,Nï;1>û—kç)oT }wՖKJ<’¡ÚFû —Ö1ž KЧõ¹‰ùV³ y‚¹ß.Ðï{ä~eÎRFù]ùUDF8mbþüÞr- +Z8‚Qü\ÎUôÖ ü¾]YÙ]¢’ᄀÙ©ˆ}ۗd)úSvN/@o‰7fwB +m Þ:r~¬= Yvt‘Ôª:¾Ý²ó"?&bzÝëB““,¦d‹Gý¤Ê¦=MÞ.[lÉŽªÚŠJ^Ü8Ënp™ZyÝàoЄ²‚°•s_*Žß‡âˆd“wfæ&cdŸ¥¬¯ŽÌóŽâ¤¢õ$*ª§Y¹›ð‘Hw.aE:†= /ŸˆN +4šUØzŸÁÂêywê +2¦¶—û’æ}juJáͼ ‡‰švb9Âüò↢˜¶ÿ… +|!â(œ|˰óÕ¿\£(~©û#c/£†u¤Çü¤a¬3²õQû3¨°%kžªŒÛÝk™8ä¿ê&—_Â>Í'Ñ´Eüˆ³Þ)[–+ßå—{Áô+N’æÛ€=M7¯–†Ó.ª)ÜàÙo~x_jfžÓï®ð'dl«ÆMç;vÌe=}‚ÅB¶„ƒ™«ÊÆ?„OÎmLµô1×-Uã7ðEÏý¸ŸtËâ2uì¸F=MßéEõ¯ *»\âjûÚÖiB<Ô½h«a,z¹ +4Û Žhl‚Êq€¢†o½J„$ÛuþyíµW«É³4!n§¸)Ê[ßÌds°¬WJ¶o5Ã2álißìÕMÈ|tܬbÊìrìõ5ÈÜì’5Ÿë”O - ˜ö™ìÄ/ëÔ -¶žöçI»ÇqfÑ"ÁW»³ª£C¹»-!Ö~™V€lY~Y~Y~Y^ÝµËøìï$v§PµkÿCf¶$¨¢-?lǕÈZë}=}Å\],÷BÏu&kSVÅv,Ï0ÐTä7{ùó +à,= ÈÙp3û\ø‘È,ԒÈÇ3LRl·ÑÉÆ×9œ#o0ÜÕm—\Éö•VïUÇ­zï(ŒÈ¸M×öëÛû„s(q·U÷ۜøDÕ8g1m=}uÍèþK½EuDmҞ÷©õ,˜û0¢0á×áWs Û÷†å0ž× €u›^阇ݎ¿@¢m‹÷=MDÖ+qv¨Ý@‰Ú¹ x\ß1Zf7GÑ"þÑðî[¿Å™ŒÞnˆ…ù:Ϻýb|·~†îÙ²ÒBêN=}Á–]?¾’”Ž=M2Ïjß­à—K¢*ò2wáB| 9X“üÖ{ +€ßBxÞ ¹”<¡ +û_#±õãX¥¤w±ëÐƒ˜'#= N¦i¿®KÓÀÂÄZõ(ï˜åm7¬œVkM$Ä8Š'~™b»…_¬ÜµÎE=My+ª\Æ=}ú.|ÄE|‹+žîÆÍÂ+ÛÎe›½ ó¿£{«#Ãû~Y^<ƒwY~Y~Y~YÿÔÐ#’è¦÷Õ¥Oµƒúb£o£†Úª[Ù㕺¤/»sÒ¶OΦÚà+u½U±(-–Duñ ¼Ýa(A&—pÁGhÃM© táë04ä'h䕐°µ’3jÂ%í³Q³Ø%ÄUy«”K+œFæ÷½Å„¡³Þ' —Ìç?ç9‰±¶­(\õÆï6ñ2±v ;že_´‰hjÓØ¶éÛ=}Îå„'”xÆ_Œ³ä¿¸}…«ò™çËÐ垚´yi¶9Ãæè¤= -ãJY¥v*¬>Ò*c6.¥¬ç,ȵ֖¢ÐƵh¸œÿ‡l£4–ÖèYµ<ýGf¶´ˆRë}×µ2.ëO÷ÈýØ3kvö…qç,TNÇmÂ9þƒº,o,Y‡94&ÕºNlw Ò[ïX¨Õ +k§ÒmOÌ6ß)åJ¯­Šîˇٸ]ÚùÛþÄ¡·¨0e“Æ­’Ë_žE3ÄTíÛZíæ÷ùø<ùló8˜øY b +øÙßøü™úý=M0$(Ø=}l½í0Øa1tÛ]çŸÁ0mú×õ_tÛ¶ö +ãé@EÈ»Ý ½Œ‹HVE1UõŠ•¤@}Ú‘= ¢¢†½ÿqÃ:Ô{ ¾G=MsN2dXl©(ù¾—à…Iä52©ñß64üð™8Ô +>¢VÉ$áÉXÊ>ü՟Clw¾É–>Ï/ÔÒVhwõ¹fð.Ñ0Ï=MšW«ïSë^…. úÏé_YS{Çñ_KðhÉ">î@]1Uì\s x¾q|?† Y\;dqŠۋóUMfy±Ô©Ü×?„S@æ5F±ÞÏ ‹“ßQîQÏÑXî\/ØÿÙ\‚pȍû:¯.-¬AôB];b—‡Á4_ÁȔkù|Æî2º ß1ï”;\mFˆ$¢Ø2ÂRàYêš ByÊ +B®%òš½áŒ~œÀq—\VqJ|´BzÚ ý= šµNµxÖ÷… tí·5ÎÔ¡Â&…£Ãç£çt~Y| ~Y~Y~Y€“n³väCmÓ$lV¨‘³kïcbÐӞ&c\»Å"u-ÒÏõF]+R.— ÒÕ+k7<ÅÖy,ïâÏՔ)k3ZÅÀFí LÇmˆ:ëøü…PÇTZ8g“¡µJëgÌRçzîµüBî?ÐtÝTïo¿ÕVnk‡ÃVx:Ìv ~ <%®¹4ìõI–<ÎÂÆW;­&vÍÿÍK3QM%PËoÀdžÎç>Eó(%[êD–¨(Tò·¹¡óûºþ 8ÀhøYwõüMoCÕ+ín¼ÍØzKáC•ŒUm¡ŠÍf!NwëG´È>iY5½ðŽ ÇWØÙw Ó÷†Œ¯0×EÁs»!üƉ0¤b×áÊs”U‹?ËQ6Z9qÓæŠÞ@&]ñx|\办@%ŠêÝa-Ü@d~%©ôM»Ç5¯õXÓëv~ÈÛ&›®°¡Ù!oƒ—ð&ø¯©èÕ45=}l•E7l-ÝÉ$5M&lTäɐJ=}ÇüU:ì˜VÉz‘>[BïAéZ«öüptK_h©¹|ß.Ä@Б²XËáf“Í.Öϵ@ZKšÓ%"Y{µf‰!Í>‹U8ẐcIDU¬*{×@ †QS4|÷ÞöƒAð5²Ù’EÛ¿ð‰ÓÐ*&úmÄú* +]fŸÙ±åâ*k¶¿9ÒKX|„l´*Az¿…_;—vÄèß:lŒ…¹ŒötˆÆ:an=}qÑÔ)] vÿ9ÐZfHsÌ:yZ¹a\“zˆúå2¯<àm¸”³M'%ê*sFþz+À‰t!]êSeF”ñ2ÕJßu€™›™}†oÂ2ܬ=}—lþkŠèèB¨0=}á¢ÝÏ¼‡öUr há@Z›ç܍֕MòŸ +áÆaè©Wò¸Öúã(u¤=M¨ø¦=MY¯;uփyk#V¥‡ø¤F¨ß¸“‹ùã/z¤ü"ª7,ºõÊ+7ÒçÒºTæ§ÆGéŽ3…= æu0±œÞ·iM3^åA­LÎǁN36âf¢¯9¦[¸ô³#V~YŽrYy^ª||Y~Y~ّûBê¯-óË(d ©æ.¾L CLäÆnƒô¦;d~L©‘õ&*þ¯½¿Ô{|Æ&äB¯èÓl6cGò6æœïÅ:ØÌþjGþ6HalœáÉBê<Ç;5HìŒÀÉx1>w= ¹…JÉØa'Æü‡ð 4Ï&hR¹ÚSû~óÎ.}AèE¹:êû/@ô!éÙ0Ý}vÙ,©}ۆpT,U}Iiñ>ôj±Xœ¡{ÉnÊ>}„Àÿ*ÔLÀ¹ˆ{ÿ¸*f0åd2{s‚»*V¿?¸±8ZÜGᅓ™Efqž± ‚Ý“~„ê:Øìý,÷süü:-XX”:€ÿ*\Ÿ>ƒuAn~xÑP]¿Þ‰5†-n“*њ‚\D"lã¯2FìàE™KócFÊÁÎ=Mÿ=M‰”€“ë}hƂã2-àr• aFˆ¹2 ªàA–Ë~ƚ®2'àáè“ܾz +ôÍÂ@€J÷´B¸ŸsžŒ6f™\yxJ¢ÃB—†™o• [Šl ÂcŠ~<ó€ðB2ò oòáú¢œ70¸SÛüãgo¤Ð•ªOÎÀ“JýãHi¤f}ª¿±¥!š­kàÏCœG#¤–¥¹O­{VЃuD#ꊥ­›—ÏgB¥Ÿ®»öÄL +éd_%aȨ0M«UÚ³Ð{Š«©¶Óˇ2´O;Ä _ç“ += äl†%.:§À‘¬= · Í›½EîAÈ6×pÇÜ7ú5PGçlF5PÇfÐlhq5G ÈðéíÉï4¿<Ҝ_í5 >GŸäì^Ö5zȆÁì‰_8ϞÄü¸ìTÅQ­hwo-S­bGEè- иZ¯híHs ·è)ÌáòóO7•~8 ª7‘Ê8¡:7Z8´ò%!N—žI R×,=M70 +íçîßlo/Î wÎ +ÇNRÏ wŒ 猎 +×Âç?ÏB· ÿü W€} ›!†r”CÒ§¢)t‘D˜Hô•6T•:´Ü%vÍ)VÖ$¶ÆLvÓPªAqV_ñ]ñ–UqoMqT]qJIñEñtñæ²é2 ò9qyÏyQù¹I‘)¿Ý@–)h¤}±Ã©EX~Y~þ~Ya€ÇX~Y~YžÂ/*-:¥a¸ÃŸF£š©{›Ôã¢B¤m*ç,ƒÛ¾€ÔÅaF jj1œ|¿–܁ƒ»i4Y-ê8i1~P¿PÝÜ—Wސßkô"7†—çê¡<1(®¿ù§yޙg€ºWލ{i”’UF‡jƒê1 ÒÀâÛu¢w¬‰¼³yV×-Š rFçABÌàôÕµˆ“Gp’lÿw6H/ÊöòMýA›°à„þáZ–|ŽßVž¥æß¸êµò•_?„|ׂ†9•Q˜üTnv“Cʅ¬r9A©úàb ᕇŒÜ™öš>Š”Âòjóež«å:‹en[åVÇeH÷å”/eå/årÅe(5å)­åb=MeœÝå…iåN9em™äbQå½Ê׍Æï»Ç¿»Ä_ÁÊg?͇<ÐwýËѯÎo{ÏÏ~ÌÒâ͏ßÀgº&Ÿœ‰{îD~DqúĂÄñ«ˆûˆë=MïHÈõˆöÍ©HþÙÈÁˆ!äÔ(Õm.-m{íY]m|éí>¹mBYm[qí…AmÕô՚öy°±…4m•í5Ìm'íkžítÊ-_÷yaö‘ ùÅ¢÷•¡ö½(՝(ډçÔYj×qhÖÁÈÙáIÓ¡IØeÙŇÓʼnØe¸Õ%ºÖa8Õ7ÚQøÔ±w×9zÖéØÙÝWÓmWØ5ÕáÖ±ª/, ׋ÇÂßÁϽ×Ag<??‹¥Æõ†ŸíÆSq+Z|{Y€Kajc‹w+m;që|û€kjû Ã‹šw;šu+œq»Ÿl››p ›~Û·OÚ åš ë›ß/>¢¯9¦»¸ã³'V~YŽrY~_@~Y~YYqVò6Ò=}åÏ¢1Šk5{tÒ\†=Mꋯ1uü¿fÛ±‡΃ëúgôZ'¼j)­1ø¿â=Mۅw‡ ‹KswtWHFþjƒ11ÀvÝ šo8bªœ¢Ó22¯½Š˜É  9ZBŠ+Vk”L†íjIX14¾À°ZÝՒŸ|†Û!cÔ¡+F}¬ê/Ö1nŠÀÒÞíÿŸ_ˆû rôšDƇöj}º1M¿B‚ÞÉ"‘"ܽŸAF¾ æ¼„f¼öŽ”F½–»,…»V†¾Ô¶¾5¼äõ<ŠºéÃ&ôÑ.TÜ^´ÊZtÚBVC4N+Ôa[”G74J?ÔUEœA»ì»P¾޼’½½<=}½þ».þ^é'ñédQÁŽï +ß7´34Kô'ôWt?ÔEÔ-T]T9TQT"$ T‚n/¦Î0€/pŽ0¸>/|þ0tÞ/^0 ž/Uª0Ïê/ j0²Ê0 +/8Š0¤:/½ú0wÚ/Z/Æ0¤2àÕ…àØ‘ßډ_Ս_ØE"Óñ"•Ù0â/êb/¬"0ŸähFƒË4ÄOÛ¶W0Çå踖E.?Tg,ÛE”ßD‹AçŸðÉ)I·„u+Ԍç'/áV«4ð[¿…ÑtÅR[9·ÒÇÙ·¹”-,$ÈgvõEüTE_«üì×QÅù¶4- Xhy]Åç¦ôH4;€çß=MÉuY·þ.XhŽ™ÅðÊtW.;xðÿ‹Ä%š¹|žo,µÞ©+côKzÀÑm/·Pê.ÄhŸ”žç U«ï¸ÂI.ÃVçgÜÅqß4$ëXëGþÅÕϖ(ë^íGÿƵP¶Ôڛ]Ú,â>h~P…qJ{_þoŽ’âËíÀ¹L2-3jèƒ'{íï߯ý@¶œÑ+«:gnhøt]Ëö'[Ðñ´‘,­¤R–ó?Ç)á´(A,ÒrhM:E„´œP{šñW¢Ã"µªâ.yèG’v²ô :›—þïŸÎÕ¨Œr,C  ¿_â‚å— +K¡Ç­vB˜žö‹âš³¨k$¨ó×ñ}Y~Y~Y~Y~Y~ º’ÉŠ×îb=Mž!ªu©y=}©xj Ž(sfŒ >*ye +þ(vŒ +>éwn ét´ .é’9J9ÙX9 GAYþߐ Ðå^2¶|?ç6;÷JRpNR@6õn=}ýÎ;iá†W™¯JZ¾Û&Àk~c< !¹ðù@Ù"ÞÅJˆu¼‰T>ÛRáØBQØbéUCáS3_(CÍê–˜8z†±ÎD"ÐLzvˆÉÏFNÏN ÏzÐ~ ‘­Qúì¶üüªýèöûx”xßrþf˜ÜIYQX1 +ONÞOJw‘Ñ=MZU!šÆrt{Ÿ=}‹ü>Œ÷>^Ҟ=}¶Zw$YU>ür>^0ùvþG@9ôzþ_¦ÀpM6 j@àöº^*^=M^n9ÿоZ*ñ\JžH²wžáŠýÂÐ ֌ +Q ØFâZÀ ٝ‚ÿ&X<½ƒãæ€Öê) Ú*BÆ_Z4¡7iü¶Ÿ9Æ¿R°‘Óq /ÚÆ “®ïwGñalA-q4„¡v–ž4Øf:;Ùv¿WfT +>ÀV‰›˜ÿŠ<Šr¼Ö‚‚CZxµHpŊV­fhÜ:!;\o¯9ÇüSåî_õÆl_ø1<_iÿy]± zi˜aúӎ0QðYðQî>p‰HäAî9P®°YÜâfZØlNlPîáèð•ÖݐR‡´ç}Ž?ÇuÌRÇ != Ôܱ›!kóŽíaæ!Ç2!º|2 &ìNäeA2+j>‚ñ[±rKLáæö÷…Œ>j•.i\ÈúÌKæ—ýõ„_’0º×R_C/™à4ќÑ\å¹À—·áô„-³M;&gy舿lWt \åM¾Qh¸õ‹Gž1§ýŒ1¿Å5 ]ľ› 1Ù?¼ßÄ= !]ºê«JFQqA4ùò€(ŸDLÑoñ¶ñþ$,ÿÅUi]Õ6[ëPüé/ãòoBA‰ÐlWz˜Ç›cÒ¶=M®Ù—¤^·±º±ùô>né7i/9Z•çÉüô3à³ð_Ãóö˽÷PÖ]÷ÃÝ¡ ßýyÄ¿ÉiF”@ Âý0eèS¡¤7aâ¬= ›A$weZó‚šr4…ÚWT$-‚؅RnpÛvj¶ÚXŒÁ+= :«ß‰ù«›_¶qn¿#†:0jž*†· +ßA»ŒgR¯Ní= P{SÂò>9'¢ÛA$ +Š™ŠÛ"eÚ?ùèÈQ|éõÓmï- –ànüìŠj¤‡ñÒä?NåkZp@돣Õ]= Û¼ÔßAç5ݚú´†þksž¬7ç=MrqÎF5^&A6ژa4Zâ·}OV49IqsÆrÐqQ£]t͋\aÄWfƒñ×Ul£ÝwÛAMre 0é”ð Ê@T +¸À3= (QJH5‹ƒi¼wp!6©ø"ñâaŸí= ÑÎOKB4¨÷ÕVÀîàûœæ¹í£>œMath.atan(t),a:t=>Math.cos(t),d:t=>Math.exp(t),e:t=>Math.log(t),f:(t,s)=>Math.pow(t,s),c:t=>Math.sin(t),g:(t,s,i)=>r.copyWithin(t,s,s+i),h(t){r.length,(()=>{throw"OOM"})()}}};this.u=s=>{t.u(pe,s)},this.U=()=>t.U(pe),this.instantiate=()=>(this.U().then((t=>WebAssembly.instantiate(t,d))).then((t=>{const i=t.exports;var e;h=i.k,o=i.l,a=i.m,l=i.n,c=i.o,u=i.p,U=i.q,e=(n=i.i).buffer,r=new Uint8Array(e),(t=>{t.j()})(i),s()})),this.ready=new Promise((t=>{s=t})).then((()=>{this.I=n.buffer,this.V=o,this.free=U,this.Fs=h,this._s=a,this.Vs=l,this.ks=c,this.Ss=u})),this)}function Me(){return this.qs=()=>(new this.Hs).instantiate(this.$s,this.Cs).then((t=>{this.Is=t,this.js=this.Is._(this.Js,Uint8Array),this.xs=!0,this.Ps=this.Is._(1,Uint32Array),this.Ds=this.Is._(1,Uint32Array),this.Es=this.Is._(1,Uint32Array),this.Os=this.Is._(1,Uint32Array),this.Ns=this.Is._(1,Uint32Array),this.Zs=this.Is._(256,Uint32Array),this.zs=this.Is._(1,Int32Array),this.gs=0,this.Ks=0,this.Qs=0,this.Rs=this.Is.M.Fs(this.js.H,this.Ps.H,this.Ds.H,this.Es.H,this.Os.H,this.Ns.H,this.Zs.H,this.zs.H,256)})),Object.defineProperty(this,"ready",{enumerable:!0,get:()=>this.Gs}),this.reset=()=>(this.free(),this.qs()),this.free=()=>{this.Is.M.Ss(this.Rs),this.Is.free()},this.sendSetupHeader=t=>{this.js.C.set(t),this.Ps.C[0]=t.length,this.Is.M._s(this.Rs,this.xs),this.xs=!1},this.initDsp=()=>{this.Is.M.Vs(this.Rs)},this.decodePackets=t=>{let s=[],i=0,e=[];for(let r=0;r{if("vorbis"!==t)throw Error("@wasm-audio-decoders/ogg-vorbis does not support this codec "+t)},new r,this.qs(),this[ye](Me)}qs(){this.Ls=!0,this.Ws=0,this.ut=new oe("audio/ogg",{os:this.zt,Us:!1})}[ye](t){if(this.Rs){const t=this.Rs;t.ready.then((()=>t.free()))}this.Rs=new t,this.Gs=this.Rs.ready}get ready(){return this.Gs}async reset(){return this.qs(),this.Rs.reset()}free(){this.Rs.free()}async ti(t){const s=[];for(let r=0;rt[le])))}const i=await this.Rs.decodePackets(s);this.Ws+=i.samplesDecoded;const e=t[t.length-1];if(e&&e[ue]){const t=this.Ws-e[fe];if(t>0){for(let s=0;s setTimeout(res, time)); + } + class AudioEffect { + constructor(ac) { } + /** + * 连接至其他效果器 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + connect(target, output, input) { + this.output.connect(target.input, output, input); + } + + /** + * 与其他效果器取消连接 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + disconnect(target, output, input) { + if (!target) { + if (!isNil(output)) { + this.output.disconnect(output); + } else { + this.output.disconnect(); + } + } else { + if (!isNil(output)) { + if (!isNil(input)) { + this.output.disconnect(target.input, output, input); + } else { + this.output.disconnect(target.input, output); + } + } else { + this.output.disconnect(target.input); + } + } + } + } + + class StereoEffect extends AudioEffect { + constructor(ac) { + super(ac); + const panner = ac.createPanner(); + this.input = panner; + this.output = panner; + } + + /** + * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 Number + * @param y 朝向y坐标 Number + * @param z 朝向z坐标 Number + */ + setOrientation(x, y, z) { + this.output.orientationX.value = x; + this.output.orientationY.value = y; + this.output.orientationZ.value = z; + } + /** + * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 Number + * @param y 位置y坐标 Number + * @param z 位置z坐标 Number + */ + setPosition(x, y, z) { + this.output.positionX.value = x; + this.output.positionY.value = y; + this.output.positionZ.value = z; + } + end() { } + + start() { } + } + class VolumeEffect extends AudioEffect { + constructor(ac) { + super(ac); + const gain = ac.createGain(); + this.input = gain; + this.output = gain; + } + + /** + * 设置音量大小 + * @param volume 音量大小 Number + */ + setVolume(volume) { + this.output.gain.value = volume; + } + + /** + * 获取音量大小 Number + */ + getVolume() { + return this.output.gain.value; + } + + end() { } + + start() { } + } + class ChannelVolumeEffect extends AudioEffect { + /** 所有的音量控制节点 */ + + constructor(ac) { + super(ac); + /** 所有的音量控制节点 */ + this.gain = []; + const splitter = ac.createChannelSplitter(); + const merger = ac.createChannelMerger(); + this.output = merger; + this.input = splitter; + for (let i = 0; i < 6; i++) { + const gain = ac.createGain(); + splitter.connect(gain, i); + gain.connect(merger, 0, i); + this.gain.push(gain); + } + } + + /** + * 设置某个声道的音量大小 + * @param channel 要设置的声道,可填0-5 Number + * @param volume 这个声道的音量大小 Number + */ + setVolume(channel, volume) { + if (!this.gain[channel]) return; + this.gain[channel].gain.value = volume; + } + + /** + * 获取某个声道的音量大小,可填0-5 + * @param channel 要获取的声道 Number + */ + getVolume(channel) { + if (!this.gain[channel]) return 0; + return this.gain[channel].gain.value; + } + + end() { } + + start() { } + } + class DelayEffect extends AudioEffect { + constructor(ac) { + super(ac); + + const delay = ac.createDelay(); + this.input = delay; + this.output = delay; + } + + /** + * 设置延迟时长 + * @param delay 延迟时长,单位秒 Number + */ + setDelay(delay) { + this.output.delayTime.value = delay; + } + + /** + * 获取延迟时长 + */ + getDelay() { + return this.output.delayTime.value; + } + + end() { } + + start() { } + } + class EchoEffect extends AudioEffect { + constructor(ac) { + super(ac); + /** 当前增益 */ + this.gain = 0.5; + /** 是否正在播放 */ + this.playing = false; + const delay = ac.createDelay(); + const gain = ac.createGain(); + gain.gain.value = 0.5; + delay.delayTime.value = 0.05; + delay.connect(gain); + gain.connect(delay); + /** 延迟节点 */ + this.delay = delay; + /** 反馈增益节点 */ + this.gainNode = gain; + + this.input = gain; + this.output = gain; + } + + /** + * 设置回声反馈增益大小 + * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number + */ + setFeedbackGain(gain) { + const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; + this.gain = resolved; + if (this.playing) this.gainNode.gain.value = resolved; + } + + /** + * 设置回声间隔时长 + * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number + */ + setEchoDelay(delay) { + const resolved = delay < 0.01 ? 0.01 : delay; + this.delay.delayTime.value = resolved; + } + + /** + * 获取反馈节点增益 + */ + getFeedbackGain() { + return this.gain; + } + + /** + * 获取回声间隔时长 + */ + getEchoDelay() { + return this.delay.delayTime.value; + } + + end() { + this.playing = false; + const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; + sleep(this.delay.delayTime.value * echoTime).then(() => { + if (!this.playing) this.gainNode.gain.value = 0; + }); + } + + start() { + this.playing = true; + this.gainNode.gain.value = this.gain; + } + } + + class StreamLoader { + constructor(url) { + /** 传输目标 Set*/ + this.target = new Set(); + this.loading = false; + } + + /** + * 将加载流传递给字节流读取对象 + * @param reader 字节流读取对象 IStreamReader + */ + pipe(reader) { + if (this.loading) { + console.warn( + "Cannot pipe new StreamReader object when stream is loading." + ); + return; + } + this.target.add(reader); + reader.piped(this); + return this; + } + + async start() { + if (this.loading) return; + this.loading = true; + const response = await window.fetch(this.url); + const stream = response.body; + if (!stream) { + console.error("Cannot get reader when fetching '" + this.url + "'."); + return; + } + // 获取读取器 + this.stream = stream; + const reader = response.body?.getReader(); + const targets = [...this.target]; + + await Promise.all(targets.map((v) => v.start(stream, this, response))); + if (reader && reader.read) { + // 开始流传输 + while (true) { + const { value, done } = await reader.read(); + await Promise.all( + targets.map((v) => v.pump(value, done, response)) + ); + if (done) break; + } + } else { + // 如果不支持流传输 + const buffer = await response.arrayBuffer(); + const data = new Uint8Array(buffer); + await Promise.all(targets.map((v) => v.pump(data, true, response))); + } + + this.loading = false; + targets.forEach((v) => v.end(true)); + + // + } + + cancel(reason) { + if (!this.stream) return; + this.stream.cancel(reason); + this.loading = false; + this.target.forEach((v) => v.end(false, reason)); + } + } + const fileSignatures = [ + [AudioType.Mp3, [0x49, 0x44, 0x33]], + [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], + [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], + [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], + [AudioType.Aac, [0xff, 0xf1]], + [AudioType.Aac, [0xff, 0xf9]], + ]; + const oggHeaders = [ + [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], + ]; + + function checkAudioType(data) { + let audioType = ""; + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + for (const [type, value] of fileSignatures) { + if (value.every((v, i) => toCheck[i] === v)) { + audioType = type; + break; + } + } + if (audioType === AudioType.Ogg) { + // 如果是ogg的话,进一步判断是不是opus + for (const [key, value] of oggHeaders) { + const has = toCheck.some((_, i) => { + return value.every((v, ii) => toCheck[i + ii] === v); + }); + if (has) { + audioType = key; + break; + } + } + } + + return audioType; + } + class AudioDecoder { + /** + * 注册一个解码器 + * @param type 要注册的解码器允许解码的类型 + * @param decoder 解码器对象 + */ + static registerDecoder(type, decoder) { + if (!this.decoderMap) this.decoderMap = new Map(); + if (this.decoderMap.has(type)) { + console.warn( + "Audio stream decoder for audio type '" + + type + + "' has already existed." + ); + return; + } + + this.decoderMap.set(type, decoder); + } + + /** + * 解码音频数据 + * @param data 音频文件数据 + * @param player AudioPlayer实例 + */ + static async decodeAudioData(data, player) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + const type = checkAudioType(data); + if (type === "") { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString().padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return null; + } + if (isAudioSupport(type)) { + if (data.buffer instanceof ArrayBuffer) { + return player.ac.decodeAudioData(data.buffer); + } else { + return null; + } + } else { + const Decoder = this.decoderMap.get(type); + if (!Decoder) { + return null; + } else { + const decoder = new Decoder(); + await decoder.create(); + const decodedData = await decoder.decode(data); + if (!decodedData) return null; + const buffer = player.ac.createBuffer( + decodedData.channelData.length, + decodedData.channelData[0].length, + decodedData.sampleRate + ); + decodedData.channelData.forEach((v, i) => { + buffer.copyToChannel(v, i); + }); + decoder.destroy(); + return buffer; + } + } + } + } + + class VorbisDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggVorbisDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return this.decoder?.flush(); + } + } + + class OpusDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggOpusDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return await this.decoder?.flush(); + } + } + const mimeTypeMap = { + [AudioType.Aac]: "audio/aac", + [AudioType.Flac]: "audio/flac", + [AudioType.Mp3]: "audio/mpeg", + [AudioType.Ogg]: "application/ogg", + [AudioType.Opus]: "application/ogg", + [AudioType.Wav]: "application/ogg", + }; + + function isOggPage(data) { + return !isNil(data.isFirstPage); + } + class AudioStreamSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否已经完全加载完毕 */ + this.loaded = false; + /** 是否正在播放 */ + this.playing = false; + /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ + this.buffered = 0; + /** 已经缓冲的采样点数量 */ + this.bufferedSamples = 0; + /** 歌曲时长,加载完毕之前保持为 0 */ + this.duration = 0; + /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ + this.bufferPlayDuration = 1; + /** 音频的采样率,未成功解析出之前保持为 0 */ + this.sampleRate = 0; + //是否循环播放 + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 开始播放时刻 */ + this.lastStartTime = 0; + /** 上一次播放的缓存长度 */ + this.lastBufferSamples = 0; + + /** 是否已经获取到头文件 */ + this.headerRecieved = false; + /** 音频类型 */ + this.audioType = ""; + /** 每多长时间组成一个缓存 Float32Array */ + this.bufferChunkSize = 10; + /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ + this.audioData = []; + + this.errored = false; + this.ac = context; + } + /** 当前已经播放了多长时间 */ + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + /** + * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 + * @param size 每个缓存数据的时长,单位秒 + */ + setChunkSize(size) { + if (this.controller?.loading || this.loaded) return; + this.bufferChunkSize = size; + } + + piped(controller) { + this.controller = controller; + } + + async pump(data, done) { + if (!data || this.errored) return; + if (!this.headerRecieved) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + this.audioType = checkAudioType(data); + if (!this.audioType) { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString(16).padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return; + } + // 创建解码器 + const Decoder = AudioDecoder.decoderMap.get(this.audioType); + if (!Decoder) { + this.errored = true; + console.error( + "Cannot decode stream source type of '" + + this.audioType + + "', since there is no registered decoder for that type." + ); + return Promise.reject( + `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` + ); + } + this.decoder = new Decoder(); + // 创建数据解析器 + const mime = mimeTypeMap[this.audioType]; + const parser = new CodecParser(mime); + this.parser = parser; + await this.decoder.create(); + this.headerRecieved = true; + } + + const decoder = this.decoder; + const parser = this.parser; + if (!decoder || !parser) { + this.errored = true; + return Promise.reject( + "No parser or decoder attached in this AudioStreamSource" + ); + } + + await this.decodeData(data, decoder, parser); + if (done) await this.decodeFlushData(decoder, parser); + this.checkBufferedPlay(); + } + + /** + * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 + */ + checkSampleRate(info) { + for (const one of info) { + const frame = isOggPage(one) ? one.codecFrames[0] : one; + if (frame) { + const rate = frame.header.sampleRate; + if (this.sampleRate === 0) { + this.sampleRate = rate; + break; + } else { + if (rate !== this.sampleRate) { + console.warn("Sample rate in stream audio must be constant."); + } + } + } + } + } + + /** + * 解析音频数据 + */ + async decodeData(data, decoder, parser) { + // 解析音频数据 + const audioData = await decoder.decode(data); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.parseChunk(data)]; + + // 检查采样率 + this.checkSampleRate(audioInfo); + // 追加音频数据 + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 解码剩余数据 + */ + async decodeFlushData(decoder, parser) { + const audioData = await decoder.flush(); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.flush()]; + + this.checkSampleRate(audioInfo); + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 追加音频数据 + */ + appendDecodedData(data, info) { + const channels = data.channelData.length; + if (channels === 0) return; + if (this.audioData.length !== channels) { + this.audioData = []; + for (let i = 0; i < channels; i++) { + this.audioData.push([]); + } + } + // 计算出应该放在哪 + const chunk = this.sampleRate * this.bufferChunkSize; + const sampled = this.bufferedSamples; + const pushIndex = Math.floor(sampled / chunk); + const bufferIndex = sampled % chunk; + const dataLength = data.channelData[0].length; + let buffered = 0; + let nowIndex = pushIndex; + let toBuffer = bufferIndex; + while (buffered < dataLength) { + const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; + + for (let i = 0; i < channels; i++) { + const audioData = this.audioData[i]; + if (!audioData[nowIndex]) { + audioData.push(new Float32Array(chunk)); + } + const toPush = data.channelData[i].slice(buffered, buffered + rest); + + audioData[nowIndex].set(toPush, toBuffer); + } + buffered += rest; + nowIndex++; + toBuffer = 0; + } + + this.buffered += + info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; + this.bufferedSamples += info.reduce( + (prev, curr) => prev + curr.samples, + 0 + ); + } + + /** + * 检查已缓冲内容,并在未开始播放时播放 + */ + checkBufferedPlay() { + if (this.playing || this.sampleRate === 0) return; + const played = this.lastBufferSamples / this.sampleRate; + const dt = this.buffered - played; + if (this.loaded) { + this.playAudio(played); + return; + } + if (dt < this.bufferPlayDuration) return; + + this.lastBufferSamples = this.bufferedSamples; + // 需要播放 + this.mergeBuffers(); + if (!this.buffer) return; + if (this.playing) this.output.stop(); + this.createSourceNode(this.buffer); + this.output.loop = false; + this.output.start(0, played); + this.lastStartTime = this.ac.currentTime; + this.playing = true; + this.output.addEventListener("ended", () => { + this.playing = false; + this.checkBufferedPlay(); + }); + } + + mergeBuffers() { + const buffer = this.ac.createBuffer( + this.audioData.length, + this.bufferedSamples, + this.sampleRate + ); + const chunk = this.sampleRate * this.bufferChunkSize; + const bufferedChunks = Math.floor(this.bufferedSamples / chunk); + const restLength = this.bufferedSamples % chunk; + for (let i = 0; i < this.audioData.length; i++) { + const audio = this.audioData[i]; + const data = new Float32Array(this.bufferedSamples); + for (let j = 0; j < bufferedChunks; j++) { + data.set(audio[j], chunk * j); + } + if (restLength !== 0) { + data.set( + audio[bufferedChunks].slice(0, restLength), + chunk * bufferedChunks + ); + } + + buffer.copyToChannel(data, i, 0); + } + this.buffer = buffer; + } + + async start() { + delete this.buffer; + this.headerRecieved = false; + this.audioType = ""; + this.errored = false; + this.buffered = 0; + this.sampleRate = 0; + this.bufferedSamples = 0; + this.duration = 0; + this.loaded = false; + if (this.playing) this.output.stop(); + this.playing = false; + this.lastStartTime = this.ac.currentTime; + } + + end(done, reason) { + if (done && this.buffer) { + this.loaded = true; + delete this.controller; + this.mergeBuffers(); + + this.duration = this.buffered; + this.audioData = []; + this.decoder?.destroy(); + delete this.decoder; + delete this.parser; + } else { + console.warn( + "Unexpected end when loading stream audio, reason: '" + + (reason ?? "") + + "'" + ); + } + } + + playAudio(when) { + if (!this.buffer) return; + this.lastStartTime = this.ac.currentTime; + if (this.playing) this.output.stop(); + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.playing = true; + + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + /** + * 开始播放这个音频源 + */ + play(when) { + if (this.playing || this.errored) return; + if (this.loaded && this.buffer) { + this.playing = true; + this.playAudio(when); + } else { + this.controller?.start(); + } + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + if (this.playing) this.output.stop(); + this.playing = false; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + /** + * 停止播放这个音频源 + * @returns 音频暂停的时刻 number + */ + stop() { + if (this.playing) this.output.stop(); + this.playing = false; + return this.ac.currentTime - this.lastStartTime; + } + /** + * 连接到音频路由图上,每次调用播放的时候都会执行一次 + * @param target 连接至的目标 IAudioInput + */ + connect(target) { + this.target = target; + } + /** + * 设置是否循环播放 + * @param loop 是否循环 boolean) + */ + setLoop(loop) { + this.loop = loop; + } + } + class AudioElementSource { + constructor(context) { + const audio = new Audio(); + audio.preload = "none"; + this.output = context.createMediaElementSource(audio); + this.audio = audio; + this.ac = context; + audio.addEventListener("play", () => { + this.playing = true; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + }); + audio.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + }); + } + get duration() { + return this.audio.duration; + } + get currentTime() { + return this.audio.currentTime; + } + /** + * 设置音频源的路径 + * @param url 音频路径 + */ + setSource(url) { + this.audio.src = url; + } + + play(when = 0) { + if (this.playing) return; + this.audio.currentTime = when; + this.audio.play(); + } + + stop() { + this.audio.pause(); + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + return this.audio.currentTime; + } + + connect(target) { + this.output.connect(target.input); + } + + setLoop(loop) { + this.audio.loop = loop; + } + } + class AudioBufferSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否循环 */ + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 播放开始时刻 */ + this.lastStartTime = 0; + this.duration = 0; + this.ac = context; + } + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + + /** + * 设置音频源数据 + * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer + */ + async setBuffer(buffer) { + if (buffer instanceof ArrayBuffer) { + this.buffer = await this.ac.decodeAudioData(buffer); + } else { + this.buffer = buffer; + } + this.duration = this.buffer.duration; + } + + play(when) { + if (this.playing || !this.buffer) return; + this.playing = true; + this.lastStartTime = this.ac.currentTime; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + + stop() { + this.output.stop(); + return this.ac.currentTime - this.lastStartTime; + } + + connect(target) { + this.target = target; + } + + setLoop(loop) { + this.loop = loop; + } + } + class AudioPlayer { + constructor() { + /** 音频播放上下文 */ + this.ac = new AudioContext(); + /** 音量节点 */ + this.gain = this.ac.createGain(); + this.gain.connect(this.ac.destination); + this.audioRoutes = new Map(); + } + /** + * 解码音频数据 + * @param data 音频数据 + */ + decodeAudioData(data) { + return AudioDecoder.decodeAudioData(data, this); + } + /** + * 设置音量 + * @param volume 音量 + */ + setVolume(volume) { + this.gain.gain.value = volume; + } + + /** + * 获取音量 + */ + getVolume() { + return this.gain.gain.value; + } + + /** + * 创建一个音频源 + * @param Source 音频源类 + */ + createSource(Source) { + return new Source(this.ac); + } + + /** + * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 + */ + createStreamSource() { + return new AudioStreamSource(this.ac); + } + + /** + * 创建一个通过 audio 元素播放的音频源 + */ + createElementSource() { + return new AudioElementSource(this.ac); + } + + /** + * 创建一个通过 AudioBuffer 播放的音频源 + */ + createBufferSource() { + return new AudioBufferSource(this.ac); + } + + /** + * 获取音频目的地 + */ + getDestination() { + return this.gain; + } + + /** + * 创建一个音频效果器 + * @param Effect 效果器类 + */ + createEffect(Effect) { + return new Effect(this.ac); + } + + /** + * 创建一个修改音量的效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * |----------| + * ``` + */ + createVolumeEffect() { + return new VolumeEffect(this.ac); + } + + /** + * 创建一个立体声效果器 + * ```txt + * |------------| + * Input ----> | PannerNode | ----> Output + * |------------| + * ``` + */ + createStereoEffect() { + return new StereoEffect(this.ac); + } + + /** + * 创建一个修改单个声道音量的效果器 + * ```txt + * |----------| + * -> | GainNode | \ + * |--------------| / |----------| -> |------------| + * Input ----> | SplitterNode | ...... | MergerNode | ----> Output + * |--------------| \ |----------| -> |------------| + * -> | GainNode | / + * |----------| + * ``` + */ + createChannelVolumeEffect() { + return new ChannelVolumeEffect(this.ac); + } + + /** + * 创建一个延迟效果器 + * |-----------| + * Input ----> | DelayNode | ----> Output + * |-----------| + */ + createDelay() { + return new DelayEffect(this.ac); + } + + /** + * 创建一个回声效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * ^ |----------| | + * | | + * | |------------| ↓ + * |-- | Delay Node | <-- + * |------------| + * ``` + */ + createEchoEffect() { + return new EchoEffect(this.ac); + } + + /** + * 创建一个音频播放路由 + * @param source 音频源 + */ + createRoute(source) { + return new AudioRoute(source, this); + } + + /** + * 添加一个音频播放路由,可以直接被播放 + * @param id 这个音频播放路由的名称 + * @param route 音频播放路由对象 + */ + addRoute(id, route) { + if (!this.audioRoutes) this.audioRoutes = new Map(); + if (this.audioRoutes.has(id)) { + console.warn( + "Audio route with id of '" + + id + + "' has already existed. New route will override old route." + ); + } + this.audioRoutes.set(id, route); + } + + /** + * 根据名称获取音频播放路由对象 + * @param id 音频播放路由的名称 + */ + getRoute(id) { + return this.audioRoutes.get(id); + } + /** + * 移除一个音频播放路由 + * @param id 要移除的播放路由的名称 + */ + removeRoute(id) { + this.audioRoutes.delete(id); + } + /** + * 播放音频 + * @param id 音频名称 + * @param when 从音频的哪个位置开始播放,单位秒 + */ + play(id, when) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot play audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + + route.play(when); + } + + /** + * 暂停音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + pause(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.pause(); + } + + /** + * 停止音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + stop(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot stop audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.stop(); + } + + /** + * 继续音频播放 + * @param id 音频名称 + */ + resume(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + route.resume(); + } + + /** + * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 + * @param y 位置y坐标 + * @param z 位置z坐标 + */ + setListenerPosition(x, y, z) { + const listener = this.ac.listener; + listener.positionX.value = x; + listener.positionY.value = y; + listener.positionZ.value = z; + } + + /** + * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 + * @param y 朝向y坐标 + * @param z 朝向z坐标 + */ + setListenerOrientation(x, y, z) { + const listener = this.ac.listener; + listener.forwardX.value = x; + listener.forwardY.value = y; + listener.forwardZ.value = z; + } + + /** + * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 头顶朝向x坐标 + * @param y 头顶朝向y坐标 + * @param z 头顶朝向z坐标 + */ + setListenerUp(x, y, z) { + const listener = this.ac.listener; + listener.upX.value = x; + listener.upY.value = y; + listener.upZ.value = z; + } + } + class AudioRoute { + constructor(source, player) { + source.route = this; + this.output = source.output; + + /** 效果器路由图 */ + this.effectRoute = []; + + /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ + this.endTime = 0; + /** 暂停时播放了多长时间 */ + this.pauseCurrentTime = 0; + /** 当前播放状态 */ + this.player = player; + this.status = AudioStatus.Stoped; + + this.shouldStop = false; + /** + * 每次暂停或停止时自增,用于判断当前正在处理的情况。 + * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 + */ + this.stopIdentifier = 0; + /** 暂停时刻 */ + this.pauseTime = 0; + this.source = source; + this.source.player = player; + } + /** 音频时长,单位秒 */ + get duration() { + return this.source.duration; + } + /** 当前播放了多长时间,单位秒 */ + get currentTime() { + if (this.status === AudioStatus.Paused) { + return this.pauseCurrentTime; + } else { + return this.source.currentTime; + } + } + set currentTime(time) { + this.source.stop(); + this.source.play(time); + } + /** + * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 + * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 + */ + setEndTime(time) { + this.endTime = time; + } + + /** + * 当音频播放时执行的函数,可以用于音频淡入效果 + * @param fn 音频开始播放时执行的函数 + */ + onStart(fn) { + this.audioStartHook = fn; + } + + /** + * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 + * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 + * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 + */ + onEnd(fn) { + this.audioEndHook = fn; + } + + /** + * 开始播放这个音频 + * @param when 从音频的什么时候开始播放,单位秒 + */ + async play(when = 0) { + if (this.status === AudioStatus.Playing) return; + this.link(); + await this.player.ac.resume(); + if (this.effectRoute.length > 0) { + const first = this.effectRoute[0]; + this.source.connect(first); + const last = this.effectRoute.at(-1); + last.connect({ input: this.player.getDestination() }); + } else { + this.source.connect({ input: this.player.getDestination() }); + } + this.source.play(when); + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + if (this.status !== AudioStatus.Playing) { + this.status = AudioStatus.Playing; + } + } + + /** + * 暂停音频播放 + */ + async pause() { + if (this.status !== AudioStatus.Playing) return; + this.status = AudioStatus.Pausing; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Pausing || + this.stopIdentifier !== identifier + ) { + return; + } + this.pauseCurrentTime = this.source.currentTime; + const time = this.source.stop(); + this.pauseTime = time; + if (this.shouldStop) { + this.status = AudioStatus.Stoped; + this.endAllEffect(); + + this.shouldStop = false; + } else { + this.status = AudioStatus.Paused; + this.endAllEffect(); + } + this.endAllEffect(); + } + + /** + * 继续音频播放 + */ + resume() { + if (this.status === AudioStatus.Playing) return; + if ( + this.status === AudioStatus.Pausing || + this.status === AudioStatus.Stoping + ) { + this.audioStartHook?.(this); + + return; + } + if (this.status === AudioStatus.Paused) { + this.play(this.pauseTime); + } else { + this.play(0); + } + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + } + + /** + * 停止音频播放 + */ + async stop() { + if (this.status !== AudioStatus.Playing) { + if (this.status === AudioStatus.Pausing) { + this.shouldStop = true; + } + return; + } + this.status = AudioStatus.Stoping; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Stoping || + this.stopIdentifier !== identifier + ) { + return; + } + this.source.stop(); + this.status = AudioStatus.Stoped; + this.pauseTime = 0; + this.endAllEffect(); + } + + /** + * 添加效果器 + * @param effect 要添加的效果,可以是数组,表示一次添加多个 + * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 + */ + addEffect(effect, index) { + if (isNil(index)) { + if (effect instanceof Array) { + this.effectRoute.push(...effect); + } else { + this.effectRoute.push(effect); + } + } else { + if (effect instanceof Array) { + this.effectRoute.splice(index, 0, ...effect); + } else { + this.effectRoute.splice(index, 0, effect); + } + } + this.setOutput(); + if (this.source.playing) this.link(); + } + + /** + * 移除一个效果器 + * @param effect 要移除的效果 + */ + removeEffect(effect) { + const index = this.effectRoute.indexOf(effect); + if (index === -1) return; + this.effectRoute.splice(index, 1); + effect.disconnect(); + this.setOutput(); + if (this.source.playing) this.link(); + } + + setOutput() { + const effect = this.effectRoute.at(-1); + if (!effect) this.output = this.source.output; + else this.output = effect.output; + } + + /** + * 连接音频路由图 + */ + link() { + this.effectRoute.forEach((v) => v.disconnect()); + this.effectRoute.forEach((v, i) => { + const next = this.effectRoute[i + 1]; + if (next) { + v.connect(next); + } + }); + } + + startAllEffect() { + this.effectRoute.forEach((v) => v.start()); + } + + endAllEffect() { + this.effectRoute.forEach((v) => v.end()); + } + } + + const audioPlayer = new AudioPlayer(); + + class BgmController { + constructor(player) { + this.mainGain = player.createVolumeEffect(); + this.player = player; + /** bgm音频名称的前缀 */ + this.prefix = "bgms."; + /** 每个 bgm 的音量控制器 */ + this.gain = new Map(); + + /** 正在播放的 bgm */ + this.playingBgm = ""; + /** 是否正在播放 */ + this.playing = false; + + /** 是否已经启用 */ + this.enabled = true; + /** 是否屏蔽所有的音乐切换 */ + this.blocking = false; + /** 渐变时长 */ + this.transitionTime = 2000; + } + + /** + * 设置音频渐变时长 + * @param time 渐变时长 + */ + setTransitionTime(time) { + this.transitionTime = time; + for (const [, value] of this.gain) { + value.transition.time(time); + } + } + + /** + * 屏蔽音乐切换 + */ + blockChange() { + this.blocking = true; + } + + /** + * 取消屏蔽音乐切换 + */ + unblockChange() { + this.blocking = false; + } + + /** + * 设置总音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.mainGain.setVolume(volume); + this._volume = volume; + } + /** + * 获取总音量大小 + */ + getVolume() { + return this.mainGain.getVolume(); + } + /** + * 设置是否启用 + * @param enabled 是否启用 + */ + setEnabled(enabled) { + if (enabled) this.resume(); + else this.stop(); + this.enabled = enabled; + } + + /** + * 设置 bgm 音频名称的前缀 + */ + setPrefix(prefix) { + this.prefix = prefix; + } + + getId(name) { + return `${this.prefix}${name}`; + } + + /** + * 根据 bgm 名称获取其 AudioRoute 实例 + * @param id 音频名称 + */ + get(id) { + return this.player.getRoute(this.getId(id)); + } + + /** + * 添加一个 bgm + * @param id 要添加的 bgm 的名称 + * @param url 指定 bgm 的加载地址 + */ + addBgm(id, url = `project/bgms/${id}`) { + const type = guessTypeByExt(id); + if (!type) { + console.warn( + "Unknown audio extension name: '" + + id.split(".").slice(0, -1).join(".") + + "'" + ); + return; + } + const gain = this.player.createVolumeEffect(); + if (isAudioSupport(type)) { + const source = audioPlayer.createElementSource(); + source.setSource(url); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } else { + const source = audioPlayer.createStreamSource(); + const stream = new StreamLoader(url); + stream.pipe(source); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } + } + + /** + * 移除一个 bgm + * @param id 要移除的 bgm 的名称 + */ + removeBgm(id) { + this.player.removeRoute(this.getId(id)); + const gain = this.gain.get(id); + gain?.transition.ticker.destroy(); + this.gain.delete(id); + } + + setTransition(id, route, gain) { + const transition = new Transition(); + transition + .time(this.transitionTime) + .mode(linear()) + .transition("volume", 0); + + const tick = () => { + gain.setVolume(transition.value.volume); + }; + + /** + * @param expect 在结束时应该是正在播放还是停止 + */ + const setTick = async (expect) => { + transition.ticker.remove(tick); + transition.ticker.add(tick); + const identifier = route.stopIdentifier; + await sleep(this.transitionTime + 500); + if (route.status === expect && identifier === route.stopIdentifier) { + transition.ticker.remove(tick); + if (route.status === AudioStatus.Playing) { + gain.setVolume(1); + } else { + gain.setVolume(0); + } + } + }; + + route.onStart(async () => { + transition.transition("volume", 1); + setTick(AudioStatus.Playing); + }); + route.onEnd(() => { + transition.transition("volume", 0); + setTick(AudioStatus.Paused); + }); + route.setEndTime(this.transitionTime); + + this.gain.set(id, { effect: gain, transition }); + } + + /** + * 播放一个 bgm + * @param id 要播放的 bgm 名称 + */ + play(id, when) { + if (this.blocking) return; + if (id !== this.playingBgm && this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playingBgm = id; + if (!this.enabled) return; + this.player.play(this.getId(id), when); + this.playing = true; + } + + /** + * 继续当前的 bgm + */ + resume() { + if (this.blocking || !this.enabled || this.playing) return; + if (this.playingBgm) { + this.player.resume(this.getId(this.playingBgm)); + } + this.playing = true; + } + + /** + * 暂停当前的 bgm + */ + pause() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playing = false; + } + + /** + * 停止当前的 bgm + */ + stop() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.stop(this.getId(this.playingBgm)); + } + this.playing = false; + } + } + const bgmController = new BgmController(audioPlayer); + + class SoundPlayer { + constructor(player) { + /** 每个音效的唯一标识符 */ + this.num = 0; + this.enabled = true; + this.gain = player.createVolumeEffect(); + /** 每个音效的数据 */ + this.buffer = new Map(); + /** 所有正在播放的音乐 */ + this.playing = new Set(); + this.player = player; + } + /** + * 设置是否启用音效 + * @param enabled 是否启用音效 + */ + setEnabled(enabled) { + if (!enabled) this.stopAllSounds(); + this.enabled = enabled; + } + + /** + * 设置音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.gain.setVolume(volume); + } + /** + * 获取音量大小 + */ + getVolume() { + return this.gain.getVolume(); + } + /** + * 添加一个音效 + * @param id 音效名称 + * @param data 音效的Uint8Array数据 + */ + async add(id, data) { + const buffer = await this.player.decodeAudioData(data); + if (!buffer) { + console.warn( + "Cannot decode sound '" + + id + + "', since audio file may not supported by 2.b." + ); + return; + } + this.buffer.set(id, buffer); + } + + /** + * 播放一个音效 + * @param id 音效名称 + * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 + * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 + */ + play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { + if (!this.enabled || !id) return -1; + const buffer = this.buffer.get(id); + if (!buffer) { + console.warn( + "Cannot play sound '" + + id + + "', since there is no added data named it." + ); + return -1; + } + const soundNum = this.num++; + + const source = this.player.createBufferSource(); + source.setBuffer(buffer); + const route = this.player.createRoute(source); + const stereo = this.player.createStereoEffect(); + stereo.setPosition(position[0], position[1], position[2]); + stereo.setOrientation(orientation[0], orientation[1], orientation[2]); + route.addEffect([stereo, this.gain]); + this.player.addRoute(`sounds.${soundNum}`, route); + route.play(); + source.output.addEventListener("ended", () => { + this.playing.delete(soundNum); + }); + this.playing.add(soundNum); + return soundNum; + } + + /** + * 停止一个音效 + * @param num 音效的唯一 id + */ + stop(num) { + const id = `sounds.${num}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + this.playing.delete(num); + } + } + + /** + * 停止播放所有音效 + */ + stopAllSounds() { + this.playing.forEach((v) => { + const id = `sounds.${v}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + } + }); + this.playing.clear(); + } + } + const soundPlayer = new SoundPlayer(audioPlayer); + + function loadAllBgm() { + const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; + for (const bgm of data.main.bgms) { + bgmController.addBgm(bgm); + } + } + loadAllBgm(); + AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); + AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); + + core.plugin.audioSystem = { + AudioType, + AudioDecoder, + AudioStatus, + checkAudioType, + isAudioSupport, + audioPlayer, + soundPlayer, + bgmController, + guessTypeByExt, + BgmController, + SoundPlayer, + EchoEffect, + DelayEffect, + ChannelVolumeEffect, + VolumeEffect, + StereoEffect, + AudioEffect, + AudioPlayer, + AudioRoute, + AudioStreamSource, + AudioElementSource, + AudioBufferSource, + loadAllBgm, + StreamLoader, + }; + //bgm相关复写 + control.prototype.playBgm = (bgm, when) => { + bgm = core.getMappedName(bgm); + if (main.mode != "play" || !core.material.bgms[bgm]) return; + // 如果不允许播放 + if (!core.musicStatus.bgmStatus) { + try { + core.musicStatus.playingBgm = bgm; + core.musicStatus.lastBgm = bgm; + core.material.bgms[bgm].pause(); + } catch (e) { + console.error(e); + } + return; + } + core.setMusicBtn(); + + try { + bgmController.play(bgm, when); + } catch (e) { + console.log("无法播放BGM " + bgm); + console.error(e); + core.musicStatus.playingBgm = null; + } + + }; + control.prototype.pauseBgm = () => { + bgmController.pause(); + core.setMusicBtn(); + }; + + control.prototype.resumeBgm = function () { + bgmController.resume(); + core.setMusicBtn(); + }; + control.prototype.checkBgm = function () { + core.playBgm(bgmController.playingBgm || main.startBgm); + }; + control.prototype.triggerBgm = function () { + core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; + if (bgmController.playing) bgmController.pause(); + else bgmController.resume(); + core.setMusicBtn(); + core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); + }; + //sound相关复写 + control.prototype.playSound = function ( + sound, + _pitch, + callback, + position, + orientation + ) { + if (main.mode != "play" || !core.musicStatus.soundStatus) return callback?.(); + const name = core.getMappedName(sound); + const num = soundPlayer.play(name, position, orientation); + const route = audioPlayer.getRoute(`sounds.${num}`); + if (!route) { + callback?.(); + return -1; + } else { + sleep(route.duration * 1000).then(() => callback?.()); + return num; + } + }; + control.prototype.stopSound = function (id) { + if (isNil(id)) { + soundPlayer.stopAllSounds(); + } else { + soundPlayer.stop(id); + } + }; + control.prototype.getPlayingSounds = function () { + return [...soundPlayer.playing]; + }; + //sound加载复写 + loader.prototype._loadOneSound_decodeData = function (name, data) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + //core.loader._loadOneSound_decodeData(name, uint8.buffer); + soundPlayer.add(name, uint8); + }); + }); + return; + } + if (data instanceof ArrayBuffer) { + const uint8 = new Uint8Array(data); + soundPlayer.add(name, uint8); + } + }; + //音量控制复写 + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { + var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); + if (value == 0 && delta < 0) return; + core.musicStatus.userVolume = core.clamp( + Math.pow(value + delta, 2) / 100, + 0, + 1 + ); + //audioContext 音效 不受designVolume 影响 + if (core.musicStatus.gainNode != null) + core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + core.setLocalStorage("userVolume", core.musicStatus.userVolume); + core.playSound("确定"); + core.ui._drawSwitchs_sounds(); + }; + } } \ No newline at end of file diff --git a/project/sounds/floor.mp3 b/project/sounds/floor.mp3 index 96dc4fa38ce4a6a09657a17b609a5432b7f423ba..2b24efbcbed62693d2b60d7dc32f993a4bf470ab 100644 GIT binary patch literal 2316 zcmbu>dpK0-1Hkbaq#<`hE~CaYB)6SOE}=EVxHE%XW-22Ymys~-Y+1{sF>aOIHYAKo zm?+eckXhs|L+-0q7L7{DE$h;((?0$F-9LVx=Q-!R?|IMjocH^je~!Jifd~kI@Njpx z*}Y1EK*CObG_ny|-&h}wLVa8O_as;e=l*YMA4a~oJCWW!pdb)r8U){^3or(p1h@i- z05TvF5CcdCWC2)!DnJ9^Ie-V40`LK=0097a`R?BQclU-q4otp73Ss^oLZ+eKvUk7V z{&p3tVA^*F!gj#yE4n+wiK|4IIn?siY{HDR(Z~|(=40LD1zlEJ;dqxB5Ij5xB;tRU zmu@WBl*uxQo|R6RVg#6f8vb-#u$lK3v(cESwp_4XBBPL!aP4Z>QnU$7suLr<86#M+ zYA1ewPu^`(kYJ~d1XfYB*jXqeQ%#hfFoKuf6)Ye(1W?el)i+~xkBO4y~9CF zU7>4WJ9G7&VC9S(`Z5u{&?k{hCgbf+IhowSkhPPTh@LvijlRbHAlQ5f1l7y6IzI+u zwLo@5-Hj|On?8}4xwJ2p2UNSN%i_jl#eVhL5?tv&=z3vvv}4heHV&aYT=@E^ zc`N#&V6ZpQ;HcZr8MYBur1y^+R_#O!ntcg^gMzoQiJ4K#_N-}HP%e=>0SBGaxV6V z>*93|v#&rZpBWAmpCshZ)AbQ?M3Saoe6)N%837r(+7?rd5{Pq_T)Wt*p`t z1yh7@NVjyfq1lK-a^h)m`YFA8BP-$3sobT@;m=b1P6I*G`l4_72g2pnVES^HZQUQD{L%l#agMi5*Kw z2Tp-5EZ@M;(`l!Qw8IA9SU~0&WbEzQ$_AmD&?{;89bwspW-e{T&CeSm)DlgKTp3se zzd5(DGem7xykpoJ8(rS)7fJ6b`3e0)PO+Zmw;-sv%G__H_Hpli1z3e?l+uAm_-yop z?0URR4lB@++^v@yW8eOx&k)XzhaYweMtztpIA;$>xi=Pph&HcNmY75Va>&vm5nu<2tQM>@%Rww_D5_fw;< z4@=G^YEQz3M=L7LF;^ucFQP7rPIWhc{+YWeJ?oYqz;+!?6_ zkt13h&%K%Y>xBvSwh$=;`PWLsVd|O)L=(J8Y=t+d>UJmHc``XJgIttw37;9a)#ty- z%ET4H{EHaOK&G=_a`}}Z^17 z&8>SfKjvT0%W1av*qeLSa}EeHgT^KI7?Ika@VEcWYI@~xHhr_|K;^ap_-qod0{>VM zBT@qT5_5==nWc^=OD;7AE^YXMS8`2N{I9(Um_?{c%+k+ajGWZiC=WMCi^yKWwidl8 zWWQJ>6j1UJ+TKfc%AD43K{oPBU(1c6u;%mu+wIFQe75!@9ZqYFW3@2r+4+{Kigum| zn``jCC_6@vl?}7avP8lzX?FEL;^uLIeJLtu_z}f7s0Sff%8v9RXQH?Am6-Ro1!(Ep2E?SukwiM z%51^<_gL1;A;c?h(c+&H%6Ls55yNV~^&W6vWwO=9K)3`#F7edFyG4FzbQm8YGEK6kgTxc6P(0ivJ>C8>PQ5@f z{b|90OsQ^x@ofrAV{m_*47Q)(mW-+T9kxtLq3P zYB4e)4hW*jKGn1n$D~2k;e{J-FHVgA&bwu;iZVPLCFg2zf0!DY<>Rg;s0m-AJSr7KL7v# literal 1879 zcmcK5dpOg37y$6!Ty|U{V;e15DVIv+k|lYL4dt3fVM-*7DWpkBxg|D=lx`>qv!nF`M!UBpZ9&<&-?!Mfk|x*#PK$AT%|)n5Nujdh;V^P9AO~agiWbt&GW7xxaOR|n8K4`cWAJ+5)HX-IgxBJ zL;ohBxIIC}V1Q@!k`9P-j^w%eScfj*FS4g2Kdp)mP^Y9&O;a)`PnzTmyI^K5EWR?8Lt=u zU%ib3v#fC(t;(lMJI7x=`nW?7M@igy-5=#A5X|VLu)#E zHFRwBgv4B!Hl>&7{B_6Vbm_5OZfY>+blbymcNU*Kazm3AQ(o^g)^m@>5A_aG2(5cB ztK!rU>alQOxn$;8h~>E}SQ6yuA@Jvy_SwjZ++#$Od0e|%v+Hmy*r{W3cPC8LJQeON znS=z;ij5}Z{UeTJ%}RNlOxm%tnBkt6B?Q1OpLvELT6#avb=GdXSfxD z&q2vdK`uD|A|v&^5OORx(w~0<6SZNAta0!=nETqvlrORuz1NUfWeoNu0t%CF>en5Y z)tF!0ro!q109A*Z%~=x|=@e3)j$&7;OVeB5;>XtKcip8(Pq9o)Mm5?D2FiXsOUWN+ zgUidzAcYoFJIK*T3^Bg4IZ6Q1ddJ1NaEkx!ks-~R62stB<|%oZ!_`>wA&gBzpI>G8 z#p|loE4MyITGT|UEOM)CkvH`it-iTwi)M~5PdL6R7T_LeDX8W&s8~g{SN`D0E}Avw z8(GitpTt0pg*+l|{j1#>l`n207ohc1~Ev3)HiD9{q)hfxyFiL=ogS2H>=IxfUq@wyhi zCl07NkNu<*l+aZZ`-T zUCDl53M+9MHFH62y-du3+y~59V&gU1Cc+N^aR`$N8X533Fm zM<02iDB2%9qwb2ehw_eTY|}9*x3QZ_;lY7w{;5vbCE$9ay}bhDkkJG|w_B?c(CA?^ zLN0#fZpN`EpVvLJE4J6r!TlkosK}-+toRlg7vNh5{;+ep`Mza+H+?r9p|U~h*~Q!b zq)QS9nzD29