From ad08fd8438bf60da5d2fa8ed820be76c2099e338 Mon Sep 17 00:00:00 2001 From: Razvan Maries Date: Fri, 6 Nov 2020 11:28:35 +0200 Subject: [PATCH] Backed out 2 changesets (bug 1669503) for crashing in mozilla::MP3TrackDemuxer::GetNextFrame. a=backout DONTBUILD Backed out changeset 863ecb9b15d5 (bug 1669503) Backed out changeset d5cbc458d318 (bug 1669503) --- dom/media/MediaData.cpp | 23 +++++------ dom/media/mp3/MP3Demuxer.cpp | 39 +++++------------- .../platforms/ffmpeg/FFmpegAudioDecoder.cpp | 31 +++++++++++++- .../platforms/ffmpeg/FFmpegAudioDecoder.h | 2 + ...cropped_8000hz_8kbs_mono_lame3.100.abr.mp3 | Bin 29376 -> 0 bytes dom/media/webaudio/test/mochitest.ini | 2 - .../webaudio/test/test_decoderDelay.html | 25 +++-------- dom/media/webaudio/test/v3.mp3 | Bin 57503 -> 0 bytes 8 files changed, 56 insertions(+), 66 deletions(-) delete mode 100644 dom/media/webaudio/test/cropped_8000hz_8kbs_mono_lame3.100.abr.mp3 delete mode 100644 dom/media/webaudio/test/v3.mp3 diff --git a/dom/media/MediaData.cpp b/dom/media/MediaData.cpp index 2a9c1ad8328d..773b4b6c9ec2 100644 --- a/dom/media/MediaData.cpp +++ b/dom/media/MediaData.cpp @@ -13,7 +13,6 @@ #include "mozilla/layers/ImageBridgeChild.h" #include "mozilla/layers/KnowsCompositor.h" #include "mozilla/layers/SharedRGBImage.h" -#include "nsMathUtils.h" #include @@ -74,17 +73,15 @@ bool AudioData::SetTrimWindow(const media::TimeInterval& aTrim) { return false; } - auto roundToNearestFrame = [&](const TimeUnit& aTime) -> uint64_t { - MOZ_ASSERT((TimeUnitToFrames(aTime, mRate) + 1).isValid()); - return NS_round(aTime.ToSeconds() * mRate); - }; - - uint64_t trimBefore = roundToNearestFrame(aTrim.mStart - mOriginalTime); + auto trimBefore = TimeUnitToFrames(aTrim.mStart - mOriginalTime, mRate); auto trimAfter = aTrim.mEnd == GetEndTime() ? originalFrames - : roundToNearestFrame(aTrim.mEnd - mOriginalTime); - - MOZ_DIAGNOSTIC_ASSERT(trimAfter >= trimBefore, + : TimeUnitToFrames(aTrim.mEnd - mOriginalTime, mRate); + if (!trimBefore.isValid() || !trimAfter.isValid()) { + // Overflow. + return false; + } + MOZ_DIAGNOSTIC_ASSERT(trimAfter.value() >= trimBefore.value(), "Something went wrong with trimming value"); if (!mTrimWindow && trimBefore == 0 && trimAfter == originalFrames) { // Nothing to change, abort early to prevent rounding errors. @@ -92,13 +89,13 @@ bool AudioData::SetTrimWindow(const media::TimeInterval& aTrim) { } mTrimWindow = Some(aTrim); - mDataOffset = trimBefore * mChannels; + mDataOffset = trimBefore.value() * mChannels; MOZ_DIAGNOSTIC_ASSERT(mDataOffset <= mAudioData.Length(), "Data offset outside original buffer"); - mFrames = trimAfter - trimBefore; + mFrames = (trimAfter - trimBefore).value(); MOZ_DIAGNOSTIC_ASSERT(mFrames <= originalFrames, "More frames than found in container"); - mTime = mOriginalTime + FramesToTimeUnit(trimBefore, mRate); + mTime = mOriginalTime + FramesToTimeUnit(trimBefore.value(), mRate); mDuration = FramesToTimeUnit(mFrames, mRate); return true; diff --git a/dom/media/mp3/MP3Demuxer.cpp b/dom/media/mp3/MP3Demuxer.cpp index bf25ab1e7651..1b810500e26c 100644 --- a/dom/media/mp3/MP3Demuxer.cpp +++ b/dom/media/mp3/MP3Demuxer.cpp @@ -6,13 +6,11 @@ #include "MP3Demuxer.h" -#include - #include +#include #include #include "ByteWriter.h" -#include "Intervals.h" #include "TimeUnits.h" #include "VideoUtils.h" #include "mozilla/Assertions.h" @@ -24,7 +22,6 @@ extern mozilla::LazyLogModule gMediaDemuxerLog; DDMOZ_LOG(gMediaDemuxerLog, LogLevel::Verbose, msg, ##__VA_ARGS__) using mozilla::BufferReader; -using mozilla::media::Interval; using mozilla::media::TimeInterval; using mozilla::media::TimeIntervals; using mozilla::media::TimeUnit; @@ -634,6 +631,15 @@ already_AddRefed MP3TrackDemuxer::GetNextFrame( UpdateState(aRange); + frame->mTime = Duration(mFrameIndex - 1); + frame->mDuration = Duration(1); + frame->mTimecode = frame->mTime; + frame->mKeyframe = true; + frame->mEOS = mEOS; + + MOZ_ASSERT(!frame->mTime.IsNegative()); + MOZ_ASSERT(frame->mDuration.IsPositive()); + if (mNumParsedFrames == 1) { // First frame parsed, let's read VBR info if available. BufferReader reader(frame->Data(), frame->Size()); @@ -650,31 +656,6 @@ already_AddRefed MP3TrackDemuxer::GetNextFrame( } } - frame->mTime = Duration(mFrameIndex - 1); - frame->mDuration = Duration(1); - frame->mTimecode = frame->mTime; - frame->mKeyframe = true; - frame->mEOS = mEOS; - - auto duration = Duration(); - if (duration) { - auto actualFramesInterval = TimeInterval( - FramesToTimeUnit(mEncoderDelay, mSamplesPerSecond), - *duration - FramesToTimeUnit(mEncoderPadding, mSamplesPerSecond)); - - auto frameInterval = TimeInterval(frame->mTime, frame->GetEndTime()); - auto realFrameInterval = actualFramesInterval.Intersection(frameInterval); - if (realFrameInterval != frameInterval) { - frame->mOriginalPresentationWindow = Some(frameInterval); - frame->mDuration = realFrameInterval.Length(); - frame->mTime = realFrameInterval.mStart; - } - } - - MOZ_ASSERT(!frame->mTime.IsNegative()); - MOZ_ASSERT(frame->mDuration.IsPositive() || - frame->mDuration.ToSeconds() == 0.); - MP3LOGV("GetNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64 " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d, mEOS=%s", diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp index 8976d4b39023..c38604e095bf 100644 --- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp @@ -22,7 +22,14 @@ FFmpegAudioDecoder::FFmpegAudioDecoder(FFmpegLibWrapper* aLib, if (aConfig.mCodecSpecificConfig && aConfig.mCodecSpecificConfig->Length()) { mExtraData = new MediaByteBuffer; mExtraData->AppendElements(*aConfig.mCodecSpecificConfig); - BufferReader reader(mExtraData->Elements(), mExtraData->Length()); + if (mCodecID == AV_CODEC_ID_MP3) { + BufferReader reader(mExtraData->Elements(), mExtraData->Length()); + mEncoderDelay = reader.ReadU32().unwrapOr(0); + mEncoderPadding = reader.ReadU32().unwrapOr(0); + FFMPEG_LOG("FFmpegAudioDecoder, found encoder delay (%" PRIu32 + ") and padding values (%" PRIu32 ") in extra data", + mEncoderDelay, mEncoderPadding); + } } } @@ -229,6 +236,25 @@ MediaResult FFmpegAudioDecoder::DoDecode(MediaRawData* aSample, if (!audio) { return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__); } + + bool trimmed = false; + if (mEncoderDelay) { + trimmed = true; + uint32_t toPop = std::min((uint32_t)mFrame->nb_samples, mEncoderDelay); + audio.PopFront(toPop * numChannels); + mFrame->nb_samples -= toPop; + mEncoderDelay -= toPop; + } + + if (aSample->mEOS && mEncoderPadding) { + trimmed = true; + uint32_t toTrim = + std::min((uint32_t)mFrame->nb_samples, mEncoderPadding); + mEncoderPadding -= toTrim; + audio.PopBack(toTrim * numChannels); + mFrame->nb_samples = audio.Length() / numChannels; + } + media::TimeUnit duration = FramesToTimeUnit(mFrame->nb_samples, samplingRate); if (!duration.IsValid()) { @@ -246,7 +272,8 @@ MediaResult FFmpegAudioDecoder::DoDecode(MediaRawData* aSample, RefPtr data = new AudioData(samplePosition, pts, std::move(audio), numChannels, samplingRate, mCodecContext->channel_layout); - MOZ_DIAGNOSTIC_ASSERT(duration == data->mDuration, "must be equal"); + MOZ_DIAGNOSTIC_ASSERT(duration == data->mDuration || trimmed, + "must be equal"); aResults.AppendElement(std::move(data)); pts = newpts; diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h index 1a9e59237a4b..9ee221df0b3f 100644 --- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h +++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h @@ -38,6 +38,8 @@ class FFmpegAudioDecoder private: MediaResult DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame, DecodedData& aResults) override; + uint32_t mEncoderDelay = 0; + uint32_t mEncoderPadding = 0; }; } // namespace mozilla diff --git a/dom/media/webaudio/test/cropped_8000hz_8kbs_mono_lame3.100.abr.mp3 b/dom/media/webaudio/test/cropped_8000hz_8kbs_mono_lame3.100.abr.mp3 deleted file mode 100644 index ceb8f11b716ea10f0b408aec7e62ee05f3d39e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29376 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 MJx4f7{y+cz2g0}zi~s-t diff --git a/dom/media/webaudio/test/mochitest.ini b/dom/media/webaudio/test/mochitest.ini index 43c651239d6a..bfc1cb05adb2 100644 --- a/dom/media/webaudio/test/mochitest.ini +++ b/dom/media/webaudio/test/mochitest.ini @@ -33,8 +33,6 @@ support-files = sine-440-10s.opus half-a-second-8000.mp3 half-a-second-48000.mp3 - cropped_8000hz_8kbs_mono_lame3.100.abr.mp3 - v3.mp3 webaudio.js ../../webrtc/tests/mochitests/mediaStreamPlayback.js ../../webrtc/tests/mochitests/head.js diff --git a/dom/media/webaudio/test/test_decoderDelay.html b/dom/media/webaudio/test/test_decoderDelay.html index a858fc55ba59..c6486e4c4ed3 100644 --- a/dom/media/webaudio/test/test_decoderDelay.html +++ b/dom/media/webaudio/test/test_decoderDelay.html @@ -12,33 +12,18 @@ SimpleTest.waitForExplicitFinish(); var tests = [ - { - name: "half-a-second-8000.mp3", - duration: 0.5 - }, - { - name: "half-a-second-48000.mp3", - duration: 0.5 - }, - { - name: "v3.mp3", - duration: 3 - }, - { - // Weird file that has the end padding larger than a packet size. - name: "cropped_8000hz_8kbs_mono_lame3.100.abr.mp3", - duration: 28.65675 - } + "half-a-second-8000.mp3", + "half-a-second-48000.mp3", ]; async function doit(t) { var count = 0; var context = new OfflineAudioContext(1, 128, 48000); - tests.forEach(async testcase => { - var response = await fetch(testcase.name); + tests.forEach(async testfile => { + var response = await fetch(testfile); var buffer = await response.arrayBuffer(); var decoded = await context.decodeAudioData(buffer); - is(decoded.duration, testcase.duration, "The file has the correct duration."); + is(decoded.duration, 0.5, "The file is half a second."); if (++count == tests.length) { SimpleTest.finish(); } diff --git a/dom/media/webaudio/test/v3.mp3 b/dom/media/webaudio/test/v3.mp3 deleted file mode 100644 index d680ebdb350f8ec7fa537d276e7b8bbc3ff02200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57503 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 z z%@>EtaHs)DL=>tkPU#{_&&PmCCC#PM8#d1$kD-rr39m^frr^0w0SM00Cj>ci%%nPL zMhBF#U}N71k>BH&5%Ocyk9_uw{@l%%QvTC^5au&PF59omTV9J%plGf^Xxka2ALcz7 zamAyu<>Qw_=NNHI0*$#S<8u|*B)3Y$6l>V#?IMGdipjtj$wzPL;~D5!eDK}#oU`QO zxVTa%8?=gr4HEX$$1FnyY4M^mw8604EoOhl$z9*%8Uq({0>5jpg_L$fI=u1-cS%qso8QWBy%v~vOo4?KADD=~89Fz@s@-w%}BH~=_McH_HL+s<| z_ZaQp%qz2P;;Vi9!M-9?%57=_NQ3C%$0W;n?E5p0AHj|L#H z9;3qvqCWvwS;kQT+(ytBkGYyu!QKtw)U@EFms<7*>cpKS|D>qkvlz7p8ZAfUB3^U? zgnn-^G@3$5;66HHfmk-`xCUhvl}~Es9^usf8LEA2A~Rs(+TzrAHuY`lr~Qg!z>|DM zEyH}v>ca3h`tT>KSdq00+#i1rc>LTBKI>xYpt$xmn0i}x;?dmu#X@UZubaW?RrGJ# z4#A=b@AO%H-5@qSmUk+u=2TryYd1yjCqCZZB4Y;4nF}h1_QV`r zP5Iv5_Gg?NefV-#zV^&ex~FJZdkSvScER$w>AVS5`vM*L@3fcbE-%k#$SY^|l%&)w zPu0dJStX|s(WIIhJt|l2rHz$?5h4+logCxeN&&kDjD{F~pXinW|3=?XE>$WA|?YK;@{>x_F028CVLB+kO)HsRC7G8S1$<7!dqbD+%B9Aww9*$$6L zVWEF_Ci!u)>S{Th2Ajk@C7L(SDBxl|iL z4Gon!p+3k-m*!dChIl@#FqnL*l>WpT>~oeeNhD4QW_?vPJMH(l?1!O!3t;I$r%cf{ zibtDJD0*lYQ-P@6dY8Bq-O`}gBqF3#E!+&?LF#itigIptWidG{DRv`F1iR`il8#z` zvlmf1h5eg}AU2gIVx7z~pXf$arFiq7LpXJ_J5`m7QT-FSsR<(Pm02d!%Swu@z}Hn+w|-ttNc^4EpRCX5Y& zR$6L^j<}c5@gtkc?i8H`#}PB#s>vtM<=W_EMi@Or6}ujRtb^L5%*`s_i>%F$qfmSN zwGUQE;gP0*>=>{tFDMp;%f&S-QJyRaDFwXo6?K61aB z0bC|w8e)v<<}oVbNIqpCJuIA@0-PAzP9XIHOOw{QHoo^l1{d5Q5JMnpn=Q(aj^AJI zXP|;B_L-?R*_&NGsd97CRepT1A-aUiKp?f1!oKj+V`lDY(xEgXTG_-A#+V&?HW_mn z&+^~|nqo5#Cn9?(q+hnM1e_ulwsgeoU-vA(Ykq`m!cfyr?x9t`A=rLXJ+vxOT=%Jh zBmhuxXi-#Tmw}cGT|_ebz9)BI{xV9EUitpqm`|3s37xp}=_h%Pc02K31*jN;AXJ>n z-qjgg>|q>=TAw0F^Lr*rd%p-H#}UzA|1$n6#q{?Eq-fwL8-~&60ye=|%6?G17E^MV zPlP2pyTP!jp&h++#E5ChwA7x6DP^3BRt!r?hS=%oN43Yx6}X6@+!C})`x0!Q!Ns)Y zrSC!X*JOMt+b!tBOO~8H-QBv7oi{lsHp{*nd$2MrZznsMQQKkmpOdD298C^crd|T^iO+m`lc|69bYX$MZ}Pihv+JGmBl)&Vv$`a1P3FMs>krE=)2*-?V;3Fg z(`rL>IA#3MfxG9S!n`#LU8IQ((e6l%*sU~;IhWqT($t${NrRP9(K4h!mMWv^axde3 zuKsCX0;qX&)G~5#O!y~Oc;ScS)#$E*9Yd!J-2N}!ouyz{a0>L`2W``@x9%*KHpmq7 ztl?M7H;0ZtU7A;u`{wkb!H1uW*g$);A*bVz=zFZFL!1`!8?XZW^*JiPzv|ztRmJtO zvx1*x$8W(WAG`T;U3->qzJ0mK|3UdkLjyhNYAsLul_T8e>y@H z>Q{@toH+eyslHvUT`l^4vU0m)hl~1O68b1B_=)NR5_SPBA^!^}c>hlxG3G)SSh;cd zo6CcXt$Z@5S1R((+UVOCH4R0argCmiaJiZ*ZS!`;RI0F=C>BHnSGW>C@ugVr1bb>f z1wmdZV!N~qTTZULQV}bHlp(c-q%1&#Zje@(D3lLpAl4@Kle{oazn5}#`8d=&h4bei zo73P&yY+0g&wS}y`saKS$*G(J7sEkg6vFb4><}+SIrd@>t^V%IWcYq3&h2h^KJ)UpFI^f`;3G61qRsKGjlpEj z;9KHis6S(iNa%h`#dnV}>0hP}mt9Xj{xSi73O%}K`6~W8&@k*k1mUx5;mn35q(R~|DI{^$;vl26?1?>#f(}swspD372j3U z5rfF>o4opXa~T^qCA0f;Z>2H}v=bMQsxZiv$A z+ScXr6?qDGVEbt*=jm9P8Er}xP|ffq1IJT(55?9d40aEF^cq#q%!=1MiamOk<==g0 zkX_&FGfeD%71p-%F5b5}X!S>iVcm{LbH}R|!s$n!(giiV6N2l&|4uYpQ%~W#%f9nF zY;TY+1fCzppRkSH3fx%yqV}V^;v9Z7y4zOKr5;dV((~c{_h+}O#n;6;muIdCuWoeU zLBsy9->-hW?9t^B(to*pnG76!cR$=BfGPn&GY9he3m9t4{;$3J42HXH8wS35iQWmq zS~Uo(M2ou0>Z{j8S-nKf6^XKX@2nb~Ac!8)MDJY$L81pKLJ}dt^WXb=-}i%=_k+wl zGwuvCCLb~*6MGzIJ&xa*Rh-|JSq!T^ZGf_IoD84M@GaQ9-%MxTEPp%cgF2moy!E)L#p^5aHE*egf5;)ST8^yJ zK6$^F;@kDR_CkEMVd_QzL?`aMMbou`f7X%ow#LX?6shi7mDk$tNe1b;azEjJf@fVJ zh8M57mQLF*<|MxSF6c9mzDKq{0w20BE*$A>FF(ExA9;!OIY)=pg!f zdL_9fm5{Auc!_4L-ONnBlaX3>ScZKJx`bR8p?s)YfZZAv@)Ff)A;>bZQvM| zrYoeiNDxS?7V|NJGSxUi%&DoH3QTKv6)ngOegu8lWifwc-inV)%(`;Rw(*;;+ZMV1 zKb%Dc_ubV$ckEL(w9=JaVNQM>EZ7!w?Lp#VE7xO(CA!rYt;$Mrl>xSaYjh%S%jO;G zWSnmneqOy|{`J%7vtiT2HidoZJ3p$oGS;O>#(u0{Zu&0QmcPBf;C=Axb>fTXtuK#0 z+3w%yQhRt}tM=r?MXhMIpHYisCYeG0;Q+|=zA){OmK}#bsqS)o1G?84DpA3Y97`RDY}-n$dS%qV#1 znuu*!U5BsJ#DnVT$-OFTVO#oq;1m$}WC(ndNpS821HBG^{zJr(41&rA#FcT1= zW^5ec4HYEQGnLr6o#%FN&aQx(9Buzn{a2dpneD@riFKL9Q`PDNPpx^3eR;wdS|7Va@sp4Gj+ndL zS1A+0Vccx@eBDontn)AKB!1Xg`;}4K^i*pA5HDCQil&Y$q^}P?sqwz^^4-e9V(YKE z`0JBPVuKmSi5thwMu9)})<(9Uy?OmE=-Si55zmz{y?4KN^%9S&)p<)<5W3@G!=&aF z;&WPbigsn1Nz*D+I3P`N5Y$duv%Co(%W#J>1V<#5nA%RUZ>-P63q`^EN~k;r+;WS) zgN}|p0l2>*Fd5?spJu}@umX2_Tw~`a#$sE^?Ff*%8e-LvU?pNhSS4r`8|50wdIfEg zwAcBy)#_(sPJD-EUuD#cjGTI@ci8OL-NLEs)1t{Ni0NpCjZ4a*%Jf=ME8QXE$pTlI zBpqwbM8uMb^mGgEE`4VzKbl$LIgFo%S;Twk9!C47r#T7R1I~q>kJE@`|8RvK&=^f5 z+#`)HYrN`G39PixZ!lL?(#;#_v`|AO5k(j*xeJ(#qu_!h{!hlzx7CEx6s2!cHdA5- z?L!oE1#tHbL_(Vau#l6-iepXsn)ND42o~SnzyfChaj*&d3$HU1Kz#@Vz~is=g8BU1QrMRXJ^10iP>NWqA|u-W|UCMOgaXC6heUuk;-| z$Nva^4Z8I>Ki(lo_I3P<8QE8Hhp*2qwBB#wf4!bBEMpUMcRy(G=6=w0%cj2sOw|x3 z3WHxwewwRXFyj;O*+muY(n-O{t;8w;YvZM zZhpu9J-RY?<=L;Mec6qLwZ+?{y~pna$1RJdK7TqInci4zJ?#AwcqRW!&U)+7@sGBd z`B8UFs!oHL>VSgqhbWvpU@HXlZY;j0+X|pmj=z7h348-L8hm zb0_l=2Yx%BP;BSjAl9g_5)9Gr=T$kBl~OuAJj=L|;Q`REjzM0X@jj|QB-uFYDmA!t z9xxWO7c(kaMux$8@47Mb=Caet8u=ywtD_Qxtcgr;{SY~uf9>5`;BG>NYQ)bWEqBCf zgUQc+Vzoa(Dp3F*T9QKMi=H&y7t5^cpT2op)U!b#L3ysAZd)(VDCE&NHa}p-CKdwYE8!%N z^hY^&xXLn&T&60iL+g@vje1ow|Lkz*=0bU_&QY0r&-V_@ei=PfotnFF2o^>@f~3 z-or$~SJdSPk30`DQMmM-KtZ@X$T(8bKuJ`Onj^Yp5)L8aoT2ra2cZ`x* zt92j49y^C984qxi@Dz+%me8CRSz7P{OgR6XumhfMT!thuA%T=Q6V9|-2qX9Itj-NhuE~a~;=PHF z?IU^UshrFqlYTVjj4vQ|GQoawOQv*)#zn-I9`U_#&Os>G_bG-*)Qr(2G@O?$GP6yx0?&F0-;gY<^-RTmj zw2lw^&B3N=^GYiws$Qu^oUq+MHWWn(+DR~(rH4fw&?3S-?lZh06Uw208BEYiqI!kt zIm5>*nEll!=~Xrh3^=>T1yvIr2(wzr6NAHiLfNDs%qiAOeFsqgKm@O5WxZp8R5VuW z6{MEpoU{GiI^f7;Z8KGe|95je(@Hf}a0Rm2r^72Y_krJ9exbtD_B|RJgB*y7ZR7}g z$}(#*v!SjxKflt;H^UrL4KCOWRF|k!?hTsW<$!@Xs6?QjKflH`9;^J0VvH9+{yS*1 zVh+lHGL>hT>01cYu8prvoXMKG&~9QLwM4fw5@Ncd%ql-hhWE&dg`}(HKF!xlXxuP? zzLaErNn#%DDxtxZT$^j8T~!7Yj0P$~7Q9hE`z&0q(a2G)K1%JXJ-oc? z>QaPMtPAci7z@;$htS=)!hxJ=7iPvUu0X;LuJY@`9VmolO>zMQKuFfaCsuDBC~JRE z;eDw-vHIcEEwl@8fuqmoIWl6fZLpm=G)pfjF=^VJqebThWX^4Apdz*+=;SzWd-P<@ zsIGV}YiwMZCYo?;0p2)=EFiQj5erMmK8*LcO!BsYlUZ-EoY)6sqtd+Y)0w2n^#N23 zx-MT!k8i`QKtLZH9Xd@!0re~Zhg1a+#91aoLPGh-I%H%NKPXL5Q}y+Q|Ijt9XQ2Bn z5EWOLInoL>HzhU^rEag|Q%oFWST6X**{`S!+k%O~Jf|XT3<#>Qn zuBu!?8lbCX*Wf+^8lAP=S!ZUH!A0gfZHCUww@IaXm}Vw%$4TUYOfe=^$3d6-*Z!>| zdJd$j5NLAi1{@B}_H)waU$lwN;n|(LXH&w>ygln)vZ)Om>$?IG{=l_4?_{JlsoLL= z6DA@Gg>r0{O~bk5+1B$3GJn;B9bF@Zmiej;-cbjWwA|@qXCCUHY5@sFyf+;THqlhT z#ujd`AVCb`?1gI;uK{AiVVzD&xl*mcG zsyx#}!QKSu>l>2#%%ePcId#@RNfo8HWHvszOvAQ#X1xLTRi}e3IK6#8*WJyPXr3NR z;K;D?m)u5Q3fH@X=@iJ}kaJv2nSETzikrATJVY@h)HE!QOkALf@U>QnA$eFqDVI7= z{;M_db?fj!wH|C!N7piWw{*Iv9l#GSWu|uTFuYF{#3%`#3SkACX%{Iq&aPCOU2+rF z-y`)C@zjYnt8Dq6y}-fne7s6lDC)Dvd<3a~-L~CG6^k%o_fX637L)56$dj9&UU;$e zH7S2X7Yy-S18RRGybL8F#gB-mZhlj1*2HypJa^9c+BK=SHi|4W@MF`I*!ojnDAzHBDLp;4wKrud7P2U%HYkY_fq0h%F!ZWuvbz1 zL6l!*roa z*N7;XJ&zr=V^@{{mApJWrjx5MqUvRM=$O$wE}45R2uzDjz$;g<94$#0>xgR=rGJ&%WwM1LbJiJ*_D$1M~zWt~#i zf!tmCA)cPfn{6PuWZ0q^xN;%Z5`e=;D6nm2Xq+!GMJp)LhEB9VHd@c2ON|EgZ9k7 z#R%3LFFl~e^g;*;JhmG z1fQGAkaqV+mvNZ8zhC|41FUnioR$OmM{b$Kw3WK}ymt*ZIOWye+~3jkjt4K<1v=qZ2}OZjLO!S-&=4 zT$q1wedch!_1%l-FHhdA4IaLDcKN~K&7)r#O%8j!o;uU0w@nZ#A3m z&k4P*q|0E?!zcQYoNO#O;(dWDg$LIBQ{1F^S$0W$H3(AP2=}K57|I%By}?D)4(ze3 z_^|5*x_)lJh6=a~bzv6xHoq;n@wgn>*$YaDAmJv{Fc&7qlubz-&d8Z>`jANmO*u75 z;%FK#am_?k!sum|D+#2witU0nH+W*ROUxw9h2Y4^top><8)EX&LO&6jGquji+=8QZ zb_qtV_1_u*-{pHY|D1ila6f=Yx))E;`6d_z28N6-#^%~djXhNNO&c%+n#kv7wPZ&R zI&g_9dqa(s6pg5$VlUg?n$pU1X16ND_hAV!6n>z!6Dc%)|F&!5KernwX38ATSwK!0 z0A>f^#?!<{AwML_64ZU?Gm|Nb&gQ*S2PMD;WONa5;XW5fFh$%G#+$7@7J@aF8*p_> zl7gf|7Bjaz7kQDmMK*$zOkfV1S0%;1!oO$Iy$W4}5PWwvXaol$AiIi-u98rEH9EKw z0&Pmm5GSM=DW+tK9h)oAYGf>CGuvTNmOX%1x8v#&&XZKh*1#BAwVPNzt(OH&Ev&&ug6cN6Y`GpOmh+P*Bncj@VqQv{v_=8U$`-_nM@#{qpz1 z`iQp&rKG@F+1X&V?G%YLcmb#U?uiR_lW}mw)}`OaIW%Dfp@OpOrZyA8pj#>STD8QY zebpgcZ!{x66+NQHkJNWtb&vlw(IOxyna<$qrfzL!SCtW`=N8v+U-M-#n_Kgt{mEwm z0^YZ?!qdHRXf4R92zSCuUE3VfU)_uQi{`$EWr2Z8a&a6C&BaqmhOtS3RA0hv-_8}c z+WKUyA5`8zIM);;mbT&FddB^TX8zq+z~KJe?7_Ro@sHbT{`se7-{`ok_2*G{yx)4B6Yj|;h=SZf7ln)Som5{= z1w~4zs57KLtVkDcL8w@HPGXFVQg~M0CnhE{gyFpvzaWH|&{saJ(iPh#P{|(EG=N1| zw8|5$8yAsOh>Ge?67K1IuZ3UGOr)Ec#5RQYUKAFmjUVDB#sH3~vtzuJsUX7Elp-qZ zYDSuTxkoh;XtX1=cjvAz|9w4jme`{k78jX_*hHq4i^hO`c!*2zAdV{e2-jgonP%Cd zS>$6r+Q|0rR3B2*xqtN5rXopY(maLa^?Jif(A%>><`U%xWwr-{w(iMhA zOc0|@6|yV6UulpO1LEa15`K1MoS?5WC{}c5Waw2G6o0SQg2$&wg!I)U`Oh!ch#kA= zRaX0Uc{@oQ2s5Xt5mP)P0_!*uk`Z8C5sF-dE{h{sS0udUrvO!z6mjPsOJW%(i%JZ) zk#X`0CHrj&X$Xa%lpfH=8J5n77M!hq-u}fW1h<^WEeu{@*KQgT9SNm`GSdU14Hz!(2(ncLJS# z6d)%3CWqI+!T2Q{L3BKJX`QU{slZgePZ(&o2(4+L6=9{FDIG|Y4 zA*QII_|_xIo=pu2+p^)MJfPU1!$m|fI=WCHi{q#I6)kFmaUqdQF?xKxX+-^e?jE6K zl0d_-cafJMAp$E~1|f&3{_PqA{@|R_&WP;L;2a{Jpt}hy)kdH(kGL!vfKIoq>j*L% zplua>$pw<;Bm%U!ZCE;LR*W?)ID8nlCHhXs2Y5~yj|~lhBgBKb2Zlh=Md8zi-NS+M zp{SCGsDvlx$&D!rJnX@r4~Z2l2uu)d45J`j_9gF%Lw>ZBlTrg1d*BY8Y?N7hi%e`t zBsbnza{?upZ0D`G5WOv70BNu(BzR&altznnEY1@IEkB21CXb~bKn7G8_d*_?)miPfXYJ^?a&?tX%GPr0>Ge8Q#O!w{ZLlH zqgwYO-sj9m>i8^oans*2CeaF7F%1S!!5kSQTp5|u$ba4k&w&dhI`oNfRv4*%| zjn{)sXgqi6DPj}6u#*L&)Y+q=ewOf9y*0Q*;~)OWi%%ndLaoS=N6Gq*YX~@n75Dj= zKRJO~;W7d#YE|x0B5NQLs?2^lJLcOz*~w+woP&_uq^qfT4JCXW6EXHmo*Y2+T|1J= zTGDhaKi`JnYM#wFa%R&LOt`WJ4X)rTCBG`C=;iIKZ^xul-k+eoQC5+$HU&(6y*lL| zpWLhT1+0u7&ne6S#5!eXuM#jtf*C5ZQY0pmOHv?7W!MaFrtcHME*%ZBLb#Y9oGs z1$JTx&5~>~ZN{*=Y65zMYQkiG=s=R zsq}!~7l1EgkW_cdGPq-efMak9YK6O;hXS}fUh8BN( zTdf{ka?{mF@TH!`LMvI0$O-^4W`>p{&0}qu4$acd@Eqv1QYgLj<4AWFvU2tvxB8Fo z=ulwHjg&8bJ1GHkQbfa33;Dgz+V)@mD7HxO2e_abd7ou2e8wro+gjBzvh27*5LQ7w}+oz_^16pA#?R05Y{I4SvscgKEbS%sN=OXd(` z)l@5t`d0X@A++&TSVE&F(92L_i10Z8dKntT`nmW=@}v8GCnok$g#h5UWFb!h1``0K72F|p_Kv<(gGoKtb%Jm=ntpVj@ zE-n@6zzA+X-xQze;Gkk>FJ|~ueeKR=4Qrd2WvUooYd(4M26S4O{84%IYoSVf|NGR! zPE7JCCee*8!R?{~QhHP366In2xRJ30WWwPtAyXECB748{5DK{^Z8D zmZ2Y!Pur@F^Y!z^<{mr?#N2#cs@7oM5dB4!|9g|>$%&0#WV6130f!z9RPb;;3xUMa zay3{5yMXyr3H9Ry@l3TmjX`*%rFaSasX{D8_?hm6aaJHVH4Ba~jWGH9T%pu)9)Y&< z>Ju!spqnYUj$KT}RuL56!q%bcyv_1FedZ$hlIy)cN3&arO+6<7&ASMR zR2agyff3=9z@dUgj%ZW1U}27Fq!~YYlCS)wtGtm)ONY#H@dZxASVcclGWxtOWGkXxd=eaCXPGquQoSd zM3(Jb+B|~p1t+zy+!gJ?XBrR3Z_t%2D8lc{0TD-|n!xHzJGa>eBbcE(`QgN(${+0U zNTi1pP|S4^y0nzL^vO}q%Z^f^Odi)KL~jV|d&YQpuyJ*$S;p@QP04jD=m^AjuAtRo ze{kaWcQCn2dVwrGp`x^11QPd!!4WIfwmw4F_5|mlchUu%2U9`QY=f-rWokDHhrD{0GYWmIy%BLVU?A` z>?`$J_@SZu6QIW&I70;*dVte6zqRKTIVtSPQPJ%CdY`b13qa^+n(G^o@*Qc8GP32D zaPt&mR{lN4R~p~aVqI}6#+u+^t*GQ=?Dsp`vF(EF$`Uq-owzN03ahk~f`UYd3R%g% zsGT8XxB^y&bviw<&6F$WcxC3XpSCt#Z$H1OwNEgg2If#{njanlhvlT%cdwL4O!@LV z=&OCT8>ul@OO#R1=TF(@CRH6kR(vBK;IbDzKi1tb)Au*fDJ%Yhd_OcT6OFK%KJUFUa@* zUh@5qb@zYoxlUQ}7v%f-A>T2nI(?dOKdS?OLB5|K^8Jr>cTB2&0iCkqFUa@vL%w5D zb@DXfepUzmf_(oQ$af$T-km1g&+5QCUXbtShJ62H-5oP%|3ICx;xEYe^FzL42JN}i zg!@??_zUv=FCgDBkuZCja6hX9e?h*VAM*W=b$3i8d;*=a;xEYe|6cO_k9Bv<^nHXn zWyN2R@8^en$E51SX~O-i4*UiA{uhw%m`GSUO}L-cfxjT%&ky@?wiRtNrqeE$o`cT6NKo+jMS>cC%+@8^en z|6|=9GidLCPFe96J_^_rHLA$3(*F zX~O-i4*UiAetyXJKi1tb)Au3jlofwLzMmiR9h0g z=ZAd%W8EDyX#YT+vf?ku_wz%(V^VecG~s?$2mXS5{|m@>Oe8FyCfv{Jz+aH>=ZAd% zW8EDyXz!v1Ajrj{{`gxzk~KE!u_lc`~~@be#rMf*4;6K z_9xUSEB=CfKR@IMe;xEYe^FzL42JPX~g!@??_zUv=FCgDBkuZCja6hX9e?h*V zAM*W=b$3i8d;y)Z;xEYe|6cO_k9GHdk4#Tl@fYO#`61sisXBd{a6hX9e?h+g1>`#> z5;jf~?q_x2FUa@vL%#p9?v5F>KZ95;*E|neK{$?&fwy>2Ac$GTn$-yQo+TD;^1fbb z1l;v9h(b6yst{FCL&zk}hrN{K>fwLbGW+P8VN=vF_ zM>YlLrRRf44@Emk8H;iD9`MNUmlP97XAdLzh3$PMEe8_RTWx#}2V&)fygDD0zgB7B zlJMW=Sx}x0u^04B^K;ZPa=VTQePEY|s5(s40$!jR+1PmKY_|bCYeCe$MRYRAb1%}o zA6m%^rc9C{tK-Faequ(`q0A2ud?LB8vpoNO9wJN+ohm4E2m2h7@BdEUrwDgnu4GV#PD*$~*wcPa zChdB`hvr%pWe!5#1QHuJokW4h>|-=dyi1$t?G6^E2YrF}dbnNe>f25Z4eRIpd`t8V z^&uP((dy<&CrA{$2K%2VD(%(F*}=H~c(OG>8b z(zRTH%||ai(_?%`HG3zV?XDZClzj4bzvh|M;O4CnxN&E*G~3uOIOEXyXa2JxP1x7( zg1cYHWP`3{toz@3v%O(*5)_yozvO<4yJt^_oZ8Pdqi~mGb!Hc~aJ(3fn^aj+h)zMAAZ^?!A9?3{e*yW9iG=yng!{-zsXIf& z8v_G3-&lcbg&@>O$M%{dD;c}etyXJKi1tb z)Avu%Ww$KvgK`kgaR>1JsSpDV&FjEbXUNr#*HdN_3hL zY@HOY22&zRQpDz@Or{IwCVTG$9;OvGVO5pyrVUS8;?mUXQGzNk7-+|+S@mS&_zI6e z2){PwnhmSYnxrR9u2w3i&?)k#X7m<^&9=|f^M&+!X0GV|F2>o=P}Q2!sk3Pq6sTHq zjie<@>A@cWixB0o*d{b->=^^Ez#cd|@jIjiXm~eNdHHUn#dAS3rR(0@42(&BC~aQ7 zRjO(yhIxLey+*T~4Oa(qTH#MGR5W&yfhc3YjAyISo(Ss^+a`nHsnaJd_r9`QeTko=ZAd%W8EDyXzziTx}CfafJdvFAG^x|57}2( zSusIZsMvlmcs~lD_f#6{cwAojH8Nb&^wEc$L}>=^x15>m4b8j<`t#%2IX%BUo8H=( zzUOqY^f$~iq&i%4^^u5T(CDC8=9-&JQw0{qUe02U8yG-TQ-=w_%MfKX2 zR@jd<^!q9?u7bLX-1?$cu4=A%^Djs5o{hFu1&&UAdi%Dm;z&Qh-TnL9Urj%Q@fQ{rLh#}NTj=@0&A>tTq|mK9GZr4!WDyomtCEU z_if{fx2~H~dWrQbZE;Q;AxgTlMhyJm;}0b^xW!B12^t?Dy$qktvd5}xDuMl>`ON^} z<>Jq8^UU-}4M~QHD5+Gb{|541;Qqpi*-CmwXBf=aKnVs*X}w(0Wkwp2X{-2&(}++^ zR07pSA2u*FP}nv4i;VyO>F$_8`xlDkklgd&Dd>`sh+vTD4#V$uHE^^+rVJgiIXNUU-#P3 z@r}Y?ZO?9be-2o*T;G`w`n3Crc1}S1^Sk*^?g88RRe}3U2ge65foF=pxE#d~{rL0= z;r?)(#^g=gaVGHH#D8C)nBoyJLj@&`7B@8!6iHrn_-QnU+k$?p&WsLZdo17QJtmvP%1U8VHAD_-*{=1Jx1^xo^ z{f~8b%%J@p#WDv>-xVkvKN;ZBY6_62#=QdGF|25&w^@^93PL#r*o~kC>{k|yQJ%QW zH}Sd1O(639J*XJsx^Jw)cVH>RB<0eCJ6|sqlB;QIaDeG&73}-0%y*i>&*wyDNOdSajwvaRu#ZrI1^CSML;7%;C*SW~xdYQ8OS1ecayQ`MkF$_b78y@YhQWr^gywvQ z-v?B%w%H~dH)H_<&?-a|;v`MQMqSbA_$|<}TF>#yo>@ba@3qUDC?$Td zGL*VV*HC`!mCK+EEh}*g?5?sDI8-&Pu#Wc~S_Vv3MQi%5y%gtGv=Qd-U?(yLAJVph zYl^!=AK@7>X)0(biwFt}303~Dd|^^`4aIKw&gI}a3M)L~p-5g5?*Gcabn!#~=r`~` DQCKFM