From e01ce4f7914cf859bbd4fb03391cb16afd6fb4ae Mon Sep 17 00:00:00 2001 From: Joey Hafner Date: Mon, 28 Nov 2022 22:41:27 -0800 Subject: [PATCH] Add metadata during transcode --- docs/ffmpeg Notes.md | 39 ++++++++++++++++++++----------- docs/img/ffmpeg/File Details.png | Bin 0 -> 12217 bytes 2 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 docs/img/ffmpeg/File Details.png diff --git a/docs/ffmpeg Notes.md b/docs/ffmpeg Notes.md index 9efbb78..9cd2786 100644 --- a/docs/ffmpeg Notes.md +++ b/docs/ffmpeg Notes.md @@ -4,26 +4,27 @@ - [Get Video Info with `mediainfo`](#get-video-info-with-mediainfo) - [Get Test Image with ffmpeg](#get-test-image-with-ffmpeg) - [Batch-ify ffmpeg Command](#batch-ify-ffmpeg-command) +- [Add Metadata to File](#add-metadata-to-file) - [Transcode Profiles](#transcode-profiles) - - [Original [40.3 Mb/s]](#original-403-mbs) + - [Original \[40.3 Mb/s\]](#original-403-mbs) - [Mediainfo](#mediainfo) - [Test Image](#test-image) - - [CRF 21 [19.9 Mb/s]](#crf-21-199-mbs) + - [CRF 21 \[19.9 Mb/s\]](#crf-21-199-mbs) - [Mediainfo](#mediainfo-1) - [Test Image](#test-image-1) - - [CRF 27 [10.3 Mb/s]](#crf-27-103-mbs) + - [CRF 27 \[10.3 Mb/s\]](#crf-27-103-mbs) - [Mediainfo](#mediainfo-2) - [Test Image](#test-image-2) - - [1080p CRF 21 [11.9 Mb/s]](#1080p-crf-21-119-mbs) + - [1080p CRF 21 \[11.9 Mb/s\]](#1080p-crf-21-119-mbs) - [Mediainfo](#mediainfo-3) - [Test Image](#test-image-3) - - [1080p CRF 27 [6,232 kb/s]](#1080p-crf-27-6232-kbs) + - [1080p CRF 27 \[6,232 kb/s\]](#1080p-crf-27-6232-kbs) - [Mediainfo](#mediainfo-4) - [Test Image](#test-image-4) - - [720p CRF 21 [6,314 kb/s]](#720p-crf-21-6314-kbs) + - [720p CRF 21 \[6,314 kb/s\]](#720p-crf-21-6314-kbs) - [Mediainfo](#mediainfo-5) - [Test Image](#test-image-5) - - [720p CRF 27 [3,305 kb/s]](#720p-crf-27-3305-kbs) + - [720p CRF 27 \[3,305 kb/s\]](#720p-crf-27-3305-kbs) - [Mediainfo](#mediainfo-6) - [Test Image](#test-image-6) - [Test a New Profile](#test-a-new-profile) @@ -32,7 +33,7 @@ FFmpeg is a free and open-source software project consisting of a suite of libraries and programs for handling video, audio, and other multimedia files and streams. At its core is the command-line ffmpeg tool itself, designed for processing of video and audio files. [Wikipedia](https://en.wikipedia.org/wiki/FFmpeg). [ffmpeg.org](https://ffmpeg.org/). # Get Video Info with `mediainfo` -MediaInfo is a free, cross-platform and open-source program that displays technical information about media files, as well as tag information for many audio and video files. [Wikipedia](https://en.wikipedia.org/wiki/MediaInfo). +MediaInfo is a free, cross-platform and open-source program that displays technical information about media files, as well as tag information for many audio and video files. [Wikipedia](https://en.wikipedia.org/wiki/MediaInfo). To install on Debian, run `sudo apt install mediainfo`. To get comprehensive media information about a file, simply use `mediainfo `. @@ -49,6 +50,16 @@ do done ``` +# Add Metadata to File +ffmpeg can add metadata to files using the `-metadata` flag. In the profiles described below, this is used to add a comment describing the profile used to create the file (e.g. `-metadata comment="x264 720p CRF 27"`). + +This comment flag is visible in Windows file details. + +![File details](img/ffmpeg/File%20Details.png) + +More information: [corbpie.com](https://write.corbpie.com/adding-metadata-to-a-video-or-audio-file-with-ffmpeg/). + + # Transcode Profiles ## Original [40.3 Mb/s] The pre-transcode data for the sample video. It was recorded using OBS with the following encoder settings at 1440p60: @@ -137,7 +148,7 @@ Alternate group : 1 ![Test Image - Original](img/ffmpeg/original.png) ## CRF 21 [19.9 Mb/s] -`ffmpeg -i "$input" -movflags +faststart -c:v libx264 -preset slower -crf 21 "$output"` +`ffmpeg -i "$input" -metadata comment="x264 CRF 21" -movflags +faststart -c:v libx264 -preset slower -crf 21 "$output"` ### Mediainfo ``` @@ -201,7 +212,7 @@ Alternate group : 1 ![Test Image - CRF 21](img/ffmpeg/CRF%2021.png) ## CRF 27 [10.3 Mb/s] -`ffmpeg -i "$input" -movflags +faststart -c:v libx264 -preset slower -crf 27 "$output"` +`ffmpeg -i "$input" -metadata comment="x264 CRF 27" -movflags +faststart -c:v libx264 -preset slower -crf 27 "$output"` ### Mediainfo ``` @@ -272,7 +283,7 @@ mdhd_Duration : 972629 ![Test Image - CRF 27](img/ffmpeg/CRF%2027.png) ## 1080p CRF 21 [11.9 Mb/s] -`ffmpeg -i "$input" -movflags +faststart -vf scale=1920:1080 -c:v libx264 -preset slower -crf 21 "$output"` +`ffmpeg -i "$input" -metadata comment="x264 1080p CRF 21" -movflags +faststart -vf scale=1920:1080 -c:v libx264 -preset slower -crf 21 "$output"` ### Mediainfo ``` @@ -336,7 +347,7 @@ Alternate group : 1 ![Test Image - 1080p CRF 21](img/ffmpeg/1080p%20CRF%2021.png) ## 1080p CRF 27 [6,232 kb/s] -`ffmpeg -i "$input" -movflags +faststart -vf scale=1920:1080 -c:v libx264 -preset slower -crf 27 "$output"` +`ffmpeg -i "$input" -metadata comment="x264 1080p CRF 27" -movflags +faststart -vf scale=1920:1080 -c:v libx264 -preset slower -crf 27 "$output"` Our test file described in the [Get Video Info](#get-video-info-with-mediainfo) section was compressed from 40.5 Mbps (over 16m12s) to ### Mediainfo @@ -402,7 +413,7 @@ Alternate group : 1 ## 720p CRF 21 [6,314 kb/s] -`ffmpeg -i "$input" -movflags +faststart -vf scale=1280:720 -c:v libx264 -preset slower -crf 21 "$output"` +`ffmpeg -i "$input" -metadata comment="x264 720p CRF 21" -movflags +faststart -vf scale=1280:720 -c:v libx264 -preset slower -crf 21 "$output"` ### Mediainfo ``` @@ -473,7 +484,7 @@ mdhd_Duration : 972629 ![Test Image - 720p CRF 21](img/ffmpeg/720p%20CRF%2021.png) ## 720p CRF 27 [3,305 kb/s] -`ffmpeg -i "$input" -movflags +faststart -vf scale=1280:720 -c:v libx264 -preset slower -crf 27 "$output"` +`ffmpeg -i "$input" -metadata comment="x264 720p CRF 27" -movflags +faststart -vf scale=1280:720 -c:v libx264 -preset slower -crf 27 "$output"` ### Mediainfo ``` diff --git a/docs/img/ffmpeg/File Details.png b/docs/img/ffmpeg/File Details.png new file mode 100644 index 0000000000000000000000000000000000000000..7748190003b0590ce7a86d0b2be62eaadfc1b7ef GIT binary patch literal 12217 zcmaKSbzB_5mM$>3TW}4*-QC>+gy0(7f(^lCaAzR628RR>!QBZO+;wnwmp8fl?(W^Y zZ{HvN>#pwVQ(dR3&v(ABDpLKuJO(NWDhvz^hN6PZ2N)PwSm=?53qT+(n5PnJ!<-(v48DS;% zHCAv|#)ed*VVMFQreXA0Oi3~W7^E{k^GNgK3CBi#0u6ml49l;e=8ZC(i>x(PbUEgE zU#>FVblbiL-l7RVP4K<-rHWYJJkqm9X*NQ$jk$TVD>e zDAi=d5XWL5RndN%p~y529K6s|H&>%vV!S7oFeqy^RGtHtecMEGQlL!bd?HcU-PV!V2`#5=81Szwjm6d!J0^J{qVBOyk)a)~k< zC3(|e&VlB_9;Z*rv>ZnEFjnuG;yikz&ku8dA0N9_!RtjJ=d6<4^%#r-t=}7wKMt>r zBn8}GFOt669gngTrC41ho2H-fx#xHl-Ndi$1PDA7ib84ext+=Zxos^jDu6kX9eptSu%e zEG)rD5+&i>eaEQ75rKb+eD_Yv z4N)$4m+!dVligVB1U9>5XNm+h$r)(3vRo6r{z=08!X7`)#Ynj~$2vXc*!O(j3<&>R ze{lEKhT|k@_EUQrxb^qiK7BEJ3_ccb?|C`HY`G9K*O}Lv`)M!MTiG0EbWP9V3TQcy z)-g%;=XPD8-x3Uji!H@Ittz7gnHq-@5wG+IGQXC%kB&~*-}Y5LsvJFx_d4EL*ML{w zJPvlvf9p37z>PKXkw41NJvtEeSzreb;vt*C?ek%_-ri&q20WQ;y|;FMjSc`l(>s0@ z4wQnxaKba>q^W1Gu3=%zG*V+=|Bxo3`WVh5QHuG`KvM`S_2q3UyGcqWeBL`A%>Sjv zUhPDe*I`A&)~x5*Z?#EqAQqghsj~z?Q&ZE`dfLI!@hc)?K>=caMIxzMzY@STnq#BL zWUn}|=0Kp!2@Vw)Pa*i^Ih13*_Lffd(J8>F=1m*WnKm+A}NJ7*jImFU~s807v|MvMIs zHcYR}iRIp{9f;(8l*%g;;HJHqAhI!VuGJYPOV!e8B1V)yPj$|?=op0nMy*XDPo0-3 zzLveEXu$fs=w^!2Em@1l0ROw3Dd%t6Zm;CxUT*@@n~g?L=o!zDeRd=Kfx?^DQV z>@JXRvyUL49fJ+q$*oXn@R0SFha7J3?Y(=LI>4vHcRY`q6+&XbPG)}V>s7UUC<_YO zmj;ZB`0wO=IIq5;yIIv~H56g-kn7Vv9HFi-zFlo-za$NcE??Wd7WATZUosLGkB)8k zUIH#ldY{xE@W%ygH_@NMr7B+Ce*ch7x!_n7@M2`3T*c~li22lICve3odM+h?6uaW@ zdYQF+-p_FWE7KX*mRkpTdAB|u>|BC{;pU5GFs^{5*eGAR-uekwwALV9B;(>REMVp} zK6d75U30wLDcuKs$v#gu0K+qq_2odHlBPcPvFq*qaxlG`m?w-c^OSRYPD9+0-yiR5 zdXFRPfwKAIOH5Hj8j0&h701pl>L8CBXN3$m390RL3oZ}eS784*%x%}~!$G>V=Htj0 z$EvrUK>b(=PGbq}gzxX#eO4S7`?+OMjw5GFSvTzu9{b|EvvY@9MulS$&fO%HCY?B$he4?P>S{zpRkL1Ba=m5KVtSczZ@}D?OxAVcL)m4 zGfas+UbZ+!Z=^83cDjp>tCFc`0GFhFV{AmdQh5$Kw_w8J!X16CTWWO0#YZr>cGUJe zAxAm5r<#`8YimDsCN>tFa_}qOEFLIAVx?w88J0~v1;|B4uS+OepCcH~*EMHx!;pDU z+-y;5Guh@`{?SWUKn{@tAUxU=Y2HvKdp{XtWw(YfHcAZbL`Zf`3O@%w+~W$Ut!paUJ6+v(dTV&U z*%TEjLzZ!VEoiMXGw{3eH-a<6Qmgm5MSLvA6!l?u8)NTPDmiX1rGsn5PL)VaS$8L& zBdxBhtmI!072`2=KPmUc(_+~F(=C+JrFc9IFr1b882pp)k!$1HyNR-@Q%e$lU6qKn z2Q6a`FVgRJCOiZQZ&bXY|HtxEtj^SUAk$3=F@A8RXx&+%d*K7n1s2cw3e%rQyKk!S zi?wbUvVM|7#m|Zxz*rAkD#dz1jd`JSlS4_#)V0tG(VdJUB}wCH;1YQIPqtiV55WrG z(B*=bSg|D7Q6SpNJEmzy?^Bfc<%{mk;jx-qK;(ap4M8F-jmp}M&_BDUAR^u4&17uGf zfBi+EIwNko92Z+_fKu>gylfNVf&LW4*E*D=3AGQSp0Qr4R%4gMicwc8nP?KH5lciqrV!+urtK5z&F~P`ckk;-eKHJ{f*|x zGyf~B{C)MG6>6uhrPiL+hFznn=n|=I*7E|y**&1(MQvi!>UlZJzfFLH{}+n>^__oW zRh$!v4Z9k|X%Mye@&31SH|EEpBDg%qlGNi4@ngGpBI~;X@ho;;`;)QVXB1#>EFZpX z2M3bV#x{M+{e_LE7ap8=cKmFm>CBySW*HM1>#6eQACaJU92P-;BwFex75dHR19n{n zofBN^Zn$2md=xk17rJAc5nBAbyx-yWn7jk4vd^ioNwHdA6G(;W!8gO({q$z3EcS|@ zZurcrsC%vn`18SQbO4pbD19KVY&BwBtGDCNern2BX6 z*^{^D8+p#^qT?sr)Y*PtRKt)9RPmD6Fyzd^YS+@I``9r zAwHC#m!Weh&ACo714)A|Dk;=feJ@AV0v@JZ!;wQ=aqSC6L=ofPKHeJmva5<^h5ao*aadD;~cNKZGYuCjh{0~ z7rT49ICQNdT~)?q!Z{PDZt>)4dFFZ&&hmUv*h;vZY{k3rb%$(Mjh-g>U`lxEx14Hx zRZr5mmug6gqfnw)+vJ3S=Tws8r@q9_!@Hc4M2DMyl@2d)jlkgCZ2#!{O zV3G0RLs8K+0c!R>Ki2B<)P=q$onhY*&RCRw<^%RFu(mONe_oSa?>wFbItI^A&GUk0 zez?&G1@2TfzL5-i@w{4{9Mw6YS9+0X~S#k2%?dNd) zwMPg1j60q2q9Tm|4Q0g}_*NdmU=7!{r{tcyW_sfo-^_}(Ct9FI_pO>?yn)Oh492{G z&rNwm`%Sk81@lnFs)OaJ$cI)ckNO67f{rl{_N@1-dS(wD;SC|Q_eZjN*d75kQK(2G zsgn(?b0$8GNza^5r`nU=U5>OU2t?WJR}btztUXkJbADPQd7pGIz8B_lkx{|nrpzN> zWWx4&@^lerl_(i;Y`5K;>m1&L?`Ap8bQcx#RXF2b|FFt~f6N4z8_61$pG`ZUH#)EL zW;C!2f*K&}$Miv9wdq|R46Hp!P0eKz#b3~40Ou(tLex)2Mb6~{^+aGTPPEM)NA$($ zat-pW$klu<;giRvh`0_RQH$jX^Fx*{l1a_^=NDH2;_AES5W5gY{xYuzWo%>O6<-il zKj80N`83(dN~@15d4(1GFG22~0qZ}LYkyl9AYi_lR;{R2qStdh717fX#+0>;KEzNy*NMX5bRMVS|oWL#iGz%gMaY@6%?q&G@M&`Tk zfj2*O@yOG2jNMg5cKlr6SqrFqd&DuOU2E)``v|+WCTEBZ-dQ4D)wA)H?&G~cG7%Ru zV=cV3%U}Ld`_zZW*Z@=^nxJle3}{Sc>G)-6f4I`vq{&~Osr)v|fdnz?<|l<^7y`py z3^LrSFSQ{yi4%cY+mFI$ zU$1(WoI3obRQbD1noa{bvbhZ5E<*FaH_6-<72pf(5Id9R8U(rn0z{j!KM7gx-PIc- zKU|}i*^D+D4O^nRELUt7TMvEtMO$m1>`9#xPEN$h!~)npcjC^r*{VUtpYOyTxp8Hq zL09abERHA90`;FS+E;b09aeR`9F$cd4xg;Fh+ltK3w(7x-;|yA`*yj36>v9e;1t?H zE!^kyM27UsnUG4`G}01y-_nkZW)D1;V=JVxSb~d&(H8HBjbn)rRlzpYc`y|vS4h2CO&CBS>3nkU3 zbtT^fkIRbujO>T^ph}#^ljg%p!={UVQm0Onc>+1T?mz*OI8EQTxq_U^qn1s`M9S4f z?gz&+#g77}(obTtu>od<^4}Oopw55J!}2R#aOg&S3O&yGRvNO8FOIAPSYI$5@wLk< z?F-Z*wW*hn5{w+viHarmf1kIZ$hU!zF^ELz>%7q&3J!RJe0yBpU1xU)E>fOCnPL>< zRCKZUd{(Hv^YC0($?@0Ul6Xzmvj*ZfHDDC9qaYmjE(R99Znr2kcs@+@_o^>H2>cu2 zYt3!7zOFr=cyL%wlVZRunZmX#dteu9`UY)AqRga&TtHO5q5sa>|4z!gqCoxkzQs;K zaK9sJdf71wm3;g5ZuGTZ>)b*+)@b{QFG8UcS{v~26G^mpb&#Epm5a}|<}S%8206l% z*A(R~FcznbbsKL_STgVlSCuLP23Z?WPsNo=RHG}Rmy@0|R`FhogC0rp?tMJT8Lmv& z_m~FeXpuZxzjzsV$xfh|J$AZsj4mtE6kJLMyH-@&0#;d$H7Gpc54CCiLj~qiLaV)NvSg!(64I;AH)<2WQe~F`eDx~q5)cx`p zd&BuOQ&WO9R6#_z54TKmFHEBr%1`}--*lPQav0-~?gZH*QgrF?fWP1EURWFx^3L{W z9@h)kw3QylB7jUtK)1nYTQYD#LvJ&G>#nssb)qfV3HeUDa{L#j|8`drxBhAH0a?&^db{63<6G0w z`q4t|g_y`$_CS>DFsd3mO#=Yoz)_}31b1u6XgDJ?1Ce6Hs%2(Cf7bs`V=e)}ei2@1 zx@x67dpfTX!fo3#z=>0l^rgNm{2t-cNEGDLn zfr>-b?JLL5p>|nFR1P|uTAauR7pduZS)ugrKC>o_OPIuer<-MoM)e9EveZ_rf7=W< zidVIb>QHk?B4gtnDLah%<`UttpZ7Vd&k?V>_db7&^fDQS7i1I>LlQk!Y`OMzdaKe2 z+3Fh-lthN$gre@suv z0;Jxk+R1IVFUud3Ba0-pWc?=phV+uOgD2ifYxNrzd7?e4X1Qa}=Lo6EKXac(@HOF8 zkpL{eit)0Q-a+!Kuve5-Pg$$0;@k5OG8M82r>7JfGU((HdUCu)^=O_Au^iZ$&T?0& zA*qNQQt16o8hW2`$gN~z1<53w)-PGBA_h>d=OCBg&O!=Z*h}kD;#VnKZ_yjQc8U`- zly!gb6$SLZEzX>^LR`;vh^Zb!BT0n0oQ7Gi38<$(EH{8QV4cMtrR&6k{WJ;V)?LAK z)!FUDSk3E<#c3Dgf>#LB}qyz^hGK3N+X5S#q?!sY}3Z<|A z{TJIQfp0)g+z@v7lE7)g+nI4v`;YeQ*~9+l1ogYMr0fBo{lPrAGH396Xe+J4UcSoF zWda?pzH7_7+nACu@i4sAyE|7eKxX>8o5+d_otp~*`#dy0<0+kBGfa@F5rgM@p>Dst{*laDj6g|Jo|Zd~0Bo_w|l zY-u7kaLN(qD;HYyUY6(=R`{39ub?@rfRAhBCbB%E5%u>lW+E zk}ud8I7)jSw9vTj4dpa0!T&E@`0tUFLr|c$-{UvU+BWv5K7Nd=vE*s2p0-8!%@L9{ zTCi`4v}0sqXK^r6Uh#I0MYm>?muc$&>~>~*$nN)Ai&zhRHz9Jk78+|&c{N}}QLk9mA_H^X#&ae=ImoaDt1yz}S@1=JE4R|=d?%-k6DS&aK4 z=A&8$pDdlNVm*dwu#7RZW0t5_vseWWEk6|+kDhtgfg62AQ23;`Y>-s|^H^V0Ik5;v zW*Ko8oOC7?2~0S?jtQgT@qM6ecsEaGJ?5>sVd0H)@J6#ke^Q_!Sd~CrDrgd>c=R~g zj6!p2NalvkZA4z}3godz?n~nQ%D+=%T<{%1<)q@4RgylMl3H>MskJ1Hp5?DwMrcky zq+O5bofc*~NXe^{oP9ORDUl#tnBCZS!RvB?ez3mVQFx4+cb4GcdE%d}K_?S~p+l5S z`FIxpkh|}&qqmZ-6|0OpoEUyJoIS(%Bwu*;6nAI((|K2E!L59w$602pAuJf2x>wM@VzmDOy zZ=K4Yf)1QzD^EO=ZRMeyVs=d$5i6t!Ht2uyR%(n8a#V)HP$!b=ewtVo-2QsDf+?=p z$lNvu7EeCE)cg+W&l^p;nQ?BByfkjm4DYKfYZW?J9ToIm)i*y=tlK9^cQpb~wr!=G zq2t8NIxBLBHf|8jGCo)AfyzKr9x_b0$sE{ox00cITVGsciGBFmC)_s^;TlWE77viN zV;k0qbBCH%fiHqRiUbOhl>vGE@Cl`VxgdvKlTeO#jZyw!y;4DHk>zYYJXiOXK0W=? zK&4qxyYnFpGQq(G$P}ty!e$sZn~ko_XU zq|rFc2=&@KodHK@JS$S;@ZM`W28^{AsHneNgXSaT%UI}iOCb|?25*$h@-LI!c)3Nh zYX)L)R#2?OIw=*Q>v3>h)rmWzE-YZQLRf)bFcB$;`)cGJ9A~36ScipxlqyJjO83k$ zNr0K3c3VsEMrg@XvP65 zb9<%)uUL3f2Y2sJDLS=zoiP3T_^2Qg&MY|n@quFMW~0-rrqQW1MSRkGxb|{s$i{&0 zq4@-A+Mg9Ng+&Ixo9_{O3+6ika5$8o__G)w6I`lc(yDu#6L!k$aw*o;cGyRhA84N} zk(Z;j@a*^eyrHAXz;3yh2l{Co(@XdkE(C7KTk?O%Bmb$$btA~eUW1`R+#|94j-k*- zc6OHV+ww0c>x8Rg0$fofr0C)Uf$NaL5l^Q>^D5L-vQLgK7Wlk;L>t$kQY4ymzz{*m zAcLKQI`luisq2ZRktW+Pt?%|eb(}BZ?dbAltL(hW$S~V#+(J$)lVP-TFnyW^1-Mv% zl-aoFx<&pB4Z8H#WVHy{$8nK5<+d#mfG!&3#V6Wmg3__jMdQ$w7lG*usA$$OM`L8x zi6lx^<2Z=Y**NlY=t^gofg8OEO*j|6*7ancs9=C(#Ims%BMLjcJrOju6W^;Di_y*F z=!wWCVl;65sFeTlSmlg_NSiD@_I+rV zp2UQBq}G2F)$VvD1jiyyLQDYg6aQGp|5s7zFCG6&qIc%$KeO`G;4P;3S}cBbHrMmQ ziUzhRj=y2BgG!mXRivL;`_af}cTdkaOE2)fz-D9e#q22jmXwE|@=7x>;WyD_H7}F% z74T)yLue?8<9}IE9@;K!5p+wcU&8v?R?$YF`!Laj4HK9Y2WPk0qi0;ZeO~9khuc7y z>$!L@J1jQ4#Ko+({iedFWRzCJK7UA7%YKG|0**5H&R@6e`e$&h^*AbFKiZmCIYWcP zFHh%`W!R&~$#o7IKANK-lR7I_OYs%AxZ|rc7zl__4sMOkEUno!^rxp#WO0Rl+4vx<$iBpFVj^Xp`eUM{Tw)S^54<CTB7!gM+5LOp$f=#oO(hWuDx^UWl89>^jI@i8o*U z%B_i`XbwAjAEcE0GNDFw$GPz3X9J;x5B0jcW&!HKK!e^ye}tN7gl=+sIvt?<51CfAE6qPZG zV`u4_;S*4@aMbv^DeMuSU5a&XYA7rj;znXQ)3L6S3(JK!Vt9l5SGXT_!CdD8eF;st zxrn*u6CZ+YIhCxu5fTJxa)fZ3b-AycyrF-Eo)zk&XA}((cS`_NH;&5n4rO5GC1{Wg zM-8ORRD<20;q_Z=wk0N~NUc=D9Ts0+&cy;RHucEdcxZ1O%CH9`P`Z_GIN2?y!+0dp zas{}8)Up3v4~8l|Tt;TSS>et2+N5hdfB1H3xZh?*z)lc^*fVD|b&<#yLqw*(S2zBE zz)6=F8Qh4|tmGb={FP8XVo5kt3aQOXQB^_Nre#x5`gxrgG-i_T=Ea5DGe7-kXGf}F zebb9uSrg)$rwFrX_aOvcW>>lOw-98|Eh}8;4WInN9kN1vdWt=mT+$Y%#d=PF{gT=_ z-A?2W+EHum0shU*xm}|tmyCuvu1%Q=pIM}++{mw-DX&uL4SmdDhC91%YEg0q`vpQM zJG7mydM>@(H}%D8Xl#Rjuz#{Drz;q7D?Vu7Y$WuzlZe(yz%22}A`EzRwt+=Fcsoo; z^?h@sm{{~MaKqNZGd-Eg%aLDKD#7X_Eifc%LkyV zP6J@w(;mjsVfii@E1xZK4}B!SdwTOomv#?Rwaw;Y?5uF*`hfUH^hmh|-SSJ=@tooEErI%MESlsw*nmk%TjPHPGBGYhd>)v;Sl?ADRIue>|@Zywv z%ogR=^QpMRL!HqLvI2|dy()2EFV$1KG2JiRvT&?-(m|J{*KV)7wAn7$V6@fNAonAKwrg>+4MP5$DFd#IV>Kal56k z*e^FS^;cfAl_Hcr8E=Xv{PC;qXMna|&0CN3Y=f*pdnh)Y{R_3$mbtY^?U%Y5j$XOf zM+sZCgx8;M&Y=8tXw|FGGtlW^iSRvrhrj-#9%>tCe=l2nn&#&m1)F66O9M*2Nzhg3 z7`v!n&C3f3Xo41NDcVo=DS8FAPdil-DR75GugDY!k_t8-(z&Ot>tOb zYd&rKm^mO*&Dq3E&+95>5^pl?(<4v87;8~MILRh{7P{~6YkDN)ZnUcw+>itK=Vutn z7}9^o{eO|P{$qpR-wM7{5=%)Xs~Kg9MDaI2M|gTBF4FYzv<@t@_DkqQsgs@VgfMLs z=LozmRL{{Lym7DQ->KsyD6lw{f2-KG;<$d|Q!{7!xXvK$NrP>|(1%AOx64l_z`td) zp-A2^7js=J;>D;0<5Ir@H8l!M=WCL#f1?H1CN|DaAQmMx^X(d>agwSjyzGHnvS$Gc{wV5_ zB!yRx(BV^hTlJ-_%k!&;=As9komOq*P6n1>;0Tg8osJI6{!{h(sv5IVvS8KmbXod{ z%0gC*mhwg1@6b?y%yKG86IUo1zZ6YF7uJZg=6XFPV8EkWO zTZvD52Fm}rg7fd=2q{3k>KntUai8np#Y8R7`9ql8(l((#RuwvShThX*H^`15QQLd% z^fpn&GGWvr#iuHrMo4{ll!JnIr(Wq-o1rOi7JMH*%P6zEt4qDL6758yTk+G((wHT} zN`vBh%XXA(1993!@t5l^lZN5B`0g6h?zB`h$%Otv+SYf?Hn9bHmt421fULd6kL3zRE9nSZ7zw(~n>)?9&{T1>BY7e8Znh}@ct zYN&a4y6QreWPLKcY34OTa;#G?GyV0n+L+NGqdeYXl`$SE3IKwrXK_Y-c%G6_tH)e3 zF0^@RUN_U@Kr2+}+SlZWa-;ceXAPUK`OuaM%?PJD6^!A;noFcX>g|cXP7qr-em6VD zNU@$+Ela>??r1^cvN+)Zw!my?9H-?*Y@if9ZOslH%-QUrYN_6#&sBLDwl0xC zf(@sdu>L5fi`}O#sQ){rm847Fg)PDvlr?_gj_c%9lM(Js3gtsY&3bO8NJ6^Q(p0wk z-o)}=ui{j6oAzbQ3ze?>HEDyVdyi;=zO%XoxJg@FzKKV!I*5>&*-WhbCL*8|jL z9ovt_&A0!?0Ua zP00TQDSlr|Shn_Q%B3frN)>D%aQT#SuboR&%(OKBXRg4fh9Rbk1iB>@7g*FJCL_`D zGKUibuVA4XZGT=elh^+NsMl`yen1ye%vySBra>gm`^UJ#EXjn0ZB`@m@x7k`{3o3Pj@KrDoh8QAVcHvGXtSBSxRv;(4x zqtP8<#bs@W3HD9cMnmWC95Y#kHUN4qGx$hiZ3wmRim=oS^(n29_&AB_{DFaPA*71=S`E+$Z&ZF8ssvP{LX^Ggq}_`P!QogshE3^iIe+l@$V)!u4u{*_Zv< z32H{qbNX2DQP0!>ckw)6O|cSH#5e2|+ATBFBgLJxJT4CI!!)jl(Oz*fKr0BGv-;WB zeTSsTN%b2t>|E!rYMkM)(^Bf5uDQR)$meSnK-&ZnuX~lzlH#DP