diff --git a/.clang-format b/.clang-format
deleted file mode 100644
index cd04efc..0000000
--- a/.clang-format
+++ /dev/null
@@ -1,2 +0,0 @@
-BasedOnStyle: Webkit
-ColumnLimit: 80
diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index 6620857..0000000
--- a/.dockerignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.git
-.vscode
-testdata/*thumb.*
-.directory
-debug.test
-thumbnailer.test
-test.exe
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index fc762c9..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-services: docker
-script:
-  - docker build -t thumbnailer_test .
-  - docker run --rm thumbnailer_test go test --race
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 52f8059..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM ubuntu:focal
-
-WORKDIR /app
-
-ENV DEBIAN_FRONTEND=noninteractive
-RUN apt-get update
-RUN apt-get dist-upgrade -y
-RUN apt-get install -y \
-	build-essential \
-	pkg-config \
-	curl \
-	libavcodec-dev \
-	libavutil-dev \
-	libavformat-dev \
-	libswscale-dev
-
-# Install Go
-RUN GO_VERSION=$(curl -sSL "https://go.dev/VERSION?m=text" | awk 'NR==1{print $1}') && \
-    curl -sSL "https://dl.google.com/go/${GO_VERSION}.linux-amd64.tar.gz" | tar xpz -C /usr/local
-ENV PATH=$PATH:/usr/local/go/bin
-
-# Try to cache deps
-COPY go.mod .
-COPY go.sum .
-RUN go mod download
-
-COPY . .
diff --git a/Makefile b/Makefile
index 23b6e09..2d870f9 100644
--- a/Makefile
+++ b/Makefile
@@ -30,12 +30,5 @@ cross_tests_windows:
 test:
 	go test --race
 
-test_docker:
-	docker build -t thumbnailer_test .
-	docker run \
-		--mount type=bind,source="$(PWD)"/testdata,target=/app/testdata \
-		--rm thumbnailer_test \
-		make clean test testdata_restore_permissions
-
 testdata_restore_permissions:
 	chown $(shell stat -c "%u:%g" testdata/alpha.webm) testdata/*
diff --git a/README.md b/README.md
index bdb4a40..aaab76e 100644
--- a/README.md
+++ b/README.md
@@ -1,39 +1,25 @@
+[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/license/mit)
 [![GoDoc](https://godoc.org/github.com/bakape/thumbnailer?status.svg)](https://godoc.org/github.com/bakape/thumbnailer)
-[![Build Status](https://travis-ci.com/bakape/thumbnailer.svg?branch=master)](https://travis-ci.com/bakape/thumbnailer)
+
 # thumbnailer
 Package thumbnailer provides a more efficient media thumbnailer than available
 with native Go processing libraries through ffmpeg bindings.
 
-Use 
 ```
 go get -u github.com/bakape/thumbnailer/v2
 ```
-to install the library in your project. 
 
-For a comprehensive list of file formats supported by default see
-main.go:Process().
+For a comprehensive list of file formats supported by default see main.go:Process().
 
 ## Dependencies
-* Go >= 1.10
+* Go >=1.13.0
 * C11 compiler
 * make
 * pkg-config
 * pthread
-* ffmpeg >= 4.1 libraries (libavcodec, libavutil, libavformat, libswscale)
+* ffmpeg >=6.1 libraries (libavcodec, libavutil, libavformat, libswscale)
 
 NB:
 * ffmpeg should be compiled with all the dependency libraries for formats you
 want to process. On most Linux distributions you should be fine with
 the packages in the stock repositories.
-* Ubuntu patches to ffmpeg on some Ubuntu versions <19.10 break this library.
-In this case, please compile from unmodified ffmpeg sources using:
-
-```
-sudo apt build-dep ffmpeg
-git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
-cd ffmpeg
-git checkout n4.1
-./configure
-make -j`nproc`
-sudo make install
-```
diff --git a/cover_art.go b/cover_art.go
index 80368fb..9a3002d 100644
--- a/cover_art.go
+++ b/cover_art.go
@@ -5,7 +5,6 @@ import "C"
 import (
 	"bytes"
 	"image"
-	"unsafe"
 )
 
 // HasCoverArt return whether file has cover art in it
@@ -15,15 +14,18 @@ func (c *FFContext) HasCoverArt() bool {
 
 // CoverArt extracts any attached image
 func (c *FFContext) CoverArt() []byte {
+	// retrieve_cover_art returns an AVPacket struct
 	img := C.retrieve_cover_art(c.avFormatCtx)
 	if img.size <= 0 || img.data == nil {
 		return nil
 	}
-	defer C.free(unsafe.Pointer(img.data))
-	return copyCBuffer(C.struct_Buffer{
+
+	buf := copyCBuffer(C.struct_Buffer{
 		data: img.data,
 		size: C.size_t(img.size),
 	})
+
+	return buf
 }
 
 func processCoverArt(buf []byte, opts Options) (thumb image.Image, err error) {
diff --git a/ffmpeg.c b/ffmpeg.c
index ec3c772..82324ab 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -6,12 +6,6 @@ static pthread_mutex_t codecMu = PTHREAD_MUTEX_INITIALIZER;
 
 void init(void)
 {
-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 9, 100)
-    av_register_all();
-#endif
-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 10, 100)
-    avcodec_register_all();
-#endif
     av_log_set_level(16);
 }
 
diff --git a/ffmpeg.go b/ffmpeg.go
index f001536..5e9f0a8 100644
--- a/ffmpeg.go
+++ b/ffmpeg.go
@@ -140,7 +140,7 @@ func (c *FFContext) Close() {
 		C.av_free(unsafe.Pointer(c.avFormatCtx.pb.buffer))
 		c.avFormatCtx.pb.buffer = nil
 		C.av_free(unsafe.Pointer(c.avFormatCtx.pb))
-		C.av_free(unsafe.Pointer(c.avFormatCtx))
+		C.avformat_close_input(&c.avFormatCtx)
 	}
 	handlersMap.Delete(c.handlerKey)
 }
diff --git a/main_test.go b/main_test.go
index 9930a89..44c3df4 100644
--- a/main_test.go
+++ b/main_test.go
@@ -51,6 +51,7 @@ var samples = [...]string{
 	"too small.png",
 	"exact_thumb_size.jpg",
 	"meta_segfault.mp4",
+	"gary.jpg", // 140x140 px image that manages to crash ffmpeg
 
 	// Exif rotation compensation
 	"jannu_baseline.jpg",
diff --git a/meta.go b/meta.go
index 6f82b51..4e798b3 100644
--- a/meta.go
+++ b/meta.go
@@ -2,6 +2,19 @@ package thumbnailer
 
 // #include "meta.h"
 import "C"
+import (
+	"strings"
+	"unicode/utf8"
+)
+
+// Convert string to valid UTF-8.
+// Strings passed from C are not guaranteed to be valid.
+func sanitize(s *string) {
+	if !utf8.ValidString(*s) {
+		// Need to replace invalid UTF-8 with a valid UTF-8 marker
+		*s = strings.ToValidUTF8(*s, "?")
+	}
+}
 
 // Meta retrieves title and artist for source, if present
 func (c *FFContext) Meta() (m Meta) {
diff --git a/mimes.go b/mimes.go
index c0c6096..6b62f98 100644
--- a/mimes.go
+++ b/mimes.go
@@ -173,6 +173,8 @@ func matchMP4(data []byte) (string, string) {
 			continue
 		}
 		if bytes.Equal(data[st:st+3], []byte("mp4")) ||
+			bytes.Equal(data[st:st+3], []byte("iso")) ||
+			bytes.Equal(data[st:st+4], []byte("qt  ")) ||
 			bytes.Equal(data[st:st+4], []byte("dash")) {
 			return "video/mp4", "mp4"
 		}
diff --git a/sanitize_go_1_13.go b/sanitize_go_1_13.go
deleted file mode 100644
index b190e17..0000000
--- a/sanitize_go_1_13.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// +build go1.13
-
-package thumbnailer
-
-import (
-	"strings"
-	"unicode/utf8"
-)
-
-// Convert string to valid UTF-8.
-// Strings passed from C are not guaranteed to be valid.
-func sanitize(s *string) {
-	if !utf8.ValidString(*s) {
-		// Need to replace invalid UTF-8 with a valid UTF-8 marker
-		*s = strings.ToValidUTF8(*s, "?")
-	}
-}
diff --git a/sanitize_legacy.go b/sanitize_legacy.go
deleted file mode 100644
index ca23c6e..0000000
--- a/sanitize_legacy.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// +build !go1.13
-
-package thumbnailer
-
-import (
-	"strings"
-	"unicode/utf8"
-)
-
-// Convert string to valid UTF-8.
-// Strings passed from C are not guaranteed to be valid.
-func sanitize(s *string) {
-	if !utf8.ValidString(*s) {
-		*s = strings.Map(
-			func(r rune) rune {
-				if r == utf8.RuneError {
-					// Need to replace invalid UTF-8 with a valid UTF-8 marker
-					return '?'
-				}
-				return r
-			},
-			*s,
-		)
-	}
-}
diff --git a/testdata/gary.jpg b/testdata/gary.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..08663207f1b620fa1b9b40ada10dbaa897a09916
GIT binary patch
literal 28651
zcmeFY2UHVZzcw00K&45SA|O?I?<FeI4M^`GASJ}mOOU1_AYHmrMViz|mo9`NAOfL>
znjj!Op+*Ss<^P`ZzUSO;opske_pEi-y6gK-)+Bpo_Uzfuv-iwA``N!-&Ri}7Zs}_3
zXacTWxdM1f`~WV|w`w(DU>5)Y1Of;F0D$X&tI=S<HDc-taYJg89Y9X}r6g|i6ITHH
zCh_a~U#Y*BzZv+Ofxj8}n}NR>_?v<MBN-rlM*_G?M9u&J+<N)$+P~6iDarpxlSoJa
z04XW|k^T=gaoz7P#{O0l|3~(lzd`@az~2n~&A{Ib{LR3>7?6^XlvI*XP?DD5l2lZZ
zQB;zZ0sL3{{_-qthPwIrc`1pDd-#euJo9vP7IX51io+bd#3jWf!~rTmn3sbS#MzI_
z(b*O3p(?P~+9|*Vex@p5E(?+Xd8s?Qfwf=wI2*svH*tCaaZ-FH092#8sRC1iLA{{P
zehyqP=yMNWC73GrKT203rvKV4&aI~6^UOub=#l2X=OAvWa{qf>0s{lZ0;R<~eO$#Q
z6%`f5C8Wfqq(q51M16xi{2XAS9=<&PUce(~Und{1mmk>EgX^yX9UMLV{ZzUA{lU+a
zTpV0v9iKgu6?JrwekLj@`OHDo;hD6g=rd{QXY#U=3Q{hTj@<vOAk^z$m;W!RAYP9M
zNlD$u*}>2G5ph-fi&9Yu1yN}UlYi2zBL2VSQ4#;EQva!v{|5U%?f4(n8U%Lo@$~g{
z@q6Ot>F4>M0YLwG<R9(n_1EElv?vkA|MeuLzpy-T^7aS&I6wP0Op;Qfk}@Vz(n?aq
zJ|w9k{(pDEe*y3xkckbeMr7lk-GJC9xc)y_{=Ue6i{!uQ`kSu*76bpS%zyW;zv=pK
zG4S8Y{CDsA{~2BXAtjwXi25;*C=@T}0P25Dp#6`QzY6&u74X-|m)`)i*8%Z>c#<pJ
zfUC4uNNBHI_5e7EQ+K5QR`x%|^_8n6*GS38uiv;yLCnx_3vl%c3CY!KB&4L*h%<dx
zLW#!#*Jw%U?n*u&qc?OQ=k{ihdX-#oo#$aq7o*V_mRH)*=k<-7Ow6}gSo!z`?g<LX
z$jZqpC@QHx($Lh>*3mUKF*P%{u(Wb|=Ir9?26p%L^A8Aw1-*!P6B!l#HYPSDH7z|O
z^ZkdcPlZLrC8eLs%4_TD8ycIwHn(&mdV2f%zYh!|$0sJIre|hRXw1s5)wT8C8=JWO
zgTtfa6a1gkzi?dvko=3Xe?#`a;i4ttx_a#z$u;u7a9z0?NL)#1uaVxBB%^y^NbcZG
z&n@-pI>W={f|{-yJkmy3Mn|8qn@qeiXg=Iu(Efq!{~55?|F4k!3)p|)LIEgAt`HlK
zgcbk<oW^0M+WkY%ltTRLlA#Z6LYVO%*e(GdXM~jomWQ3SMH>G+L7WxQ=0yF5tc&CM
zd%Nc@0bQzXWXFw-5???<!ZE4(;~k^hdAwr<>U`fCmxQ%m)f5GA{mN^F%!Wz2D~V=q
zUjlI5{1ZERO<nmh*LmoaTbr=~)o;sbrBi;idJ}B&q=dV}mp^1qg=2Tm=`g1c7&}sB
z;69fCMcM}?_&8ARTB?V|=R~^gkL=H!iXmD0Cg3$`#9*<)WST8n%w)$*E@WxZTAUAR
zFnrHRLNVbvC68GG%(yiNt)Qcc_3`l#E%wlw)2lmry+7dTL78dx!n&Ta>sj--U!V5M
z<D9ls>nrTupT(ZJm}ro`FE8UcfTPWKZaAM=gdvw$LTHxtR5{j{#lOMHXMeXu$9x<+
z49e~gr$4IluVPx!Z_gM&iqrf)wz7khW_9;$RwsNWv#_JY2ND?dj*$&m^H-V2;dl_{
z8HXA^-BlWYV1dkf)`<;Ad_W-h;_356tNim>fT!2QIy;+?j-Bth<Rz5B;a!}5KuQ?r
zvGp`TJ<yjisuU-T$!M;CX7HQmYh#OZGoxfQv~H5z=U6h&m9Ulni4XnJ-64FX_d|lp
zVj{(rm>y)*9id70htPciSA}Lix20!`O^ul~Cm;Hw+7t+iy*QUpb#kGgVb5(sUOGf$
z>T{Mqq-?loV_&&Hy+PHgCC>HE*@KYV&DixG<)rP3N4Da|!XlDd4sJF5VgV9AZb7db
zaQ#~L|MklD1Tpe@tR$D=G_r*m#+U<g^+1vf1oD3Kji*hFE@OckoWnc8Nl|K7Cqopm
zh%O^=J{=GY<Zyox7P$<MZt<(c!TdI>A}~vw_6YWvPrsE^YoNN28@w0D2{Wd|+jLCe
z)HxMVhflD;?ha1uMFWlu(Z|6%ez*lwQO5xJRaIp}Ez|R#<e`3|rtU$XJH4+rGraaA
z!26MF^6Fy$DSu`>;{jzI=>zkghm9PWHNEE0YWH`B`bPP)sXC3-;kV7Omdn1nUvq3W
zMCv#Vr-s~qn)xDr>dg+`N-<B8t`7<-9Fq&N#-*ao5*Kf^BU5$jro~mP{fqHDTBDS5
zV~rKnu<BDPsXkh+mqC(Nl}LAa`m0uK5W!#lgW4Ct;coDkVN&PsJH+vEXn_PeitJ%A
zVO4dF>B{XNR`xN6cl1fK`Yn+v=ex&?uKCVVDoG;d0jU~dQvlB2aTwr^<(UYcWF`OQ
zPKXmO0#Unh380ZNV8r+Bk02UP;qh>`zSDRwycQzsQDYw4_>lspb6loMuP3V~#$UAc
z{@UDHqH!#t>k{xfA#941EF7Yo6nzY&Yy+<F01;<E#@lVqm^(cB*g1E3t6wdO^~jC^
z)!vH+v1oS@cy*EWn=fDW1`2{<9YHgf03lcdMh@JQWBqcl_&R1kq>ij?@&}*3+L+nr
zLNiIzg<@Gf^piM9@K(V^X()AwcrTWQ!o{+Yh9*7@pUtda`Q@i6PgJA`qoTux-i$&q
zYpPNE!XAhDLT>mr?HL0;>k@!aqdu=B*j8>Tal{2xZH^LzYOqxVCREKtz4h$jTs|En
zGlp`@^Lb`QQ^2W5?3iw5-lIBqZRmpNuXAB!hfIh$&K+Mqa3Sr^TJoU~)?|fk3(R90
z?cl_}*xywZe6Ah}w;FAeKK>)tG(SK(aq7SNDoCAwCRfrvHlL!?;}VdVf1}d{k~ABE
z$O?b?47=r?$2GC7;#^_5)nq3!T7aYa*3n)w)?+o9k?cvyOcMaDE~(9eT}%tp=6>A-
zIw@QNp3}r$@JFD<yB2hZ5Q{e<Cpduwm7r>vfI$Z`<WA9MZQrz2an)McwN!Uh!ePK}
z7RUQK8`;(61C^O&9cOrt!nioXr5Q?7F+>s7i{8?h=yQC&!me7Su)sgj!N_>+*N$_*
z(M5ZY7E6?Swd<QS!GTU^7L&MqX&vF>Nq_5E+X}0tX8Sq;#IS%lu0O7W&&DmoJV1@p
zdXH>_brDYaqN5Ow&o<JY>uY(_bee?P6E`-fb5l_{p`TX(do<j;`{-7yIZ};3oD%k+
zK9{=NllAwGw{x(srze^%*X-=^=;0i9;hBLYk`7V<^LxMRtOsMPKZ^_ShxJ@>a<wb{
z#z8f%b_XVmSiFwp1J_>ysK5i)vJxiDrZQP`(JuKW(+x6B7FBoKC*iAk7x@0SM&OyN
zHRUVf=<TV~!^L~JZR4&06|HJJuod5A{eX-l-o882*e&3Or_8fe@gp`{Yt#2+f;@J8
zTGu~yvY51|dLzpdR(2RfSvH%qkW($-z=k6=kGA$=>t-t*W#Ps@whhxBvB&$rgLV>Y
z(4iDvtS7y>G~IcOZTMGir=^kgRQ6gmH7Vk>uuiMi#?eE|$_$iTt!TCTi4wRoR}=+v
zdcEoj{JqPJ3L}F^;lsOIfZb37gNVmCEyM^7*evTi1SGdVVtZzubCM^7l)d5s+DWXc
zY9OS1aEh|F{y<5uS=5_nZ5QiFAEJi^MiV~DcwU{ICxE6bwzXZRRw13#c<!FQ@Tq!p
z*B+%UrN~*ebl1DkescQ$Fn(kRElwH@e0ya3pnmR-8SrfwZ6|CwE4=<2iZ43mId{rE
z#`ovM`$j9sF~H1(+4$a#H9=r0%rw_*NFkfz&9QEkNS_{s%nFBxYmo6Oa#z=VLqpy_
zST5<iio+1L0k6fDh4B`P7%=MBG=>`evZ>!Z(|Mj*2X#N4gXEiMH|wiwJ)03oF5MvP
z2giBpx2?!(o*336>lX~HCO!NT#I?r!=5}1oCaQO2epiXe42z-k79O6inKxa}I1ca{
z@s_4fPvlo^-oLJ<93m?iHC3JSnMAnA{r13#<V%B5r?~<(=`&N<NOvb4&^aH)hF*Vj
zv{ixwCUj5|9%3&6(JM_~TCG3$$L-PBQBY_P(568jK9#|mzH;#U{=i5h+}hD0&d@kP
zsVyZI+DGTDGt0Y>n>SQ)2?)oLQVXMF(?90<XErESsnzLhZl~Ctwsypglr-A+pAZ;?
zkJIs?XJ%pJ7qa*o?9jI?`_}|P+4jun?IUIDdzJq7ZxcSL_K;&}Vnn$U6-19z0|er>
zM?Zyr5*0%Y_}_48J>clL`&|Vcz887%x+CH|`{F93v)-V0hXSopJb*p)=@0)5tFug*
z8_7mwF-3irjhX6g3~G68qoU-TTRBXpO2EZvC$O7umm=VJzDvONSU7q%-yTTkpP)J3
zqjnEz{ltJ-tCS);l(~mBF%=?gIRgekNrpY0*?%VIw+r$JJy2orIw+s_Z!>D2Y-rER
z<v0ygR><xRqgzJROTY+reA9m5VZ$zTXuI}UiaXusTx|`(eVtzZ-At(YL^!*e0L*6u
zZP1e|ZjAGYF16hP(u6oUI5>w^TF=<IOY0Tb-TyLUH9y4I`>Vtf9gpy2NO5^|Md}+%
zrvvadIFFL}Mlm726<umno>;^55Q_>eNk7xMtaCM@2|9jXQJPOY8bF3sB0G*Y-}ku7
z?}i8xCeJI><in8R_0fHo08*GeW+|bAZhkY50w0b+pqmMT%eh()$DA6b9H5XVv1@~S
z=9A)LvK5n~1+mDTT_$0RZbAafJNc;LGj&+3=d5}cXPsQq=g-*5^*DGKA3;51c0#9o
zGovZ<IFA*3gebMPRcwOzeCz4w8*4}_xE|Hs!9Vh)bF)L4c0@l)Nmg(?{dViu1Cz*R
zyRzR|kh4W?tO^CTJSdatR}L_uZ*myRa)|wq@YuNYUb*G-6}6y-ADDFQ?k7fR#g!=_
zxs(H%JFt@;&RZdt82h(*qOHMuwD`t-khw|nY_8+^Xzb6vg&4<1RA_lW#Pb$_TT||(
zWkTq<=b6JIf&M%%jF}*gckrpgafp*z<?8+!Lm|FZRF3$U&)W`A4weOBDBz88aSFF(
z%(~tjtlwY@^J})eRan3kPrtvO9MR8{bIMuj{#5<7olZ&eODfqOq=EDsQxhuQ%AZ}d
zrni{7HOpfeO>PpzNqQLf_o{SrtSe$;qZ^=#8vO7=kj(gMo&JKH`6a**zy2Hd4%aJ2
zK8QmetH^iNRoLZ$q75TOpc<MoU+RSiW`}6VHg&z%pk>N(C^h(bZif_}9!*__fhUA1
zwoZld5^QkKni{S666%M-D^R_{((b5Bz+2ghOTeM6)PeceIk(sn%$lmI^+5d%3C46>
z_;D3}07q0?=BL{ilvvaL-OR3zTdghQDVyv`e`p}d^-9$>JTFV!9yPXjcNx0YXZ^`S
zEnc@iF|5=}>EZe&GM}R5Gdv)mDv7Mt?8zXxMz(eF(~HLb06*#Y6)s&7S^64bl0o;z
zwB+|dU$HsV)^bmIq1d(YG%l(mZjp2OYc^va%PzHwM($6)jGKv$1;&B{UWXH*8EnEs
zD<H!+g7<m_P1ineFQ5WgpkUIh_d8CB*K4)4KWRr<SIB*%P`nTj@XfPGHH#n9Y<B5)
z>NigG(Z8bNw3zbo>)RpP`(EFo$Qw1iXliz))Ef4YJ%aj20)m4Zx<+l;jaf~dBL(Mo
z*%?JR$Sgw0I5IfWZ!3(IK1>6Tm)`qaG{KdkJ7iinv557be&unbCl~@Q+cIN)G#y1z
zIxfSO>!?R@yNJ_mGHkHcs+fQi`ZB)Fx{q3fM4GqcIxN_?UjoQ30n3H?*Hk1wf%B=u
zU6W>qj*IXkL7t?!RcnQ%zd7!-;>cQqT(6nMgjNriY_@c3s3gA}?Gmz_-N2?dMk%a-
zhW|j$L<u_QNf#{HwtB~}@K;tk<MM>`VoENMmw-1(2vqc|`mY&}<nkTx!CoP%$7g8|
zKCDkSB-k-|zZEH@)HyH3ju05KkJVeT7YWPxksZ8o%flD#L7oLxIv6-0yqk1+@2b{|
zsyj<DN7lKlsC5LC=>yyMsV6t=cV4{7xbXP?Bb7!O*kkxZ;ANLcVwH^?6ZTEn<guT-
z(*8+>nO9bYnx(HBN>}h+vCByJ!Q(oqf|wtY_;@qd*dE7H!3lpPEJRkw?nuc(h&@pv
zqAfe5ZQ3(ik7urfJ><nyr<(!$#sv+IW_t{m+11EFJIQ*`lSejjWN>ARg9|6u1iq<P
z3eFl%jKmbzAXOBLWV<>h3vr^WIWN))x4<>15fL9PyOHI+m@o>YiZpd=^`->O{DOXj
z0XEXJ$claNCClK}#;I5V2C7RXtT#?zLI0K&eWFF0n-j>)-EWZcQ@JAhbxQi5^1at>
z53reN;2XcaH%qnr4a-aHunN1Ta0XZ%Ml|~EwhENAGOI8yK@a2FqYBY&Zw(FZWo;+a
zf(m}q&0BY8iY2!(Wk^5;u|sHqh%ovM&e;pr`m8Op7PHXcKGvREcMcJp?5}BhI~!Yf
zR4<}^AZEAPHDeCc2$NY*Wq$yMvKEM9bDWdD*9uvL6aos2S}JQSvSiZDJ~uxoC4XD?
zV{JSm*(YBpb;oISKQgHgBjo7KuxV5<h}JiCED*{_WAjj{Y0PM-%+jCQ;(Xb`1yk?q
zWVjHp#s`{YLDjXe`3P+f5r2@lCHA6%fzAfMh_R%O!-xWPCr~IwF(<R;#Ni!8n?ngT
zS}P$8X=R^4u*U(>Nl|Sq%X<v?O1yk`m;$czEid*sJ*Z5*1cb@X<>^*qkHybjO&$sM
zbi!DQrr6|*-FSZ`KFJSvf@tMr*KjSjv>ifsa>Bf_J4x{?pewSrOh-~0xd%!4=Ge*O
zwP^EEPs*vxCquk(tn)&;?cv)a%husBoY?vh2+nNCnkYJYtvy-6i!>85;x`DIxQ<s2
zC3s->3kG2{m1Z9eB`o4m!-Nc+(RQ<g4=36-{cf07p1F2*fCuE#-GGHFzQNa#$C@~<
zzBcaZi!{q|R?y1exJXHF&dG`z(h77s7-8G@&+?)UOrC<<B~Wh0dl^+l#oOxoE$I4Y
zdw`2s?(NH*w6~2!Orw+fzR?2FMg-j_WF(xFHaRKsa_VY6+6sGfS#_S+%#~Nkx&%&q
zwlI@A3-P}6>ql_hrpW&OcAXviU7=rglM`zQjJyQgx?uPn#*FX6wjLLq7pbx1!=K>P
z5|%k{!ANxQ*%j_epr55xv+hkV^xHpea&TYFPaL+su@%BBnbe$_WCY&C&d-Hr`KRgp
zF_7;OPZIsH)UdZ>#b}zRL%+g!DAMZlW7T2&lR4n3rM0R8i|qM$nm4uUd$etc8VM<@
z-+27`fazyD!IHgDR<qVx``AkWzd|cwk!+dpGsEzM%bzW{RgTbjB5N*LA<Iw0h;&m9
zPt1c>jRj$k;C=-BCCVHDL|GG`KgC$Gie*k_d%XEKR?SwY3Tt(@ardm5PMlilXK-WV
zxB+8}djQ2pP#A8Yac#r)hkNgb`f9(uSYKFDpB{Fpr*qbhGrDJ-B2K-;!tV3bu3x*r
zlPL~G*C=xnNNXP%SC^5-yB*5meA)9%HJ*VoOGsdtD!#NDcF@xyFxg=H0_52j#uwMK
z$mL1%n@P^$i1QZ2Sl^@I_0Z#dP)&p0`$7vOc`Tz1`#BJ6&<$i)vBaJk;9MirSU_c9
zHNgqO0}TIU!@1QGLVB}_^=DIfSY`%mC;<{EmXbj~Gdr_5#Qty<%HEy#uxA+Uq);LB
z4Vfs+_7;IGv#UqnGfY>s11}cVt$_t?`P%c&IBDz=i}EY_+&?~J7cH|~aNkC|pA?!k
z2o8FZ>jGQTvLVS0hQZ~7@~gT7_bvfS`L|UJ<>GLI2R)h8D`#TUpxWF~51`}M(UQh=
z?;!=@5Mrw+QA-cQJflU-5RV%Zw4^j$eD{PsOt}ssZNH8zJb$$r3dDT9K;k1Yiu~##
zMhTLI2gxsCy^$?9?)%%~6pak~48Q2s@W^)8So<j|o5?End6koe1IXbd?0H9jN|{&6
z^*BE`f63oniLV%94&q%A7;+A_RJ7&u54LvpJmL90i@vZ-@$$UxorY$G&6{6az0JRR
zy$osMBw%<62mr~3nPtCd+#WJ9)6WjeN*NM)Y{eL$@h)^qD9o9>L-nGNyP*QZoAV6K
zKbMf|Sv8&4VesRkrob+b{|&@2Q$~O@K(9Kxr0K~1?sanbQ7K9NFLqA*`-<m+f?fvq
z4bV16?y|6=@$p6dg}nUGywWn#+r7%X^QH?a&{?7>@Z)PO&pDE&DNOK4pWEz_0<SCi
zc){M$x%-+{mF}m7qSf|n5Tq*G!1gFSI#h{kGOHmYb9*VUxcYF(Tl31b<B>lEoYAg%
zH`Y7#^_9LC>$vlv^4bTyzX#Z!J3gSkF_;6O28@vBt0SAjZW6BIn{X?bj&y8imz^Be
zC8A<$%x1_bbY<8*lo^!0U0}Oi#WbfsQ92>3!{d^I?4IIO`=!D4@MfxQ8am3oXba=!
za95YQvfM1BrXE_Jve~q6=6=R0p0{=hn3XgRvQw5UHY(+@xc8)j)!fh^kG_J1_tWm5
zr<jS9jtvN2x;IP^?_br0F^In4pC(XYC<2$L;b@TA-lMkp@YlZ1yxz7Cd-A0yKCegJ
z|G~jO?|T}DmA<&yiu3I%8PUWqeVid!j`9dH<Z&a7h7f9M4R1N~%q1S?aZE3mr0}%V
zB6nTxF*cBjc4VXX@VuEx+bW*u5fc3R%1MN4rZINpZHQsz0!;W@%VMGTCyU=LiOEH%
zd!fE2V>{JLW)uE8T(5ORciQr|&ocG}`Uegd-~`$sw0gOYFK!D{l)`wWE$JqV2_-T3
zQCeu2YEEp8#YC!O)Vuko#f5+V+B|byPMH(V;<>$yRiwK@h^;w=Om^f8SeRRDnUzoo
z+&uVq$WLLZ@6tD|&_bgXGS%(zf`ilp!D9xQxt5T^T07U@o!>42DCOm)of}2D)@axG
z?S}04cMoLkDHjEiZB7NLFO5yG3v;4}-W5`xCqy---v5eVTv=!Q9bwpl&Fl?-qb4=Z
z>Ys0q19f(D(pw{hwWv$cd$;G@>D_#m)PFEb|F#nxujH%E(2!OqD+pqE%=A!re+xt$
zZ0W&#yIH4lF-g(+^?SYfWcWhu7V9dYT|IUrGU2?ifG=!B>_cE-ODW;-HCRm4mBsR7
zvNg$}>jR{UVSxr#{xNPZuBt5vqY7M!?w;9Iu_TW!#8yB+)E#D1y9eqGof9I^2D13%
zK+&8r6zFb{V_nlv6h0(<wb_;a*GyZS>}fBHQ(3pgi!_KaoD~|pG1$NwHkA!J(9*0-
zjRR>DDv~5D9_y=TKZ%yvP`RU{2`x!O#uo}uwEBFlKQdnf%a$uH;e{J(Gwka+yA!xl
zGGDCkkfWoUG#uqiUM<_dRch#R?xK9<6i=#v`2K!d_|Gwpzs#TdRaMdBzBQ=YE|OB>
ziI}IOoR`FRX#a3-Kne9q7Z-cdJSSd6znZx_zfLY@K<7d*<k93hRZ6y>eY6yKBRP)&
zgn5kXTNO~a4M!w6uFajPVO%4N6GzoQ%P8xBdlP!hlUM;yGGS<E8@U@#0qm^AF;R%@
z;DSAk@AEF>HMm)xN0}9n;WOHa)qTLWY*^<rYG6>uZYO_bJ$8%AzUN0aO>EMcs?rBh
zr8<w}Vq?~IGyPL5iS)|F>;=1#Q!Z>Eaqa^f-IukS{@LB0Duhgh534<cr|3e3<u4Px
z+>MM2E*v~cW{3*ddm%O@CUY)@Jg{jPZ?F#EhD!CDWNjIwoEfxtW}t!|)}ANUa$TX5
zNbaG#Hx?f7Hu+QeC+=IZv1AjbS4{8U1OTW#5v<h_a2P}b#~c}kIFG<UrN(<u)*GA2
zs9{gcZD#W`-AecJaU0pWVV_^j!BOc&E}=ae!+}tjp*y>UB{ScD^J>HWDcBUPxPQb6
z_4|8MCeX`xFx}6l5Ee>#vVtf3)O%)CzZv{u(#fhKhoM+rU*9t~7&%tzcicKw6kY-o
z5wm{Tg<g$Bpg$YsQmTZ)`GkbL67FecsuYs`m=GPzm)6~ooyHHIw*bLQ*TW_|*+s$x
zVaj@wexY)lQ5;m*h2885@UVlwL*>S_(q!*N-a&Zzgi|eZ@&nTIFH8rI-V&`s$BS^-
zy2ZZC7?>h510U&F<VkxagQuEd1>ChcGtgC~HMO%>uiV;dCaK%Fx+n#l{K4>xHuc@t
z6_un1cA}x57u<c|`C{h<hWZi@cX`*@e}$32OK7$gY&xo?8O<53#H356>*I5>(^iJ+
zODm9|g(lRw{l=e?z)WoB_0=5lbWCX+!lc`{Frrsb;2yfz)K?R#-1o%TWU}&)BXV4Q
zPKEhaG~(ED`FrvAy%g<>2oe=1Ty;%dL}F+3QMGvYi+FQ6vt#TR2go%&aZbM+!DZ^A
zm3$-LY1#SSYbR2C?e+BY^N$16J)zf{<mna3Z&0<};2l@&y33>a{Hpg$?LR-dIYt<5
zhZauK=js}c$7Gg15ol0fjcIj5fSD7evPQWgvI+;H;sej7+lK;&dD~8Qf8fGhT+alX
z-`GMapNd`kNc*mrn)<enYOra>knr;XX#5kB_;=I_DxBFY<cb{g6CJnkcPa@GTvcZz
zfek}L1LlyO6fH?YDA~t&&S}-+G+V*VRRmc`_2clm!vy;$rfxEmlU5XZtt*V#HV=5e
zPY!OediID%T!^({$@^$-z>>N+guWzK?aCz4gELt}w<*~_W=Tq2hgTL0g=Ej^h>7w8
z+N7ltdJ<XF-Nr3KG?ZrE_A$Dnn+sXX1xsP$o>_i-&wjxf4t-hz{+zbKKD&I)fy;JH
zbfL@5aw$0+$OWI2XX!H9OPx3e)O!$yG)6JiZI+lSDIKO`=EU1;`%ZZft=P#`0iT{G
zJ|>d8Hng`gf6Qgv)C5^I;$uSJ4-dzSNnLSUeLD9=;U<ar6W`P%MAkV`d%O+`vB!o-
zbV!yWXyTOQqlwbae&us5HYuiFoCRzZ)_|Vlq#L@M)Sbr_tZKBlhGb4Tw%>-dPHGqF
zfgV`smXJCeNAIj&0<L{Je;=Z_JnV{z?gr8=h0x%P23CJ}QlcBD2!ZJQw`$z)YZ|fe
z*KOj@WjR?aAgIbB4F|GF{)!T-6yikXj!25mr(Yq)@6ZQImYUE^({3~P(9v@%eVFBl
z_8=qcYMEw{b5Uyir|c<RrTjeCnLOF=-YFU6itzaEpK7SA3gz;&VqSDWWph<~v+dM~
zIyU>^R8$#fj;W&v^UYc^fjpm&Dc1*XEBw^5F}J>U5)f#n6qOt3U+Qk<ztDc1|9RGc
zui+?ip*~KueWB{d<649YozMV#@)zf)5|H=!xHIvKN&C9BgkpRrCaH@vhLfgEwxXYX
z3bj^KSa}L+Q82UckEx%97h=!Hg(Hqteb1Ek;JblhsP#6*l_BfpjF#km@!OH+q*j7D
zoPrBqpD)ZivHYSmFGv`?YnR&Re1x5u7ipjRawLdxxLrRELZ*EhHwU>R+jsny=Djjw
zSi+#XdA7O66|a6MhGv(=*`!Gt+f;8F#ft_hTN$;i>L1tIBToqQNyoLV_#F%<+wUc2
z*&Vg@6<K&>n_vMRoH1%SfPs_XZDp<7jsEB<7f;6|!ppLE!h{`ITAQq`S6_w1#9q`E
z*m!9w^m}~sQ`i;87h$7g2^z}=^!V_8HR{Rru@DeC!D!lYtO26QZ5>>pwaEAd@v|{k
zer{o|!?C3y!;RM{h1Pzuf4l5V8}ECZk9Tlg5fy|UE-``WGzy8HcaaaL^g|ryJ3dJE
zqaY5;`a2GRc3|e{gbx4g$ULMeeBDC{J-hlf^S#5<Jh~<k$V1w38lxLU$XLDE;nKj0
z_}$!8^U8yJFrnCXmSA^<Xr*#5?=<e_2AvAGY_r9U3i;+E`6o0^IbrOq-zKW4_Ts`Q
zy9fd+fiJ~uNE%`{!sl4Oq3%0<)hX?pnQL<M>R)3lWABrCRQmE}`AdE3AXUj^ysIo}
z`=EG|8s)tt@2~jQLhG04SG;)je)@!L-}(r$<sP_Z*Ko)ZMXAaq;2y~Syd}MA`ooJk
zlePvR5EInRu9~B$)2l*i{wc6FO&oeBtEDM7>E|9^Brv8h6_d1$UjDuskgtyg_QF{W
z$V~dm%C<VlunYBz7JO62=O04yTo-7aVZ7`6vix9eXUc$=y%HnI(<Ri)lH)lmw-tNC
zI*Gvv55xGwzF*LsH#|Qi%C%^;LGL9Xw$p`p2i{<gc#5|V4J<{$UTm4-b8$R|Q|r^b
zwfI-dmM)?C6nCVQ-Sn1(vLBu~@kagOF*z><E@xPQq6)lAFA%``#=>K$+Ntd{ht%Zr
zu|>9^SRIj6LO}CAhV*d?W5TSd^=er3xj(i)t~kZZia6_9@u5+cFE&Tg!d>FDGHu;d
zQ7K)N^xBe0^`DIDvqHkBl?$po-`;~hk#(`|ujf{Ag?3dH!O4XzS}D^$WBU!y7JqJ^
zOP!~5+_neX*CuUaL_7FGjK-egXu9obU>PSmNEMAwRh7(2gww<-iE+<8g6wBV%X7N^
z7cZ?*o1Zf_nYX#e-FNVr$KUWg;RPX9vEkQ#PiO7sVmNPZSgjQVW8&J)`%tCFBXdUy
ztcP;V7^s%<1WFMzRs~OhqcrN7nKQ{2Z)ZHD*<$Wi<>sUzke%oI=|PO0AjJd<yeVmJ
zs<IAWLR$yL*e>#?j_t1?-j_CSe+8syf(>Vj-qrXXEbWl4<Ws@ydr@NfRhvrw#S@DR
z4Q+|a1KgHYi?)G15=C)q&hb#uw!tEHXA6I_PQh>33%%_{#Z|n;bng`0tg=0a&rrA6
zT>gfRn7PYIY@Peb%$dH_FwyaY)4c3iS7=dqu7bst8lxs+<I9YXy><AM75h%c2+Bnb
z7p&}?tiiS$O@_8Jwhv^cUL-{Rkeah0ewt%3$bFQl<<qaPHQd&soGp3$oxQHhro~na
zzNFzvR3K0KC45>)eEbtFlrCvMc+$Hqd)5vz3#;FqY>u&dowRsUN~SE%9(;kBlgMoo
zkaS-$Eb*7)h}D&+Z5F$_wlu4q=15r}&1OqtWYxwrO0%ZO-e#kvB)x2I0Q`9a6<Gvl
zoXp*+98Br*zV`X|26q{s4hj48YR=u>Kc0+F)#{?kSYespYZMf9bc<P2;;mzYe`Z5Y
zd}~|AW*0bTKJ1z&4ONUH%>9MX8*;x*>wfu7q)vzFXzU;Kwl7SMtMZ^H?n0|q`_u<%
zX->SZIA8PomDhX>C*B*5obgK}YGh$!tXe(rgqDsfD)<`}QMe6WS{=I-c?4v}N895X
z%P3#SWs>C<ZPa{WW(qKGNtidb9lrL^;kx;vQ3pLfh?R=_;SJk^?>>O-uOo^_-&Jdn
zouxoLulTooN?71>9vp`-#g-%lu7tnskeS>$q@mxmGA*8JD1oVW4=}}0HO73lQRn-a
z?HpRwTWM=^9<vN7b9}88Xt6?pC4k>A`%J$#kSL9*cxaC3yRAD`U^|)F@<&()WUNb<
z>T9y8<FhE?(SPV-YkwzlS)?T6W|fjJT$kE6%f~QM>qm}U{hT4FSyO1bRm};%hc>tx
zHj_yYYg*>qW;}C*DPtZlIuA$poB=8DJZSPavQ>_XPN8a-fF4%nc>gUnsBXACT?f2K
zExV%cruL2>ZaEZP5~4JD32=kYZr#T_orPWuEGmcJ!H4T5>1OxaF*jnP<KY>>ZW`&)
zaRf;?9@v9Qiaoqz1iLy^u~AlJJEQX=lgw?ms&qef19)po?b>7mXUvPt_z>Ch5Mx|G
zLK!|nZ%pL|8Y;KalP7^}6GelB2LJ4dKv!BC8?f>6<9goZ^RR5A2^kA}TFwUDyZhO5
zVa%wl2=vGs|4^4pzz%M!G1VUYS}#W2^DtLRXT}N^XxHgEzo~Q)$9c+B9OVA2Da)dc
zeH?mVzaOt3_%@F$-G<D-oIJW~%BXwgqBSv3DQ&xo==z%J^lI9SM--KT!~=3zYw<7M
zxA<=kQ6>D~iLG)Lcl^T!(v>$X4f1KNel`JzOE>oK51i?TcPU&*UJOOqGvoC^u9(s;
zW}xSIn{~+sbK`{sR>ZzF3pIyfdYOD)`Z!}goyVreY~0MkVxc6{tHU&GJZ$h1P*0YP
zi$h0uFC{4T!NG;FY)x$Y`l}1BkViPpXn(i`%(G94Z#U`Vtee#hQ;_ui36)UlVsQ0P
z$Ov)V!hp1#)7`%saX1kaX5BYdnLNbSD<UP-CauAp1}ly^;pye3tJVB&I`M80@~vU-
z^$Yt~7t|NXEcxv%bUqF7)fG-Jqdf8!rIv6k*NSyM>FvC-0V>D4?*p&bCvRj_Rd#%!
zN+4KSZQu-EOl6kbRbqZV<!=yM8u86#Qz684iu?1LjL|Re+*H$zL7fBD1#N+0$XDS;
zf0v*PVT!atL%T&7Owl+&^VfM!kX5{A;E$???QDG3=x&JciZTs@d&}Od5Cd1Je-$|3
z7zwd*-hEX*3%0vEx;OveyZ~B+&*;7zSUMyqm+7S~_VG2k`-81Ee0{Hf39AdIB<SM8
z(n~jl(Ic<)KKJ9|bjMZn(Dc>#d;=V3Jb@WUwkayCgDZ{l52$Ox9vAwfZ#<h)S-QS?
z!_^xCt!2B*OIdo#PjpB(F66@cF9EgdJ3v^i6@)c2Qti$bhd_Pn2eh+2OPBNV9w(Ug
z!9BB}?GW?TO}Rz~OAJ&=o!!GSCj^ZXqrq!-aLu?4^CpXR65FveDMaKCKR?uG+ze~p
z15&+Bx2EMLas(bFy&|ib3BEsK4|?ZNqjI;eISi!5Xw*R=QSmSbeWR4cci1@9E7HK3
zO&<y!87kC!6x1e~(CrQ7i|KosBV<%1q%XA=5uX*Gp7yDz9^BY5i3Fx!0^*ly4R+Yh
zgy(?-kxKyia21S<g|t1tSNwVqYCR%Pb&d;i_IAa3;U+jB=@1k))zt-T&G7&8bA20q
zri-6Geumoy(yGvtCN?{ifunVB_K~u}F;#~n^uOsIX9^S5-~6#sdRk4@RBD-s@p;yY
zPn+=r8C>VlfIn5$PVsQUc@<F^pSLwOH8MATv9q+Z*1f3*4RZBm&p46zE(K>88(^cZ
zuurzHUn0;gb?1rL8uWG6#ah5Pdn#+^7YWkM$tzfwcCTIJ_eHjr4>@?VQ=@)pd|tqt
z?T?x=ixwAWJvkJV&a8_+Ust@T01eSbuUd8MD}h~EdQ}zK+->j70bRe1r%9yyoKEuD
z(|pfk8D6YncI*2YFeRxwW)`TwX9{2Fym1L|7YBqGG&adIp^{!VG#{QT8#Rym{}FvA
zX}xK-<qHmUF0*X4BI^Af4@#vsH@|!z{N2q$yJBB(XkFBdFTje5x-{hp!(+@d1$m8%
zl3R$OXcS?5wlSs?X$~Btv)82Pr0#QZ_P}Q<y2AKyNzp2vXR-v#v7@D^a27SPdOL2s
zD~3vUQ2Pi9M6fO#HlCc`>06cSxQBhi`r9(VYTjnHA5t!D38L?lJ_+Bh0men|K(Gk(
zQoLx%sQ(B#%omfN*q|!(fNw3jY6gV|wF#7N<uP<7KW1iP&I}W9Js;EC(ulQ&e0O>Z
z3cF&BPzg}aTeYmF&b3^X>VMFz_hE!eCTlfo6{OK@CHgz-q_P1hzcR1ll_Q;F)`0m^
z7r8KJlvc2-TDg!ZZM~qpq>dq4OU{#@F6Nj%UGHj+I1a`;QJw7w$q!&W-!_>IvH3aQ
z(rrDz{SweMvZ`MbX01Mzw$G_M!Na5QJq2kom%4o}jrWI-+2e)t--b6_0zCHKGF@2Q
zK*OUs$=c*O<f&$`MHf674;5@;LNuM0^V4rFd&vIjcZG<-KZBJXyYYtF+hKR(-^JIY
zALRyv#+hX8r0jRBgA@ix$oV^`Isk}%ax^uykFFs0SgLVY`RjBATNTf6IjD6}cNj(V
zow&aiW;6HCl$5ng$397zoG@`8H*24p({TRP*4dz(pr*?60Be>>t<o<2t%GXZ$<+33
znG<?g4k>HOOKM6>N^+Mt)X^olpI2OP;3HNH`o)>-Hq1Rq^ItBHUT{87h`ZwN{AmVX
z_~hCrH4f!V0Fw=ZyM~Ib=lgw>^w|U4x^ZeZ6RK)08+^Q@uTXzZj$rk9NnMCh)!n6{
zKx94hjzF#$H`kk+8aGY~q+WUQB_9!9a|!r%M_IEjjwskE+L%|uS$-x2uZXikl$=H?
z@bF&wc-JZas)wrrZ|7A`o?}rg3=JLGr0FU7{8L=OBwr3e#Om$mRE#X9=@z<SYq*mt
zK4F2@F}JC#Ij1A`gV(q=b4^%?8h_r+T&2U(9U)Dq?vps1*n!!z#TL~R6*qY^<J_-`
z#@~5(eH8CtVX9sa);g()Q|h0AwZJGfNqlTShWr&~j3A1$TclE3>XrAsFDjG7f^vV6
zQ2n7~Vavz5z)dzm{^z&JN6$T;55%tfYS6=X#zb!`YtM2^I&^UX?*I0kICzEZR3xg2
z1e+~$HRa}ncm1x;zwQSLYXWQSSPGMA7D&aomcHh<wLLY*dR|+DZC9v$o9db@(>QbY
z&WdoCHZIc@V`R*iu|kROSRMk$V?T(oDHNDf#3rfA529+<5^}84o}qrFw(6qx8^dK!
zlMpnl1U4L5Cw8g-l<{Z8ia51<-HbihI7#C1_8ios{?D}JCTl2mPBdYm*{#|k`8sMY
zE!=UbmO6>~4bau#P1x0|3Z4YE<sD(2DX#mP!$xj%Mib9Gv-yf9#H#}vcWrI_WQk^G
zgZVamc`2!JkrVgkg$W5J5YcY%c$y&XPpjufFeu$<s&Q{pBb)Z{ZUHHqx_uCF^%^d*
zSE_f0u4YMFqYe6mvx9^Db2-Q%!EqavDi1!oYagQ$6RIq9N8Oe53$F9)fpoi9Lg<A_
z*kheCL`T0@hTG!8#eR4pyLJ5pMELK9LgtDVn2l2xisowl@1VTf(~+r<k8l>GTB6;n
zevBIGH}rD^e<FR-xF?EMW&IX6RG)`cUHr(>iaPYgg?H1s9Us_lb%<s6p$?lQLO-4L
zoXRKGw+6E~cC@}@fj@sP?$@rT)l?stg6f;xfugl1Ur&Dr)&>%Xd5jmsYFF`NXUh1^
z)3HN1*#(mGR-4WlaM2Eyg)pCP)4@XeuwV|}dh*A%ntRsBkJ#$6px{qK)KyT(+4n4M
z1_ZaVCoH)4f(my&DA7FW*X|7!sLl8}Za3AY?C<X+X`a_@-A-XRZf!Qc_@s_PXHmN+
zmUlmHKa}V3SiLG42~%njIO{P>&@OLnUDS<gw#=YCk94)kAW5$Jx&@F7{Pi;*ge>kz
z;b$DWJc#D_nUJZ;UCm<q1)qcQ7pBqeK{DALRaMYn{xIo_LW~=Z&t|hkv^!@@=pEv#
zzRzTzP4x>+q2sy>)2iH`NxZKHZgVB4_BS>C!F)|(-&zzN<Hh!#yzz&UjXbgScW6Np
z)KyNQ)eR8Q`XUWi44d_xhn_T>aw(POW+%0?BQ9I)@8+wgjT(4}k$2w`DpoE5*Y|%&
zo;SErA1*ZC7te{mb$?evn7+qq4<XJ84rJv$jqHyR^>l=(jiAqgJ?4Rwt}&l{p+UtP
z!@rat?SAt6djDhUnji{t&`YVw;q`fAvM9Tay+EO)zAnBf9SL%8m~+}o0}tAy>K55f
zto+C_YfR|d3f|1kngi)|Qqn}LK$b_Y<B!^a!3?PO!p#;?Y0S}%dN1;Kx%eJ;Y$&&_
z?%Ik$eJuJD<cuv>Xt0M3^7f9AlrCjbLJL_^a5&brk9lfDu55WP&Pt;rRY-sAk859+
zW*yoZtwbr>&DGh|5f8kj2VJjbQ5P?P89zoI0;zwqip7-7yP@QgiY+#j%s%*2ezCCx
zqx|aw0wi=OcMl5m+#CV=YXO`xXU?u9gKE5+<hJ+(>|R#}pFmP~SsB3u_b{k6Y-Dw2
zlY<GXkv8`N6k5J%)mTO+6|w3Tg|_w(-i6&*@g_jtwRrfukN1yNuPU0AZ;Te2<!lbL
zq?9?|UPKjFjCZ;iN0zeNnBMe`cQT?Xe^T2dW3Q5CeCVm+mTUYyH}UH0kL*|Fj{D*I
zxuBr+o(1DR6!5kGPB?lpBfkP)ikMoOGixFH%y$Ni5vgA~Y&U)o1+&pB-DExu2^20_
z{A93dU-i|^_6{yk8|RT*;V%8#xad?X=J{B0^Js(2zBq5RH~#@BRn)U$W2@`TC0Djv
zv$E6eR>vxbFRprMC9*Nu6*KZGjH}jw4(6lWEZ%kn4z>!th+YY1zN!@~+ze_gEP+gY
z;+B~eJ-Q9`ARwSJ)+j~c^J{NRRx|~-?jb%11f<5>RfH~96prh0y1t)Er{v(T=TU<h
z=U_Ja^Sr(Ey>p&s%KWjRUybz`JiAMbO$<{FQ91wU_XbBESsZ-Fr5mNt&`G@|sm}bC
zAj>||VI3UJmbC>sF!!;w`VQqV;rEMLX0WHn3*z>-Rz}{2i9wjA<??B&!)PF*o0ota
z1lN*g=);k2QH~1IH8}kH4qrz>@s@lR!??TElZ5AUx>*V?TIo*d;oQZzsS015R_}|(
z=psn|4gYf+ccoXU>g_4SAehb&WEW<EY1HOkYtw7XU%~M01V@x<6J46t2OiDpY4jx^
zffsK{)=-QpPojaHd^>gRs&YSGH)}!~Kln0Dut&cqkKL>GC^(buDxT@6%q$<Kb@N=E
z<4)-AIFZ6ucL=;b;NXr_g5{{PGkE*`*3faJFIA{C_MS^&SdwvOYs`j<()?oY-=NKK
z{2H4{wr-(j<;jxx%|%w&Falw2R7g`cnC6$pC-hToJZo^ra&i6j#RQPKO&zy)9FK1$
zf>IKOK`f^m@@Xt}KGvp#)TR-6<k*f^?#H-hDRtMfsyK+;6Wzz7R-1<E0wXMp-wB*Z
z0UUXs{c9BC7qfgz{5UpRKb9xuS#Z+Z3)X8-sULoJ5uSX>bro{dy>-ll2c7AKJi>S3
zV*C5^IZ`~?3C{S!vKc%C-T&<zVlnD>&NS4EDv3tFJp{eD1awDeP1Y}{BT#CYp{4Vv
z%_K*t$2$!lLo)x4J4DMzk-58*CF~A98qJ@2_6RoA$9Y5TUWg3-RoNUt^9x=NJBQwW
z;Tj!c=uo-YqSlO||Ge2UZ?)Q&@5)t&JZvZ1J!Xj=2=t^QRE+8Mc2Ezg$RyE>_Duxk
zNU?ssjx-Tc(4sX;`}naWqsAk^xDEtyX}ow))ipb%oKT~f<K>~i+T4SCl0799-C$&;
zxhWTm_xST7zlB2p8IG1b{}dunB6&~`jBL>$nidPt00;X%*44@BXtg^V(<<@juls=X
z`1g+nC1sSJM}MN<yXF&+c!kS}my#ntGURBPhB72*)Cs2shd;o&%=OwS<IGAi`Ls)7
ztt)$s{hsvwjL}i`R7xmS@~*LLPD*^(;t=Rf?n9a84`S7f+y}Gy<IBhkq1#UK912(l
z<J#SHkqb8WDi4<T`3u=2Z>4RX3O)%LxSetB^_6cI;ysQKN1<Tdm_eO;Rfn;Su_(WT
zY1~C*VPvsxR=kz1J)%8x)#)I+Z&3~zB3)p+I1of(r$UEtfKq-LQW@8dk2R9@dF1wk
zRjcbJGkH~*H~!R8jKGKSUSshPJIwyw;S`m%c5>oY`bEk>>f<)cOO|09z2YpH6c(pE
zmO>rJ48cb@J%-pje6gm1mfXoVYn3E5jjr>uXE(m^#!<H~kK9mi)WiYf{Nk(=DXz;b
z@cZMa>%7oG!qmCNKfaQ1JR2k9m7_Tbr*Kw?{j+8tU3_D(4L9TNK`kZ<gn$MKQ>)%h
z?f%7;v*&wny899Y6&eI&a##b6tb7J^>^AzL&nL4MWKUfq<3GLp*q2;bEg6;Y@QcU!
z1M*Hg(hy%9qN|k1QT_^3q_aGMM~$l?b_7$E`$kG%<cLBxk&3=Qd1kI~=<fd8F@pNB
zMNx)DNB?IfX$?U*JU6aRQn^XFv(e_)3aX|}<I@~08<BSxJG|Bf#)#6Gjfvfv_?oC{
z)E&$t@nlf%n+v_By0FOG>Pi-q>60dUuMYaRJ~x{^#BKmxIh{>4>C%PXna8JOv<+|g
zH|&jWAA9HXKHKpOI4ch3-<g`4t6ngOIm~C-&@y}dv)|M@)SWxCF(XrA5o{F^|0j6>
z>RLW$VKZONAT3+(bB(=*oV#Nm?~T(O?+w7txYKD7MZhyd8U350%kfu^;{xUxS|b;6
zB^HtbjDJc!F@kMi?D1STCxa;ev}|W2Yf%eltV?}Bw0YDBqR9z?T7O%w3L<e=3TP-6
z3CKF6pZor4ZPwD2{!x$Y9viI5<UDU3xpTq2086sN{w!0`Sq_iAV8regS87zChOW+A
zY+ML8jykn8BikNjpmlBf-JUlPM`PMe&vJ|2hV$T}BU!5TZadZ<nM)NI6~-N#WL0T2
zF}q#|^DdcXH#P<51oc^}0PBin*(OVG)~}@m8r50b4Y#ufZ=!$>9kYU$fQ;I!z&DC3
zAAd?m<dCHP4B9f%Qb`pS9_Ib3{5{Zxqy#Xa*ms5Hw{L`fPA6HXr$GdVU~}sIi4f1A
zAkjR>)F)rDu8B|c4TR*<ryPi}e9wkG=@@3j_~YDHs8?8kkB825LueBvMVk_{%}Gt$
z5=go`<R+`<8@<Xrq3EUnMdJ~QbIe!A&djNS0~M8d;iuj*MU|@~x`wp@=IKboU|VI#
zW>P|rVLHqHPr3A?daG1@)LgpVIgpA5jFXS?vnP(N?Qr2So}b1KIjO*bFMd`9NxyU=
zs;BQ5E+6OS^hN~aW`)YMlm=^=>(vg{^ZX7mPWCOUz8Z}E^{vI*xTN0jTac`(&g00b
zh;UbqB=iu28XI;{Ew{|Z-HdJ{kAc=MTX{&<Qe4bmk+Q_}X;|QS{e>FQx{B;X<Z_~?
z5$)zr@TT6F8Jf88M!x2;HUo^R4tItpl}a9GedB~DaT4do#>qRKK!4A0=HuM+rCF5)
zr9}mk&Qh2%BAf|L{KFBXg94k0(5pz`G?^yczYw*LeUY%un!2?}J=G@BxKpgPtQ`0f
zY@SuzK7SnUDSio{o32eqqTlzPQ!Gbmyg~HS=b7aS%|<@LPDl*RPNd(|seX}?F#mDW
zz5%6+atn>7dFr!iX(rBWO-CH)@Y$s+-PT}+jb_y4<Yij-E}>TsTqoo=mh;~(p|ad2
zphpx-H;9(Xi9AYnWp3+&4o4|bR0)-(@Dlja*_1F@^e70rehuNxK4>f4Tc4jKpgv8o
z#E$o#P5|fZSldFCXxMBvs2H+B<QvQ6A}V3y-MD!x{TAmn>;Ohp2zDr{uf1j+bJ$El
zG6{d(-`z>`J4|rY4zkrrMGPeG0Yk^3{qay)mW1O@j8uwqw&|BiF|ngo7oY9MF#ng7
zln&uU0wB$5axh`c^qYo(UB62J17G(KVmwNiICv`Hl%okl18~3D#LPj5dn{K|8con5
zigdz3P@d^<WPN6f^Pt?UUWWa~4>H^LYhSm;$jMUs99`0d%%?n-u05Y_LxRM2cYN3J
z)3IM{?xvXxACM|6|Nco^Wt8Kp_)sb!4fV#E?{@EOtL65IQYT9J*zdej#dw7c_;z%b
zz>BNO@hU<^6=LHM@=7kvn0Co`A_AtP{^5+76SB9t=lB{6i*4PT=(xA}wO_{LN4`~1
zaNZ7a!IPKjmG)O|picVs-b{^ev_yWCJ2A`0=D3|?222N-8*V$Wn@N4Baxs58R;&Fc
z3hsb+KJy^zvzrapF={+`bx<u{ZKJ?K#}oZQ%+sSyvC1~1X_9Enx({7MpofNLjWB!a
zj~t3L`CA%t`bs2GAtdKn;%Y3v!|Rs%n@jWi^BG0eR0#4o<~MBuXmQ3ae>9a=cN1!u
z;EKp-dPSXG=ALPF?Ie#o+ceo59PY~aD%ot&DBQZNPvyb4wmbhT!xTL0#JnlQS#B<c
zOm0_+r+|Y_P8D%*bmtc)rA^aOag$J$(r@ir{{Y2&XTUr&;&y+8<Np8;^J*BHczTn>
zaTN*5G-C*1X~J~p3R9%2Dz#?`#q;t-sI<N3887J{$DSa*(R?ke-`L0wrpa%mXfd|q
z0M<3lM%zWv*UAKijx9q_x0B0Jv15&w0e4p3gW=mR3TU=^4UuV9$~OB|<cwb9Q@@w@
zm%5eHpPEaH%Z8F?XDn1WjW))Lqr@lpkKxZB=zk5hpA6hB)vmAcqrtu%)%2Ul#5%5v
zsoE~Lt6pf@&6JyDvD9p4(c+cCR!Pwk>e^W#kU07Y*_nwfdY(AP<NUh*HT*!Fq^~s8
zm6e~x8$v6U^}JeZU0H4}3z92HS~1xsl1rH`(zW-$n3*I2o(6C|GuD!dOpj6dirx@T
zJl5JxJ$h+x&6)GbcGLR)y<e5TjUU<1Sk?Ro@Q2}p>zCJ>zl8Nq2<W#`UtCIWF8nWZ
zc%EXU(&eU?LSpKGx6h}u1>9j6AEf^Pvp$P&;=daBpW;sVuJnHb+RxxW49OW1K{tps
zxNP-b7HTm{30aMfoVr$z6Abxg>iG+D%0D%J0qg32W`Bp8fVYnR;CM>YL$k18CK{Hi
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
Gk^kAF!S*2l

literal 0
HcmV?d00001

diff --git a/thumbnailer.c b/thumbnailer.c
index 1f47902..8a9cfdb 100644
--- a/thumbnailer.c
+++ b/thumbnailer.c
@@ -87,82 +87,22 @@ static AVFrame* select_best_frame(AVFrame* frames[], int size)
 }
 
 // Calculate size and allocate buffer
-static void alloc_buffer(struct Buffer* dst)
+static int alloc_buffer(struct Buffer* dst)
 {
-    dst->size
-        = av_image_get_buffer_size(AV_PIX_FMT_RGBA, dst->width, dst->height, 1);
-    dst->data = malloc(dst->size);
-}
+    uint8_t *data[4];
+    int linesize[4];
+    int size = av_image_alloc(data, linesize, dst->width, dst->height, AV_PIX_FMT_RGBA, 32);
 
-// Use point subsampling to scale image up to target size and convert to RGBA
-static int resample(struct Buffer* dst, const AVFrame const* frame)
-{
-    struct SwsContext* ctx
-        = sws_getContext(frame->width, frame->height, frame->format, dst->width,
-            dst->height, AV_PIX_FMT_RGBA, SWS_POINT, NULL, NULL, NULL);
-    if (!ctx) {
-        return AVERROR(ENOMEM);
+    if (size < 0) {
+        dst->data = NULL;
+        return size;
     }
 
-    uint8_t* dst_data[1] = { dst->data }; // RGB have one plane
-    int dst_linesize[1] = { 4 * dst->width }; // RGBA stride
-
-    sws_scale(ctx, (const uint8_t* const*)frame->data, frame->linesize, 0,
-        frame->height, dst_data, dst_linesize);
-
-    sws_freeContext(ctx);
+    dst->data = data[0]; // RGBA = single plane
+    dst->size = size;
     return 0;
 }
 
-struct Pixel {
-    // uint16_t fits the max value of 255 * 16
-    uint16_t r, g, b, a;
-};
-
-// Downscale resampled image
-static void downscale(struct Buffer* dst, const struct Buffer const* src)
-{
-    // First sum all pixels into a multidimensional array
-    const size_t size = dst->height * dst->width * sizeof(struct Pixel);
-    struct Pixel(*img)[dst->width] = malloc(size);
-    memset(img, 0, size);
-
-    int i = 0;
-    for (int y = 0; y < src->height; y++) {
-        const int dest_y = y ? y / 4 : 0;
-        for (int x = 0; x < src->width; x++) {
-            struct Pixel* p = &img[dest_y][x ? x / 4 : 0];
-
-            // Skip pixels with maxed transparency
-            const uint8_t alpha = src->data[i + 3];
-            if (alpha != 0) {
-                // Unrolled for less data dependency
-                p->r += src->data[i];
-                p->g += src->data[i + 1];
-                p->b += src->data[i + 2];
-                p->a += alpha;
-            }
-
-            i += 4; // Less data dependency than i++
-        }
-    }
-
-    // Then average them and arrange as RGBA
-    i = 0;
-    for (int y = 0; y < dst->height; y++) {
-        for (int x = 0; x < dst->width; x++) {
-            const struct Pixel p = img[y][x];
-
-            // Unrolled for less data dependency
-            dst->data[i] = p.r ? p.r / 16 : 0;
-            dst->data[i + 1] = p.g ? p.g / 16 : 0;
-            dst->data[i + 2] = p.b ? p.b / 16 : 0;
-            dst->data[i + 3] = p.a ? p.a / 16 : 0;
-            i += 4;
-        }
-    }
-}
-
 // Decrease intensity of pixels with alpha
 static void compensate_alpha(struct Buffer* img)
 {
@@ -248,7 +188,7 @@ static void rotate_180(struct Buffer* img)
 // Swap buffers and dimensions after a 90 degree rotation in any direction
 static void finish_90_rotation(struct Buffer* img, uint8_t* out)
 {
-    free(img->data);
+    av_free(img->data);
     img->data = out;
     uint64_t tmp = img->width;
     img->width = img->height;
@@ -264,7 +204,7 @@ static inline void copy_pixel(size_t dst, size_t src)
 // Rotate an image by 90 degrees clockwise
 static void rotate_90(struct Buffer* img)
 {
-    uint8_t* out = malloc(img->size);
+    uint8_t* out = av_malloc(img->size);
 
     size_t src = (size_t)img->data;
     for (size_t y = 0; y < img->height; y++) {
@@ -282,7 +222,7 @@ static void rotate_90(struct Buffer* img)
 // Rotate an image by 270 degrees clockwise
 static void rotate_270(struct Buffer* img)
 {
-    uint8_t* out = malloc(img->size);
+    uint8_t* out = av_malloc(img->size);
 
     size_t src = (size_t)img->data;
     for (size_t y = 0; y < img->height; y++) {
@@ -325,14 +265,63 @@ static void adjust_orientation(struct Buffer* img, const int orientation)
 }
 
 // Scale both image dimensions to fit in constraint, if it is exceeded
-static void scale_dims(struct Buffer* img, uint64_t max, uint64_t val)
+static void scale_dims(struct Buffer* img, uint64_t max_w, uint64_t max_h)
 {
-    if (val > max) {
-        // Maintains aspect ratio
-        const double scale = (double)val / (double)max;
-        img->width = (uint64_t)((double)img->width / scale);
-        img->height = (uint64_t)((double)img->height / scale);
+    if (!img || !img->width || !img->height)
+        return;
+
+    const double scale_w = (double)max_w / (double)img->width;
+    const double scale_h = (double)max_h / (double)img->height;
+
+    // Choose the smaller scale to ensure both dimensions fit
+    const double scale = scale_w < scale_h ? scale_w : scale_h;
+
+    // If image already fits, do nothing
+    if (scale >= 1.0) {
+        return;
     }
+
+    img->width  = (uint64_t)(img->width  * scale + 0.5);
+    img->height = (uint64_t)(img->height * scale + 0.5);
+}
+
+static int scale_frame_to_rgba(struct Buffer* dst, const AVFrame* frame)
+{
+    struct SwsContext* ctx = sws_getContext(
+        frame->width,
+        frame->height,
+        frame->format,
+        dst->width,
+        dst->height,
+        AV_PIX_FMT_RGBA,
+        SWS_AREA,
+        NULL,
+        NULL,
+        NULL
+    );
+
+    if (!ctx)
+        return AVERROR(ENOMEM);
+
+    uint8_t* dst_data[4] = { dst->data, NULL, NULL, NULL };
+    int dst_linesize[4] = { 4 * dst->width, 0, 0, 0 };
+
+    int scaled = sws_scale(
+        ctx,
+        (const uint8_t* const*)frame->data,
+        frame->linesize,
+        0,
+        frame->height,
+        dst_data,
+        dst_linesize
+    );
+
+    sws_freeContext(ctx);
+
+    if (scaled != dst->height)
+        return AVERROR_UNKNOWN;
+
+    return 0;
 }
 
 // Encode and scale frame to RGBA image
@@ -345,47 +334,34 @@ static int encode_frame(
         AVDictionaryEntry* e
             = av_dict_get(frame->metadata, "Orientation", NULL, 0);
         if (e) {
-            orientation = atol(e->value);
+            orientation = atoi(e->value);
         }
     }
 
     img->width = frame->width;
     img->height = frame->height;
 
-    // If image fits inside thumbnail, simply convert to RGBA.
-    //
-    // scale_dims() does not work, if image size is exactly that of the target
-    // thumbnail size. Perhaps a peculiarity of sws_scale().
-    if (img->width < box.width && img->height < box.height) {
-        alloc_buffer(img);
-        err = resample(img, frame);
-        if (err) {
-            return err;
-        }
-        compensate_alpha(img);
-        adjust_orientation(img, orientation);
-        return 0;
-    }
+    // Scale dimensions to fit box
+    scale_dims(img, box.width, box.height);
+
+    // Allocate final RGBA buffer
+    err = alloc_buffer(img);
+    if (err < 0)
+        return err;
 
-    scale_dims(img, box.width, img->width);
-    scale_dims(img, box.height, img->height);
-
-    // Subsample to 4 times the thumbnail size and then Box subsample that.
-    // A decent enough compromise between quality and performance for images
-    // around the thumbnail size and much bigger ones.
-    struct Buffer enlarged
-        = { .width = img->width * 4, .height = img->height * 4 };
-    alloc_buffer(&enlarged);
-    err = resample(&enlarged, frame);
-    if (err) {
-        free(enlarged.data);
+    // Single-pass high quality scale
+    err = scale_frame_to_rgba(img, frame);
+    if (err < 0) {
+        av_freep(&img->data);
         return err;
     }
-    alloc_buffer(img);
-    downscale(img, &enlarged);
-    free(enlarged.data);
+
+    // Optional: keep only if needed for your pipeline
+    // compensate_alpha(img);
+
     adjust_orientation(img, orientation);
-    return err;
+
+    return 0;
 }
 
 // Read from stream until a full frame is read
@@ -448,7 +424,6 @@ int get_rotation(AVStream* video_stream) {
     if (!video_stream)
         return 0;
 
-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60,31,0) /* ffmpeg >= 6.1 */
     const AVCodecParameters *par = video_stream->codecpar;
     if(!par)
         return 0;
@@ -458,14 +433,6 @@ int get_rotation(AVStream* video_stream) {
             sd->size >= 9 * sizeof(int32_t))
             return extract_rotation_from_matrix((const int32_t*)sd->data);
     }
-#else /* ffmpeg < 6.1 */
-    for (int i = 0; i < video_stream->nb_side_data; ++i) {
-        const AVPacketSideData *sd = &video_stream->side_data[i];
-        if (sd->type == AV_PKT_DATA_DISPLAYMATRIX &&
-            sd->size >= 9 * sizeof(int32_t))
-            return extract_rotation_from_matrix((const int32_t*)sd->data);
-    }
-#endif
     return 0; // No rotation detected or side data not found
 }
 
