From 6803c1682b26a0d78326dbe45b06f61ac0476d0d Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 27 Dec 2021 18:03:36 +0100 Subject: [PATCH 01/43] start refactor of media package --- internal/media/handler.go | 53 ++----- internal/media/{processimage.go => image.go} | 8 +- internal/media/processicon.go | 6 +- internal/media/{util.go => processing.go} | 158 ++----------------- internal/media/types.go | 149 +++++++++++++++++ internal/media/util_test.go | 4 +- 6 files changed, 183 insertions(+), 195 deletions(-) rename internal/media/{processimage.go => image.go} (94%) rename internal/media/{util.go => processing.go} (50%) create mode 100644 internal/media/types.go diff --git a/internal/media/handler.go b/internal/media/handler.go index e6c7369b68..b64e583b3e 100644 --- a/internal/media/handler.go +++ b/internal/media/handler.go @@ -35,45 +35,16 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/uris" ) -// EmojiMaxBytes is the maximum permitted bytes of an emoji upload (50kb) -const EmojiMaxBytes = 51200 -type Size string -const ( - SizeSmall Size = "small" // SizeSmall is the key for small/thumbnail versions of media - SizeOriginal Size = "original" // SizeOriginal is the key for original/fullsize versions of media and emoji - SizeStatic Size = "static" // SizeStatic is the key for static (non-animated) versions of emoji -) - -type Type string - -const ( - TypeAttachment Type = "attachment" // TypeAttachment is the key for media attachments - TypeHeader Type = "header" // TypeHeader is the key for profile header requests - TypeAvatar Type = "avatar" // TypeAvatar is the key for profile avatar requests - TypeEmoji Type = "emoji" // TypeEmoji is the key for emoji type requests -) +type ProcessedCallback func(*gtsmodel.MediaAttachment) error // Handler provides an interface for parsing, storing, and retrieving media objects like photos, videos, and gifs. type Handler interface { - // ProcessHeaderOrAvatar takes a new header image for an account, checks it out, removes exif data from it, - // puts it in whatever storage backend we're using, sets the relevant fields in the database for the new image, - // and then returns information to the caller about the new header. - ProcessHeaderOrAvatar(ctx context.Context, attachment []byte, accountID string, mediaType Type, remoteURL string) (*gtsmodel.MediaAttachment, error) - - // ProcessLocalAttachment takes a new attachment and the requesting account, checks it out, removes exif data from it, - // puts it in whatever storage backend we're using, sets the relevant fields in the database for the new media, - // and then returns information to the caller about the attachment. It's the caller's responsibility to put the returned struct - // in the database. - ProcessAttachment(ctx context.Context, attachmentBytes []byte, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) - - // ProcessLocalEmoji takes a new emoji and a shortcode, cleans it up, puts it in storage, and creates a new - // *gts.Emoji for it, then returns it to the caller. It's the caller's responsibility to put the returned struct - // in the database. - ProcessLocalEmoji(ctx context.Context, emojiBytes []byte, shortcode string) (*gtsmodel.Emoji, error) - - ProcessRemoteHeaderOrAvatar(ctx context.Context, t transport.Transport, currentAttachment *gtsmodel.MediaAttachment, accountID string) (*gtsmodel.MediaAttachment, error) + ProcessHeader(ctx context.Context, data []byte, accountID string, cb ProcessedCallback) (*gtsmodel.MediaAttachment, error) + ProcessAvatar(ctx context.Context, data []byte, accountID string, cb ProcessedCallback) (*gtsmodel.MediaAttachment, error) + ProcessAttachment(ctx context.Context, data []byte, accountID string, cb ProcessedCallback) (*gtsmodel.MediaAttachment, error) + ProcessEmoji(ctx context.Context, data []byte, shortcode string) (*gtsmodel.Emoji, error) } type mediaHandler struct { @@ -108,7 +79,7 @@ func (mh *mediaHandler) ProcessHeaderOrAvatar(ctx context.Context, attachment [] if err != nil { return nil, err } - if !SupportedImageType(contentType) { + if !supportedImage(contentType) { return nil, fmt.Errorf("%s is not an accepted image type", contentType) } @@ -152,8 +123,8 @@ func (mh *mediaHandler) ProcessAttachment(ctx context.Context, attachmentBytes [ // return nil, errors.New("video was of size 0") // } // return mh.processVideoAttachment(attachment, accountID, contentType, remoteURL) - case MIMEImage: - if !SupportedImageType(contentType) { + case mimeImage: + if !supportedImage(contentType) { return nil, fmt.Errorf("image type %s not supported", contentType) } if len(attachmentBytes) == 0 { @@ -180,7 +151,7 @@ func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte if err != nil { return nil, err } - if !supportedEmojiType(contentType) { + if !supportedEmoji(contentType) { return nil, fmt.Errorf("content type %s not supported for emojis", contentType) } @@ -193,11 +164,11 @@ func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte // clean any exif data from png but leave gifs alone switch contentType { - case MIMEPng: + case mimePng: if clean, err = purgeExif(emojiBytes); err != nil { return nil, fmt.Errorf("error cleaning exif data: %s", err) } - case MIMEGif: + case mimeGif: clean = emojiBytes default: return nil, errors.New("media type unrecognized") @@ -266,7 +237,7 @@ func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte ImagePath: emojiPath, ImageStaticPath: emojiStaticPath, ImageContentType: contentType, - ImageStaticContentType: MIMEPng, // static version will always be a png + ImageStaticContentType: mimePng, // static version will always be a png ImageFileSize: len(original.image), ImageStaticFileSize: len(static.image), ImageUpdatedAt: time.Now(), diff --git a/internal/media/processimage.go b/internal/media/image.go similarity index 94% rename from internal/media/processimage.go rename to internal/media/image.go index ca92c0660b..f1cc03bb69 100644 --- a/internal/media/processimage.go +++ b/internal/media/image.go @@ -29,7 +29,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/uris" ) -func (mh *mediaHandler) processImageAttachment(data []byte, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) { +func (mh *mediaHandler) processImage(data []byte, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) { var clean []byte var err error var original *imageAndMeta @@ -38,7 +38,7 @@ func (mh *mediaHandler) processImageAttachment(data []byte, minAttachment *gtsmo contentType := minAttachment.File.ContentType switch contentType { - case MIMEJpeg, MIMEPng: + case mimeJpeg, mimePng: if clean, err = purgeExif(data); err != nil { return nil, fmt.Errorf("error cleaning exif data: %s", err) } @@ -46,7 +46,7 @@ func (mh *mediaHandler) processImageAttachment(data []byte, minAttachment *gtsmo if err != nil { return nil, fmt.Errorf("error parsing image: %s", err) } - case MIMEGif: + case mimeGif: clean = data original, err = deriveGif(clean, contentType) if err != nil { @@ -119,7 +119,7 @@ func (mh *mediaHandler) processImageAttachment(data []byte, minAttachment *gtsmo }, Thumbnail: gtsmodel.Thumbnail{ Path: smallPath, - ContentType: MIMEJpeg, // all thumbnails/smalls are encoded as jpeg + ContentType: mimeJpeg, // all thumbnails/smalls are encoded as jpeg FileSize: len(small.image), UpdatedAt: time.Now(), URL: smallURL, diff --git a/internal/media/processicon.go b/internal/media/processicon.go index 66cf1f9998..faeae0ee65 100644 --- a/internal/media/processicon.go +++ b/internal/media/processicon.go @@ -47,17 +47,17 @@ func (mh *mediaHandler) processHeaderOrAvi(imageBytes []byte, contentType string var original *imageAndMeta switch contentType { - case MIMEJpeg: + case mimeJpeg: if clean, err = purgeExif(imageBytes); err != nil { return nil, fmt.Errorf("error cleaning exif data: %s", err) } original, err = deriveImage(clean, contentType) - case MIMEPng: + case mimePng: if clean, err = purgeExif(imageBytes); err != nil { return nil, fmt.Errorf("error cleaning exif data: %s", err) } original, err = deriveImage(clean, contentType) - case MIMEGif: + case mimeGif: clean = imageBytes original, err = deriveGif(clean, contentType) default: diff --git a/internal/media/util.go b/internal/media/processing.go similarity index 50% rename from internal/media/util.go rename to internal/media/processing.go index 348136c92d..ccd9ebfdb1 100644 --- a/internal/media/util.go +++ b/internal/media/processing.go @@ -1,21 +1,3 @@ -/* - GoToSocial - Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - package media import ( @@ -28,112 +10,26 @@ import ( "image/png" "github.com/buckket/go-blurhash" - "github.com/h2non/filetype" "github.com/nfnt/resize" "github.com/superseriousbusiness/exifremove/pkg/exifremove" ) -const ( - // MIMEImage is the mime type for image - MIMEImage = "image" - // MIMEJpeg is the jpeg image mime type - MIMEJpeg = "image/jpeg" - // MIMEGif is the gif image mime type - MIMEGif = "image/gif" - // MIMEPng is the png image mime type - MIMEPng = "image/png" - - // MIMEVideo is the mime type for video - MIMEVideo = "video" - // MIMEMp4 is the mp4 video mime type - MIMEMp4 = "video/mp4" - // MIMEMpeg is the mpeg video mime type - MIMEMpeg = "video/mpeg" - // MIMEWebm is the webm video mime type - MIMEWebm = "video/webm" -) - -// parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). -// Returns an error if the content type is not something we can process. -func parseContentType(content []byte) (string, error) { - head := make([]byte, 261) - _, err := bytes.NewReader(content).Read(head) - if err != nil { - return "", fmt.Errorf("could not read first magic bytes of file: %s", err) - } - - kind, err := filetype.Match(head) - if err != nil { - return "", err - } - - if kind == filetype.Unknown { - return "", errors.New("filetype unknown") - } - - return kind.MIME.Value, nil -} - -// SupportedImageType checks mime type of an image against a slice of accepted types, -// and returns True if the mime type is accepted. -func SupportedImageType(mimeType string) bool { - acceptedImageTypes := []string{ - MIMEJpeg, - MIMEGif, - MIMEPng, - } - for _, accepted := range acceptedImageTypes { - if mimeType == accepted { - return true - } - } - return false -} - -// SupportedVideoType checks mime type of a video against a slice of accepted types, -// and returns True if the mime type is accepted. -func SupportedVideoType(mimeType string) bool { - acceptedVideoTypes := []string{ - MIMEMp4, - MIMEMpeg, - MIMEWebm, - } - for _, accepted := range acceptedVideoTypes { - if mimeType == accepted { - return true - } - } - return false -} - -// supportedEmojiType checks that the content type is image/png -- the only type supported for emoji. -func supportedEmojiType(mimeType string) bool { - acceptedEmojiTypes := []string{ - MIMEGif, - MIMEPng, - } - for _, accepted := range acceptedEmojiTypes { - if mimeType == accepted { - return true - } - } - return false -} - // purgeExif is a little wrapper for the action of removing exif data from an image. // Only pass pngs or jpegs to this function. -func purgeExif(b []byte) ([]byte, error) { - if len(b) == 0 { +func purgeExif(data []byte) ([]byte, error) { + if len(data) == 0 { return nil, errors.New("passed image was not valid") } - clean, err := exifremove.Remove(b) + clean, err := exifremove.Remove(data) if err != nil { return nil, fmt.Errorf("could not purge exif from image: %s", err) } + if len(clean) == 0 { return nil, errors.New("purged image was not valid") } + return clean, nil } @@ -141,7 +37,7 @@ func deriveGif(b []byte, extension string) (*imageAndMeta, error) { var g *gif.GIF var err error switch extension { - case MIMEGif: + case mimeGif: g, err = gif.DecodeAll(bytes.NewReader(b)) if err != nil { return nil, err @@ -170,12 +66,12 @@ func deriveImage(b []byte, contentType string) (*imageAndMeta, error) { var err error switch contentType { - case MIMEJpeg: + case mimeImageJpeg: i, err = jpeg.Decode(bytes.NewReader(b)) if err != nil { return nil, err } - case MIMEPng: + case mimeImagePng: i, err = png.Decode(bytes.NewReader(b)) if err != nil { return nil, err @@ -208,17 +104,17 @@ func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMet var err error switch contentType { - case MIMEJpeg: + case mimeImageJpeg: i, err = jpeg.Decode(bytes.NewReader(b)) if err != nil { return nil, err } - case MIMEPng: + case mimeImagePng: i, err = png.Decode(bytes.NewReader(b)) if err != nil { return nil, err } - case MIMEGif: + case mimeImageGif: i, err = gif.Decode(bytes.NewReader(b)) if err != nil { return nil, err @@ -261,12 +157,12 @@ func deriveStaticEmoji(b []byte, contentType string) (*imageAndMeta, error) { var err error switch contentType { - case MIMEPng: + case mimeImagePng: i, err = png.Decode(bytes.NewReader(b)) if err != nil { return nil, err } - case MIMEGif: + case mimeImageGif: i, err = gif.Decode(bytes.NewReader(b)) if err != nil { return nil, err @@ -292,31 +188,3 @@ type imageAndMeta struct { aspect float64 blurhash string } - -// ParseMediaType converts s to a recognized MediaType, or returns an error if unrecognized -func ParseMediaType(s string) (Type, error) { - switch s { - case string(TypeAttachment): - return TypeAttachment, nil - case string(TypeHeader): - return TypeHeader, nil - case string(TypeAvatar): - return TypeAvatar, nil - case string(TypeEmoji): - return TypeEmoji, nil - } - return "", fmt.Errorf("%s not a recognized MediaType", s) -} - -// ParseMediaSize converts s to a recognized MediaSize, or returns an error if unrecognized -func ParseMediaSize(s string) (Size, error) { - switch s { - case string(SizeSmall): - return SizeSmall, nil - case string(SizeOriginal): - return SizeOriginal, nil - case string(SizeStatic): - return SizeStatic, nil - } - return "", fmt.Errorf("%s not a recognized MediaSize", s) -} diff --git a/internal/media/types.go b/internal/media/types.go new file mode 100644 index 0000000000..f1608f8804 --- /dev/null +++ b/internal/media/types.go @@ -0,0 +1,149 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package media + +import ( + "bytes" + "errors" + "fmt" + + "github.com/h2non/filetype" +) + +// mime consts +const ( + mimeImage = "image" + + mimeJpeg = "jpeg" + mimeImageJpeg = mimeImage + "/" + mimeJpeg + + mimeGif = "gif" + mimeImageGif = mimeImage + "/" + mimeGif + + mimePng = "png" + mimeImagePng = mimeImage + "/" + mimePng +) + + +// EmojiMaxBytes is the maximum permitted bytes of an emoji upload (50kb) +// const EmojiMaxBytes = 51200 + +// maxFileHeaderBytes represents the maximum amount of bytes we want +// to examine from the beginning of a file to determine its type. +// +// See: https://en.wikipedia.org/wiki/File_format#File_header +// and https://github.com/h2non/filetype +const maxFileHeaderBytes = 262 + +type Size string + +const ( + SizeSmall Size = "small" // SizeSmall is the key for small/thumbnail versions of media + SizeOriginal Size = "original" // SizeOriginal is the key for original/fullsize versions of media and emoji + SizeStatic Size = "static" // SizeStatic is the key for static (non-animated) versions of emoji +) + +type Type string + +const ( + TypeAttachment Type = "attachment" // TypeAttachment is the key for media attachments + TypeHeader Type = "header" // TypeHeader is the key for profile header requests + TypeAvatar Type = "avatar" // TypeAvatar is the key for profile avatar requests + TypeEmoji Type = "emoji" // TypeEmoji is the key for emoji type requests +) + +// parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). +// Returns an error if the content type is not something we can process. +func parseContentType(content []byte) (string, error) { + + // read in the first bytes of the file + fileHeader := make([]byte, maxFileHeaderBytes) + if _, err := bytes.NewReader(content).Read(fileHeader); err != nil { + return "", fmt.Errorf("could not read first magic bytes of file: %s", err) + } + + kind, err := filetype.Match(fileHeader) + if err != nil { + return "", err + } + + if kind == filetype.Unknown { + return "", errors.New("filetype unknown") + } + + return kind.MIME.Value, nil +} + +// supportedImage checks mime type of an image against a slice of accepted types, +// and returns True if the mime type is accepted. +func supportedImage(mimeType string) bool { + acceptedImageTypes := []string{ + mimeImageJpeg, + mimeImageGif, + mimeImagePng, + } + for _, accepted := range acceptedImageTypes { + if mimeType == accepted { + return true + } + } + return false +} + +// supportedEmoji checks that the content type is image/png -- the only type supported for emoji. +func supportedEmoji(mimeType string) bool { + acceptedEmojiTypes := []string{ + mimeImageGif, + mimeImagePng, + } + for _, accepted := range acceptedEmojiTypes { + if mimeType == accepted { + return true + } + } + return false +} + +// ParseMediaType converts s to a recognized MediaType, or returns an error if unrecognized +func ParseMediaType(s string) (Type, error) { + switch s { + case string(TypeAttachment): + return TypeAttachment, nil + case string(TypeHeader): + return TypeHeader, nil + case string(TypeAvatar): + return TypeAvatar, nil + case string(TypeEmoji): + return TypeEmoji, nil + } + return "", fmt.Errorf("%s not a recognized MediaType", s) +} + +// ParseMediaSize converts s to a recognized MediaSize, or returns an error if unrecognized +func ParseMediaSize(s string) (Size, error) { + switch s { + case string(SizeSmall): + return SizeSmall, nil + case string(SizeOriginal): + return SizeOriginal, nil + case string(SizeStatic): + return SizeStatic, nil + } + return "", fmt.Errorf("%s not a recognized MediaSize", s) +} diff --git a/internal/media/util_test.go b/internal/media/util_test.go index cb299d50eb..817b597cbb 100644 --- a/internal/media/util_test.go +++ b/internal/media/util_test.go @@ -138,10 +138,10 @@ func (suite *MediaUtilTestSuite) TestDeriveThumbnailFromJPEG() { } func (suite *MediaUtilTestSuite) TestSupportedImageTypes() { - ok := SupportedImageType("image/jpeg") + ok := supportedImage("image/jpeg") suite.True(ok) - ok = SupportedImageType("image/bmp") + ok = supportedImage("image/bmp") suite.False(ok) } From c4d63d125b5a44c150a00b0b20b3638cad9221f8 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 28 Dec 2021 16:36:00 +0100 Subject: [PATCH 02/43] more refactoring, media handler => manager --- cmd/gotosocial/action/server/server.go | 6 +- .../api/client/fileserver/servefile_test.go | 4 +- internal/api/client/media/mediacreate_test.go | 4 +- .../api/s2s/webfinger/webfingerget_test.go | 4 +- internal/federation/dereferencing/account.go | 4 +- .../federation/dereferencing/attachment.go | 2 +- .../federation/dereferencing/dereferencer.go | 6 +- .../dereferencing/dereferencer_test.go | 2 +- internal/federation/federator.go | 8 +- internal/federation/federator_test.go | 4 +- internal/media/image.go | 241 ++++++++++++++++-- internal/media/{handler.go => manager.go} | 115 ++++----- internal/media/processicon.go | 143 ----------- internal/media/processing.go | 190 -------------- internal/media/processvideo.go | 2 +- internal/media/types.go | 1 - internal/media/util_test.go | 2 +- internal/processing/account/account.go | 6 +- internal/processing/account/account_test.go | 6 +- internal/processing/account/update.go | 4 +- internal/processing/admin/admin.go | 6 +- internal/processing/admin/emoji.go | 4 +- internal/processing/media/create.go | 4 +- internal/processing/media/media.go | 6 +- internal/processing/processor.go | 12 +- internal/processing/processor_test.go | 6 +- testrig/federator.go | 2 +- testrig/mediahandler.go | 4 +- testrig/processor.go | 2 +- 29 files changed, 321 insertions(+), 479 deletions(-) rename internal/media/{handler.go => manager.go} (71%) delete mode 100644 internal/media/processicon.go delete mode 100644 internal/media/processing.go diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index d55f38fc5a..05c2e89748 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -105,10 +105,10 @@ var Start action.GTSAction = func(ctx context.Context) error { } // build backend handlers - mediaHandler := media.New(dbService, storage) + mediaManager := media.New(dbService, storage) oauthServer := oauth.New(ctx, dbService) transportController := transport.NewController(dbService, &federation.Clock{}, http.DefaultClient) - federator := federation.NewFederator(dbService, federatingDB, transportController, typeConverter, mediaHandler) + federator := federation.NewFederator(dbService, federatingDB, transportController, typeConverter, mediaManager) // decide whether to create a noop email sender (won't send emails) or a real one var emailSender email.Sender @@ -128,7 +128,7 @@ var Start action.GTSAction = func(ctx context.Context) error { } // create and start the message processor using the other services we've created so far - processor := processing.NewProcessor(typeConverter, federator, oauthServer, mediaHandler, storage, timelineManager, dbService, emailSender) + processor := processing.NewProcessor(typeConverter, federator, oauthServer, mediaManager, storage, timelineManager, dbService, emailSender) if err := processor.Start(ctx); err != nil { return fmt.Errorf("error starting processor: %s", err) } diff --git a/internal/api/client/fileserver/servefile_test.go b/internal/api/client/fileserver/servefile_test.go index 18f54542a8..109ed4ebae 100644 --- a/internal/api/client/fileserver/servefile_test.go +++ b/internal/api/client/fileserver/servefile_test.go @@ -51,7 +51,7 @@ type ServeFileTestSuite struct { federator federation.Federator tc typeutils.TypeConverter processor processing.Processor - mediaHandler media.Handler + mediaManager media.Manager oauthServer oauth.Server emailSender email.Sender @@ -82,7 +82,7 @@ func (suite *ServeFileTestSuite) SetupSuite() { suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) suite.tc = testrig.NewTestTypeConverter(suite.db) - suite.mediaHandler = testrig.NewTestMediaHandler(suite.db, suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) // setup module being tested diff --git a/internal/api/client/media/mediacreate_test.go b/internal/api/client/media/mediacreate_test.go index 2897d786b0..72a377c254 100644 --- a/internal/api/client/media/mediacreate_test.go +++ b/internal/api/client/media/mediacreate_test.go @@ -53,7 +53,7 @@ type MediaCreateTestSuite struct { storage *kv.KVStore federator federation.Federator tc typeutils.TypeConverter - mediaHandler media.Handler + mediaManager media.Manager oauthServer oauth.Server emailSender email.Sender processor processing.Processor @@ -81,7 +81,7 @@ func (suite *MediaCreateTestSuite) SetupSuite() { suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() suite.tc = testrig.NewTestTypeConverter(suite.db) - suite.mediaHandler = testrig.NewTestMediaHandler(suite.db, suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) diff --git a/internal/api/s2s/webfinger/webfingerget_test.go b/internal/api/s2s/webfinger/webfingerget_test.go index 4b27ada422..c5df1f7e5a 100644 --- a/internal/api/s2s/webfinger/webfingerget_test.go +++ b/internal/api/s2s/webfinger/webfingerget_test.go @@ -69,7 +69,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUser() { func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByHost() { viper.Set(config.Keys.Host, "gts.example.org") viper.Set(config.Keys.AccountDomain, "example.org") - suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaHandler(suite.db, suite.storage), suite.storage, testrig.NewTestTimelineManager(suite.db), suite.db, suite.emailSender) + suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaManager(suite.db, suite.storage), suite.storage, testrig.NewTestTimelineManager(suite.db), suite.db, suite.emailSender) suite.webfingerModule = webfinger.New(suite.processor).(*webfinger.Module) targetAccount := accountDomainAccount() @@ -103,7 +103,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByHo func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByAccountDomain() { viper.Set(config.Keys.Host, "gts.example.org") viper.Set(config.Keys.AccountDomain, "example.org") - suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaHandler(suite.db, suite.storage), suite.storage, testrig.NewTestTimelineManager(suite.db), suite.db, suite.emailSender) + suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaManager(suite.db, suite.storage), suite.storage, testrig.NewTestTimelineManager(suite.db), suite.db, suite.emailSender) suite.webfingerModule = webfinger.New(suite.processor).(*webfinger.Module) targetAccount := accountDomainAccount() diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index d06ad21c19..19c98e203c 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -246,7 +246,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * } if targetAccount.AvatarRemoteURL != "" && (targetAccount.AvatarMediaAttachmentID == "" || refresh) { - a, err := d.mediaHandler.ProcessRemoteHeaderOrAvatar(ctx, t, >smodel.MediaAttachment{ + a, err := d.mediaManager.ProcessRemoteHeaderOrAvatar(ctx, t, >smodel.MediaAttachment{ RemoteURL: targetAccount.AvatarRemoteURL, Avatar: true, }, targetAccount.ID) @@ -257,7 +257,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * } if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { - a, err := d.mediaHandler.ProcessRemoteHeaderOrAvatar(ctx, t, >smodel.MediaAttachment{ + a, err := d.mediaManager.ProcessRemoteHeaderOrAvatar(ctx, t, >smodel.MediaAttachment{ RemoteURL: targetAccount.HeaderRemoteURL, Header: true, }, targetAccount.ID) diff --git a/internal/federation/dereferencing/attachment.go b/internal/federation/dereferencing/attachment.go index 0c7005e23b..30ab6da104 100644 --- a/internal/federation/dereferencing/attachment.go +++ b/internal/federation/dereferencing/attachment.go @@ -93,7 +93,7 @@ func (d *deref) RefreshAttachment(ctx context.Context, requestingUsername string return nil, fmt.Errorf("RefreshAttachment: error dereferencing media: %s", err) } - a, err := d.mediaHandler.ProcessAttachment(ctx, attachmentBytes, minAttachment) + a, err := d.mediaManager.ProcessAttachment(ctx, attachmentBytes, minAttachment) if err != nil { return nil, fmt.Errorf("RefreshAttachment: error processing attachment: %s", err) } diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index d0b653920a..4f977b8c85 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -80,18 +80,18 @@ type deref struct { db db.DB typeConverter typeutils.TypeConverter transportController transport.Controller - mediaHandler media.Handler + mediaManager media.Manager handshakes map[string][]*url.URL handshakeSync *sync.Mutex // mutex to lock/unlock when checking or updating the handshakes map } // NewDereferencer returns a Dereferencer initialized with the given parameters. -func NewDereferencer(db db.DB, typeConverter typeutils.TypeConverter, transportController transport.Controller, mediaHandler media.Handler) Dereferencer { +func NewDereferencer(db db.DB, typeConverter typeutils.TypeConverter, transportController transport.Controller, mediaManager media.Manager) Dereferencer { return &deref{ db: db, typeConverter: typeConverter, transportController: transportController, - mediaHandler: mediaHandler, + mediaManager: mediaManager, handshakeSync: &sync.Mutex{}, } } diff --git a/internal/federation/dereferencing/dereferencer_test.go b/internal/federation/dereferencing/dereferencer_test.go index 569e8e93b9..fe66abce43 100644 --- a/internal/federation/dereferencing/dereferencer_test.go +++ b/internal/federation/dereferencing/dereferencer_test.go @@ -64,7 +64,7 @@ func (suite *DereferencerStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() - suite.dereferencer = dereferencing.NewDereferencer(suite.db, testrig.NewTestTypeConverter(suite.db), suite.mockTransportController(), testrig.NewTestMediaHandler(suite.db, suite.storage)) + suite.dereferencer = dereferencing.NewDereferencer(suite.db, testrig.NewTestTypeConverter(suite.db), suite.mockTransportController(), testrig.NewTestMediaManager(suite.db, suite.storage)) testrig.StandardDBSetup(suite.db, nil) } diff --git a/internal/federation/federator.go b/internal/federation/federator.go index 0a82f12bc9..7edff1118f 100644 --- a/internal/federation/federator.go +++ b/internal/federation/federator.go @@ -78,13 +78,13 @@ type federator struct { typeConverter typeutils.TypeConverter transportController transport.Controller dereferencer dereferencing.Dereferencer - mediaHandler media.Handler + mediaManager media.Manager actor pub.FederatingActor } // NewFederator returns a new federator -func NewFederator(db db.DB, federatingDB federatingdb.DB, transportController transport.Controller, typeConverter typeutils.TypeConverter, mediaHandler media.Handler) Federator { - dereferencer := dereferencing.NewDereferencer(db, typeConverter, transportController, mediaHandler) +func NewFederator(db db.DB, federatingDB federatingdb.DB, transportController transport.Controller, typeConverter typeutils.TypeConverter, mediaManager media.Manager) Federator { + dereferencer := dereferencing.NewDereferencer(db, typeConverter, transportController, mediaManager) clock := &Clock{} f := &federator{ @@ -94,7 +94,7 @@ func NewFederator(db db.DB, federatingDB federatingdb.DB, transportController tr typeConverter: typeConverter, transportController: transportController, dereferencer: dereferencer, - mediaHandler: mediaHandler, + mediaManager: mediaManager, } actor := newFederatingActor(f, f, federatingDB, clock) f.actor = actor diff --git a/internal/federation/federator_test.go b/internal/federation/federator_test.go index 43f4904a50..6dac76c050 100644 --- a/internal/federation/federator_test.go +++ b/internal/federation/federator_test.go @@ -78,7 +78,7 @@ func (suite *ProtocolTestSuite) TestPostInboxRequestBodyHook() { return nil, nil }), suite.db) // setup module being tested - federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db), tc, suite.typeConverter, testrig.NewTestMediaHandler(suite.db, suite.storage)) + federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db), tc, suite.typeConverter, testrig.NewTestMediaManager(suite.db, suite.storage)) // setup request ctx := context.Background() @@ -107,7 +107,7 @@ func (suite *ProtocolTestSuite) TestAuthenticatePostInbox() { tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) // now setup module being tested, with the mock transport controller - federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db), tc, suite.typeConverter, testrig.NewTestMediaHandler(suite.db, suite.storage)) + federator := federation.NewFederator(suite.db, testrig.NewTestFederatingDB(suite.db), tc, suite.typeConverter, testrig.NewTestMediaManager(suite.db, suite.storage)) request := httptest.NewRequest(http.MethodPost, "http://localhost:8080/users/the_mighty_zork/inbox", nil) // we need these headers for the request to be validated diff --git a/internal/media/image.go b/internal/media/image.go index f1cc03bb69..87b5d70b7f 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -19,67 +19,88 @@ package media import ( + "bytes" "errors" "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" "strings" "time" + "github.com/buckket/go-blurhash" + "github.com/nfnt/resize" + "github.com/superseriousbusiness/exifremove/pkg/exifremove" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" "github.com/superseriousbusiness/gotosocial/internal/uris" ) -func (mh *mediaHandler) processImage(data []byte, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) { +const ( + thumbnailMaxWidth = 512 + thumbnailMaxHeight = 512 +) + +type imageAndMeta struct { + image []byte + width int + height int + size int + aspect float64 + blurhash string +} + +func (m *manager) processImage(data []byte, contentType string) (*gtsmodel.MediaAttachment, error) { var clean []byte var err error var original *imageAndMeta var small *imageAndMeta - contentType := minAttachment.File.ContentType - switch contentType { - case mimeJpeg, mimePng: - if clean, err = purgeExif(data); err != nil { - return nil, fmt.Errorf("error cleaning exif data: %s", err) + case mimeImageJpeg, mimeImagePng: + // first 'clean' image by purging exif data from it + var exifErr error + if clean, exifErr = purgeExif(data); exifErr != nil { + return nil, fmt.Errorf("error cleaning exif data: %s", exifErr) } - original, err = deriveImage(clean, contentType) - if err != nil { - return nil, fmt.Errorf("error parsing image: %s", err) - } - case mimeGif: + original, err = decodeImage(clean, contentType) + case mimeImageGif: + // gifs are already clean - no exif data to remove clean = data - original, err = deriveGif(clean, contentType) - if err != nil { - return nil, fmt.Errorf("error parsing gif: %s", err) - } + original, err = decodeGif(clean, contentType) default: - return nil, errors.New("media type unrecognized") + err = fmt.Errorf("content type %s not a recognized image type", contentType) + } + + if err != nil { + return nil, err } - small, err = deriveThumbnail(clean, contentType, 512, 512) + small, err = deriveThumbnail(clean, contentType, thumbnailMaxWidth, thumbnailMaxHeight) if err != nil { return nil, fmt.Errorf("error deriving thumbnail: %s", err) } // now put it in storage, take a new id for the name of the file so we don't store any unnecessary info about it extension := strings.Split(contentType, "/")[1] - newMediaID, err := id.NewRandomULID() + attachmentID, err := id.NewRandomULID() if err != nil { return nil, err } - originalURL := uris.GenerateURIForAttachment(minAttachment.AccountID, string(TypeAttachment), string(SizeOriginal), newMediaID, extension) - smallURL := uris.GenerateURIForAttachment(minAttachment.AccountID, string(TypeAttachment), string(SizeSmall), newMediaID, "jpeg") // all thumbnails/smalls are encoded as jpeg + originalURL := uris.GenerateURIForAttachment(minAttachment.AccountID, string(TypeAttachment), string(SizeOriginal), attachmentID, extension) + smallURL := uris.GenerateURIForAttachment(minAttachment.AccountID, string(TypeAttachment), string(SizeSmall), attachmentID, "jpeg") // all thumbnails/smalls are encoded as jpeg // we store the original... - originalPath := fmt.Sprintf("%s/%s/%s/%s.%s", minAttachment.AccountID, TypeAttachment, SizeOriginal, newMediaID, extension) - if err := mh.storage.Put(originalPath, original.image); err != nil { + originalPath := fmt.Sprintf("%s/%s/%s/%s.%s", minAttachment.AccountID, TypeAttachment, SizeOriginal, attachmentID, extension) + if err := m.storage.Put(originalPath, original.image); err != nil { return nil, fmt.Errorf("storage error: %s", err) } // and a thumbnail... - smallPath := fmt.Sprintf("%s/%s/%s/%s.jpeg", minAttachment.AccountID, TypeAttachment, SizeSmall, newMediaID) // all thumbnails/smalls are encoded as jpeg - if err := mh.storage.Put(smallPath, small.image); err != nil { + smallPath := fmt.Sprintf("%s/%s/%s/%s.jpeg", minAttachment.AccountID, TypeAttachment, SizeSmall, attachmentID) // all thumbnails/smalls are encoded as jpeg + if err := m.storage.Put(smallPath, small.image); err != nil { return nil, fmt.Errorf("storage error: %s", err) } @@ -98,7 +119,7 @@ func (mh *mediaHandler) processImage(data []byte, minAttachment *gtsmodel.MediaA } attachment := >smodel.MediaAttachment{ - ID: newMediaID, + ID: attachmentID, StatusID: minAttachment.StatusID, URL: originalURL, RemoteURL: minAttachment.RemoteURL, @@ -131,3 +152,173 @@ func (mh *mediaHandler) processImage(data []byte, minAttachment *gtsmodel.MediaA return attachment, nil } + +func decodeGif(b []byte, extension string) (*imageAndMeta, error) { + var g *gif.GIF + var err error + + switch extension { + case mimeGif: + g, err = gif.DecodeAll(bytes.NewReader(b)) + default: + err = fmt.Errorf("extension %s not recognised", extension) + } + + if err != nil { + return nil, err + } + + // use the first frame to get the static characteristics + width := g.Config.Width + height := g.Config.Height + size := width * height + aspect := float64(width) / float64(height) + + return &imageAndMeta{ + image: b, + width: width, + height: height, + size: size, + aspect: aspect, + }, nil +} + +func decodeImage(b []byte, contentType string) (*imageAndMeta, error) { + var i image.Image + var err error + + switch contentType { + case mimeImageJpeg: + i, err = jpeg.Decode(bytes.NewReader(b)) + case mimeImagePng: + i, err = png.Decode(bytes.NewReader(b)) + default: + err = fmt.Errorf("content type %s not recognised", contentType) + } + + if err != nil { + return nil, err + } + + if i == nil { + return nil, errors.New("processed image was nil") + } + + width := i.Bounds().Size().X + height := i.Bounds().Size().Y + size := width * height + aspect := float64(width) / float64(height) + + return &imageAndMeta{ + image: b, + width: width, + height: height, + size: size, + aspect: aspect, + }, nil +} + +// deriveThumbnail returns a byte slice and metadata for a thumbnail of width x and height y, +// of a given jpeg, png, or gif, or an error if something goes wrong. +// +// Note that the aspect ratio of the image will be retained, +// so it will not necessarily be a square, even if x and y are set as the same value. +func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMeta, error) { + var i image.Image + var err error + + switch contentType { + case mimeImageJpeg: + i, err = jpeg.Decode(bytes.NewReader(b)) + if err != nil { + return nil, err + } + case mimeImagePng: + i, err = png.Decode(bytes.NewReader(b)) + if err != nil { + return nil, err + } + case mimeImageGif: + i, err = gif.Decode(bytes.NewReader(b)) + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("content type %s not recognised", contentType) + } + + thumb := resize.Thumbnail(x, y, i, resize.NearestNeighbor) + width := thumb.Bounds().Size().X + height := thumb.Bounds().Size().Y + size := width * height + aspect := float64(width) / float64(height) + + tiny := resize.Thumbnail(32, 32, thumb, resize.NearestNeighbor) + bh, err := blurhash.Encode(4, 3, tiny) + if err != nil { + return nil, err + } + + out := &bytes.Buffer{} + if err := jpeg.Encode(out, thumb, &jpeg.Options{ + Quality: 75, + }); err != nil { + return nil, err + } + return &imageAndMeta{ + image: out.Bytes(), + width: width, + height: height, + size: size, + aspect: aspect, + blurhash: bh, + }, nil +} + +// deriveStaticEmojji takes a given gif or png of an emoji, decodes it, and re-encodes it as a static png. +func deriveStaticEmoji(b []byte, contentType string) (*imageAndMeta, error) { + var i image.Image + var err error + + switch contentType { + case mimeImagePng: + i, err = png.Decode(bytes.NewReader(b)) + if err != nil { + return nil, err + } + case mimeImageGif: + i, err = gif.Decode(bytes.NewReader(b)) + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("content type %s not allowed for emoji", contentType) + } + + out := &bytes.Buffer{} + if err := png.Encode(out, i); err != nil { + return nil, err + } + return &imageAndMeta{ + image: out.Bytes(), + }, nil +} + +// purgeExif is a little wrapper for the action of removing exif data from an image. +// Only pass pngs or jpegs to this function. +func purgeExif(data []byte) ([]byte, error) { + if len(data) == 0 { + return nil, errors.New("passed image was not valid") + } + + clean, err := exifremove.Remove(data) + if err != nil { + return nil, fmt.Errorf("could not purge exif from image: %s", err) + } + + if len(clean) == 0 { + return nil, errors.New("purged image was not valid") + } + + return clean, nil +} diff --git a/internal/media/handler.go b/internal/media/manager.go similarity index 71% rename from internal/media/handler.go rename to internal/media/manager.go index b64e583b3e..782542ca90 100644 --- a/internal/media/handler.go +++ b/internal/media/manager.go @@ -27,7 +27,6 @@ import ( "time" "codeberg.org/gruf/go-store/kv" - "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" @@ -35,26 +34,31 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/uris" ) +// ProcessCallback is triggered by the media manager when an attachment has finished undergoing +// image processing (generation of a blurhash, thumbnail etc) but hasn't yet been inserted into +// the database. It is provided to allow callers to a) access the processed media attachment and b) +// make any last-minute changes to the media attachment before it enters the database. +type ProcessCallback func(*gtsmodel.MediaAttachment) *gtsmodel.MediaAttachment +// defaultCB will be used when a nil ProcessCallback is passed to one of the manager's interface functions. +// It just returns the processed media attachment with no additional changes. +var defaultCB ProcessCallback = func(a *gtsmodel.MediaAttachment) *gtsmodel.MediaAttachment { + return a +} -type ProcessedCallback func(*gtsmodel.MediaAttachment) error - -// Handler provides an interface for parsing, storing, and retrieving media objects like photos, videos, and gifs. -type Handler interface { - ProcessHeader(ctx context.Context, data []byte, accountID string, cb ProcessedCallback) (*gtsmodel.MediaAttachment, error) - ProcessAvatar(ctx context.Context, data []byte, accountID string, cb ProcessedCallback) (*gtsmodel.MediaAttachment, error) - ProcessAttachment(ctx context.Context, data []byte, accountID string, cb ProcessedCallback) (*gtsmodel.MediaAttachment, error) - ProcessEmoji(ctx context.Context, data []byte, shortcode string) (*gtsmodel.Emoji, error) +// Manager provides an interface for managing media: parsing, storing, and retrieving media objects like photos, videos, and gifs. +type Manager interface { + ProcessAttachment(ctx context.Context, data []byte, accountID string, cb ProcessCallback) (*gtsmodel.MediaAttachment, error) } -type mediaHandler struct { +type manager struct { db db.DB storage *kv.KVStore } -// New returns a new handler with the given db and storage -func New(database db.DB, storage *kv.KVStore) Handler { - return &mediaHandler{ +// New returns a media manager with the given db and underlying storage. +func New(database db.DB, storage *kv.KVStore) Manager { + return &manager{ db: database, storage: storage, } @@ -64,83 +68,64 @@ func New(database db.DB, storage *kv.KVStore) Handler { INTERFACE FUNCTIONS */ +func (m *manager) ProcessAttachment(ctx context.Context, data []byte, accountID string, cb ProcessCallback) (*gtsmodel.MediaAttachment, error) { + contentType, err := parseContentType(data) + if err != nil { + return nil, err + } + + mainType := strings.Split(contentType, "/")[0] + switch mainType { + case mimeImage: + if !supportedImage(contentType) { + return nil, fmt.Errorf("image type %s not supported", contentType) + } + if len(data) == 0 { + return nil, errors.New("image was of size 0") + } + return m.processImage(attachmentBytes, minAttachment) + default: + return nil, fmt.Errorf("content type %s not (yet) supported", contentType) + } +} + // ProcessHeaderOrAvatar takes a new header image for an account, checks it out, removes exif data from it, // puts it in whatever storage backend we're using, sets the relevant fields in the database for the new image, // and then returns information to the caller about the new header. -func (mh *mediaHandler) ProcessHeaderOrAvatar(ctx context.Context, attachment []byte, accountID string, mediaType Type, remoteURL string) (*gtsmodel.MediaAttachment, error) { - l := logrus.WithField("func", "SetHeaderForAccountID") - - if mediaType != TypeHeader && mediaType != TypeAvatar { - return nil, errors.New("header or avatar not selected") - } +func (m *manager) ProcessHeader(ctx context.Context, data []byte, accountID string, cb ProcessCallback) (*gtsmodel.MediaAttachment, error) { // make sure we have a type we can handle - contentType, err := parseContentType(attachment) + contentType, err := parseContentType(data) if err != nil { return nil, err } + if !supportedImage(contentType) { return nil, fmt.Errorf("%s is not an accepted image type", contentType) } - if len(attachment) == 0 { + if len(data) == 0 { return nil, fmt.Errorf("passed reader was of size 0") } - l.Tracef("read %d bytes of file", len(attachment)) // process it - ma, err := mh.processHeaderOrAvi(attachment, contentType, mediaType, accountID, remoteURL) + ma, err := m.processHeaderOrAvi(attachment, contentType, mediaType, accountID, remoteURL) if err != nil { return nil, fmt.Errorf("error processing %s: %s", mediaType, err) } // set it in the database - if err := mh.db.SetAccountHeaderOrAvatar(ctx, ma, accountID); err != nil { + if err := m.db.SetAccountHeaderOrAvatar(ctx, ma, accountID); err != nil { return nil, fmt.Errorf("error putting %s in database: %s", mediaType, err) } return ma, nil } -// ProcessAttachment takes a new attachment and the owning account, checks it out, removes exif data from it, -// puts it in whatever storage backend we're using, sets the relevant fields in the database for the new media, -// and then returns information to the caller about the attachment. -func (mh *mediaHandler) ProcessAttachment(ctx context.Context, attachmentBytes []byte, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) { - contentType, err := parseContentType(attachmentBytes) - if err != nil { - return nil, err - } - - minAttachment.File.ContentType = contentType - - mainType := strings.Split(contentType, "/")[0] - switch mainType { - // case MIMEVideo: - // if !SupportedVideoType(contentType) { - // return nil, fmt.Errorf("video type %s not supported", contentType) - // } - // if len(attachment) == 0 { - // return nil, errors.New("video was of size 0") - // } - // return mh.processVideoAttachment(attachment, accountID, contentType, remoteURL) - case mimeImage: - if !supportedImage(contentType) { - return nil, fmt.Errorf("image type %s not supported", contentType) - } - if len(attachmentBytes) == 0 { - return nil, errors.New("image was of size 0") - } - return mh.processImageAttachment(attachmentBytes, minAttachment) - default: - break - } - return nil, fmt.Errorf("content type %s not (yet) supported", contentType) -} - // ProcessLocalEmoji takes a new emoji and a shortcode, cleans it up, puts it in storage, and creates a new // *gts.Emoji for it, then returns it to the caller. It's the caller's responsibility to put the returned struct // in the database. -func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte, shortcode string) (*gtsmodel.Emoji, error) { +func (m *manager) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte, shortcode string) (*gtsmodel.Emoji, error) { var clean []byte var err error var original *imageAndMeta @@ -187,7 +172,7 @@ func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte // since emoji aren't 'owned' by an account, but we still want to use the same pattern for serving them through the filserver, // (ie., fileserver/ACCOUNT_ID/etc etc) we need to fetch the INSTANCE ACCOUNT from the database. That is, the account that's created // with the same username as the instance hostname, which doesn't belong to any particular user. - instanceAccount, err := mh.db.GetInstanceAccount(ctx, "") + instanceAccount, err := m.db.GetInstanceAccount(ctx, "") if err != nil { return nil, fmt.Errorf("error fetching instance account: %s", err) } @@ -214,12 +199,12 @@ func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte emojiStaticPath := fmt.Sprintf("%s/%s/%s/%s.png", instanceAccount.ID, TypeEmoji, SizeStatic, newEmojiID) // Store the original emoji - if err := mh.storage.Put(emojiPath, original.image); err != nil { + if err := m.storage.Put(emojiPath, original.image); err != nil { return nil, fmt.Errorf("storage error: %s", err) } // Store the static emoji - if err := mh.storage.Put(emojiStaticPath, static.image); err != nil { + if err := m.storage.Put(emojiStaticPath, static.image); err != nil { return nil, fmt.Errorf("storage error: %s", err) } @@ -249,7 +234,7 @@ func (mh *mediaHandler) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte return e, nil } -func (mh *mediaHandler) ProcessRemoteHeaderOrAvatar(ctx context.Context, t transport.Transport, currentAttachment *gtsmodel.MediaAttachment, accountID string) (*gtsmodel.MediaAttachment, error) { +func (m *manager) ProcessRemoteHeaderOrAvatar(ctx context.Context, t transport.Transport, currentAttachment *gtsmodel.MediaAttachment, accountID string) (*gtsmodel.MediaAttachment, error) { if !currentAttachment.Header && !currentAttachment.Avatar { return nil, errors.New("provided attachment was set to neither header nor avatar") } @@ -285,5 +270,5 @@ func (mh *mediaHandler) ProcessRemoteHeaderOrAvatar(ctx context.Context, t trans return nil, fmt.Errorf("dereferencing remote media with url %s: %s", remoteIRI.String(), err) } - return mh.ProcessHeaderOrAvatar(ctx, attachmentBytes, accountID, headerOrAvi, currentAttachment.RemoteURL) + return m.ProcessHeaderOrAvatar(ctx, attachmentBytes, accountID, headerOrAvi, currentAttachment.RemoteURL) } diff --git a/internal/media/processicon.go b/internal/media/processicon.go deleted file mode 100644 index faeae0ee65..0000000000 --- a/internal/media/processicon.go +++ /dev/null @@ -1,143 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package media - -import ( - "errors" - "fmt" - "strings" - "time" - - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" - "github.com/superseriousbusiness/gotosocial/internal/uris" -) - -func (mh *mediaHandler) processHeaderOrAvi(imageBytes []byte, contentType string, mediaType Type, accountID string, remoteURL string) (*gtsmodel.MediaAttachment, error) { - var isHeader bool - var isAvatar bool - - switch mediaType { - case TypeHeader: - isHeader = true - case TypeAvatar: - isAvatar = true - default: - return nil, errors.New("header or avatar not selected") - } - - var clean []byte - var err error - - var original *imageAndMeta - switch contentType { - case mimeJpeg: - if clean, err = purgeExif(imageBytes); err != nil { - return nil, fmt.Errorf("error cleaning exif data: %s", err) - } - original, err = deriveImage(clean, contentType) - case mimePng: - if clean, err = purgeExif(imageBytes); err != nil { - return nil, fmt.Errorf("error cleaning exif data: %s", err) - } - original, err = deriveImage(clean, contentType) - case mimeGif: - clean = imageBytes - original, err = deriveGif(clean, contentType) - default: - return nil, errors.New("media type unrecognized") - } - - if err != nil { - return nil, fmt.Errorf("error parsing image: %s", err) - } - - small, err := deriveThumbnail(clean, contentType, 256, 256) - if err != nil { - return nil, fmt.Errorf("error deriving thumbnail: %s", err) - } - - // now put it in storage, take a new id for the name of the file so we don't store any unnecessary info about it - extension := strings.Split(contentType, "/")[1] - newMediaID, err := id.NewRandomULID() - if err != nil { - return nil, err - } - - originalURL := uris.GenerateURIForAttachment(accountID, string(mediaType), string(SizeOriginal), newMediaID, extension) - smallURL := uris.GenerateURIForAttachment(accountID, string(mediaType), string(SizeSmall), newMediaID, extension) - // we store the original... - originalPath := fmt.Sprintf("%s/%s/%s/%s.%s", accountID, mediaType, SizeOriginal, newMediaID, extension) - if err := mh.storage.Put(originalPath, original.image); err != nil { - return nil, fmt.Errorf("storage error: %s", err) - } - - // and a thumbnail... - smallPath := fmt.Sprintf("%s/%s/%s/%s.%s", accountID, mediaType, SizeSmall, newMediaID, extension) - if err := mh.storage.Put(smallPath, small.image); err != nil { - return nil, fmt.Errorf("storage error: %s", err) - } - - ma := >smodel.MediaAttachment{ - ID: newMediaID, - StatusID: "", - URL: originalURL, - RemoteURL: remoteURL, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - Type: gtsmodel.FileTypeImage, - FileMeta: gtsmodel.FileMeta{ - Original: gtsmodel.Original{ - Width: original.width, - Height: original.height, - Size: original.size, - Aspect: original.aspect, - }, - Small: gtsmodel.Small{ - Width: small.width, - Height: small.height, - Size: small.size, - Aspect: small.aspect, - }, - }, - AccountID: accountID, - Description: "", - ScheduledStatusID: "", - Blurhash: small.blurhash, - Processing: 2, - File: gtsmodel.File{ - Path: originalPath, - ContentType: contentType, - FileSize: len(original.image), - UpdatedAt: time.Now(), - }, - Thumbnail: gtsmodel.Thumbnail{ - Path: smallPath, - ContentType: contentType, - FileSize: len(small.image), - UpdatedAt: time.Now(), - URL: smallURL, - RemoteURL: "", - }, - Avatar: isAvatar, - Header: isHeader, - } - - return ma, nil -} diff --git a/internal/media/processing.go b/internal/media/processing.go deleted file mode 100644 index ccd9ebfdb1..0000000000 --- a/internal/media/processing.go +++ /dev/null @@ -1,190 +0,0 @@ -package media - -import ( - "bytes" - "errors" - "fmt" - "image" - "image/gif" - "image/jpeg" - "image/png" - - "github.com/buckket/go-blurhash" - "github.com/nfnt/resize" - "github.com/superseriousbusiness/exifremove/pkg/exifremove" -) - -// purgeExif is a little wrapper for the action of removing exif data from an image. -// Only pass pngs or jpegs to this function. -func purgeExif(data []byte) ([]byte, error) { - if len(data) == 0 { - return nil, errors.New("passed image was not valid") - } - - clean, err := exifremove.Remove(data) - if err != nil { - return nil, fmt.Errorf("could not purge exif from image: %s", err) - } - - if len(clean) == 0 { - return nil, errors.New("purged image was not valid") - } - - return clean, nil -} - -func deriveGif(b []byte, extension string) (*imageAndMeta, error) { - var g *gif.GIF - var err error - switch extension { - case mimeGif: - g, err = gif.DecodeAll(bytes.NewReader(b)) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("extension %s not recognised", extension) - } - - // use the first frame to get the static characteristics - width := g.Config.Width - height := g.Config.Height - size := width * height - aspect := float64(width) / float64(height) - - return &imageAndMeta{ - image: b, - width: width, - height: height, - size: size, - aspect: aspect, - }, nil -} - -func deriveImage(b []byte, contentType string) (*imageAndMeta, error) { - var i image.Image - var err error - - switch contentType { - case mimeImageJpeg: - i, err = jpeg.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - case mimeImagePng: - i, err = png.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("content type %s not recognised", contentType) - } - - width := i.Bounds().Size().X - height := i.Bounds().Size().Y - size := width * height - aspect := float64(width) / float64(height) - - return &imageAndMeta{ - image: b, - width: width, - height: height, - size: size, - aspect: aspect, - }, nil -} - -// deriveThumbnail returns a byte slice and metadata for a thumbnail of width x and height y, -// of a given jpeg, png, or gif, or an error if something goes wrong. -// -// Note that the aspect ratio of the image will be retained, -// so it will not necessarily be a square, even if x and y are set as the same value. -func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMeta, error) { - var i image.Image - var err error - - switch contentType { - case mimeImageJpeg: - i, err = jpeg.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - case mimeImagePng: - i, err = png.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - case mimeImageGif: - i, err = gif.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("content type %s not recognised", contentType) - } - - thumb := resize.Thumbnail(x, y, i, resize.NearestNeighbor) - width := thumb.Bounds().Size().X - height := thumb.Bounds().Size().Y - size := width * height - aspect := float64(width) / float64(height) - - tiny := resize.Thumbnail(32, 32, thumb, resize.NearestNeighbor) - bh, err := blurhash.Encode(4, 3, tiny) - if err != nil { - return nil, err - } - - out := &bytes.Buffer{} - if err := jpeg.Encode(out, thumb, &jpeg.Options{ - Quality: 75, - }); err != nil { - return nil, err - } - return &imageAndMeta{ - image: out.Bytes(), - width: width, - height: height, - size: size, - aspect: aspect, - blurhash: bh, - }, nil -} - -// deriveStaticEmojji takes a given gif or png of an emoji, decodes it, and re-encodes it as a static png. -func deriveStaticEmoji(b []byte, contentType string) (*imageAndMeta, error) { - var i image.Image - var err error - - switch contentType { - case mimeImagePng: - i, err = png.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - case mimeImageGif: - i, err = gif.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("content type %s not allowed for emoji", contentType) - } - - out := &bytes.Buffer{} - if err := png.Encode(out, i); err != nil { - return nil, err - } - return &imageAndMeta{ - image: out.Bytes(), - }, nil -} - -type imageAndMeta struct { - image []byte - width int - height int - size int - aspect float64 - blurhash string -} diff --git a/internal/media/processvideo.go b/internal/media/processvideo.go index d0d11f7793..e829c68c08 100644 --- a/internal/media/processvideo.go +++ b/internal/media/processvideo.go @@ -18,6 +18,6 @@ package media -// func (mh *mediaHandler) processVideoAttachment(data []byte, accountID string, contentType string, remoteURL string) (*gtsmodel.MediaAttachment, error) { +// func (mh *mediaManager) processVideoAttachment(data []byte, accountID string, contentType string, remoteURL string) (*gtsmodel.MediaAttachment, error) { // return nil, nil // } diff --git a/internal/media/types.go b/internal/media/types.go index f1608f8804..d40f402d29 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -40,7 +40,6 @@ const ( mimeImagePng = mimeImage + "/" + mimePng ) - // EmojiMaxBytes is the maximum permitted bytes of an emoji upload (50kb) // const EmojiMaxBytes = 51200 diff --git a/internal/media/util_test.go b/internal/media/util_test.go index 817b597cbb..1180bf2aa8 100644 --- a/internal/media/util_test.go +++ b/internal/media/util_test.go @@ -103,7 +103,7 @@ func (suite *MediaUtilTestSuite) TestDeriveImageFromJPEG() { suite.NoError(err) // clean it up and validate the clean version - imageAndMeta, err := deriveImage(b, "image/jpeg") + imageAndMeta, err := decodeImage(b, "image/jpeg") suite.NoError(err) suite.Equal(1920, imageAndMeta.width) diff --git a/internal/processing/account/account.go b/internal/processing/account/account.go index ae005f4f6c..b2321f414a 100644 --- a/internal/processing/account/account.go +++ b/internal/processing/account/account.go @@ -77,7 +77,7 @@ type Processor interface { type processor struct { tc typeutils.TypeConverter - mediaHandler media.Handler + mediaManager media.Manager fromClientAPI chan messages.FromClientAPI oauthServer oauth.Server filter visibility.Filter @@ -87,10 +87,10 @@ type processor struct { } // New returns a new account processor. -func New(db db.DB, tc typeutils.TypeConverter, mediaHandler media.Handler, oauthServer oauth.Server, fromClientAPI chan messages.FromClientAPI, federator federation.Federator) Processor { +func New(db db.DB, tc typeutils.TypeConverter, mediaManager media.Manager, oauthServer oauth.Server, fromClientAPI chan messages.FromClientAPI, federator federation.Federator) Processor { return &processor{ tc: tc, - mediaHandler: mediaHandler, + mediaManager: mediaManager, fromClientAPI: fromClientAPI, oauthServer: oauthServer, filter: visibility.NewFilter(db), diff --git a/internal/processing/account/account_test.go b/internal/processing/account/account_test.go index e4611ba23b..9c7f0fe67f 100644 --- a/internal/processing/account/account_test.go +++ b/internal/processing/account/account_test.go @@ -41,7 +41,7 @@ type AccountStandardTestSuite struct { db db.DB tc typeutils.TypeConverter storage *kv.KVStore - mediaHandler media.Handler + mediaManager media.Manager oauthServer oauth.Server fromClientAPIChan chan messages.FromClientAPI httpClient pub.HttpClient @@ -80,7 +80,7 @@ func (suite *AccountStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.tc = testrig.NewTestTypeConverter(suite.db) suite.storage = testrig.NewTestStorage() - suite.mediaHandler = testrig.NewTestMediaHandler(suite.db, suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.fromClientAPIChan = make(chan messages.FromClientAPI, 100) suite.httpClient = testrig.NewMockHTTPClient(nil) @@ -88,7 +88,7 @@ func (suite *AccountStandardTestSuite) SetupTest() { suite.federator = testrig.NewTestFederator(suite.db, suite.transportController, suite.storage) suite.sentEmails = make(map[string]string) suite.emailSender = testrig.NewEmailSender("../../../web/template/", suite.sentEmails) - suite.accountProcessor = account.New(suite.db, suite.tc, suite.mediaHandler, suite.oauthServer, suite.fromClientAPIChan, suite.federator) + suite.accountProcessor = account.New(suite.db, suite.tc, suite.mediaManager, suite.oauthServer, suite.fromClientAPIChan, suite.federator) testrig.StandardDBSetup(suite.db, nil) testrig.StandardStorageSetup(suite.storage, "../../../testrig/media") } diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index a32dd9ac0d..8de6c83f06 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -159,7 +159,7 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead } // do the setting - avatarInfo, err := p.mediaHandler.ProcessHeaderOrAvatar(ctx, buf.Bytes(), accountID, media.TypeAvatar, "") + avatarInfo, err := p.mediaManager.ProcessHeaderOrAvatar(ctx, buf.Bytes(), accountID, media.TypeAvatar, "") if err != nil { return nil, fmt.Errorf("error processing avatar: %s", err) } @@ -193,7 +193,7 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead } // do the setting - headerInfo, err := p.mediaHandler.ProcessHeaderOrAvatar(ctx, buf.Bytes(), accountID, media.TypeHeader, "") + headerInfo, err := p.mediaManager.ProcessHeaderOrAvatar(ctx, buf.Bytes(), accountID, media.TypeHeader, "") if err != nil { return nil, fmt.Errorf("error processing header: %s", err) } diff --git a/internal/processing/admin/admin.go b/internal/processing/admin/admin.go index 217d10dfe4..27a7da47a1 100644 --- a/internal/processing/admin/admin.go +++ b/internal/processing/admin/admin.go @@ -43,16 +43,16 @@ type Processor interface { type processor struct { tc typeutils.TypeConverter - mediaHandler media.Handler + mediaManager media.Manager fromClientAPI chan messages.FromClientAPI db db.DB } // New returns a new admin processor. -func New(db db.DB, tc typeutils.TypeConverter, mediaHandler media.Handler, fromClientAPI chan messages.FromClientAPI) Processor { +func New(db db.DB, tc typeutils.TypeConverter, mediaManager media.Manager, fromClientAPI chan messages.FromClientAPI) Processor { return &processor{ tc: tc, - mediaHandler: mediaHandler, + mediaManager: mediaManager, fromClientAPI: fromClientAPI, db: db, } diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 4989d8e8de..5620374b8e 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -49,8 +49,8 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return nil, errors.New("could not read provided emoji: size 0 bytes") } - // allow the mediaHandler to work its magic of processing the emoji bytes, and putting them in whatever storage backend we're using - emoji, err := p.mediaHandler.ProcessLocalEmoji(ctx, buf.Bytes(), form.Shortcode) + // allow the mediaManager to work its magic of processing the emoji bytes, and putting them in whatever storage backend we're using + emoji, err := p.mediaManager.ProcessLocalEmoji(ctx, buf.Bytes(), form.Shortcode) if err != nil { return nil, fmt.Errorf("error reading emoji: %s", err) } diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index de15d3162d..68a011683c 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -65,8 +65,8 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form }, } - // allow the mediaHandler to work its magic of processing the attachment bytes, and putting them in whatever storage backend we're using - attachment, err := p.mediaHandler.ProcessAttachment(ctx, buf.Bytes(), minAttachment) + // allow the mediaManager to work its magic of processing the attachment bytes, and putting them in whatever storage backend we're using + attachment, err := p.mediaManager.ProcessAttachment(ctx, buf.Bytes(), minAttachment) if err != nil { return nil, fmt.Errorf("error reading attachment: %s", err) } diff --git a/internal/processing/media/media.go b/internal/processing/media/media.go index 9e050fe84f..3d4ae5009b 100644 --- a/internal/processing/media/media.go +++ b/internal/processing/media/media.go @@ -43,16 +43,16 @@ type Processor interface { type processor struct { tc typeutils.TypeConverter - mediaHandler media.Handler + mediaManager media.Manager storage *kv.KVStore db db.DB } // New returns a new media processor. -func New(db db.DB, tc typeutils.TypeConverter, mediaHandler media.Handler, storage *kv.KVStore) Processor { +func New(db db.DB, tc typeutils.TypeConverter, mediaManager media.Manager, storage *kv.KVStore) Processor { return &processor{ tc: tc, - mediaHandler: mediaHandler, + mediaManager: mediaManager, storage: storage, db: db, } diff --git a/internal/processing/processor.go b/internal/processing/processor.go index f5334a1ef8..2626c1fea9 100644 --- a/internal/processing/processor.go +++ b/internal/processing/processor.go @@ -235,7 +235,7 @@ type processor struct { stop chan interface{} tc typeutils.TypeConverter oauthServer oauth.Server - mediaHandler media.Handler + mediaManager media.Manager storage *kv.KVStore timelineManager timeline.Manager db db.DB @@ -259,7 +259,7 @@ func NewProcessor( tc typeutils.TypeConverter, federator federation.Federator, oauthServer oauth.Server, - mediaHandler media.Handler, + mediaManager media.Manager, storage *kv.KVStore, timelineManager timeline.Manager, db db.DB, @@ -269,9 +269,9 @@ func NewProcessor( statusProcessor := status.New(db, tc, fromClientAPI) streamingProcessor := streaming.New(db, oauthServer) - accountProcessor := account.New(db, tc, mediaHandler, oauthServer, fromClientAPI, federator) - adminProcessor := admin.New(db, tc, mediaHandler, fromClientAPI) - mediaProcessor := mediaProcessor.New(db, tc, mediaHandler, storage) + accountProcessor := account.New(db, tc, mediaManager, oauthServer, fromClientAPI, federator) + adminProcessor := admin.New(db, tc, mediaManager, fromClientAPI) + mediaProcessor := mediaProcessor.New(db, tc, mediaManager, storage) userProcessor := user.New(db, emailSender) federationProcessor := federationProcessor.New(db, tc, federator, fromFederator) @@ -282,7 +282,7 @@ func NewProcessor( stop: make(chan interface{}), tc: tc, oauthServer: oauthServer, - mediaHandler: mediaHandler, + mediaManager: mediaManager, storage: storage, timelineManager: timelineManager, db: db, diff --git a/internal/processing/processor_test.go b/internal/processing/processor_test.go index dc7562a2e8..04793898fe 100644 --- a/internal/processing/processor_test.go +++ b/internal/processing/processor_test.go @@ -51,7 +51,7 @@ type ProcessingStandardTestSuite struct { transportController transport.Controller federator federation.Federator oauthServer oauth.Server - mediaHandler media.Handler + mediaManager media.Manager timelineManager timeline.Manager emailSender email.Sender @@ -218,11 +218,11 @@ func (suite *ProcessingStandardTestSuite) SetupTest() { suite.transportController = testrig.NewTestTransportController(httpClient, suite.db) suite.federator = testrig.NewTestFederator(suite.db, suite.transportController, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) - suite.mediaHandler = testrig.NewTestMediaHandler(suite.db, suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.timelineManager = testrig.NewTestTimelineManager(suite.db) suite.emailSender = testrig.NewEmailSender("../../web/template/", nil) - suite.processor = processing.NewProcessor(suite.typeconverter, suite.federator, suite.oauthServer, suite.mediaHandler, suite.storage, suite.timelineManager, suite.db, suite.emailSender) + suite.processor = processing.NewProcessor(suite.typeconverter, suite.federator, suite.oauthServer, suite.mediaManager, suite.storage, suite.timelineManager, suite.db, suite.emailSender) testrig.StandardDBSetup(suite.db, suite.testAccounts) testrig.StandardStorageSetup(suite.storage, "../../testrig/media") diff --git a/testrig/federator.go b/testrig/federator.go index b04c01d633..b9c7428329 100644 --- a/testrig/federator.go +++ b/testrig/federator.go @@ -27,5 +27,5 @@ import ( // NewTestFederator returns a federator with the given database and (mock!!) transport controller. func NewTestFederator(db db.DB, tc transport.Controller, storage *kv.KVStore) federation.Federator { - return federation.NewFederator(db, NewTestFederatingDB(db), tc, NewTestTypeConverter(db), NewTestMediaHandler(db, storage)) + return federation.NewFederator(db, NewTestFederatingDB(db), tc, NewTestTypeConverter(db), NewTestMediaManager(db, storage)) } diff --git a/testrig/mediahandler.go b/testrig/mediahandler.go index ab7fee621b..ba21486553 100644 --- a/testrig/mediahandler.go +++ b/testrig/mediahandler.go @@ -24,7 +24,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/media" ) -// NewTestMediaHandler returns a media handler with the default test config, and the given db and storage. -func NewTestMediaHandler(db db.DB, storage *kv.KVStore) media.Handler { +// NewTestMediaManager returns a media handler with the default test config, and the given db and storage. +func NewTestMediaManager(db db.DB, storage *kv.KVStore) media.Manager { return media.New(db, storage) } diff --git a/testrig/processor.go b/testrig/processor.go index 0baffd35b2..d86dd84110 100644 --- a/testrig/processor.go +++ b/testrig/processor.go @@ -28,5 +28,5 @@ import ( // NewTestProcessor returns a Processor suitable for testing purposes func NewTestProcessor(db db.DB, storage *kv.KVStore, federator federation.Federator, emailSender email.Sender) processing.Processor { - return processing.NewProcessor(NewTestTypeConverter(db), federator, NewTestOauthServer(db), NewTestMediaHandler(db, storage), storage, NewTestTimelineManager(db), db, emailSender) + return processing.NewProcessor(NewTestTypeConverter(db), federator, NewTestOauthServer(db), NewTestMediaManager(db, storage), storage, NewTestTimelineManager(db), db, emailSender) } From 2f57eb5ece9a5cb25b78284d01bd55b14d2e4580 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 2 Jan 2022 15:00:53 +0100 Subject: [PATCH 03/43] fiddle around with workers --- internal/media/image.go | 88 ++++++------- internal/media/manager.go | 224 +++------------------------------ internal/media/media.go | 7 ++ internal/media/pool.go | 65 ++++++++++ internal/media/process.go | 5 + internal/media/processvideo.go | 23 ---- internal/media/util_test.go | 150 ---------------------- 7 files changed, 135 insertions(+), 427 deletions(-) create mode 100644 internal/media/media.go create mode 100644 internal/media/pool.go create mode 100644 internal/media/process.go delete mode 100644 internal/media/processvideo.go delete mode 100644 internal/media/util_test.go diff --git a/internal/media/image.go b/internal/media/image.go index 87b5d70b7f..26bd5e8b69 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -20,6 +20,7 @@ package media import ( "bytes" + "context" "errors" "fmt" "image" @@ -51,7 +52,8 @@ type imageAndMeta struct { blurhash string } -func (m *manager) processImage(data []byte, contentType string) (*gtsmodel.MediaAttachment, error) { +func (m *manager) processImage(ctx context.Context, data []byte, contentType string, accountID string) { + var clean []byte var err error var original *imageAndMeta @@ -68,9 +70,9 @@ func (m *manager) processImage(data []byte, contentType string) (*gtsmodel.Media case mimeImageGif: // gifs are already clean - no exif data to remove clean = data - original, err = decodeGif(clean, contentType) + original, err = decodeGif(clean) default: - err = fmt.Errorf("content type %s not a recognized image type", contentType) + err = fmt.Errorf("content type %s not a processible image type", contentType) } if err != nil { @@ -89,47 +91,46 @@ func (m *manager) processImage(data []byte, contentType string) (*gtsmodel.Media return nil, err } - originalURL := uris.GenerateURIForAttachment(minAttachment.AccountID, string(TypeAttachment), string(SizeOriginal), attachmentID, extension) - smallURL := uris.GenerateURIForAttachment(minAttachment.AccountID, string(TypeAttachment), string(SizeSmall), attachmentID, "jpeg") // all thumbnails/smalls are encoded as jpeg + originalURL := uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), attachmentID, extension) + smallURL := uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), attachmentID, "jpeg") // all thumbnails/smalls are encoded as jpeg // we store the original... - originalPath := fmt.Sprintf("%s/%s/%s/%s.%s", minAttachment.AccountID, TypeAttachment, SizeOriginal, attachmentID, extension) + originalPath := fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, attachmentID, extension) if err := m.storage.Put(originalPath, original.image); err != nil { return nil, fmt.Errorf("storage error: %s", err) } // and a thumbnail... - smallPath := fmt.Sprintf("%s/%s/%s/%s.jpeg", minAttachment.AccountID, TypeAttachment, SizeSmall, attachmentID) // all thumbnails/smalls are encoded as jpeg + smallPath := fmt.Sprintf("%s/%s/%s/%s.jpeg", accountID, TypeAttachment, SizeSmall, attachmentID) // all thumbnails/smalls are encoded as jpeg if err := m.storage.Put(smallPath, small.image); err != nil { return nil, fmt.Errorf("storage error: %s", err) } - minAttachment.FileMeta.Original = gtsmodel.Original{ - Width: original.width, - Height: original.height, - Size: original.size, - Aspect: original.aspect, - } - - minAttachment.FileMeta.Small = gtsmodel.Small{ - Width: small.width, - Height: small.height, - Size: small.size, - Aspect: small.aspect, - } - attachment := >smodel.MediaAttachment{ - ID: attachmentID, - StatusID: minAttachment.StatusID, - URL: originalURL, - RemoteURL: minAttachment.RemoteURL, - CreatedAt: minAttachment.CreatedAt, - UpdatedAt: minAttachment.UpdatedAt, - Type: gtsmodel.FileTypeImage, - FileMeta: minAttachment.FileMeta, - AccountID: minAttachment.AccountID, - Description: minAttachment.Description, - ScheduledStatusID: minAttachment.ScheduledStatusID, + ID: attachmentID, + StatusID: "", + URL: originalURL, + RemoteURL: "", + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + Type: gtsmodel.FileTypeImage, + FileMeta: gtsmodel.FileMeta{ + Original: gtsmodel.Original{ + Width: original.width, + Height: original.height, + Size: original.size, + Aspect: original.aspect, + }, + Small: gtsmodel.Small{ + Width: small.width, + Height: small.height, + Size: small.size, + Aspect: small.aspect, + }, + }, + AccountID: accountID, + Description: "", + ScheduledStatusID: "", Blurhash: small.blurhash, Processing: 2, File: gtsmodel.File{ @@ -144,33 +145,24 @@ func (m *manager) processImage(data []byte, contentType string) (*gtsmodel.Media FileSize: len(small.image), UpdatedAt: time.Now(), URL: smallURL, - RemoteURL: minAttachment.Thumbnail.RemoteURL, + RemoteURL: "", }, - Avatar: minAttachment.Avatar, - Header: minAttachment.Header, + Avatar: false, + Header: false, } return attachment, nil } -func decodeGif(b []byte, extension string) (*imageAndMeta, error) { - var g *gif.GIF - var err error - - switch extension { - case mimeGif: - g, err = gif.DecodeAll(bytes.NewReader(b)) - default: - err = fmt.Errorf("extension %s not recognised", extension) - } - +func decodeGif(b []byte) (*imageAndMeta, error) { + gif, err := gif.DecodeAll(bytes.NewReader(b)) if err != nil { return nil, err } // use the first frame to get the static characteristics - width := g.Config.Width - height := g.Config.Height + width := gif.Config.Width + height := gif.Config.Height size := width * height aspect := float64(width) / float64(height) diff --git a/internal/media/manager.go b/internal/media/manager.go index 782542ca90..16465bb677 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -22,45 +22,32 @@ import ( "context" "errors" "fmt" - "net/url" + "runtime" "strings" - "time" "codeberg.org/gruf/go-store/kv" "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" - "github.com/superseriousbusiness/gotosocial/internal/transport" - "github.com/superseriousbusiness/gotosocial/internal/uris" ) -// ProcessCallback is triggered by the media manager when an attachment has finished undergoing -// image processing (generation of a blurhash, thumbnail etc) but hasn't yet been inserted into -// the database. It is provided to allow callers to a) access the processed media attachment and b) -// make any last-minute changes to the media attachment before it enters the database. -type ProcessCallback func(*gtsmodel.MediaAttachment) *gtsmodel.MediaAttachment - -// defaultCB will be used when a nil ProcessCallback is passed to one of the manager's interface functions. -// It just returns the processed media attachment with no additional changes. -var defaultCB ProcessCallback = func(a *gtsmodel.MediaAttachment) *gtsmodel.MediaAttachment { - return a -} - // Manager provides an interface for managing media: parsing, storing, and retrieving media objects like photos, videos, and gifs. type Manager interface { - ProcessAttachment(ctx context.Context, data []byte, accountID string, cb ProcessCallback) (*gtsmodel.MediaAttachment, error) + ProcessMedia(ctx context.Context, data []byte, accountID string) (*Media, error) } type manager struct { db db.DB storage *kv.KVStore + pool *workerPool } // New returns a media manager with the given db and underlying storage. func New(database db.DB, storage *kv.KVStore) Manager { + workers := runtime.NumCPU() / 2 + return &manager{ db: database, storage: storage, + pool: newWorkerPool(workers), } } @@ -68,13 +55,19 @@ func New(database db.DB, storage *kv.KVStore) Manager { INTERFACE FUNCTIONS */ -func (m *manager) ProcessAttachment(ctx context.Context, data []byte, accountID string, cb ProcessCallback) (*gtsmodel.MediaAttachment, error) { +func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string) (*Media, error) { contentType, err := parseContentType(data) if err != nil { return nil, err } - mainType := strings.Split(contentType, "/")[0] + split := strings.Split(contentType, "/") + if len(split) != 2 { + return nil, fmt.Errorf("content type %s malformed", contentType) + } + + mainType := split[0] + switch mainType { case mimeImage: if !supportedImage(contentType) { @@ -83,192 +76,11 @@ func (m *manager) ProcessAttachment(ctx context.Context, data []byte, accountID if len(data) == 0 { return nil, errors.New("image was of size 0") } - return m.processImage(attachmentBytes, minAttachment) - default: - return nil, fmt.Errorf("content type %s not (yet) supported", contentType) - } -} - -// ProcessHeaderOrAvatar takes a new header image for an account, checks it out, removes exif data from it, -// puts it in whatever storage backend we're using, sets the relevant fields in the database for the new image, -// and then returns information to the caller about the new header. -func (m *manager) ProcessHeader(ctx context.Context, data []byte, accountID string, cb ProcessCallback) (*gtsmodel.MediaAttachment, error) { - - // make sure we have a type we can handle - contentType, err := parseContentType(data) - if err != nil { - return nil, err - } - if !supportedImage(contentType) { - return nil, fmt.Errorf("%s is not an accepted image type", contentType) - } - - if len(data) == 0 { - return nil, fmt.Errorf("passed reader was of size 0") - } - - // process it - ma, err := m.processHeaderOrAvi(attachment, contentType, mediaType, accountID, remoteURL) - if err != nil { - return nil, fmt.Errorf("error processing %s: %s", mediaType, err) - } - - // set it in the database - if err := m.db.SetAccountHeaderOrAvatar(ctx, ma, accountID); err != nil { - return nil, fmt.Errorf("error putting %s in database: %s", mediaType, err) - } - - return ma, nil -} - -// ProcessLocalEmoji takes a new emoji and a shortcode, cleans it up, puts it in storage, and creates a new -// *gts.Emoji for it, then returns it to the caller. It's the caller's responsibility to put the returned struct -// in the database. -func (m *manager) ProcessLocalEmoji(ctx context.Context, emojiBytes []byte, shortcode string) (*gtsmodel.Emoji, error) { - var clean []byte - var err error - var original *imageAndMeta - var static *imageAndMeta - - // check content type of the submitted emoji and make sure it's supported by us - contentType, err := parseContentType(emojiBytes) - if err != nil { - return nil, err - } - if !supportedEmoji(contentType) { - return nil, fmt.Errorf("content type %s not supported for emojis", contentType) - } - - if len(emojiBytes) == 0 { - return nil, errors.New("emoji was of size 0") - } - if len(emojiBytes) > EmojiMaxBytes { - return nil, fmt.Errorf("emoji size %d bytes exceeded max emoji size of %d bytes", len(emojiBytes), EmojiMaxBytes) - } - - // clean any exif data from png but leave gifs alone - switch contentType { - case mimePng: - if clean, err = purgeExif(emojiBytes); err != nil { - return nil, fmt.Errorf("error cleaning exif data: %s", err) - } - case mimeGif: - clean = emojiBytes + return m.pool.run(func(ctx context.Context, data []byte, contentType string, accountID string) { + m.processImage(ctx, data, contentType, accountID) + }) default: - return nil, errors.New("media type unrecognized") - } - - // unlike with other attachments we don't need to derive anything here because we don't care about the width/height etc - original = &imageAndMeta{ - image: clean, - } - - static, err = deriveStaticEmoji(clean, contentType) - if err != nil { - return nil, fmt.Errorf("error deriving static emoji: %s", err) - } - - // since emoji aren't 'owned' by an account, but we still want to use the same pattern for serving them through the filserver, - // (ie., fileserver/ACCOUNT_ID/etc etc) we need to fetch the INSTANCE ACCOUNT from the database. That is, the account that's created - // with the same username as the instance hostname, which doesn't belong to any particular user. - instanceAccount, err := m.db.GetInstanceAccount(ctx, "") - if err != nil { - return nil, fmt.Errorf("error fetching instance account: %s", err) - } - - // the file extension (either png or gif) - extension := strings.Split(contentType, "/")[1] - - // generate a ulid for the new emoji - newEmojiID, err := id.NewRandomULID() - if err != nil { - return nil, err - } - - // activitypub uri for the emoji -- unrelated to actually serving the image - // will be something like https://example.org/emoji/01FPSVBK3H8N7V8XK6KGSQ86EC - emojiURI := uris.GenerateURIForEmoji(newEmojiID) - - // serve url and storage path for the original emoji -- can be png or gif - emojiURL := uris.GenerateURIForAttachment(instanceAccount.ID, string(TypeEmoji), string(SizeOriginal), newEmojiID, extension) - emojiPath := fmt.Sprintf("%s/%s/%s/%s.%s", instanceAccount.ID, TypeEmoji, SizeOriginal, newEmojiID, extension) - - // serve url and storage path for the static version -- will always be png - emojiStaticURL := uris.GenerateURIForAttachment(instanceAccount.ID, string(TypeEmoji), string(SizeStatic), newEmojiID, "png") - emojiStaticPath := fmt.Sprintf("%s/%s/%s/%s.png", instanceAccount.ID, TypeEmoji, SizeStatic, newEmojiID) - - // Store the original emoji - if err := m.storage.Put(emojiPath, original.image); err != nil { - return nil, fmt.Errorf("storage error: %s", err) - } - - // Store the static emoji - if err := m.storage.Put(emojiStaticPath, static.image); err != nil { - return nil, fmt.Errorf("storage error: %s", err) - } - - // and finally return the new emoji data to the caller -- it's up to them what to do with it - e := >smodel.Emoji{ - ID: newEmojiID, - Shortcode: shortcode, - Domain: "", // empty because this is a local emoji - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - ImageRemoteURL: "", // empty because this is a local emoji - ImageStaticRemoteURL: "", // empty because this is a local emoji - ImageURL: emojiURL, - ImageStaticURL: emojiStaticURL, - ImagePath: emojiPath, - ImageStaticPath: emojiStaticPath, - ImageContentType: contentType, - ImageStaticContentType: mimePng, // static version will always be a png - ImageFileSize: len(original.image), - ImageStaticFileSize: len(static.image), - ImageUpdatedAt: time.Now(), - Disabled: false, - URI: emojiURI, - VisibleInPicker: true, - CategoryID: "", // empty because this is a new emoji -- no category yet - } - return e, nil -} - -func (m *manager) ProcessRemoteHeaderOrAvatar(ctx context.Context, t transport.Transport, currentAttachment *gtsmodel.MediaAttachment, accountID string) (*gtsmodel.MediaAttachment, error) { - if !currentAttachment.Header && !currentAttachment.Avatar { - return nil, errors.New("provided attachment was set to neither header nor avatar") - } - - if currentAttachment.Header && currentAttachment.Avatar { - return nil, errors.New("provided attachment was set to both header and avatar") - } - - var headerOrAvi Type - if currentAttachment.Header { - headerOrAvi = TypeHeader - } else if currentAttachment.Avatar { - headerOrAvi = TypeAvatar - } - - if currentAttachment.RemoteURL == "" { - return nil, errors.New("no remote URL on media attachment to dereference") - } - remoteIRI, err := url.Parse(currentAttachment.RemoteURL) - if err != nil { - return nil, fmt.Errorf("error parsing attachment url %s: %s", currentAttachment.RemoteURL, err) - } - - // for content type, we assume we don't know what to expect... - expectedContentType := "*/*" - if currentAttachment.File.ContentType != "" { - // ... and then narrow it down if we do - expectedContentType = currentAttachment.File.ContentType - } - - attachmentBytes, err := t.DereferenceMedia(ctx, remoteIRI, expectedContentType) - if err != nil { - return nil, fmt.Errorf("dereferencing remote media with url %s: %s", remoteIRI.String(), err) + return nil, fmt.Errorf("content type %s not (yet) supported", contentType) } - - return m.ProcessHeaderOrAvatar(ctx, attachmentBytes, accountID, headerOrAvi, currentAttachment.RemoteURL) } diff --git a/internal/media/media.go b/internal/media/media.go new file mode 100644 index 0000000000..e96c370209 --- /dev/null +++ b/internal/media/media.go @@ -0,0 +1,7 @@ +package media + +import gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20211113114307_init" + +type Media struct { + Attachment *gtsmodel.MediaAttachment +} diff --git a/internal/media/pool.go b/internal/media/pool.go new file mode 100644 index 0000000000..19b31cde3b --- /dev/null +++ b/internal/media/pool.go @@ -0,0 +1,65 @@ +package media + +import "context" + +func newWorkerPool(workers int) *workerPool { + // make a pool with the given worker capacity + pool := &workerPool{ + workerQueue: make(chan *worker, workers), + } + + // fill the pool with workers + for i := 0; i < workers; i++ { + pool.workerQueue <- &worker{ + // give each worker a reference to the pool so it + // can put itself back in when it's finished + workerQueue: pool.workerQueue, + data: []byte{}, + contentType: "", + accountID: "", + } + } + + return pool +} + +type workerPool struct { + workerQueue chan *worker +} + +func (p *workerPool) run(fn func(ctx context.Context, data []byte, contentType string, accountID string)) (*Media, error) { + + m := &Media{} + + go func() { + // take a worker from the worker pool + worker := <-p.workerQueue + // tell it to work + worker.work(fn) + }() + + return m, nil +} + +type worker struct { + workerQueue chan *worker + data []byte + contentType string + accountID string +} + +func (w *worker) work(fn func(ctx context.Context, data []byte, contentType string, accountID string)) { + // return self to pool when finished + defer w.finish() + // do the work + fn(context.Background(), w.data, w.contentType, w.accountID) +} + +func (w *worker) finish() { + // clear self + w.data = []byte{} + w.contentType = "" + w.accountID = "" + // put self back in the worker pool + w.workerQueue <- w +} diff --git a/internal/media/process.go b/internal/media/process.go new file mode 100644 index 0000000000..e921be6bc4 --- /dev/null +++ b/internal/media/process.go @@ -0,0 +1,5 @@ +package media + +import "context" + +type mediaProcessingFunction func(ctx context.Context, data []byte, contentType string, accountID string) diff --git a/internal/media/processvideo.go b/internal/media/processvideo.go deleted file mode 100644 index e829c68c08..0000000000 --- a/internal/media/processvideo.go +++ /dev/null @@ -1,23 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package media - -// func (mh *mediaManager) processVideoAttachment(data []byte, accountID string, contentType string, remoteURL string) (*gtsmodel.MediaAttachment, error) { -// return nil, nil -// } diff --git a/internal/media/util_test.go b/internal/media/util_test.go deleted file mode 100644 index 1180bf2aa8..0000000000 --- a/internal/media/util_test.go +++ /dev/null @@ -1,150 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package media - -import ( - "io/ioutil" - "testing" - - "github.com/spf13/viper" - "github.com/superseriousbusiness/gotosocial/internal/config" - "github.com/superseriousbusiness/gotosocial/internal/log" - - "github.com/stretchr/testify/suite" -) - -type MediaUtilTestSuite struct { - suite.Suite -} - -/* - TEST INFRASTRUCTURE -*/ - -// SetupSuite sets some variables on the suite that we can use as consts (more or less) throughout -func (suite *MediaUtilTestSuite) SetupSuite() { - // doesn't use testrig.InitTestLog() helper to prevent import cycle - viper.Set(config.Keys.LogLevel, "trace") - err := log.Initialize() - if err != nil { - panic(err) - } -} - -func (suite *MediaUtilTestSuite) TearDownSuite() { - -} - -// SetupTest creates a db connection and creates necessary tables before each test -func (suite *MediaUtilTestSuite) SetupTest() { - -} - -// TearDownTest drops tables to make sure there's no data in the db -func (suite *MediaUtilTestSuite) TearDownTest() { - -} - -/* - ACTUAL TESTS -*/ - -func (suite *MediaUtilTestSuite) TestParseContentTypeOK() { - f, err := ioutil.ReadFile("./test/test-jpeg.jpg") - suite.NoError(err) - ct, err := parseContentType(f) - suite.NoError(err) - suite.Equal("image/jpeg", ct) -} - -func (suite *MediaUtilTestSuite) TestParseContentTypeNotOK() { - f, err := ioutil.ReadFile("./test/test-corrupted.jpg") - suite.NoError(err) - ct, err := parseContentType(f) - suite.NotNil(err) - suite.Equal("", ct) - suite.Equal("filetype unknown", err.Error()) -} - -func (suite *MediaUtilTestSuite) TestRemoveEXIF() { - // load and validate image - b, err := ioutil.ReadFile("./test/test-with-exif.jpg") - suite.NoError(err) - - // clean it up and validate the clean version - clean, err := purgeExif(b) - suite.NoError(err) - - // compare it to our stored sample - sampleBytes, err := ioutil.ReadFile("./test/test-without-exif.jpg") - suite.NoError(err) - suite.EqualValues(sampleBytes, clean) -} - -func (suite *MediaUtilTestSuite) TestDeriveImageFromJPEG() { - // load image - b, err := ioutil.ReadFile("./test/test-jpeg.jpg") - suite.NoError(err) - - // clean it up and validate the clean version - imageAndMeta, err := decodeImage(b, "image/jpeg") - suite.NoError(err) - - suite.Equal(1920, imageAndMeta.width) - suite.Equal(1080, imageAndMeta.height) - suite.Equal(1.7777777777777777, imageAndMeta.aspect) - suite.Equal(2073600, imageAndMeta.size) - - // assert that the final image is what we would expect - sampleBytes, err := ioutil.ReadFile("./test/test-jpeg-processed.jpg") - suite.NoError(err) - suite.EqualValues(sampleBytes, imageAndMeta.image) -} - -func (suite *MediaUtilTestSuite) TestDeriveThumbnailFromJPEG() { - // load image - b, err := ioutil.ReadFile("./test/test-jpeg.jpg") - suite.NoError(err) - - // clean it up and validate the clean version - imageAndMeta, err := deriveThumbnail(b, "image/jpeg", 512, 512) - suite.NoError(err) - - suite.Equal(512, imageAndMeta.width) - suite.Equal(288, imageAndMeta.height) - suite.Equal(1.7777777777777777, imageAndMeta.aspect) - suite.Equal(147456, imageAndMeta.size) - suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", imageAndMeta.blurhash) - - sampleBytes, err := ioutil.ReadFile("./test/test-jpeg-thumbnail.jpg") - suite.NoError(err) - suite.EqualValues(sampleBytes, imageAndMeta.image) -} - -func (suite *MediaUtilTestSuite) TestSupportedImageTypes() { - ok := supportedImage("image/jpeg") - suite.True(ok) - - ok = supportedImage("image/bmp") - suite.False(ok) -} - -func TestMediaUtilTestSuite(t *testing.T) { - suite.Run(t, new(MediaUtilTestSuite)) -} From e08c0e55eec777b9bf1eb907c78cecd4c8859c8e Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 3 Jan 2022 17:37:09 +0100 Subject: [PATCH 04/43] add gruf worker pool --- go.mod | 1 + go.sum | 2 + vendor/codeberg.org/gruf/go-runners/LICENSE | 9 + vendor/codeberg.org/gruf/go-runners/README.md | 3 + .../codeberg.org/gruf/go-runners/context.go | 36 ++++ vendor/codeberg.org/gruf/go-runners/pool.go | 160 ++++++++++++++++++ vendor/codeberg.org/gruf/go-runners/run.go | 130 ++++++++++++++ .../codeberg.org/gruf/go-runners/service.go | 159 +++++++++++++++++ vendor/modules.txt | 3 + 9 files changed, 503 insertions(+) create mode 100644 vendor/codeberg.org/gruf/go-runners/LICENSE create mode 100644 vendor/codeberg.org/gruf/go-runners/README.md create mode 100644 vendor/codeberg.org/gruf/go-runners/context.go create mode 100644 vendor/codeberg.org/gruf/go-runners/pool.go create mode 100644 vendor/codeberg.org/gruf/go-runners/run.go create mode 100644 vendor/codeberg.org/gruf/go-runners/service.go diff --git a/go.mod b/go.mod index 019607977f..71509ee6ad 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/superseriousbusiness/gotosocial go 1.17 require ( + codeberg.org/gruf/go-runners v1.2.0 codeberg.org/gruf/go-store v1.1.5 github.com/ReneKroon/ttlcache v1.7.0 github.com/buckket/go-blurhash v1.1.0 diff --git a/go.sum b/go.sum index 5f09d42f1e..05d7597e11 100644 --- a/go.sum +++ b/go.sum @@ -70,6 +70,8 @@ codeberg.org/gruf/go-nowish v1.1.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K codeberg.org/gruf/go-pools v1.0.2 h1:B0X6yoCL9FVmnvyoizb1SYRwMYPWwEJBjPnBMM5ILos= codeberg.org/gruf/go-pools v1.0.2/go.mod h1:MjUV3H6IASyBeBPCyCr7wjPpSNu8E2N87LG4r4TAyok= codeberg.org/gruf/go-runners v1.1.1/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= +codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBsH4= +codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-store v1.1.5 h1:fp28vzGD15OsAF51CCwi7woH+Y3vb0aMl4OFh9JSjA0= codeberg.org/gruf/go-store v1.1.5/go.mod h1:Q6ev500ddKghDQ8KS4IstL/W9fptDKa2T9oeHP+tXsI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= diff --git a/vendor/codeberg.org/gruf/go-runners/LICENSE b/vendor/codeberg.org/gruf/go-runners/LICENSE new file mode 100644 index 0000000000..b7c4417ac5 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-runners/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2021 gruf + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/codeberg.org/gruf/go-runners/README.md b/vendor/codeberg.org/gruf/go-runners/README.md new file mode 100644 index 0000000000..91cc1528d4 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-runners/README.md @@ -0,0 +1,3 @@ +# go-runners + +Provides a means a simple means of managing long-running functions and services \ No newline at end of file diff --git a/vendor/codeberg.org/gruf/go-runners/context.go b/vendor/codeberg.org/gruf/go-runners/context.go new file mode 100644 index 0000000000..edb6950603 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-runners/context.go @@ -0,0 +1,36 @@ +package runners + +import ( + "context" + "time" +) + +// ContextWithCancel returns a new context.Context impl with cancel. +func ContextWithCancel() (context.Context, context.CancelFunc) { + ctx := make(cancelctx) + return ctx, func() { close(ctx) } +} + +// cancelctx is the simplest possible cancellable context. +type cancelctx (chan struct{}) + +func (cancelctx) Deadline() (time.Time, bool) { + return time.Time{}, false +} + +func (ctx cancelctx) Done() <-chan struct{} { + return ctx +} + +func (ctx cancelctx) Err() error { + select { + case <-ctx: + return context.Canceled + default: + return nil + } +} + +func (cancelctx) Value(key interface{}) interface{} { + return nil +} diff --git a/vendor/codeberg.org/gruf/go-runners/pool.go b/vendor/codeberg.org/gruf/go-runners/pool.go new file mode 100644 index 0000000000..49fc220387 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-runners/pool.go @@ -0,0 +1,160 @@ +package runners + +import ( + "context" + "sync" +) + +// WorkerFunc represents a function processable by a worker in WorkerPool. Note +// that implementations absolutely MUST check whether passed context is Done() +// otherwise stopping the pool may block for large periods of time. +type WorkerFunc func(context.Context) + +// WorkerPool provides a means of enqueuing asynchronous work. +type WorkerPool struct { + queue chan WorkerFunc + free chan struct{} + wait sync.WaitGroup + svc Service +} + +// NewWorkerPool returns a new WorkerPool with provided worker count and WorkerFunc queue size. +// The number of workers represents how many WorkerFuncs can be executed simultaneously, and the +// queue size represents the max number of WorkerFuncs that can be queued at any one time. +func NewWorkerPool(workers int, queue int) WorkerPool { + return WorkerPool{ + queue: make(chan WorkerFunc, queue), + free: make(chan struct{}, workers), + } +} + +// Start will attempt to start the worker pool, asynchronously. Return is success state. +func (pool *WorkerPool) Start() bool { + ok := true + + done := make(chan struct{}) + go func() { + ok = pool.svc.Run(func(ctx context.Context) { + close(done) + pool.process(ctx) + }) + if !ok { + close(done) + } + }() + <-done + + return ok +} + +// Stop will attempt to stop the worker pool, this will block until stopped. Return is success state. +func (pool *WorkerPool) Stop() bool { + return pool.svc.Stop() +} + +// Running returns whether the worker pool is running. +func (pool *WorkerPool) Running() bool { + return pool.svc.Running() +} + +// execute will take a queued function and pass it to a free worker when available. +func (pool *WorkerPool) execute(ctx context.Context, fn WorkerFunc) { + // Set as running + pool.wait.Add(1) + + select { + // Pool context cancelled + case <-ctx.Done(): + pool.wait.Done() + + // Free worker acquired + case pool.free <- struct{}{}: + } + + go func() { + defer func() { + // defer in case panic + <-pool.free + pool.wait.Done() + }() + + // Run queued + fn(ctx) + }() +} + +// process is the background processing routine that passes queued functions to workers. +func (pool *WorkerPool) process(ctx context.Context) { + for { + select { + // Pool context cancelled + case <-ctx.Done(): + for { + select { + // Pop and execute queued + case fn := <-pool.queue: + fn(ctx) // ctx is closed + + // Empty, wait for workers + default: + pool.wait.Wait() + return + } + } + + // Queued func received + case fn := <-pool.queue: + pool.execute(ctx, fn) + } + } +} + +// Enqueue will add provided WorkerFunc to the queue to be performed when there is a free worker. +// Note that 'fn' will ALWAYS be executed, and the supplied context will specify whether this 'fn' +// is being executed during normal pool execution, or if the pool has been stopped with <-ctx.Done(). +func (pool *WorkerPool) Enqueue(fn WorkerFunc) { + // Check valid fn + if fn == nil { + return + } + + select { + // Pool context cancelled + case <-pool.svc.Done(): + + // Placed fn in queue + case pool.queue <- fn: + } +} + +// EnqueueNoBlock performs Enqueue but returns false if queue size is at max. Else, true. +func (pool *WorkerPool) EnqueueNoBlock(fn WorkerFunc) bool { + // Check valid fn + if fn == nil { + return false + } + + select { + // Pool context cancelled + case <-pool.svc.Done(): + return false + + // Placed fn in queue + case pool.queue <- fn: + return true + + // Queue is full + default: + return false + } +} + +// Queue returns the number of currently queued WorkerFuncs. +func (pool *WorkerPool) Queue() int { + return len(pool.queue) +} + +// Workers returns the number of currently active workers. +func (pool *WorkerPool) Workers() int { + return len(pool.free) +} diff --git a/vendor/codeberg.org/gruf/go-runners/run.go b/vendor/codeberg.org/gruf/go-runners/run.go new file mode 100644 index 0000000000..27f7fb9b8a --- /dev/null +++ b/vendor/codeberg.org/gruf/go-runners/run.go @@ -0,0 +1,130 @@ +package runners + +import ( + "context" + "errors" + "fmt" + "sync" + "time" +) + +// FuncRunner provides a means of managing long-running functions e.g. main logic loops. +type FuncRunner struct { + // HandOff is the time after which a blocking function will be considered handed off + HandOff time.Duration + + // ErrorHandler is the function that errors are passed to when encountered by the + // provided function. This can be used both for logging, and for error filtering + ErrorHandler func(err error) error + + svc Service // underlying service to manage start/stop + err error // last-set error + mu sync.Mutex // protects err +} + +// Go will attempt to run 'fn' asynchronously. The provided context is used to propagate requested +// cancel if FuncRunner.Stop() is called. Any returned error will be passed to FuncRunner.ErrorHandler +// for filtering/logging/etc. Any blocking functions will be waited on for FuncRunner.HandOff amount of +// time before considering the function as handed off. Returned bool is success state, i.e. returns true +// if function is successfully handed off or returns within hand off time with nil error. +func (r *FuncRunner) Go(fn func(ctx context.Context) error) bool { + done := make(chan struct{}) + + go func() { + var cancelled bool + + has := r.svc.Run(func(ctx context.Context) { + // reset error + r.mu.Lock() + r.err = nil + r.mu.Unlock() + + // Run supplied func and set errror if returned + if err := Run(func() error { return fn(ctx) }); err != nil { + r.mu.Lock() + r.err = err + r.mu.Unlock() + } + + // signal done + close(done) + + // Check if cancelled + select { + case <-ctx.Done(): + cancelled = true + default: + cancelled = false + } + }) + + switch has { + // returned after starting + case true: + r.mu.Lock() + + // filter out errors due FuncRunner.Stop() being called + if cancelled && errors.Is(r.err, context.Canceled) { + // filter out errors from FuncRunner.Stop() being called + r.err = nil + } else if r.err != nil && r.ErrorHandler != nil { + // pass any non-nil error to set handler + r.err = r.ErrorHandler(r.err) + } + + r.mu.Unlock() + + // already running + case false: + close(done) + } + }() + + // get valid handoff to use + handoff := r.HandOff + if handoff < 1 { + handoff = time.Second * 5 + } + + select { + // handed off (long-run successful) + case <-time.After(handoff): + return true + + // 'fn' returned, check error + case <-done: + return (r.Err() == nil) + } +} + +// Stop will cancel the context supplied to the running function. +func (r *FuncRunner) Stop() bool { + return r.svc.Stop() +} + +// Err returns the last-set error value. +func (r *FuncRunner) Err() error { + r.mu.Lock() + err := r.err + r.mu.Unlock() + return err +} + +// Run will execute the supplied 'fn' catching any panics. Returns either function-returned error or formatted panic. +func Run(fn func() error) (err error) { + defer func() { + if r := recover(); r != nil { + if e, ok := r.(error); ok { + // wrap and preserve existing error + err = fmt.Errorf("caught panic: %w", e) + } else { + // simply create new error fromt iface + err = fmt.Errorf("caught panic: %v", r) + } + } + }() + + // run supplied func + err = fn() + return +} diff --git a/vendor/codeberg.org/gruf/go-runners/service.go b/vendor/codeberg.org/gruf/go-runners/service.go new file mode 100644 index 0000000000..c0f878c457 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-runners/service.go @@ -0,0 +1,159 @@ +package runners + +import ( + "context" + "sync" +) + +// Service provides a means of tracking a single long-running service, provided protected state +// changes and preventing multiple instances running. Also providing service state information. +type Service struct { + state uint32 // 0=stopped, 1=running, 2=stopping + wait sync.Mutex // wait is the mutex used as a single-entity wait-group, i.e. just a "wait" :p + cncl context.CancelFunc // cncl is the cancel function set for the current context + ctx context.Context // ctx is the current context for running function (or nil if not running) + mu sync.Mutex // mu protects state changes +} + +// Run will run the supplied function until completion, use given context to propagate cancel. +// Immediately returns false if the Service is already running, and true after completed run. +func (svc *Service) Run(fn func(context.Context)) bool { + // Attempt to start the svc + ctx, ok := svc.doStart() + if !ok { + return false + } + + defer func() { + // unlock single wait + svc.wait.Unlock() + + // ensure stopped + svc.Stop() + }() + + // Run user func + if fn != nil { + fn(ctx) + } + return true +} + +// Stop will attempt to stop the service, cancelling the running function's context. Immediately +// returns false if not running, and true only after Service is fully stopped. +func (svc *Service) Stop() bool { + // Attempt to stop the svc + cncl, ok := svc.doStop() + if !ok { + return false + } + + defer func() { + // Get svc lock + svc.mu.Lock() + + // Wait until stopped + svc.wait.Lock() + svc.wait.Unlock() + + // Reset the svc + svc.ctx = nil + svc.cncl = nil + svc.state = 0 + svc.mu.Unlock() + }() + + cncl() // cancel ctx + return true +} + +// doStart will safely set Service state to started, returning a ptr to this context insance. +func (svc *Service) doStart() (context.Context, bool) { + // Protect startup + svc.mu.Lock() + + if svc.state != 0 /* not stopped */ { + svc.mu.Unlock() + return nil, false + } + + // state started + svc.state = 1 + + // Take our own ptr + var ctx context.Context + + if svc.ctx == nil { + // Context required allocating + svc.ctx, svc.cncl = ContextWithCancel() + } + + // Start the waiter + svc.wait.Lock() + + // Set our ptr + unlock + ctx = svc.ctx + svc.mu.Unlock() + + return ctx, true +} + +// doStop will safely set Service state to stopping, returning a ptr to this cancelfunc instance. +func (svc *Service) doStop() (context.CancelFunc, bool) { + // Protect stop + svc.mu.Lock() + + if svc.state != 1 /* not started */ { + svc.mu.Unlock() + return nil, false + } + + // state stopping + svc.state = 2 + + // Take our own ptr + // and unlock state + cncl := svc.cncl + svc.mu.Unlock() + + return cncl, true +} + +// Running returns if Service is running (i.e. state NOT stopped / stopping). +func (svc *Service) Running() bool { + svc.mu.Lock() + state := svc.state + svc.mu.Unlock() + return (state == 1) +} + +// Done returns a channel that's closed when Service.Stop() is called. It is +// the same channel provided to the currently running service function. +func (svc *Service) Done() <-chan struct{} { + var done <-chan struct{} + + svc.mu.Lock() + switch svc.state { + // stopped + // (here we create a new context so that the + // returned 'done' channel here will still + // be valid for when Service is next started) + case 0: + if svc.ctx == nil { + // need to allocate new context + svc.ctx, svc.cncl = ContextWithCancel() + } + done = svc.ctx.Done() + + // started + case 1: + done = svc.ctx.Done() + + // stopping + case 2: + done = svc.ctx.Done() + } + svc.mu.Unlock() + + return done +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 051463c5e0..c403b7d2d7 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -22,6 +22,9 @@ codeberg.org/gruf/go-nowish # codeberg.org/gruf/go-pools v1.0.2 ## explicit; go 1.16 codeberg.org/gruf/go-pools +# codeberg.org/gruf/go-runners v1.2.0 +## explicit; go 1.14 +codeberg.org/gruf/go-runners # codeberg.org/gruf/go-store v1.1.5 ## explicit; go 1.14 codeberg.org/gruf/go-store/kv From 8abfa7751ab4b80ced391f8a7bd16c5e6c432fee Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 3 Jan 2022 17:37:38 +0100 Subject: [PATCH 05/43] return very partial image on first upload --- internal/media/image.go | 143 +++++++++++++++----------------------- internal/media/manager.go | 30 ++++++-- internal/media/media.go | 31 ++++++++- internal/media/pool.go | 65 ----------------- internal/media/process.go | 5 -- 5 files changed, 109 insertions(+), 165 deletions(-) delete mode 100644 internal/media/pool.go delete mode 100644 internal/media/process.go diff --git a/internal/media/image.go b/internal/media/image.go index 26bd5e8b69..4ad68db5a0 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -43,21 +43,55 @@ const ( thumbnailMaxHeight = 512 ) -type imageAndMeta struct { - image []byte - width int - height int - size int - aspect float64 - blurhash string +type ImageMeta struct { + image []byte + contentType string + width int + height int + size int + aspect float64 + blurhash string } -func (m *manager) processImage(ctx context.Context, data []byte, contentType string, accountID string) { +func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string) (*Media, error) { + id, err := id.NewRandomULID() + if err != nil { + return nil, err + } + + extension := strings.Split(contentType, "/")[1] + + attachment := >smodel.MediaAttachment{ + ID: id, + UpdatedAt: time.Now(), + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), + Type: gtsmodel.FileTypeImage, + AccountID: accountID, + Processing: 0, + File: gtsmodel.File{ + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), + ContentType: contentType, + UpdatedAt: time.Now(), + }, + Thumbnail: gtsmodel.Thumbnail{ + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, + ContentType: mimeJpeg, + UpdatedAt: time.Now(), + }, + Avatar: false, + Header: false, + } + + media := &Media{ + attachment: attachment, + } + + return media, nil var clean []byte - var err error - var original *imageAndMeta - var small *imageAndMeta + var original *ImageMeta + var small *ImageMeta switch contentType { case mimeImageJpeg, mimeImagePng: @@ -79,82 +113,17 @@ func (m *manager) processImage(ctx context.Context, data []byte, contentType str return nil, err } - small, err = deriveThumbnail(clean, contentType, thumbnailMaxWidth, thumbnailMaxHeight) + small, err = deriveThumbnail(clean, contentType) if err != nil { return nil, fmt.Errorf("error deriving thumbnail: %s", err) } // now put it in storage, take a new id for the name of the file so we don't store any unnecessary info about it - extension := strings.Split(contentType, "/")[1] - attachmentID, err := id.NewRandomULID() - if err != nil { - return nil, err - } - - originalURL := uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), attachmentID, extension) - smallURL := uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), attachmentID, "jpeg") // all thumbnails/smalls are encoded as jpeg - - // we store the original... - originalPath := fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, attachmentID, extension) - if err := m.storage.Put(originalPath, original.image); err != nil { - return nil, fmt.Errorf("storage error: %s", err) - } - - // and a thumbnail... - smallPath := fmt.Sprintf("%s/%s/%s/%s.jpeg", accountID, TypeAttachment, SizeSmall, attachmentID) // all thumbnails/smalls are encoded as jpeg - if err := m.storage.Put(smallPath, small.image); err != nil { - return nil, fmt.Errorf("storage error: %s", err) - } - - attachment := >smodel.MediaAttachment{ - ID: attachmentID, - StatusID: "", - URL: originalURL, - RemoteURL: "", - CreatedAt: time.Time{}, - UpdatedAt: time.Time{}, - Type: gtsmodel.FileTypeImage, - FileMeta: gtsmodel.FileMeta{ - Original: gtsmodel.Original{ - Width: original.width, - Height: original.height, - Size: original.size, - Aspect: original.aspect, - }, - Small: gtsmodel.Small{ - Width: small.width, - Height: small.height, - Size: small.size, - Aspect: small.aspect, - }, - }, - AccountID: accountID, - Description: "", - ScheduledStatusID: "", - Blurhash: small.blurhash, - Processing: 2, - File: gtsmodel.File{ - Path: originalPath, - ContentType: contentType, - FileSize: len(original.image), - UpdatedAt: time.Now(), - }, - Thumbnail: gtsmodel.Thumbnail{ - Path: smallPath, - ContentType: mimeJpeg, // all thumbnails/smalls are encoded as jpeg - FileSize: len(small.image), - UpdatedAt: time.Now(), - URL: smallURL, - RemoteURL: "", - }, - Avatar: false, - Header: false, - } return attachment, nil } -func decodeGif(b []byte) (*imageAndMeta, error) { +func decodeGif(b []byte) (*ImageMeta, error) { gif, err := gif.DecodeAll(bytes.NewReader(b)) if err != nil { return nil, err @@ -166,7 +135,7 @@ func decodeGif(b []byte) (*imageAndMeta, error) { size := width * height aspect := float64(width) / float64(height) - return &imageAndMeta{ + return &ImageMeta{ image: b, width: width, height: height, @@ -175,7 +144,7 @@ func decodeGif(b []byte) (*imageAndMeta, error) { }, nil } -func decodeImage(b []byte, contentType string) (*imageAndMeta, error) { +func decodeImage(b []byte, contentType string) (*ImageMeta, error) { var i image.Image var err error @@ -201,7 +170,7 @@ func decodeImage(b []byte, contentType string) (*imageAndMeta, error) { size := width * height aspect := float64(width) / float64(height) - return &imageAndMeta{ + return &ImageMeta{ image: b, width: width, height: height, @@ -210,12 +179,12 @@ func decodeImage(b []byte, contentType string) (*imageAndMeta, error) { }, nil } -// deriveThumbnail returns a byte slice and metadata for a thumbnail of width x and height y, +// deriveThumbnail returns a byte slice and metadata for a thumbnail // of a given jpeg, png, or gif, or an error if something goes wrong. // // Note that the aspect ratio of the image will be retained, // so it will not necessarily be a square, even if x and y are set as the same value. -func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMeta, error) { +func deriveThumbnail(b []byte, contentType string) (*ImageMeta, error) { var i image.Image var err error @@ -239,7 +208,7 @@ func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMet return nil, fmt.Errorf("content type %s not recognised", contentType) } - thumb := resize.Thumbnail(x, y, i, resize.NearestNeighbor) + thumb := resize.Thumbnail(thumbnailMaxWidth, thumbnailMaxHeight, i, resize.NearestNeighbor) width := thumb.Bounds().Size().X height := thumb.Bounds().Size().Y size := width * height @@ -257,7 +226,7 @@ func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMet }); err != nil { return nil, err } - return &imageAndMeta{ + return &ImageMeta{ image: out.Bytes(), width: width, height: height, @@ -268,7 +237,7 @@ func deriveThumbnail(b []byte, contentType string, x uint, y uint) (*imageAndMet } // deriveStaticEmojji takes a given gif or png of an emoji, decodes it, and re-encodes it as a static png. -func deriveStaticEmoji(b []byte, contentType string) (*imageAndMeta, error) { +func deriveStaticEmoji(b []byte, contentType string) (*ImageMeta, error) { var i image.Image var err error @@ -291,7 +260,7 @@ func deriveStaticEmoji(b []byte, contentType string) (*imageAndMeta, error) { if err := png.Encode(out, i); err != nil { return nil, err } - return &imageAndMeta{ + return &ImageMeta{ image: out.Bytes(), }, nil } diff --git a/internal/media/manager.go b/internal/media/manager.go index 16465bb677..54b9645640 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -25,7 +25,9 @@ import ( "runtime" "strings" + "codeberg.org/gruf/go-runners" "codeberg.org/gruf/go-store/kv" + "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/db" ) @@ -37,18 +39,27 @@ type Manager interface { type manager struct { db db.DB storage *kv.KVStore - pool *workerPool + pool runners.WorkerPool } // New returns a media manager with the given db and underlying storage. -func New(database db.DB, storage *kv.KVStore) Manager { +func New(database db.DB, storage *kv.KVStore) (Manager, error) { workers := runtime.NumCPU() / 2 + queue := workers * 10 + pool := runners.NewWorkerPool(workers, queue) - return &manager{ + if start := pool.Start(); !start { + return nil, errors.New("could not start worker pool") + } + logrus.Debugf("started media manager worker pool with %d workers and queue capacity of %d", workers, queue) + + m := &manager{ db: database, storage: storage, - pool: newWorkerPool(workers), + pool: pool, } + + return m, nil } /* @@ -77,9 +88,16 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin return nil, errors.New("image was of size 0") } - return m.pool.run(func(ctx context.Context, data []byte, contentType string, accountID string) { - m.processImage(ctx, data, contentType, accountID) + media, err := m.preProcessImage(ctx, data, contentType, accountID) + if err != nil { + return nil, err + } + + m.pool.Enqueue(func(innerCtx context.Context) { + }) + + return nil, nil default: return nil, fmt.Errorf("content type %s not (yet) supported", contentType) } diff --git a/internal/media/media.go b/internal/media/media.go index e96c370209..0bd196b273 100644 --- a/internal/media/media.go +++ b/internal/media/media.go @@ -1,7 +1,34 @@ package media -import gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20211113114307_init" +import ( + "fmt" + "sync" + + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) type Media struct { - Attachment *gtsmodel.MediaAttachment + mu sync.Mutex + attachment *gtsmodel.MediaAttachment + rawData []byte +} + +func (m *Media) Thumb() (*ImageMeta, error) { + m.mu.Lock() + thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType) + if err != nil { + return nil, fmt.Errorf("error deriving thumbnail: %s", err) + } + m.attachment.Blurhash = thumb.blurhash + aaaaaaaaaaaaaaaa +} + +func (m *Media) PreLoad() { + m.mu.Lock() + defer m.mu.Unlock() +} + +func (m *Media) Load() { + m.mu.Lock() + defer m.mu.Unlock() } diff --git a/internal/media/pool.go b/internal/media/pool.go deleted file mode 100644 index 19b31cde3b..0000000000 --- a/internal/media/pool.go +++ /dev/null @@ -1,65 +0,0 @@ -package media - -import "context" - -func newWorkerPool(workers int) *workerPool { - // make a pool with the given worker capacity - pool := &workerPool{ - workerQueue: make(chan *worker, workers), - } - - // fill the pool with workers - for i := 0; i < workers; i++ { - pool.workerQueue <- &worker{ - // give each worker a reference to the pool so it - // can put itself back in when it's finished - workerQueue: pool.workerQueue, - data: []byte{}, - contentType: "", - accountID: "", - } - } - - return pool -} - -type workerPool struct { - workerQueue chan *worker -} - -func (p *workerPool) run(fn func(ctx context.Context, data []byte, contentType string, accountID string)) (*Media, error) { - - m := &Media{} - - go func() { - // take a worker from the worker pool - worker := <-p.workerQueue - // tell it to work - worker.work(fn) - }() - - return m, nil -} - -type worker struct { - workerQueue chan *worker - data []byte - contentType string - accountID string -} - -func (w *worker) work(fn func(ctx context.Context, data []byte, contentType string, accountID string)) { - // return self to pool when finished - defer w.finish() - // do the work - fn(context.Background(), w.data, w.contentType, w.accountID) -} - -func (w *worker) finish() { - // clear self - w.data = []byte{} - w.contentType = "" - w.accountID = "" - // put self back in the worker pool - w.workerQueue <- w -} diff --git a/internal/media/process.go b/internal/media/process.go deleted file mode 100644 index e921be6bc4..0000000000 --- a/internal/media/process.go +++ /dev/null @@ -1,5 +0,0 @@ -package media - -import "context" - -type mediaProcessingFunction func(ctx context.Context, data []byte, contentType string, accountID string) From 7ebe0f6a15f1881e465b8e78bb8ef8b4982b00aa Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 4 Jan 2022 17:37:54 +0100 Subject: [PATCH 06/43] start working on thumb + full funcs --- internal/media/image.go | 24 +++---- internal/media/manager.go | 17 +++-- internal/media/media.go | 136 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 146 insertions(+), 31 deletions(-) diff --git a/internal/media/image.go b/internal/media/image.go index 4ad68db5a0..157ae0f4a4 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -54,6 +54,14 @@ type ImageMeta struct { } func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string) (*Media, error) { + if !supportedImage(contentType) { + return nil, fmt.Errorf("image type %s not supported", contentType) + } + + if len(data) == 0 { + return nil, errors.New("image was of size 0") + } + id, err := id.NewRandomULID() if err != nil { return nil, err @@ -93,21 +101,7 @@ func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType var original *ImageMeta var small *ImageMeta - switch contentType { - case mimeImageJpeg, mimeImagePng: - // first 'clean' image by purging exif data from it - var exifErr error - if clean, exifErr = purgeExif(data); exifErr != nil { - return nil, fmt.Errorf("error cleaning exif data: %s", exifErr) - } - original, err = decodeImage(clean, contentType) - case mimeImageGif: - // gifs are already clean - no exif data to remove - clean = data - original, err = decodeGif(clean) - default: - err = fmt.Errorf("content type %s not a processible image type", contentType) - } + if err != nil { return nil, err diff --git a/internal/media/manager.go b/internal/media/manager.go index 54b9645640..074ebdb584 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -81,23 +81,22 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin switch mainType { case mimeImage: - if !supportedImage(contentType) { - return nil, fmt.Errorf("image type %s not supported", contentType) - } - if len(data) == 0 { - return nil, errors.New("image was of size 0") - } - media, err := m.preProcessImage(ctx, data, contentType, accountID) if err != nil { return nil, err } m.pool.Enqueue(func(innerCtx context.Context) { - + select { + case <-innerCtx.Done(): + // if the inner context is done that means the worker pool is closing, so we should just return + return + default: + media.PreLoad(innerCtx) + } }) - return nil, nil + return media, nil default: return nil, fmt.Errorf("content type %s not (yet) supported", contentType) } diff --git a/internal/media/media.go b/internal/media/media.go index 0bd196b273..aa11787b28 100644 --- a/internal/media/media.go +++ b/internal/media/media.go @@ -1,29 +1,151 @@ package media import ( + "context" "fmt" "sync" + "codeberg.org/gruf/go-store/kv" + "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" ) +type processState int + +const ( + received processState = iota // processing order has been received but not done yet + complete // processing order has been completed successfully + errored // processing order has been completed with an error +) + type Media struct { - mu sync.Mutex + mu sync.Mutex + + /* + below fields should be set on newly created media; + attachment will be updated incrementally as media goes through processing + */ + attachment *gtsmodel.MediaAttachment rawData []byte + + /* + below fields represent the processing state of the media thumbnail + */ + + thumbing processState + thumb *ImageMeta + + /* + below fields represent the processing state of the full-sized media + */ + + processing processState + processed *ImageMeta + + /* + below pointers to database and storage are maintained so that + the media can store and update itself during processing steps + */ + + database db.DB + storage *kv.KVStore + + err error // error created during processing, if any } -func (m *Media) Thumb() (*ImageMeta, error) { +func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { m.mu.Lock() - thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType) + defer m.mu.Unlock() + + switch m.thumbing { + case received: + // we haven't processed a thumbnail for this media yet so do it now + thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType) + if err != nil { + m.err = fmt.Errorf("error deriving thumbnail: %s", err) + m.thumbing = errored + return nil, m.err + } + + // put the thumbnail in storage + if err := m.storage.Put(m.attachment.Thumbnail.Path, thumb.image); err != nil { + m.err = fmt.Errorf("error storing thumbnail: %s", err) + m.thumbing = errored + return nil, m.err + } + + // set appropriate fields on the attachment based on the thumbnail we derived + m.attachment.Blurhash = thumb.blurhash + m.attachment.FileMeta.Small = gtsmodel.Small{ + Width: thumb.width, + Height: thumb.height, + Size: thumb.size, + Aspect: thumb.aspect, + } + m.attachment.Thumbnail.FileSize = thumb.size + + // put or update the attachment in the database + if err := m.database.Put(ctx, m.attachment); err != nil { + if err != db.ErrAlreadyExists { + m.err = fmt.Errorf("error putting attachment: %s", err) + m.thumbing = errored + return nil, m.err + } + if err := m.database.UpdateByPrimaryKey(ctx, m.attachment); err != nil { + m.err = fmt.Errorf("error updating attachment: %s", err) + m.thumbing = errored + return nil, m.err + } + } + + // set the thumbnail of this media + m.thumb = thumb + + // we're done processing the thumbnail! + m.thumbing = complete + fallthrough + case complete: + return m.thumb, nil + case errored: + return nil, m.err + } + + return nil, fmt.Errorf("thumbnail processing status %d unknown", m.thumbing) +} + +func (m *Media) Full(ctx context.Context) (*ImageMeta, error) { + var clean []byte + var err error + var original *ImageMeta + + ct := m.attachment.File.ContentType +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + switch ct { + case mimeImageJpeg, mimeImagePng: + // first 'clean' image by purging exif data from it + var exifErr error + if clean, exifErr = purgeExif(m.rawData); exifErr != nil { + return nil, fmt.Errorf("error cleaning exif data: %s", exifErr) + } + original, err = decodeImage(clean, ct) + case mimeImageGif: + // gifs are already clean - no exif data to remove + clean = m.rawData + original, err = decodeGif(clean) + default: + err = fmt.Errorf("content type %s not a processible image type", ct) + } + if err != nil { - return nil, fmt.Errorf("error deriving thumbnail: %s", err) + return nil, err } - m.attachment.Blurhash = thumb.blurhash - aaaaaaaaaaaaaaaa + + return original, nil } -func (m *Media) PreLoad() { +func (m *Media) PreLoad(ctx context.Context) { + go m.Thumb(ctx) m.mu.Lock() defer m.mu.Unlock() } From c2ff8f392b6320d45d8667d4e093e8eb8ddf59c1 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 8 Jan 2022 13:45:42 +0100 Subject: [PATCH 07/43] further refinements --- internal/media/image.go | 70 ------------------ internal/media/manager.go | 56 ++++++++++++++ internal/media/media.go | 110 ++++++++++++++++++---------- internal/processing/media/create.go | 26 ++----- 4 files changed, 131 insertions(+), 131 deletions(-) diff --git a/internal/media/image.go b/internal/media/image.go index 157ae0f4a4..acc62a28b9 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -20,22 +20,16 @@ package media import ( "bytes" - "context" "errors" "fmt" "image" "image/gif" "image/jpeg" "image/png" - "strings" - "time" "github.com/buckket/go-blurhash" "github.com/nfnt/resize" "github.com/superseriousbusiness/exifremove/pkg/exifremove" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" - "github.com/superseriousbusiness/gotosocial/internal/uris" ) const ( @@ -53,70 +47,6 @@ type ImageMeta struct { blurhash string } -func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string) (*Media, error) { - if !supportedImage(contentType) { - return nil, fmt.Errorf("image type %s not supported", contentType) - } - - if len(data) == 0 { - return nil, errors.New("image was of size 0") - } - - id, err := id.NewRandomULID() - if err != nil { - return nil, err - } - - extension := strings.Split(contentType, "/")[1] - - attachment := >smodel.MediaAttachment{ - ID: id, - UpdatedAt: time.Now(), - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), - Type: gtsmodel.FileTypeImage, - AccountID: accountID, - Processing: 0, - File: gtsmodel.File{ - Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), - ContentType: contentType, - UpdatedAt: time.Now(), - }, - Thumbnail: gtsmodel.Thumbnail{ - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, - Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, - ContentType: mimeJpeg, - UpdatedAt: time.Now(), - }, - Avatar: false, - Header: false, - } - - media := &Media{ - attachment: attachment, - } - - return media, nil - - var clean []byte - var original *ImageMeta - var small *ImageMeta - - - - if err != nil { - return nil, err - } - - small, err = deriveThumbnail(clean, contentType) - if err != nil { - return nil, fmt.Errorf("error deriving thumbnail: %s", err) - } - - // now put it in storage, take a new id for the name of the file so we don't store any unnecessary info about it - - return attachment, nil -} - func decodeGif(b []byte) (*ImageMeta, error) { gif, err := gif.DecodeAll(bytes.NewReader(b)) if err != nil { diff --git a/internal/media/manager.go b/internal/media/manager.go index 074ebdb584..8032ab42d9 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -24,11 +24,15 @@ import ( "fmt" "runtime" "strings" + "time" "codeberg.org/gruf/go-runners" "codeberg.org/gruf/go-store/kv" "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/uris" ) // Manager provides an interface for managing media: parsing, storing, and retrieving media objects like photos, videos, and gifs. @@ -92,6 +96,7 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin // if the inner context is done that means the worker pool is closing, so we should just return return default: + // start preloading the media for the caller's convenience media.PreLoad(innerCtx) } }) @@ -101,3 +106,54 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin return nil, fmt.Errorf("content type %s not (yet) supported", contentType) } } + +// preProcessImage initializes processing +func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string) (*Media, error) { + if !supportedImage(contentType) { + return nil, fmt.Errorf("image type %s not supported", contentType) + } + + if len(data) == 0 { + return nil, errors.New("image was of size 0") + } + + id, err := id.NewRandomULID() + if err != nil { + return nil, err + } + + extension := strings.Split(contentType, "/")[1] + + attachment := >smodel.MediaAttachment{ + ID: id, + UpdatedAt: time.Now(), + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), + Type: gtsmodel.FileTypeImage, + AccountID: accountID, + Processing: 0, + File: gtsmodel.File{ + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), + ContentType: contentType, + UpdatedAt: time.Now(), + }, + Thumbnail: gtsmodel.Thumbnail{ + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, + ContentType: mimeJpeg, + UpdatedAt: time.Now(), + }, + Avatar: false, + Header: false, + } + + media := &Media{ + attachment: attachment, + rawData: data, + thumbstate: received, + fullSizeState: received, + database: m.db, + storage: m.storage, + } + + return media, nil +} diff --git a/internal/media/media.go b/internal/media/media.go index aa11787b28..022de063e5 100644 --- a/internal/media/media.go +++ b/internal/media/media.go @@ -33,15 +33,15 @@ type Media struct { below fields represent the processing state of the media thumbnail */ - thumbing processState - thumb *ImageMeta + thumbstate processState + thumb *ImageMeta /* below fields represent the processing state of the full-sized media */ - processing processState - processed *ImageMeta + fullSizeState processState + fullSize *ImageMeta /* below pointers to database and storage are maintained so that @@ -58,20 +58,20 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { m.mu.Lock() defer m.mu.Unlock() - switch m.thumbing { + switch m.thumbstate { case received: // we haven't processed a thumbnail for this media yet so do it now thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType) if err != nil { m.err = fmt.Errorf("error deriving thumbnail: %s", err) - m.thumbing = errored + m.thumbstate = errored return nil, m.err } // put the thumbnail in storage if err := m.storage.Put(m.attachment.Thumbnail.Path, thumb.image); err != nil { m.err = fmt.Errorf("error storing thumbnail: %s", err) - m.thumbing = errored + m.thumbstate = errored return nil, m.err } @@ -89,12 +89,12 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { if err := m.database.Put(ctx, m.attachment); err != nil { if err != db.ErrAlreadyExists { m.err = fmt.Errorf("error putting attachment: %s", err) - m.thumbing = errored + m.thumbstate = errored return nil, m.err } if err := m.database.UpdateByPrimaryKey(ctx, m.attachment); err != nil { m.err = fmt.Errorf("error updating attachment: %s", err) - m.thumbing = errored + m.thumbstate = errored return nil, m.err } } @@ -103,7 +103,7 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { m.thumb = thumb // we're done processing the thumbnail! - m.thumbing = complete + m.thumbstate = complete fallthrough case complete: return m.thumb, nil @@ -111,46 +111,76 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { return nil, m.err } - return nil, fmt.Errorf("thumbnail processing status %d unknown", m.thumbing) + return nil, fmt.Errorf("thumbnail processing status %d unknown", m.thumbstate) } -func (m *Media) Full(ctx context.Context) (*ImageMeta, error) { - var clean []byte - var err error - var original *ImageMeta - - ct := m.attachment.File.ContentType -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - switch ct { - case mimeImageJpeg, mimeImagePng: - // first 'clean' image by purging exif data from it - var exifErr error - if clean, exifErr = purgeExif(m.rawData); exifErr != nil { - return nil, fmt.Errorf("error cleaning exif data: %s", exifErr) +func (m *Media) FullSize(ctx context.Context) (*ImageMeta, error) { + m.mu.Lock() + defer m.mu.Unlock() + + switch m.fullSizeState { + case received: + var clean []byte + var err error + var decoded *ImageMeta + + ct := m.attachment.File.ContentType + switch ct { + case mimeImageJpeg, mimeImagePng: + // first 'clean' image by purging exif data from it + var exifErr error + if clean, exifErr = purgeExif(m.rawData); exifErr != nil { + err = exifErr + break + } + decoded, err = decodeImage(clean, ct) + case mimeImageGif: + // gifs are already clean - no exif data to remove + clean = m.rawData + decoded, err = decodeGif(clean) + default: + err = fmt.Errorf("content type %s not a processible image type", ct) } - original, err = decodeImage(clean, ct) - case mimeImageGif: - // gifs are already clean - no exif data to remove - clean = m.rawData - original, err = decodeGif(clean) - default: - err = fmt.Errorf("content type %s not a processible image type", ct) - } - if err != nil { - return nil, err + if err != nil { + m.err = err + m.fullSizeState = errored + return nil, err + } + + // set the fullsize of this media + m.fullSize = decoded + + // we're done processing the full-size image + m.fullSizeState = complete + fallthrough + case complete: + return m.fullSize, nil + case errored: + return nil, m.err } - return original, nil + return nil, fmt.Errorf("full size processing status %d unknown", m.fullSizeState) } +// PreLoad begins the process of deriving the thumbnail and encoding the full-size image. +// It does this in a non-blocking way, so you can call it and then come back later and check +// if it's finished. func (m *Media) PreLoad(ctx context.Context) { go m.Thumb(ctx) - m.mu.Lock() - defer m.mu.Unlock() + go m.FullSize(ctx) } -func (m *Media) Load() { - m.mu.Lock() - defer m.mu.Unlock() +// Load is the blocking equivalent of pre-load. It makes sure the thumbnail and full-size image +// have been processed, then it returns the full-size image. +func (m *Media) Load(ctx context.Context) (*gtsmodel.MediaAttachment, error) { + if _, err := m.Thumb(ctx); err != nil { + return nil, err + } + + if _, err := m.FullSize(ctx); err != nil { + return nil, err + } + + return m.attachment, nil } diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index 68a011683c..357278e640 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -24,11 +24,9 @@ import ( "errors" "fmt" "io" - "time" apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/text" ) func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form *apimodel.AttachmentRequest) (*apimodel.Attachment, error) { @@ -46,29 +44,15 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form return nil, errors.New("could not read provided attachment: size 0 bytes") } - // now parse the focus parameter - focusx, focusy, err := parseFocus(form.Focus) + // process the media and load it immediately + media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), account.ID) if err != nil { - return nil, fmt.Errorf("couldn't parse attachment focus: %s", err) + return nil, err } - minAttachment := >smodel.MediaAttachment{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - AccountID: account.ID, - Description: text.SanitizeCaption(form.Description), - FileMeta: gtsmodel.FileMeta{ - Focus: gtsmodel.Focus{ - X: focusx, - Y: focusy, - }, - }, - } - - // allow the mediaManager to work its magic of processing the attachment bytes, and putting them in whatever storage backend we're using - attachment, err := p.mediaManager.ProcessAttachment(ctx, buf.Bytes(), minAttachment) + attachment, err := media.Load(ctx) if err != nil { - return nil, fmt.Errorf("error reading attachment: %s", err) + return nil, err } // prepare the frontend representation now -- if there are any errors here at least we can bail without From f61c3ddcf72ff689b9d253546c58d499b6fe6ac8 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 8 Jan 2022 17:17:01 +0100 Subject: [PATCH 08/43] compiling now --- internal/api/client/admin/emojicreate.go | 6 - internal/db/bundb/errors.go | 2 +- internal/federation/dereferencing/account.go | 48 ++++++-- .../federation/dereferencing/attachment.go | 102 ---------------- .../federation/dereferencing/dereferencer.go | 29 +---- internal/federation/dereferencing/media.go | 55 +++++++++ .../{attachment_test.go => media_test.go} | 18 ++- internal/federation/dereferencing/status.go | 10 +- internal/media/manager.go | 25 +++- internal/media/manager_test.go | 4 + internal/media/media.go | 113 +++++++++++++++--- internal/media/media_test.go | 65 ++++++++++ internal/processing/account/update.go | 47 +++++--- internal/processing/admin/emoji.go | 13 +- internal/processing/media/create.go | 11 +- internal/transport/derefmedia.go | 9 +- internal/transport/transport.go | 2 +- testrig/mediahandler.go | 6 +- 18 files changed, 342 insertions(+), 223 deletions(-) delete mode 100644 internal/federation/dereferencing/attachment.go create mode 100644 internal/federation/dereferencing/media.go rename internal/federation/dereferencing/{attachment_test.go => media_test.go} (91%) create mode 100644 internal/media/manager_test.go create mode 100644 internal/media/media_test.go diff --git a/internal/api/client/admin/emojicreate.go b/internal/api/client/admin/emojicreate.go index 617add4134..882654ea99 100644 --- a/internal/api/client/admin/emojicreate.go +++ b/internal/api/client/admin/emojicreate.go @@ -27,7 +27,6 @@ import ( "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/api" "github.com/superseriousbusiness/gotosocial/internal/api/model" - "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/validate" ) @@ -133,10 +132,5 @@ func validateCreateEmoji(form *model.EmojiCreateRequest) error { return errors.New("no emoji given") } - // a very superficial check to see if the media size limit is exceeded - if form.Image.Size > media.EmojiMaxBytes { - return fmt.Errorf("file size limit exceeded: limit is %d bytes but emoji was %d bytes", media.EmojiMaxBytes, form.Image.Size) - } - return validate.EmojiShortcode(form.Shortcode) } diff --git a/internal/db/bundb/errors.go b/internal/db/bundb/errors.go index 7602d5e1dc..7d01573731 100644 --- a/internal/db/bundb/errors.go +++ b/internal/db/bundb/errors.go @@ -35,7 +35,7 @@ func processSQLiteError(err error) db.Error { // Handle supplied error code: switch sqliteErr.Code() { - case sqlite3.SQLITE_CONSTRAINT_UNIQUE: + case sqlite3.SQLITE_CONSTRAINT_UNIQUE, sqlite3.SQLITE_CONSTRAINT_PRIMARYKEY: return db.ErrAlreadyExists default: return err diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 19c98e203c..5912ff29a9 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -246,25 +246,49 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * } if targetAccount.AvatarRemoteURL != "" && (targetAccount.AvatarMediaAttachmentID == "" || refresh) { - a, err := d.mediaManager.ProcessRemoteHeaderOrAvatar(ctx, t, >smodel.MediaAttachment{ - RemoteURL: targetAccount.AvatarRemoteURL, - Avatar: true, - }, targetAccount.ID) + avatarIRI, err := url.Parse(targetAccount.AvatarRemoteURL) if err != nil { - return fmt.Errorf("error processing avatar for user: %s", err) + return err } - targetAccount.AvatarMediaAttachmentID = a.ID + + data, err := t.DereferenceMedia(ctx, avatarIRI) + if err != nil { + return err + } + + media, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, targetAccount.AvatarRemoteURL) + if err != nil { + return err + } + + if err := media.SetAsAvatar(ctx); err != nil { + return err + } + + targetAccount.AvatarMediaAttachmentID = media.AttachmentID() } if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { - a, err := d.mediaManager.ProcessRemoteHeaderOrAvatar(ctx, t, >smodel.MediaAttachment{ - RemoteURL: targetAccount.HeaderRemoteURL, - Header: true, - }, targetAccount.ID) + headerIRI, err := url.Parse(targetAccount.HeaderRemoteURL) if err != nil { - return fmt.Errorf("error processing header for user: %s", err) + return err } - targetAccount.HeaderMediaAttachmentID = a.ID + + data, err := t.DereferenceMedia(ctx, headerIRI) + if err != nil { + return err + } + + media, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, targetAccount.HeaderRemoteURL) + if err != nil { + return err + } + + if err := media.SetAsHeader(ctx); err != nil { + return err + } + + targetAccount.HeaderMediaAttachmentID = media.AttachmentID() } return nil } diff --git a/internal/federation/dereferencing/attachment.go b/internal/federation/dereferencing/attachment.go deleted file mode 100644 index 30ab6da104..0000000000 --- a/internal/federation/dereferencing/attachment.go +++ /dev/null @@ -1,102 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package dereferencing - -import ( - "context" - "fmt" - "net/url" - - "github.com/sirupsen/logrus" - "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" -) - -func (d *deref) GetRemoteAttachment(ctx context.Context, requestingUsername string, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) { - if minAttachment.RemoteURL == "" { - return nil, fmt.Errorf("GetRemoteAttachment: minAttachment remote URL was empty") - } - remoteAttachmentURL := minAttachment.RemoteURL - - l := logrus.WithFields(logrus.Fields{ - "username": requestingUsername, - "remoteAttachmentURL": remoteAttachmentURL, - }) - - // return early if we already have the attachment somewhere - maybeAttachment := >smodel.MediaAttachment{} - where := []db.Where{ - { - Key: "remote_url", - Value: remoteAttachmentURL, - }, - } - - if err := d.db.GetWhere(ctx, where, maybeAttachment); err == nil { - // we already the attachment in the database - l.Debugf("GetRemoteAttachment: attachment already exists with id %s", maybeAttachment.ID) - return maybeAttachment, nil - } - - a, err := d.RefreshAttachment(ctx, requestingUsername, minAttachment) - if err != nil { - return nil, fmt.Errorf("GetRemoteAttachment: error refreshing attachment: %s", err) - } - - if err := d.db.Put(ctx, a); err != nil { - if err != db.ErrAlreadyExists { - return nil, fmt.Errorf("GetRemoteAttachment: error inserting attachment: %s", err) - } - } - - return a, nil -} - -func (d *deref) RefreshAttachment(ctx context.Context, requestingUsername string, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) { - // it just doesn't exist or we have to refresh - if minAttachment.AccountID == "" { - return nil, fmt.Errorf("RefreshAttachment: minAttachment account ID was empty") - } - - if minAttachment.File.ContentType == "" { - return nil, fmt.Errorf("RefreshAttachment: minAttachment.file.contentType was empty") - } - - t, err := d.transportController.NewTransportForUsername(ctx, requestingUsername) - if err != nil { - return nil, fmt.Errorf("RefreshAttachment: error creating transport: %s", err) - } - - derefURI, err := url.Parse(minAttachment.RemoteURL) - if err != nil { - return nil, err - } - - attachmentBytes, err := t.DereferenceMedia(ctx, derefURI, minAttachment.File.ContentType) - if err != nil { - return nil, fmt.Errorf("RefreshAttachment: error dereferencing media: %s", err) - } - - a, err := d.mediaManager.ProcessAttachment(ctx, attachmentBytes, minAttachment) - if err != nil { - return nil, fmt.Errorf("RefreshAttachment: error processing attachment: %s", err) - } - - return a, nil -} diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index 4f977b8c85..d4786f62d4 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -41,34 +41,7 @@ type Dereferencer interface { GetRemoteInstance(ctx context.Context, username string, remoteInstanceURI *url.URL) (*gtsmodel.Instance, error) - // GetRemoteAttachment takes a minimal attachment struct and converts it into a fully fleshed out attachment, stored in the database and instance storage. - // - // The parameter minAttachment must have at least the following fields defined: - // * minAttachment.RemoteURL - // * minAttachment.AccountID - // * minAttachment.File.ContentType - // - // The returned attachment will have an ID generated for it, so no need to generate one beforehand. - // A blurhash will also be generated for the attachment. - // - // Most other fields will be preserved on the passed attachment, including: - // * minAttachment.StatusID - // * minAttachment.CreatedAt - // * minAttachment.UpdatedAt - // * minAttachment.FileMeta - // * minAttachment.AccountID - // * minAttachment.Description - // * minAttachment.ScheduledStatusID - // * minAttachment.Thumbnail.RemoteURL - // * minAttachment.Avatar - // * minAttachment.Header - // - // GetRemoteAttachment will return early if an attachment with the same value as minAttachment.RemoteURL - // is found in the database -- then that attachment will be returned and nothing else will be changed or stored. - GetRemoteAttachment(ctx context.Context, requestingUsername string, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) - // RefreshAttachment is like GetRemoteAttachment, but the attachment will always be dereferenced again, - // whether or not it was already stored in the database. - RefreshAttachment(ctx context.Context, requestingUsername string, minAttachment *gtsmodel.MediaAttachment) (*gtsmodel.MediaAttachment, error) + GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string) (*media.Media, error) DereferenceAnnounce(ctx context.Context, announce *gtsmodel.Status, requestingUsername string) error DereferenceThread(ctx context.Context, username string, statusIRI *url.URL) error diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go new file mode 100644 index 0000000000..4d62fe0a68 --- /dev/null +++ b/internal/federation/dereferencing/media.go @@ -0,0 +1,55 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package dereferencing + +import ( + "context" + "fmt" + "net/url" + + "github.com/superseriousbusiness/gotosocial/internal/media" +) + +func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string) (*media.Media, error) { + if accountID == "" { + return nil, fmt.Errorf("RefreshAttachment: minAttachment account ID was empty") + } + + t, err := d.transportController.NewTransportForUsername(ctx, requestingUsername) + if err != nil { + return nil, fmt.Errorf("RefreshAttachment: error creating transport: %s", err) + } + + derefURI, err := url.Parse(remoteURL) + if err != nil { + return nil, err + } + + data, err := t.DereferenceMedia(ctx, derefURI) + if err != nil { + return nil, fmt.Errorf("RefreshAttachment: error dereferencing media: %s", err) + } + + m, err := d.mediaManager.ProcessMedia(ctx, data, accountID, remoteURL) + if err != nil { + return nil, fmt.Errorf("RefreshAttachment: error processing attachment: %s", err) + } + + return m, nil +} diff --git a/internal/federation/dereferencing/attachment_test.go b/internal/federation/dereferencing/media_test.go similarity index 91% rename from internal/federation/dereferencing/attachment_test.go rename to internal/federation/dereferencing/media_test.go index d07cf1c6a9..cc158c9a93 100644 --- a/internal/federation/dereferencing/attachment_test.go +++ b/internal/federation/dereferencing/media_test.go @@ -31,6 +31,8 @@ type AttachmentTestSuite struct { } func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { + ctx := context.Background() + fetchingAccount := suite.testAccounts["local_account_1"] attachmentOwner := "01FENS9F666SEQ6TYQWEEY78GM" @@ -39,18 +41,12 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { attachmentURL := "https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg" attachmentDescription := "It's a cute plushie." - minAttachment := >smodel.MediaAttachment{ - RemoteURL: attachmentURL, - AccountID: attachmentOwner, - StatusID: attachmentStatus, - File: gtsmodel.File{ - ContentType: attachmentContentType, - }, - Description: attachmentDescription, - } - - attachment, err := suite.dereferencer.GetRemoteAttachment(context.Background(), fetchingAccount.Username, minAttachment) + media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL) suite.NoError(err) + + attachment, err := media.LoadAttachment(ctx) + suite.NoError(err) + suite.NotNil(attachment) suite.Equal(attachmentOwner, attachment.AccountID) diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index d7de5936a1..e184b585fc 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -393,9 +393,15 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. a.AccountID = status.AccountID a.StatusID = status.ID - attachment, err := d.GetRemoteAttachment(ctx, requestingUsername, a) + media, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL) if err != nil { - logrus.Errorf("populateStatusAttachments: couldn't get remote attachment %s: %s", a.RemoteURL, err) + logrus.Errorf("populateStatusAttachments: couldn't get remote media %s: %s", a.RemoteURL, err) + continue + } + + attachment, err := media.LoadAttachment(ctx) + if err != nil { + logrus.Errorf("populateStatusAttachments: couldn't load remote attachment %s: %s", a.RemoteURL, err) continue } diff --git a/internal/media/manager.go b/internal/media/manager.go index 8032ab42d9..9ca4501417 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -37,7 +37,17 @@ import ( // Manager provides an interface for managing media: parsing, storing, and retrieving media objects like photos, videos, and gifs. type Manager interface { - ProcessMedia(ctx context.Context, data []byte, accountID string) (*Media, error) + // ProcessMedia begins the process of decoding and storing the given data as a piece of media (aka an attachment). + // It will return a pointer to a Media struct upon which further actions can be performed, such as getting + // the finished media, thumbnail, decoded bytes, attachment, and setting additional fields. + // + // accountID should be the account that the media belongs to. + // + // RemoteURL is optional, and can be an empty string. Setting this to a non-empty string indicates that + // the piece of media originated on a remote instance and has been dereferenced to be cached locally. + ProcessMedia(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) + + ProcessEmoji(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) } type manager struct { @@ -70,7 +80,7 @@ func New(database db.DB, storage *kv.KVStore) (Manager, error) { INTERFACE FUNCTIONS */ -func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string) (*Media, error) { +func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) { contentType, err := parseContentType(data) if err != nil { return nil, err @@ -85,7 +95,7 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin switch mainType { case mimeImage: - media, err := m.preProcessImage(ctx, data, contentType, accountID) + media, err := m.preProcessImage(ctx, data, contentType, accountID, remoteURL) if err != nil { return nil, err } @@ -97,7 +107,7 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin return default: // start preloading the media for the caller's convenience - media.PreLoad(innerCtx) + media.preLoad(innerCtx) } }) @@ -107,8 +117,12 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin } } +func (m *manager) ProcessEmoji(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) { + return nil, nil +} + // preProcessImage initializes processing -func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string) (*Media, error) { +func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string, remoteURL string) (*Media, error) { if !supportedImage(contentType) { return nil, fmt.Errorf("image type %s not supported", contentType) } @@ -128,6 +142,7 @@ func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType ID: id, UpdatedAt: time.Now(), URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), + RemoteURL: remoteURL, Type: gtsmodel.FileTypeImage, AccountID: accountID, Processing: 0, diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go new file mode 100644 index 0000000000..45428fbba5 --- /dev/null +++ b/internal/media/manager_test.go @@ -0,0 +1,4 @@ +package media_test + + + diff --git a/internal/media/media.go b/internal/media/media.go index 022de063e5..e19997391d 100644 --- a/internal/media/media.go +++ b/internal/media/media.go @@ -1,9 +1,28 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + package media import ( "context" "fmt" "sync" + "time" "codeberg.org/gruf/go-store/kv" "github.com/superseriousbusiness/gotosocial/internal/db" @@ -26,7 +45,8 @@ type Media struct { attachment will be updated incrementally as media goes through processing */ - attachment *gtsmodel.MediaAttachment + attachment *gtsmodel.MediaAttachment // will only be set if the media is an attachment + emoji *gtsmodel.Emoji // will only be set if the media is an emoji rawData []byte /* @@ -86,17 +106,10 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { m.attachment.Thumbnail.FileSize = thumb.size // put or update the attachment in the database - if err := m.database.Put(ctx, m.attachment); err != nil { - if err != db.ErrAlreadyExists { - m.err = fmt.Errorf("error putting attachment: %s", err) - m.thumbstate = errored - return nil, m.err - } - if err := m.database.UpdateByPrimaryKey(ctx, m.attachment); err != nil { - m.err = fmt.Errorf("error updating attachment: %s", err) - m.thumbstate = errored - return nil, m.err - } + if err := putOrUpdateAttachment(ctx, m.database, m.attachment); err != nil { + m.err = err + m.thumbstate = errored + return nil, err } // set the thumbnail of this media @@ -148,6 +161,30 @@ func (m *Media) FullSize(ctx context.Context) (*ImageMeta, error) { return nil, err } + // put the full size in storage + if err := m.storage.Put(m.attachment.File.Path, decoded.image); err != nil { + m.err = fmt.Errorf("error storing full size image: %s", err) + m.fullSizeState = errored + return nil, m.err + } + + // set appropriate fields on the attachment based on the image we derived + m.attachment.FileMeta.Original = gtsmodel.Original{ + Width: decoded.width, + Height: decoded.height, + Size: decoded.size, + Aspect: decoded.aspect, + } + m.attachment.File.FileSize = decoded.size + m.attachment.File.UpdatedAt = time.Now() + + // put or update the attachment in the database + if err := putOrUpdateAttachment(ctx, m.database, m.attachment); err != nil { + m.err = err + m.fullSizeState = errored + return nil, err + } + // set the fullsize of this media m.fullSize = decoded @@ -163,17 +200,46 @@ func (m *Media) FullSize(ctx context.Context) (*ImageMeta, error) { return nil, fmt.Errorf("full size processing status %d unknown", m.fullSizeState) } -// PreLoad begins the process of deriving the thumbnail and encoding the full-size image. +func (m *Media) SetAsAvatar(ctx context.Context) error { + m.mu.Lock() + defer m.mu.Unlock() + + m.attachment.Avatar = true + return putOrUpdateAttachment(ctx, m.database, m.attachment) +} + +func (m *Media) SetAsHeader(ctx context.Context) error { + m.mu.Lock() + defer m.mu.Unlock() + + m.attachment.Header = true + return putOrUpdateAttachment(ctx, m.database, m.attachment) +} + +func (m *Media) SetStatusID(ctx context.Context, statusID string) error { + m.mu.Lock() + defer m.mu.Unlock() + + m.attachment.StatusID = statusID + return putOrUpdateAttachment(ctx, m.database, m.attachment) +} + +// AttachmentID returns the ID of the underlying media attachment without blocking processing. +func (m *Media) AttachmentID() string { + return m.attachment.ID +} + +// preLoad begins the process of deriving the thumbnail and encoding the full-size image. // It does this in a non-blocking way, so you can call it and then come back later and check // if it's finished. -func (m *Media) PreLoad(ctx context.Context) { +func (m *Media) preLoad(ctx context.Context) { go m.Thumb(ctx) go m.FullSize(ctx) } // Load is the blocking equivalent of pre-load. It makes sure the thumbnail and full-size image // have been processed, then it returns the full-size image. -func (m *Media) Load(ctx context.Context) (*gtsmodel.MediaAttachment, error) { +func (m *Media) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAttachment, error) { if _, err := m.Thumb(ctx); err != nil { return nil, err } @@ -184,3 +250,20 @@ func (m *Media) Load(ctx context.Context) (*gtsmodel.MediaAttachment, error) { return m.attachment, nil } + +func (m *Media) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { + return nil, nil +} + +func putOrUpdateAttachment(ctx context.Context, database db.DB, attachment *gtsmodel.MediaAttachment) error { + if err := database.Put(ctx, attachment); err != nil { + if err != db.ErrAlreadyExists { + return fmt.Errorf("putOrUpdateAttachment: proper error while putting attachment: %s", err) + } + if err := database.UpdateByPrimaryKey(ctx, attachment); err != nil { + return fmt.Errorf("putOrUpdateAttachment: error while updating attachment: %s", err) + } + } + + return nil +} diff --git a/internal/media/media_test.go b/internal/media/media_test.go new file mode 100644 index 0000000000..7e820c9ea7 --- /dev/null +++ b/internal/media/media_test.go @@ -0,0 +1,65 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package media_test + +import ( + "testing" + + "codeberg.org/gruf/go-store/kv" + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/media" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type MediaStandardTestSuite struct { + suite.Suite + + db db.DB + storage *kv.KVStore + manager media.Manager +} + +func (suite *MediaStandardTestSuite) SetupSuite() { + testrig.InitTestLog() + testrig.InitTestConfig() + + suite.db = testrig.NewTestDB() + suite.storage = testrig.NewTestStorage() +} + +func (suite *MediaStandardTestSuite) SetupTest() { + testrig.StandardStorageSetup(suite.storage, "../../testrig/media") + testrig.StandardDBSetup(suite.db, nil) + + m, err := media.New(suite.db, suite.storage) + if err != nil { + panic(err) + } + suite.manager = m +} + +func (suite *MediaStandardTestSuite) TearDownTest() { + testrig.StandardDBTeardown(suite.db) + testrig.StandardStorageTeardown(suite.storage) +} + +func TestMediaStandardTestSuite(t *testing.T) { + suite.Run(t, &MediaStandardTestSuite{}) +} diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 8de6c83f06..6e74a0ccd9 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -33,7 +33,6 @@ import ( apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/messages" "github.com/superseriousbusiness/gotosocial/internal/text" "github.com/superseriousbusiness/gotosocial/internal/util" @@ -140,31 +139,40 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead var err error maxImageSize := viper.GetInt(config.Keys.MediaImageMaxSize) if int(avatar.Size) > maxImageSize { - err = fmt.Errorf("avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) + err = fmt.Errorf("UpdateAvatar: avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) return nil, err } f, err := avatar.Open() if err != nil { - return nil, fmt.Errorf("could not read provided avatar: %s", err) + return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) } // extract the bytes buf := new(bytes.Buffer) size, err := io.Copy(buf, f) if err != nil { - return nil, fmt.Errorf("could not read provided avatar: %s", err) + return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) } if size == 0 { - return nil, errors.New("could not read provided avatar: size 0 bytes") + return nil, errors.New("UpdateAvatar: could not read provided avatar: size 0 bytes") + } + + // we're done with the FileHeader now + if err := f.Close(); err != nil { + return nil, fmt.Errorf("UpdateAvatar: error closing multipart fileheader: %s", err) } // do the setting - avatarInfo, err := p.mediaManager.ProcessHeaderOrAvatar(ctx, buf.Bytes(), accountID, media.TypeAvatar, "") + media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, "") if err != nil { - return nil, fmt.Errorf("error processing avatar: %s", err) + return nil, fmt.Errorf("UpdateAvatar: error processing avatar: %s", err) + } + + if err := media.SetAsAvatar(ctx); err != nil { + return nil, fmt.Errorf("UpdateAvatar: error setting media as avatar: %s", err) } - return avatarInfo, f.Close() + return media.LoadAttachment(ctx) } // UpdateHeader does the dirty work of checking the header part of an account update form, @@ -174,31 +182,40 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead var err error maxImageSize := viper.GetInt(config.Keys.MediaImageMaxSize) if int(header.Size) > maxImageSize { - err = fmt.Errorf("header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) + err = fmt.Errorf("UpdateHeader: header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) return nil, err } f, err := header.Open() if err != nil { - return nil, fmt.Errorf("could not read provided header: %s", err) + return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) } // extract the bytes buf := new(bytes.Buffer) size, err := io.Copy(buf, f) if err != nil { - return nil, fmt.Errorf("could not read provided header: %s", err) + return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) } if size == 0 { - return nil, errors.New("could not read provided header: size 0 bytes") + return nil, errors.New("UpdateHeader: could not read provided header: size 0 bytes") + } + + // we're done with the FileHeader now + if err := f.Close(); err != nil { + return nil, fmt.Errorf("UpdateHeader: error closing multipart fileheader: %s", err) } // do the setting - headerInfo, err := p.mediaManager.ProcessHeaderOrAvatar(ctx, buf.Bytes(), accountID, media.TypeHeader, "") + media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, "") if err != nil { - return nil, fmt.Errorf("error processing header: %s", err) + return nil, fmt.Errorf("UpdateHeader: error processing header: %s", err) + } + + if err := media.SetAsHeader(ctx); err != nil { + return nil, fmt.Errorf("UpdateHeader: error setting media as header: %s", err) } - return headerInfo, f.Close() + return media.LoadAttachment(ctx) } func (p *processor) processNote(ctx context.Context, note string, accountID string) (string, error) { diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 5620374b8e..6fb2ca8c52 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -27,7 +27,6 @@ import ( apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" ) func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) { @@ -49,26 +48,20 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return nil, errors.New("could not read provided emoji: size 0 bytes") } - // allow the mediaManager to work its magic of processing the emoji bytes, and putting them in whatever storage backend we're using - emoji, err := p.mediaManager.ProcessLocalEmoji(ctx, buf.Bytes(), form.Shortcode) + media, err := p.mediaManager.ProcessEmoji(ctx, buf.Bytes(), account.ID, "") if err != nil { - return nil, fmt.Errorf("error reading emoji: %s", err) + return nil, err } - emojiID, err := id.NewULID() + emoji, err := media.LoadEmoji(ctx) if err != nil { return nil, err } - emoji.ID = emojiID apiEmoji, err := p.tc.EmojiToAPIEmoji(ctx, emoji) if err != nil { return nil, fmt.Errorf("error converting emoji to apitype: %s", err) } - if err := p.db.Put(ctx, emoji); err != nil { - return nil, fmt.Errorf("database error while processing emoji: %s", err) - } - return &apiEmoji, nil } diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index 357278e640..d1840196a1 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -44,13 +44,13 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form return nil, errors.New("could not read provided attachment: size 0 bytes") } - // process the media and load it immediately - media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), account.ID) + // process the media attachment and load it immediately + media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), account.ID, "") if err != nil { return nil, err } - attachment, err := media.Load(ctx) + attachment, err := media.LoadAttachment(ctx) if err != nil { return nil, err } @@ -62,10 +62,5 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form return nil, fmt.Errorf("error parsing media attachment to frontend type: %s", err) } - // now we can confidently put the attachment in the database - if err := p.db.Put(ctx, attachment); err != nil { - return nil, fmt.Errorf("error storing media attachment in db: %s", err) - } - return &apiAttachment, nil } diff --git a/internal/transport/derefmedia.go b/internal/transport/derefmedia.go index 8a6aa4e24d..3fa4a89e45 100644 --- a/internal/transport/derefmedia.go +++ b/internal/transport/derefmedia.go @@ -28,18 +28,15 @@ import ( "github.com/sirupsen/logrus" ) -func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL, expectedContentType string) ([]byte, error) { +func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) ([]byte, error) { l := logrus.WithField("func", "DereferenceMedia") l.Debugf("performing GET to %s", iri.String()) req, err := http.NewRequestWithContext(ctx, "GET", iri.String(), nil) if err != nil { return nil, err } - if expectedContentType == "" { - req.Header.Add("Accept", "*/*") - } else { - req.Header.Add("Accept", expectedContentType) - } + + req.Header.Add("Accept", "*/*") // we don't know what kind of media we're going to get here req.Header.Add("Date", t.clock.Now().UTC().Format("Mon, 02 Jan 2006 15:04:05")+" GMT") req.Header.Add("User-Agent", fmt.Sprintf("%s %s", t.appAgent, t.gofedAgent)) req.Header.Set("Host", iri.Host) diff --git a/internal/transport/transport.go b/internal/transport/transport.go index 73b0158650..b470b289a1 100644 --- a/internal/transport/transport.go +++ b/internal/transport/transport.go @@ -34,7 +34,7 @@ import ( type Transport interface { pub.Transport // DereferenceMedia fetches the bytes of the given media attachment IRI, with the expectedContentType. - DereferenceMedia(ctx context.Context, iri *url.URL, expectedContentType string) ([]byte, error) + DereferenceMedia(ctx context.Context, iri *url.URL) ([]byte, error) // DereferenceInstance dereferences remote instance information, first by checking /api/v1/instance, and then by checking /.well-known/nodeinfo. DereferenceInstance(ctx context.Context, iri *url.URL) (*gtsmodel.Instance, error) // Finger performs a webfinger request with the given username and domain, and returns the bytes from the response body. diff --git a/testrig/mediahandler.go b/testrig/mediahandler.go index ba21486553..046ddc5be2 100644 --- a/testrig/mediahandler.go +++ b/testrig/mediahandler.go @@ -26,5 +26,9 @@ import ( // NewTestMediaManager returns a media handler with the default test config, and the given db and storage. func NewTestMediaManager(db db.DB, storage *kv.KVStore) media.Manager { - return media.New(db, storage) + m, err := media.New(db, storage) + if err != nil { + panic(err) + } + return m } From dccf21dd87638320a687a0556c973cced541c945 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 9 Jan 2022 18:41:22 +0100 Subject: [PATCH 09/43] tests are passing, but there's still much to be done --- cmd/gotosocial/action/server/server.go | 5 +- internal/ap/extract.go | 18 ++--- internal/ap/extractattachments_test.go | 2 +- internal/ap/interfaces.go | 8 +- internal/federation/dereferencing/account.go | 25 +++--- .../federation/dereferencing/dereferencer.go | 2 +- internal/federation/dereferencing/media.go | 4 +- .../federation/dereferencing/media_test.go | 17 ++-- internal/federation/dereferencing/status.go | 9 ++- internal/media/image.go | 32 +++++--- internal/media/manager.go | 80 ++++++++++++++++--- internal/media/manager_test.go | 50 ++++++++++++ internal/media/media.go | 51 +++++------- internal/media/media_test.go | 65 --------------- internal/media/types.go | 26 ++++++ internal/processing/account/update.go | 23 +++--- internal/processing/admin/emoji.go | 2 +- internal/processing/media/create.go | 12 ++- 18 files changed, 260 insertions(+), 171 deletions(-) delete mode 100644 internal/media/media_test.go diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index 05c2e89748..8a227edb74 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -105,7 +105,10 @@ var Start action.GTSAction = func(ctx context.Context) error { } // build backend handlers - mediaManager := media.New(dbService, storage) + mediaManager, err := media.New(dbService, storage) + if err != nil { + return fmt.Errorf("error creating media manager: %s", err) + } oauthServer := oauth.New(ctx, dbService) transportController := transport.NewController(dbService, &federation.Clock{}, http.DefaultClient) federator := federation.NewFederator(dbService, federatingDB, transportController, typeConverter, mediaManager) diff --git a/internal/ap/extract.go b/internal/ap/extract.go index ed61faf1e6..49dac71867 100644 --- a/internal/ap/extract.go +++ b/internal/ap/extract.go @@ -395,20 +395,20 @@ func ExtractAttachment(i Attachmentable) (*gtsmodel.MediaAttachment, error) { attachment.Description = name } + attachment.Blurhash = ExtractBlurhash(i) + attachment.Processing = gtsmodel.ProcessingStatusReceived return attachment, nil } -// func extractBlurhash(i withBlurhash) (string, error) { -// if i.GetTootBlurhashProperty() == nil { -// return "", errors.New("blurhash property was nil") -// } -// if i.GetTootBlurhashProperty().Get() == "" { -// return "", errors.New("empty blurhash string") -// } -// return i.GetTootBlurhashProperty().Get(), nil -// } +// ExtractBlurhash extracts the blurhash value (if present) from a WithBlurhash interface. +func ExtractBlurhash(i WithBlurhash) string { + if i.GetTootBlurhash() == nil { + return "" + } + return i.GetTootBlurhash().Get() +} // ExtractHashtags returns a slice of tags on the interface. func ExtractHashtags(i WithTag) ([]*gtsmodel.Tag, error) { diff --git a/internal/ap/extractattachments_test.go b/internal/ap/extractattachments_test.go index 3cee98faaa..b937911d29 100644 --- a/internal/ap/extractattachments_test.go +++ b/internal/ap/extractattachments_test.go @@ -42,7 +42,7 @@ func (suite *ExtractAttachmentsTestSuite) TestExtractAttachments() { suite.Equal("image/jpeg", attachment1.File.ContentType) suite.Equal("https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg", attachment1.RemoteURL) suite.Equal("It's a cute plushie.", attachment1.Description) - suite.Empty(attachment1.Blurhash) // atm we discard blurhashes and generate them ourselves during processing + suite.Equal("UxQ0EkRP_4tRxtRjWBt7%hozM_ayV@oLf6WB", attachment1.Blurhash) } func (suite *ExtractAttachmentsTestSuite) TestExtractNoAttachments() { diff --git a/internal/ap/interfaces.go b/internal/ap/interfaces.go index 582465ec3e..6edaa42ba4 100644 --- a/internal/ap/interfaces.go +++ b/internal/ap/interfaces.go @@ -70,6 +70,7 @@ type Attachmentable interface { WithMediaType WithURL WithName + WithBlurhash } // Hashtaggable represents the minimum activitypub interface for representing a 'hashtag' tag. @@ -284,9 +285,10 @@ type WithMediaType interface { GetActivityStreamsMediaType() vocab.ActivityStreamsMediaTypeProperty } -// type withBlurhash interface { -// GetTootBlurhashProperty() vocab.TootBlurhashProperty -// } +// WithBlurhash represents an activity with TootBlurhashProperty +type WithBlurhash interface { + GetTootBlurhash() vocab.TootBlurhashProperty +} // type withFocalPoint interface { // // TODO diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 5912ff29a9..d83fc3bac8 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -32,6 +32,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/ap" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/transport" ) @@ -256,16 +257,16 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - media, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, targetAccount.AvatarRemoteURL) + avatar := true + processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalInfo{ + RemoteURL: &targetAccount.AvatarRemoteURL, + Avatar: &avatar, + }) if err != nil { return err } - if err := media.SetAsAvatar(ctx); err != nil { - return err - } - - targetAccount.AvatarMediaAttachmentID = media.AttachmentID() + targetAccount.AvatarMediaAttachmentID = processingMedia.AttachmentID() } if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { @@ -279,16 +280,16 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - media, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, targetAccount.HeaderRemoteURL) + header := true + processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalInfo{ + RemoteURL: &targetAccount.HeaderRemoteURL, + Header: &header, + }) if err != nil { return err } - if err := media.SetAsHeader(ctx); err != nil { - return err - } - - targetAccount.HeaderMediaAttachmentID = media.AttachmentID() + targetAccount.HeaderMediaAttachmentID = processingMedia.AttachmentID() } return nil } diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index d4786f62d4..787a39739f 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -41,7 +41,7 @@ type Dereferencer interface { GetRemoteInstance(ctx context.Context, username string, remoteInstanceURI *url.URL) (*gtsmodel.Instance, error) - GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string) (*media.Media, error) + GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Media, error) DereferenceAnnounce(ctx context.Context, announce *gtsmodel.Status, requestingUsername string) error DereferenceThread(ctx context.Context, username string, statusIRI *url.URL) error diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go index 4d62fe0a68..0ddab7ae0a 100644 --- a/internal/federation/dereferencing/media.go +++ b/internal/federation/dereferencing/media.go @@ -26,7 +26,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/media" ) -func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string) (*media.Media, error) { +func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Media, error) { if accountID == "" { return nil, fmt.Errorf("RefreshAttachment: minAttachment account ID was empty") } @@ -46,7 +46,7 @@ func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, a return nil, fmt.Errorf("RefreshAttachment: error dereferencing media: %s", err) } - m, err := d.mediaManager.ProcessMedia(ctx, data, accountID, remoteURL) + m, err := d.mediaManager.ProcessMedia(ctx, data, accountID, ai) if err != nil { return nil, fmt.Errorf("RefreshAttachment: error processing attachment: %s", err) } diff --git a/internal/federation/dereferencing/media_test.go b/internal/federation/dereferencing/media_test.go index cc158c9a93..8fb28d1962 100644 --- a/internal/federation/dereferencing/media_test.go +++ b/internal/federation/dereferencing/media_test.go @@ -24,6 +24,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" ) type AttachmentTestSuite struct { @@ -32,7 +33,7 @@ type AttachmentTestSuite struct { func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { ctx := context.Background() - + fetchingAccount := suite.testAccounts["local_account_1"] attachmentOwner := "01FENS9F666SEQ6TYQWEEY78GM" @@ -40,8 +41,14 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { attachmentContentType := "image/jpeg" attachmentURL := "https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg" attachmentDescription := "It's a cute plushie." - - media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL) + attachmentBlurhash := "LwP?p=aK_4%N%MRjWXt7%hozM_a}" + + media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL, &media.AdditionalInfo{ + StatusID: &attachmentStatus, + RemoteURL: &attachmentURL, + Description: &attachmentDescription, + Blurhash: &attachmentBlurhash, + }) suite.NoError(err) attachment, err := media.LoadAttachment(ctx) @@ -61,7 +68,7 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { suite.Equal(2071680, attachment.FileMeta.Original.Size) suite.Equal(1245, attachment.FileMeta.Original.Height) suite.Equal(1664, attachment.FileMeta.Original.Width) - suite.Equal("LwP?p=aK_4%N%MRjWXt7%hozM_a}", attachment.Blurhash) + suite.Equal(attachmentBlurhash, attachment.Blurhash) suite.Equal(gtsmodel.ProcessingStatusProcessed, attachment.Processing) suite.NotEmpty(attachment.File.Path) suite.Equal(attachmentContentType, attachment.File.ContentType) @@ -87,7 +94,7 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { suite.Equal(2071680, dbAttachment.FileMeta.Original.Size) suite.Equal(1245, dbAttachment.FileMeta.Original.Height) suite.Equal(1664, dbAttachment.FileMeta.Original.Width) - suite.Equal("LwP?p=aK_4%N%MRjWXt7%hozM_a}", dbAttachment.Blurhash) + suite.Equal(attachmentBlurhash, dbAttachment.Blurhash) suite.Equal(gtsmodel.ProcessingStatusProcessed, dbAttachment.Processing) suite.NotEmpty(dbAttachment.File.Path) suite.Equal(attachmentContentType, dbAttachment.File.ContentType) diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index e184b585fc..47ce087a2f 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -32,6 +32,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/ap" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/media" ) // EnrichRemoteStatus takes a status that's already been inserted into the database in a minimal form, @@ -393,7 +394,13 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. a.AccountID = status.AccountID a.StatusID = status.ID - media, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL) + media, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL, &media.AdditionalInfo{ + CreatedAt: &a.CreatedAt, + StatusID: &a.StatusID, + RemoteURL: &a.RemoteURL, + Description: &a.Description, + Blurhash: &a.Blurhash, + }) if err != nil { logrus.Errorf("populateStatusAttachments: couldn't get remote media %s: %s", a.RemoteURL, err) continue diff --git a/internal/media/image.go b/internal/media/image.go index acc62a28b9..4c0b28c02f 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -108,7 +108,7 @@ func decodeImage(b []byte, contentType string) (*ImageMeta, error) { // // Note that the aspect ratio of the image will be retained, // so it will not necessarily be a square, even if x and y are set as the same value. -func deriveThumbnail(b []byte, contentType string) (*ImageMeta, error) { +func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageMeta, error) { var i image.Image var err error @@ -138,10 +138,20 @@ func deriveThumbnail(b []byte, contentType string) (*ImageMeta, error) { size := width * height aspect := float64(width) / float64(height) - tiny := resize.Thumbnail(32, 32, thumb, resize.NearestNeighbor) - bh, err := blurhash.Encode(4, 3, tiny) - if err != nil { - return nil, err + im := &ImageMeta{ + width: width, + height: height, + size: size, + aspect: aspect, + } + + if createBlurhash { + tiny := resize.Thumbnail(32, 32, thumb, resize.NearestNeighbor) + bh, err := blurhash.Encode(4, 3, tiny) + if err != nil { + return nil, err + } + im.blurhash = bh } out := &bytes.Buffer{} @@ -150,14 +160,10 @@ func deriveThumbnail(b []byte, contentType string) (*ImageMeta, error) { }); err != nil { return nil, err } - return &ImageMeta{ - image: out.Bytes(), - width: width, - height: height, - size: size, - aspect: aspect, - blurhash: bh, - }, nil + + im.image = out.Bytes() + + return im, nil } // deriveStaticEmojji takes a given gif or png of an emoji, decodes it, and re-encodes it as a static png. diff --git a/internal/media/manager.go b/internal/media/manager.go index 9ca4501417..5e62b39b2a 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -45,9 +45,9 @@ type Manager interface { // // RemoteURL is optional, and can be an empty string. Setting this to a non-empty string indicates that // the piece of media originated on a remote instance and has been dereferenced to be cached locally. - ProcessMedia(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) + ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Media, error) - ProcessEmoji(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) + ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Media, error) } type manager struct { @@ -80,7 +80,7 @@ func New(database db.DB, storage *kv.KVStore) (Manager, error) { INTERFACE FUNCTIONS */ -func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) { +func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Media, error) { contentType, err := parseContentType(data) if err != nil { return nil, err @@ -95,7 +95,7 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin switch mainType { case mimeImage: - media, err := m.preProcessImage(ctx, data, contentType, accountID, remoteURL) + media, err := m.preProcessImage(ctx, data, contentType, accountID, ai) if err != nil { return nil, err } @@ -117,12 +117,12 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin } } -func (m *manager) ProcessEmoji(ctx context.Context, data []byte, accountID string, remoteURL string) (*Media, error) { +func (m *manager) ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Media, error) { return nil, nil } // preProcessImage initializes processing -func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string, remoteURL string) (*Media, error) { +func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string, ai *AdditionalInfo) (*Media, error) { if !supportedImage(contentType) { return nil, fmt.Errorf("image type %s not supported", contentType) } @@ -139,13 +139,24 @@ func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType extension := strings.Split(contentType, "/")[1] attachment := >smodel.MediaAttachment{ - ID: id, - UpdatedAt: time.Now(), - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), - RemoteURL: remoteURL, - Type: gtsmodel.FileTypeImage, - AccountID: accountID, - Processing: 0, + ID: id, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + StatusID: "", + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), + RemoteURL: "", + Type: gtsmodel.FileTypeImage, + FileMeta: gtsmodel.FileMeta{ + Focus: gtsmodel.Focus{ + X: 0, + Y: 0, + }, + }, + AccountID: accountID, + Description: "", + ScheduledStatusID: "", + Blurhash: "", + Processing: 0, File: gtsmodel.File{ Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), ContentType: contentType, @@ -161,6 +172,49 @@ func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType Header: false, } + // check if we have additional info to add to the attachment + if ai != nil { + if ai.CreatedAt != nil { + attachment.CreatedAt = *ai.CreatedAt + } + + if ai.StatusID != nil { + attachment.StatusID = *ai.StatusID + } + + if ai.RemoteURL != nil { + attachment.RemoteURL = *ai.RemoteURL + } + + if ai.Description != nil { + attachment.Description = *ai.Description + } + + if ai.ScheduledStatusID != nil { + attachment.ScheduledStatusID = *ai.ScheduledStatusID + } + + if ai.Blurhash != nil { + attachment.Blurhash = *ai.Blurhash + } + + if ai.Avatar != nil { + attachment.Avatar = *ai.Avatar + } + + if ai.Header != nil { + attachment.Header = *ai.Header + } + + if ai.FocusX != nil { + attachment.FileMeta.Focus.X = *ai.FocusX + } + + if ai.FocusY != nil { + attachment.FileMeta.Focus.Y = *ai.FocusY + } + } + media := &Media{ attachment: attachment, rawData: data, diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 45428fbba5..aad7f46d06 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -1,4 +1,54 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + package media_test +import ( + "codeberg.org/gruf/go-store/kv" + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/media" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type MediaManagerStandardTestSuite struct { + suite.Suite + + db db.DB + storage *kv.KVStore + manager media.Manager +} + +func (suite *MediaManagerStandardTestSuite) SetupSuite() { + testrig.InitTestLog() + testrig.InitTestConfig() + + suite.db = testrig.NewTestDB() + suite.storage = testrig.NewTestStorage() +} +func (suite *MediaManagerStandardTestSuite) SetupTest() { + testrig.StandardStorageSetup(suite.storage, "../../testrig/media") + testrig.StandardDBSetup(suite.db, nil) + suite.manager = testrig.NewTestMediaManager(suite.db, suite.storage) +} +func (suite *MediaManagerStandardTestSuite) TearDownTest() { + testrig.StandardDBTeardown(suite.db) + testrig.StandardStorageTeardown(suite.storage) +} diff --git a/internal/media/media.go b/internal/media/media.go index e19997391d..e0cfe09b7b 100644 --- a/internal/media/media.go +++ b/internal/media/media.go @@ -47,7 +47,8 @@ type Media struct { attachment *gtsmodel.MediaAttachment // will only be set if the media is an attachment emoji *gtsmodel.Emoji // will only be set if the media is an emoji - rawData []byte + + rawData []byte /* below fields represent the processing state of the media thumbnail @@ -81,7 +82,15 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { switch m.thumbstate { case received: // we haven't processed a thumbnail for this media yet so do it now - thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType) + + // check if we need to create a blurhash or if there's already one set + var createBlurhash bool + if m.attachment.Blurhash == "" { + // no blurhash created yet + createBlurhash = true + } + + thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType, createBlurhash) if err != nil { m.err = fmt.Errorf("error deriving thumbnail: %s", err) m.thumbstate = errored @@ -96,7 +105,10 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { } // set appropriate fields on the attachment based on the thumbnail we derived - m.attachment.Blurhash = thumb.blurhash + if createBlurhash { + m.attachment.Blurhash = thumb.blurhash + } + m.attachment.FileMeta.Small = gtsmodel.Small{ Width: thumb.width, Height: thumb.height, @@ -105,7 +117,6 @@ func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { } m.attachment.Thumbnail.FileSize = thumb.size - // put or update the attachment in the database if err := putOrUpdateAttachment(ctx, m.database, m.attachment); err != nil { m.err = err m.thumbstate = errored @@ -177,8 +188,8 @@ func (m *Media) FullSize(ctx context.Context) (*ImageMeta, error) { } m.attachment.File.FileSize = decoded.size m.attachment.File.UpdatedAt = time.Now() + m.attachment.Processing = gtsmodel.ProcessingStatusProcessed - // put or update the attachment in the database if err := putOrUpdateAttachment(ctx, m.database, m.attachment); err != nil { m.err = err m.fullSizeState = errored @@ -200,30 +211,6 @@ func (m *Media) FullSize(ctx context.Context) (*ImageMeta, error) { return nil, fmt.Errorf("full size processing status %d unknown", m.fullSizeState) } -func (m *Media) SetAsAvatar(ctx context.Context) error { - m.mu.Lock() - defer m.mu.Unlock() - - m.attachment.Avatar = true - return putOrUpdateAttachment(ctx, m.database, m.attachment) -} - -func (m *Media) SetAsHeader(ctx context.Context) error { - m.mu.Lock() - defer m.mu.Unlock() - - m.attachment.Header = true - return putOrUpdateAttachment(ctx, m.database, m.attachment) -} - -func (m *Media) SetStatusID(ctx context.Context, statusID string) error { - m.mu.Lock() - defer m.mu.Unlock() - - m.attachment.StatusID = statusID - return putOrUpdateAttachment(ctx, m.database, m.attachment) -} - // AttachmentID returns the ID of the underlying media attachment without blocking processing. func (m *Media) AttachmentID() string { return m.attachment.ID @@ -237,8 +224,8 @@ func (m *Media) preLoad(ctx context.Context) { go m.FullSize(ctx) } -// Load is the blocking equivalent of pre-load. It makes sure the thumbnail and full-size image -// have been processed, then it returns the full-size image. +// Load is the blocking equivalent of pre-load. It makes sure the thumbnail and full-size +// image have been processed, then it returns the completed attachment. func (m *Media) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAttachment, error) { if _, err := m.Thumb(ctx); err != nil { return nil, err @@ -255,6 +242,8 @@ func (m *Media) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { return nil, nil } +// putOrUpdateAttachment is just a convenience function for first trying to PUT the attachment in the database, +// and then if that doesn't work because the attachment already exists, updating it instead. func putOrUpdateAttachment(ctx context.Context, database db.DB, attachment *gtsmodel.MediaAttachment) error { if err := database.Put(ctx, attachment); err != nil { if err != db.ErrAlreadyExists { diff --git a/internal/media/media_test.go b/internal/media/media_test.go deleted file mode 100644 index 7e820c9ea7..0000000000 --- a/internal/media/media_test.go +++ /dev/null @@ -1,65 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package media_test - -import ( - "testing" - - "codeberg.org/gruf/go-store/kv" - "github.com/stretchr/testify/suite" - "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/media" - "github.com/superseriousbusiness/gotosocial/testrig" -) - -type MediaStandardTestSuite struct { - suite.Suite - - db db.DB - storage *kv.KVStore - manager media.Manager -} - -func (suite *MediaStandardTestSuite) SetupSuite() { - testrig.InitTestLog() - testrig.InitTestConfig() - - suite.db = testrig.NewTestDB() - suite.storage = testrig.NewTestStorage() -} - -func (suite *MediaStandardTestSuite) SetupTest() { - testrig.StandardStorageSetup(suite.storage, "../../testrig/media") - testrig.StandardDBSetup(suite.db, nil) - - m, err := media.New(suite.db, suite.storage) - if err != nil { - panic(err) - } - suite.manager = m -} - -func (suite *MediaStandardTestSuite) TearDownTest() { - testrig.StandardDBTeardown(suite.db) - testrig.StandardStorageTeardown(suite.storage) -} - -func TestMediaStandardTestSuite(t *testing.T) { - suite.Run(t, &MediaStandardTestSuite{}) -} diff --git a/internal/media/types.go b/internal/media/types.go index d40f402d29..aaf423682e 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -22,6 +22,7 @@ import ( "bytes" "errors" "fmt" + "time" "github.com/h2non/filetype" ) @@ -67,6 +68,31 @@ const ( TypeEmoji Type = "emoji" // TypeEmoji is the key for emoji type requests ) +// AdditionalInfo represents additional information that should be added to an attachment +// when processing a piece of media. +type AdditionalInfo struct { + // Time that this media was created; defaults to time.Now(). + CreatedAt *time.Time + // ID of the status to which this media is attached; defaults to "". + StatusID *string + // URL of the media on a remote instance; defaults to "". + RemoteURL *string + // Image description of this media; defaults to "". + Description *string + // Blurhash of this media; defaults to "". + Blurhash *string + // ID of the scheduled status to which this media is attached; defaults to "". + ScheduledStatusID *string + // Mark this media as in-use as an avatar; defaults to false. + Avatar *bool + // Mark this media as in-use as a header; defaults to false. + Header *bool + // X focus coordinate for this media; defaults to 0. + FocusX *float32 + // Y focus coordinate for this media; defaults to 0. + FocusY *float32 +} + // parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). // Returns an error if the content type is not something we can process. func parseContentType(content []byte) (string, error) { diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 6e74a0ccd9..e0dd493e13 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -33,6 +33,7 @@ import ( apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/messages" "github.com/superseriousbusiness/gotosocial/internal/text" "github.com/superseriousbusiness/gotosocial/internal/util" @@ -163,16 +164,15 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead } // do the setting - media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, "") + isAvatar := true + processingMedia, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, &media.AdditionalInfo{ + Avatar: &isAvatar, + }) if err != nil { return nil, fmt.Errorf("UpdateAvatar: error processing avatar: %s", err) } - if err := media.SetAsAvatar(ctx); err != nil { - return nil, fmt.Errorf("UpdateAvatar: error setting media as avatar: %s", err) - } - - return media.LoadAttachment(ctx) + return processingMedia.LoadAttachment(ctx) } // UpdateHeader does the dirty work of checking the header part of an account update form, @@ -206,16 +206,15 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead } // do the setting - media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, "") + isHeader := true + processingMedia, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, &media.AdditionalInfo{ + Header: &isHeader, + }) if err != nil { return nil, fmt.Errorf("UpdateHeader: error processing header: %s", err) } - if err := media.SetAsHeader(ctx); err != nil { - return nil, fmt.Errorf("UpdateHeader: error setting media as header: %s", err) - } - - return media.LoadAttachment(ctx) + return processingMedia.LoadAttachment(ctx) } func (p *processor) processNote(ctx context.Context, note string, accountID string) (string, error) { diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 6fb2ca8c52..737a4ebe2a 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -48,7 +48,7 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return nil, errors.New("could not read provided emoji: size 0 bytes") } - media, err := p.mediaManager.ProcessEmoji(ctx, buf.Bytes(), account.ID, "") + media, err := p.mediaManager.ProcessEmoji(ctx, buf.Bytes(), account.ID) if err != nil { return nil, err } diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index d1840196a1..093a3d2beb 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -27,6 +27,7 @@ import ( apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" ) func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form *apimodel.AttachmentRequest) (*apimodel.Attachment, error) { @@ -44,8 +45,17 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form return nil, errors.New("could not read provided attachment: size 0 bytes") } + focusX, focusY, err := parseFocus(form.Focus) + if err != nil { + return nil, fmt.Errorf("could not parse focus value %s: %s", form.Focus, err) + } + // process the media attachment and load it immediately - media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), account.ID, "") + media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), account.ID, &media.AdditionalInfo{ + Description: &form.Description, + FocusX: &focusX, + FocusY: &focusY, + }) if err != nil { return nil, err } From 0ef478584cd695c9c4899354119e396cc7535c04 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 9 Jan 2022 18:52:28 +0100 Subject: [PATCH 10/43] add async test --- .../federation/dereferencing/media_test.go | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/internal/federation/dereferencing/media_test.go b/internal/federation/dereferencing/media_test.go index 8fb28d1962..1f076f62c2 100644 --- a/internal/federation/dereferencing/media_test.go +++ b/internal/federation/dereferencing/media_test.go @@ -21,6 +21,7 @@ package dereferencing_test import ( "context" "testing" + "time" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" @@ -31,7 +32,7 @@ type AttachmentTestSuite struct { DereferencerStandardTestSuite } -func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { +func (suite *AttachmentTestSuite) TestDereferenceAttachmentBlocking() { ctx := context.Background() fetchingAccount := suite.testAccounts["local_account_1"] @@ -51,6 +52,7 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { }) suite.NoError(err) + // make a blocking call to load the attachment from the in-process media attachment, err := media.LoadAttachment(ctx) suite.NoError(err) @@ -104,6 +106,59 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentOK() { suite.NotEmpty(dbAttachment.Type) } +func (suite *AttachmentTestSuite) TestDereferenceAttachmentAsync() { + ctx := context.Background() + + fetchingAccount := suite.testAccounts["local_account_1"] + + attachmentOwner := "01FENS9F666SEQ6TYQWEEY78GM" + attachmentStatus := "01FENS9NTTVNEX1YZV7GB63MT8" + attachmentContentType := "image/jpeg" + attachmentURL := "https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg" + attachmentDescription := "It's a cute plushie." + attachmentBlurhash := "LwP?p=aK_4%N%MRjWXt7%hozM_a}" + + media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL, &media.AdditionalInfo{ + StatusID: &attachmentStatus, + RemoteURL: &attachmentURL, + Description: &attachmentDescription, + Blurhash: &attachmentBlurhash, + }) + suite.NoError(err) + attachmentID := media.AttachmentID() + + // wait 5 seconds to let the image process in the background + // it probably won't really take this long but hey let's be sure + time.Sleep(5 * time.Second) + + // now get the attachment from the database + attachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + + suite.NotNil(attachment) + + suite.Equal(attachmentOwner, attachment.AccountID) + suite.Equal(attachmentStatus, attachment.StatusID) + suite.Equal(attachmentURL, attachment.RemoteURL) + suite.NotEmpty(attachment.URL) + suite.NotEmpty(attachment.Blurhash) + suite.NotEmpty(attachment.ID) + suite.NotEmpty(attachment.CreatedAt) + suite.NotEmpty(attachment.UpdatedAt) + suite.Equal(1.336546184738956, attachment.FileMeta.Original.Aspect) + suite.Equal(2071680, attachment.FileMeta.Original.Size) + suite.Equal(1245, attachment.FileMeta.Original.Height) + suite.Equal(1664, attachment.FileMeta.Original.Width) + suite.Equal(attachmentBlurhash, attachment.Blurhash) + suite.Equal(gtsmodel.ProcessingStatusProcessed, attachment.Processing) + suite.NotEmpty(attachment.File.Path) + suite.Equal(attachmentContentType, attachment.File.ContentType) + suite.Equal(attachmentDescription, attachment.Description) + + suite.NotEmpty(attachment.Thumbnail.Path) + suite.NotEmpty(attachment.Type) +} + func TestAttachmentTestSuite(t *testing.T) { suite.Run(t, new(AttachmentTestSuite)) } From e0f9323b9aa98b55f3557086f7b0a17047943f39 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 10 Jan 2022 18:36:09 +0100 Subject: [PATCH 11/43] test the media manager a bit, add shutdown logic --- cmd/gotosocial/action/server/server.go | 4 +- cmd/gotosocial/action/testrig/testrig.go | 7 +- internal/api/client/account/account_test.go | 21 +- .../api/client/fileserver/servefile_test.go | 4 +- .../followrequest/followrequest_test.go | 17 +- internal/api/client/media/mediacreate_test.go | 6 +- internal/api/client/status/status_test.go | 19 +- internal/api/client/user/user_test.go | 19 +- internal/api/s2s/user/inboxpost_test.go | 16 +- internal/api/s2s/user/outboxget_test.go | 12 +- internal/api/s2s/user/repliesget_test.go | 12 +- internal/api/s2s/user/user_test.go | 7 +- internal/api/s2s/user/userget_test.go | 4 +- internal/api/s2s/webfinger/webfinger_test.go | 7 +- internal/db/bundb/trace.go | 9 - internal/federation/dereferencing/account.go | 6 +- .../federation/dereferencing/dereferencer.go | 2 +- internal/federation/dereferencing/media.go | 6 +- .../federation/dereferencing/media_test.go | 4 +- internal/federation/dereferencing/status.go | 2 +- internal/gotosocial/gotosocial.go | 26 +- internal/media/image.go | 156 +++++++++-- internal/media/manager.go | 207 ++++++--------- internal/media/manager_test.go | 242 ++++++++++++++++-- internal/media/media_test.go | 54 ++++ internal/media/{media.go => processing.go} | 132 +++++----- internal/media/test/test-corrupted.jpg | 1 - internal/media/test/test-jpeg-blurhash.jpg | Bin 8802 -> 0 bytes internal/media/test/test-with-exif.jpg | Bin 1227452 -> 0 bytes internal/media/test/test-without-exif.jpg | Bin 1227452 -> 0 bytes internal/processing/account/account_test.go | 2 +- internal/processing/account/update.go | 4 +- internal/processing/media/create.go | 2 +- internal/processing/processor_test.go | 6 +- testrig/federator.go | 5 +- testrig/mediahandler.go | 2 +- testrig/processor.go | 5 +- 37 files changed, 681 insertions(+), 347 deletions(-) create mode 100644 internal/media/media_test.go rename internal/media/{media.go => processing.go} (65%) delete mode 100644 internal/media/test/test-corrupted.jpg delete mode 100644 internal/media/test/test-jpeg-blurhash.jpg delete mode 100644 internal/media/test/test-with-exif.jpg delete mode 100644 internal/media/test/test-without-exif.jpg diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index 8a227edb74..5c1192b561 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -105,7 +105,7 @@ var Start action.GTSAction = func(ctx context.Context) error { } // build backend handlers - mediaManager, err := media.New(dbService, storage) + mediaManager, err := media.NewManager(dbService, storage) if err != nil { return fmt.Errorf("error creating media manager: %s", err) } @@ -203,7 +203,7 @@ var Start action.GTSAction = func(ctx context.Context) error { } } - gts, err := gotosocial.NewServer(dbService, router, federator) + gts, err := gotosocial.NewServer(dbService, router, federator, mediaManager) if err != nil { return fmt.Errorf("error creating gotosocial service: %s", err) } diff --git a/cmd/gotosocial/action/testrig/testrig.go b/cmd/gotosocial/action/testrig/testrig.go index 33f5217e46..d79ba3ea41 100644 --- a/cmd/gotosocial/action/testrig/testrig.go +++ b/cmd/gotosocial/action/testrig/testrig.go @@ -80,11 +80,12 @@ var Start action.GTSAction = func(ctx context.Context) error { Body: r, }, nil }), dbService) - federator := testrig.NewTestFederator(dbService, transportController, storageBackend) + mediaManager := testrig.NewTestMediaManager(dbService, storageBackend) + federator := testrig.NewTestFederator(dbService, transportController, storageBackend, mediaManager) emailSender := testrig.NewEmailSender("./web/template/", nil) - processor := testrig.NewTestProcessor(dbService, storageBackend, federator, emailSender) + processor := testrig.NewTestProcessor(dbService, storageBackend, federator, emailSender, mediaManager) if err := processor.Start(ctx); err != nil { return fmt.Errorf("error starting processor: %s", err) } @@ -156,7 +157,7 @@ var Start action.GTSAction = func(ctx context.Context) error { } } - gts, err := gotosocial.NewServer(dbService, router, federator) + gts, err := gotosocial.NewServer(dbService, router, federator, mediaManager) if err != nil { return fmt.Errorf("error creating gotosocial service: %s", err) } diff --git a/internal/api/client/account/account_test.go b/internal/api/client/account/account_test.go index b642dbcb4e..01c8c9599a 100644 --- a/internal/api/client/account/account_test.go +++ b/internal/api/client/account/account_test.go @@ -16,6 +16,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/typeutils" @@ -25,13 +26,14 @@ import ( type AccountStandardTestSuite struct { // standard suite interfaces suite.Suite - db db.DB - tc typeutils.TypeConverter - storage *kv.KVStore - federator federation.Federator - processor processing.Processor - emailSender email.Sender - sentEmails map[string]string + db db.DB + tc typeutils.TypeConverter + storage *kv.KVStore + mediaManager media.Manager + federator federation.Federator + processor processing.Processor + emailSender email.Sender + sentEmails map[string]string // standard suite models testTokens map[string]*gtsmodel.Token @@ -61,10 +63,11 @@ func (suite *AccountStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() testrig.InitTestLog() - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.sentEmails = make(map[string]string) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", suite.sentEmails) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) suite.accountModule = account.New(suite.processor).(*account.Module) testrig.StandardDBSetup(suite.db, nil) testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") diff --git a/internal/api/client/fileserver/servefile_test.go b/internal/api/client/fileserver/servefile_test.go index 109ed4ebae..5cd4b529b5 100644 --- a/internal/api/client/fileserver/servefile_test.go +++ b/internal/api/client/fileserver/servefile_test.go @@ -77,10 +77,10 @@ func (suite *ServeFileTestSuite) SetupSuite() { testrig.InitTestLog() suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, testrig.NewTestMediaManager(suite.db, suite.storage)) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, testrig.NewTestMediaManager(suite.db, suite.storage)) suite.tc = testrig.NewTestTypeConverter(suite.db) suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) diff --git a/internal/api/client/followrequest/followrequest_test.go b/internal/api/client/followrequest/followrequest_test.go index 2d327f4615..36b4912e9e 100644 --- a/internal/api/client/followrequest/followrequest_test.go +++ b/internal/api/client/followrequest/followrequest_test.go @@ -33,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/testrig" @@ -40,11 +41,12 @@ import ( type FollowRequestStandardTestSuite struct { suite.Suite - db db.DB - storage *kv.KVStore - federator federation.Federator - processor processing.Processor - emailSender email.Sender + db db.DB + storage *kv.KVStore + mediaManager media.Manager + federator federation.Federator + processor processing.Processor + emailSender email.Sender // standard suite models testTokens map[string]*gtsmodel.Token @@ -74,9 +76,10 @@ func (suite *FollowRequestStandardTestSuite) SetupTest() { testrig.InitTestLog() suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) suite.followRequestModule = followrequest.New(suite.processor).(*followrequest.Module) testrig.StandardDBSetup(suite.db, nil) testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") diff --git a/internal/api/client/media/mediacreate_test.go b/internal/api/client/media/mediacreate_test.go index 72a377c254..22e0e21885 100644 --- a/internal/api/client/media/mediacreate_test.go +++ b/internal/api/client/media/mediacreate_test.go @@ -51,9 +51,9 @@ type MediaCreateTestSuite struct { suite.Suite db db.DB storage *kv.KVStore + mediaManager media.Manager federator federation.Federator tc typeutils.TypeConverter - mediaManager media.Manager oauthServer oauth.Server emailSender email.Sender processor processing.Processor @@ -83,9 +83,9 @@ func (suite *MediaCreateTestSuite) SetupSuite() { suite.tc = testrig.NewTestTypeConverter(suite.db) suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) // setup module being tested suite.mediaModule = mediamodule.New(suite.processor).(*mediamodule.Module) diff --git a/internal/api/client/status/status_test.go b/internal/api/client/status/status_test.go index dd037f6f43..c6e5b354fe 100644 --- a/internal/api/client/status/status_test.go +++ b/internal/api/client/status/status_test.go @@ -26,6 +26,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/typeutils" "github.com/superseriousbusiness/gotosocial/testrig" @@ -34,12 +35,13 @@ import ( type StatusStandardTestSuite struct { // standard suite interfaces suite.Suite - db db.DB - tc typeutils.TypeConverter - federator federation.Federator - emailSender email.Sender - processor processing.Processor - storage *kv.KVStore + db db.DB + tc typeutils.TypeConverter + mediaManager media.Manager + federator federation.Federator + emailSender email.Sender + processor processing.Processor + storage *kv.KVStore // standard suite models testTokens map[string]*gtsmodel.Token @@ -70,9 +72,10 @@ func (suite *StatusStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.tc = testrig.NewTestTypeConverter(suite.db) suite.storage = testrig.NewTestStorage() - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) suite.statusModule = status.New(suite.processor).(*status.Module) testrig.StandardDBSetup(suite.db, nil) testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") diff --git a/internal/api/client/user/user_test.go b/internal/api/client/user/user_test.go index d60bf2f1a3..e84a78cde5 100644 --- a/internal/api/client/user/user_test.go +++ b/internal/api/client/user/user_test.go @@ -26,6 +26,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/typeutils" "github.com/superseriousbusiness/gotosocial/testrig" @@ -33,12 +34,13 @@ import ( type UserStandardTestSuite struct { suite.Suite - db db.DB - tc typeutils.TypeConverter - federator federation.Federator - emailSender email.Sender - processor processing.Processor - storage *kv.KVStore + db db.DB + tc typeutils.TypeConverter + mediaManager media.Manager + federator federation.Federator + emailSender email.Sender + processor processing.Processor + storage *kv.KVStore testTokens map[string]*gtsmodel.Token testClients map[string]*gtsmodel.Client @@ -62,10 +64,11 @@ func (suite *UserStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() suite.tc = testrig.NewTestTypeConverter(suite.db) - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.sentEmails = make(map[string]string) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", suite.sentEmails) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) suite.userModule = user.New(suite.processor).(*user.Module) testrig.StandardDBSetup(suite.db, suite.testAccounts) testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") diff --git a/internal/api/s2s/user/inboxpost_test.go b/internal/api/s2s/user/inboxpost_test.go index 7cd9ce93a9..2f43799c8b 100644 --- a/internal/api/s2s/user/inboxpost_test.go +++ b/internal/api/s2s/user/inboxpost_test.go @@ -84,9 +84,9 @@ func (suite *InboxPostTestSuite) TestPostBlock() { body := bytes.NewReader(bodyJson) tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -184,9 +184,9 @@ func (suite *InboxPostTestSuite) TestPostUnblock() { body := bytes.NewReader(bodyJson) tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -274,9 +274,9 @@ func (suite *InboxPostTestSuite) TestPostUpdate() { body := bytes.NewReader(bodyJson) tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -393,9 +393,9 @@ func (suite *InboxPostTestSuite) TestPostDelete() { body := bytes.NewReader(bodyJson) tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) err = processor.Start(context.Background()) suite.NoError(err) userModule := user.New(processor).(*user.Module) diff --git a/internal/api/s2s/user/outboxget_test.go b/internal/api/s2s/user/outboxget_test.go index 2591a80f12..3f5b54c074 100644 --- a/internal/api/s2s/user/outboxget_test.go +++ b/internal/api/s2s/user/outboxget_test.go @@ -45,9 +45,9 @@ func (suite *OutboxGetTestSuite) TestGetOutbox() { targetAccount := suite.testAccounts["local_account_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -100,9 +100,9 @@ func (suite *OutboxGetTestSuite) TestGetOutboxFirstPage() { targetAccount := suite.testAccounts["local_account_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -155,9 +155,9 @@ func (suite *OutboxGetTestSuite) TestGetOutboxNextPage() { targetAccount := suite.testAccounts["local_account_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request diff --git a/internal/api/s2s/user/repliesget_test.go b/internal/api/s2s/user/repliesget_test.go index d128e30da6..81249091c5 100644 --- a/internal/api/s2s/user/repliesget_test.go +++ b/internal/api/s2s/user/repliesget_test.go @@ -48,9 +48,9 @@ func (suite *RepliesGetTestSuite) TestGetReplies() { targetStatus := suite.testStatuses["local_account_1_status_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -109,9 +109,9 @@ func (suite *RepliesGetTestSuite) TestGetRepliesNext() { targetStatus := suite.testStatuses["local_account_1_status_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request @@ -173,9 +173,9 @@ func (suite *RepliesGetTestSuite) TestGetRepliesLast() { targetStatus := suite.testStatuses["local_account_1_status_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request diff --git a/internal/api/s2s/user/user_test.go b/internal/api/s2s/user/user_test.go index 43b8351658..b1be59073b 100644 --- a/internal/api/s2s/user/user_test.go +++ b/internal/api/s2s/user/user_test.go @@ -27,6 +27,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/typeutils" @@ -38,6 +39,7 @@ type UserStandardTestSuite struct { suite.Suite db db.DB tc typeutils.TypeConverter + mediaManager media.Manager federator federation.Federator emailSender email.Sender processor processing.Processor @@ -77,9 +79,10 @@ func (suite *UserStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.tc = testrig.NewTestTypeConverter(suite.db) suite.storage = testrig.NewTestStorage() - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) suite.userModule = user.New(suite.processor).(*user.Module) suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.securityModule = security.New(suite.db, suite.oauthServer).(*security.Module) diff --git a/internal/api/s2s/user/userget_test.go b/internal/api/s2s/user/userget_test.go index 2f3109c920..a764f6993a 100644 --- a/internal/api/s2s/user/userget_test.go +++ b/internal/api/s2s/user/userget_test.go @@ -46,9 +46,9 @@ func (suite *UserGetTestSuite) TestGetUser() { targetAccount := suite.testAccounts["local_account_1"] tc := testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db) - federator := testrig.NewTestFederator(suite.db, tc, suite.storage) + federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager) emailSender := testrig.NewEmailSender("../../../../web/template/", nil) - processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender) + processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager) userModule := user.New(processor).(*user.Module) // setup request diff --git a/internal/api/s2s/webfinger/webfinger_test.go b/internal/api/s2s/webfinger/webfinger_test.go index 7e57f7e454..d7b1647b0b 100644 --- a/internal/api/s2s/webfinger/webfinger_test.go +++ b/internal/api/s2s/webfinger/webfinger_test.go @@ -32,6 +32,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/typeutils" @@ -43,6 +44,7 @@ type WebfingerStandardTestSuite struct { suite.Suite db db.DB tc typeutils.TypeConverter + mediaManager media.Manager federator federation.Federator emailSender email.Sender processor processing.Processor @@ -80,9 +82,10 @@ func (suite *WebfingerStandardTestSuite) SetupTest() { suite.db = testrig.NewTestDB() suite.tc = testrig.NewTestTypeConverter(suite.db) suite.storage = testrig.NewTestStorage() - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) suite.webfingerModule = webfinger.New(suite.processor).(*webfinger.Module) suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.securityModule = security.New(suite.db, suite.oauthServer).(*security.Module) diff --git a/internal/db/bundb/trace.go b/internal/db/bundb/trace.go index 3726506a9c..9eaad68806 100644 --- a/internal/db/bundb/trace.go +++ b/internal/db/bundb/trace.go @@ -20,7 +20,6 @@ package bundb import ( "context" - "database/sql" "time" "github.com/sirupsen/logrus" @@ -48,13 +47,5 @@ func (q *debugQueryHook) AfterQuery(_ context.Context, event *bun.QueryEvent) { "operation": event.Operation(), }) - if event.Err != nil && event.Err != sql.ErrNoRows { - // if there's an error the it'll be handled in the application logic, - // but we can still debug log it here alongside the query - l = l.WithField("query", event.Query) - l.Debug(event.Err) - return - } - l.Tracef("[%s] %s", dur, event.Operation()) } diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index d83fc3bac8..27d9f39ce1 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -119,7 +119,7 @@ func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAcc } else { // take the id we already have and do an update gtsAccount.ID = maybeAccount.ID - +aaaaaaaaaaaaaaaaaa if err := d.PopulateAccountFields(ctx, gtsAccount, username, refresh); err != nil { return nil, new, fmt.Errorf("FullyDereferenceAccount: error populating further account fields: %s", err) } @@ -260,7 +260,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * avatar := true processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalInfo{ RemoteURL: &targetAccount.AvatarRemoteURL, - Avatar: &avatar, + Avatar: &avatar, }) if err != nil { return err @@ -283,7 +283,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * header := true processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalInfo{ RemoteURL: &targetAccount.HeaderRemoteURL, - Header: &header, + Header: &header, }) if err != nil { return err diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index 787a39739f..1e6f781b8e 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -41,7 +41,7 @@ type Dereferencer interface { GetRemoteInstance(ctx context.Context, username string, remoteInstanceURI *url.URL) (*gtsmodel.Instance, error) - GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Media, error) + GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Processing, error) DereferenceAnnounce(ctx context.Context, announce *gtsmodel.Status, requestingUsername string) error DereferenceThread(ctx context.Context, username string, statusIRI *url.URL) error diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go index 0ddab7ae0a..f02303aa19 100644 --- a/internal/federation/dereferencing/media.go +++ b/internal/federation/dereferencing/media.go @@ -26,7 +26,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/media" ) -func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Media, error) { +func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Processing, error) { if accountID == "" { return nil, fmt.Errorf("RefreshAttachment: minAttachment account ID was empty") } @@ -46,10 +46,10 @@ func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, a return nil, fmt.Errorf("RefreshAttachment: error dereferencing media: %s", err) } - m, err := d.mediaManager.ProcessMedia(ctx, data, accountID, ai) + processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, accountID, ai) if err != nil { return nil, fmt.Errorf("RefreshAttachment: error processing attachment: %s", err) } - return m, nil + return processingMedia, nil } diff --git a/internal/federation/dereferencing/media_test.go b/internal/federation/dereferencing/media_test.go index 1f076f62c2..61ee6edb60 100644 --- a/internal/federation/dereferencing/media_test.go +++ b/internal/federation/dereferencing/media_test.go @@ -52,8 +52,8 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentBlocking() { }) suite.NoError(err) - // make a blocking call to load the attachment from the in-process media - attachment, err := media.LoadAttachment(ctx) + // make a blocking call to load the attachment from the in-process media + attachment, err := media.Load(ctx) suite.NoError(err) suite.NotNil(attachment) diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index 47ce087a2f..041cfa6b4a 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -406,7 +406,7 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. continue } - attachment, err := media.LoadAttachment(ctx) + attachment, err := media.Load(ctx) if err != nil { logrus.Errorf("populateStatusAttachments: couldn't load remote attachment %s: %s", a.RemoteURL, err) continue diff --git a/internal/gotosocial/gotosocial.go b/internal/gotosocial/gotosocial.go index 01a77ce2a3..7b2d16e5e4 100644 --- a/internal/gotosocial/gotosocial.go +++ b/internal/gotosocial/gotosocial.go @@ -23,6 +23,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/federation" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/router" ) @@ -41,19 +42,21 @@ type Server interface { // NewServer returns a new gotosocial server, initialized with the given configuration. // An error will be returned the caller if something goes wrong during initialization // eg., no db or storage connection, port for router already in use, etc. -func NewServer(db db.DB, apiRouter router.Router, federator federation.Federator) (Server, error) { +func NewServer(db db.DB, apiRouter router.Router, federator federation.Federator, mediaManager media.Manager) (Server, error) { return &gotosocial{ - db: db, - apiRouter: apiRouter, - federator: federator, + db: db, + apiRouter: apiRouter, + federator: federator, + mediaManager: mediaManager, }, nil } // gotosocial fulfils the gotosocial interface. type gotosocial struct { - db db.DB - apiRouter router.Router - federator federation.Federator + db db.DB + apiRouter router.Router + federator federation.Federator + mediaManager media.Manager } // Start starts up the gotosocial server. If something goes wrong @@ -63,13 +66,16 @@ func (gts *gotosocial) Start(ctx context.Context) error { return nil } -// Stop closes down the gotosocial server, first closing the router -// then the database. If something goes wrong while stopping, an -// error will be returned. +// Stop closes down the gotosocial server, first closing the router, +// then the media manager, then the database. +// If something goes wrong while stopping, an error will be returned. func (gts *gotosocial) Stop(ctx context.Context) error { if err := gts.apiRouter.Stop(ctx); err != nil { return err } + if err := gts.mediaManager.Stop(); err != nil { + return err + } if err := gts.db.Stop(ctx); err != nil { return err } diff --git a/internal/media/image.go b/internal/media/image.go index 4c0b28c02f..074dd38393 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -20,16 +20,22 @@ package media import ( "bytes" + "context" "errors" "fmt" "image" "image/gif" "image/jpeg" "image/png" + "strings" + "time" "github.com/buckket/go-blurhash" "github.com/nfnt/resize" "github.com/superseriousbusiness/exifremove/pkg/exifremove" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/uris" ) const ( @@ -38,13 +44,119 @@ const ( ) type ImageMeta struct { - image []byte - contentType string - width int - height int - size int - aspect float64 - blurhash string + image []byte + width int + height int + size int + aspect float64 + blurhash string +} + +func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string, ai *AdditionalInfo) (*Processing, error) { + if !supportedImage(contentType) { + return nil, fmt.Errorf("image type %s not supported", contentType) + } + + if len(data) == 0 { + return nil, errors.New("image was of size 0") + } + + id, err := id.NewRandomULID() + if err != nil { + return nil, err + } + + extension := strings.Split(contentType, "/")[1] + + // populate initial fields on the media attachment -- some of these will be overwritten as we proceed + attachment := >smodel.MediaAttachment{ + ID: id, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + StatusID: "", + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), + RemoteURL: "", + Type: gtsmodel.FileTypeImage, + FileMeta: gtsmodel.FileMeta{ + Focus: gtsmodel.Focus{ + X: 0, + Y: 0, + }, + }, + AccountID: accountID, + Description: "", + ScheduledStatusID: "", + Blurhash: "", + Processing: gtsmodel.ProcessingStatusReceived, + File: gtsmodel.File{ + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), + ContentType: contentType, + UpdatedAt: time.Now(), + }, + Thumbnail: gtsmodel.Thumbnail{ + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, + ContentType: mimeJpeg, + UpdatedAt: time.Now(), + }, + Avatar: false, + Header: false, + } + + // check if we have additional info to add to the attachment, + // and overwrite some of the attachment fields if so + if ai != nil { + if ai.CreatedAt != nil { + attachment.CreatedAt = *ai.CreatedAt + } + + if ai.StatusID != nil { + attachment.StatusID = *ai.StatusID + } + + if ai.RemoteURL != nil { + attachment.RemoteURL = *ai.RemoteURL + } + + if ai.Description != nil { + attachment.Description = *ai.Description + } + + if ai.ScheduledStatusID != nil { + attachment.ScheduledStatusID = *ai.ScheduledStatusID + } + + if ai.Blurhash != nil { + attachment.Blurhash = *ai.Blurhash + } + + if ai.Avatar != nil { + attachment.Avatar = *ai.Avatar + } + + if ai.Header != nil { + attachment.Header = *ai.Header + } + + if ai.FocusX != nil { + attachment.FileMeta.Focus.X = *ai.FocusX + } + + if ai.FocusY != nil { + attachment.FileMeta.Focus.Y = *ai.FocusY + } + } + + media := &Processing{ + attachment: attachment, + rawData: data, + thumbstate: received, + fullSizeState: received, + database: m.db, + storage: m.storage, + } + + return media, nil } func decodeGif(b []byte) (*ImageMeta, error) { @@ -106,8 +218,12 @@ func decodeImage(b []byte, contentType string) (*ImageMeta, error) { // deriveThumbnail returns a byte slice and metadata for a thumbnail // of a given jpeg, png, or gif, or an error if something goes wrong. // -// Note that the aspect ratio of the image will be retained, -// so it will not necessarily be a square, even if x and y are set as the same value. +// If createBlurhash is true, then a blurhash will also be generated from a tiny +// version of the image. This costs precious CPU cycles, so only use it if you +// really need a blurhash and don't have one already. +// +// If createBlurhash is false, then the blurhash field on the returned ImageAndMeta +// will be an empty string. func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageMeta, error) { var i image.Image var err error @@ -115,21 +231,20 @@ func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageM switch contentType { case mimeImageJpeg: i, err = jpeg.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } case mimeImagePng: i, err = png.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } case mimeImageGif: i, err = gif.Decode(bytes.NewReader(b)) - if err != nil { - return nil, err - } default: - return nil, fmt.Errorf("content type %s not recognised", contentType) + err = fmt.Errorf("content type %s can't be thumbnailed", contentType) + } + + if err != nil { + return nil, err + } + + if i == nil { + return nil, errors.New("processed image was nil") } thumb := resize.Thumbnail(thumbnailMaxWidth, thumbnailMaxHeight, i, resize.NearestNeighbor) @@ -146,6 +261,8 @@ func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageM } if createBlurhash { + // for generating blurhashes, it's more cost effective to lose detail rather than + // pass a big image into the blurhash algorithm, so make a teeny tiny version tiny := resize.Thumbnail(32, 32, thumb, resize.NearestNeighbor) bh, err := blurhash.Encode(4, 3, tiny) if err != nil { @@ -156,6 +273,7 @@ func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageM out := &bytes.Buffer{} if err := jpeg.Encode(out, thumb, &jpeg.Options{ + // Quality isn't extremely important for thumbnails, so 75 is "good enough" Quality: 75, }); err != nil { return nil, err diff --git a/internal/media/manager.go b/internal/media/manager.go index 5e62b39b2a..c8642fcb47 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -24,63 +24,84 @@ import ( "fmt" "runtime" "strings" - "time" "codeberg.org/gruf/go-runners" "codeberg.org/gruf/go-store/kv" "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" - "github.com/superseriousbusiness/gotosocial/internal/uris" ) // Manager provides an interface for managing media: parsing, storing, and retrieving media objects like photos, videos, and gifs. type Manager interface { // ProcessMedia begins the process of decoding and storing the given data as a piece of media (aka an attachment). // It will return a pointer to a Media struct upon which further actions can be performed, such as getting - // the finished media, thumbnail, decoded bytes, attachment, and setting additional fields. + // the finished media, thumbnail, attachment, etc. // // accountID should be the account that the media belongs to. // - // RemoteURL is optional, and can be an empty string. Setting this to a non-empty string indicates that - // the piece of media originated on a remote instance and has been dereferenced to be cached locally. - ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Media, error) - - ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Media, error) + // ai is optional and can be nil. Any additional information about the attachment provided will be put in the database. + ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Processing, error) + ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Processing, error) + // NumWorkers returns the total number of workers available to this manager. + NumWorkers() int + // QueueSize returns the total capacity of the queue. + QueueSize() int + // JobsQueued returns the number of jobs currently in the task queue. + JobsQueued() int + // ActiveWorkers returns the number of workers currently performing jobs. + ActiveWorkers() int + // Stop stops the underlying worker pool of the manager. It should be called + // when closing GoToSocial in order to cleanly finish any in-progress jobs. + // It will block until workers are finished processing. + Stop() error } type manager struct { - db db.DB - storage *kv.KVStore - pool runners.WorkerPool + db db.DB + storage *kv.KVStore + pool runners.WorkerPool + numWorkers int + queueSize int } -// New returns a media manager with the given db and underlying storage. -func New(database db.DB, storage *kv.KVStore) (Manager, error) { - workers := runtime.NumCPU() / 2 - queue := workers * 10 - pool := runners.NewWorkerPool(workers, queue) - - if start := pool.Start(); !start { - return nil, errors.New("could not start worker pool") +// NewManager returns a media manager with the given db and underlying storage. +// +// A worker pool will also be initialized for the manager, to ensure that only +// a limited number of media will be processed in parallel. +// +// The number of workers will be the number of CPUs available to the Go runtime, +// divided by 2 (rounding down, but always at least 1). +// +// The length of the queue will be the number of workers multiplied by 10. +// +// So for an 8 core machine, the media manager will get 4 workers, and a queue of length 40. +// For a 4 core machine, this will be 2 workers, and a queue length of 20. +// For a single or 2-core machine, the media manager will get 1 worker, and a queue of length 10. +func NewManager(database db.DB, storage *kv.KVStore) (Manager, error) { + numWorkers := runtime.NumCPU() / 2 + // make sure we always have at least 1 worker even on single-core machines + if numWorkers == 0 { + numWorkers = 1 } - logrus.Debugf("started media manager worker pool with %d workers and queue capacity of %d", workers, queue) + queueSize := numWorkers * 10 m := &manager{ - db: database, - storage: storage, - pool: pool, + db: database, + storage: storage, + pool: runners.NewWorkerPool(numWorkers, queueSize), + numWorkers: numWorkers, + queueSize: queueSize, + } + + if start := m.pool.Start(); !start { + return nil, errors.New("could not start worker pool") } + logrus.Debugf("started media manager worker pool with %d workers and queue capacity of %d", numWorkers, queueSize) return m, nil } -/* - INTERFACE FUNCTIONS -*/ - -func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Media, error) { +func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Processing, error) { contentType, err := parseContentType(data) if err != nil { return nil, err @@ -100,16 +121,20 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin return nil, err } + logrus.Tracef("ProcessMedia: about to enqueue media with attachmentID %s, queue length is %d", media.AttachmentID(), m.pool.Queue()) m.pool.Enqueue(func(innerCtx context.Context) { select { case <-innerCtx.Done(): // if the inner context is done that means the worker pool is closing, so we should just return return default: - // start preloading the media for the caller's convenience - media.preLoad(innerCtx) + // start loading the media already for the caller's convenience + if _, err := media.Load(innerCtx); err != nil { + logrus.Errorf("ProcessMedia: error processing media with attachmentID %s: %s", media.AttachmentID(), err) + } } }) + logrus.Tracef("ProcessMedia: succesfully queued media with attachmentID %s, queue length is %d", media.AttachmentID(), m.pool.Queue()) return media, nil default: @@ -117,112 +142,32 @@ func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID strin } } -func (m *manager) ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Media, error) { +func (m *manager) ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Processing, error) { return nil, nil } -// preProcessImage initializes processing -func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string, ai *AdditionalInfo) (*Media, error) { - if !supportedImage(contentType) { - return nil, fmt.Errorf("image type %s not supported", contentType) - } - - if len(data) == 0 { - return nil, errors.New("image was of size 0") - } - - id, err := id.NewRandomULID() - if err != nil { - return nil, err - } - - extension := strings.Split(contentType, "/")[1] - - attachment := >smodel.MediaAttachment{ - ID: id, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - StatusID: "", - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), - RemoteURL: "", - Type: gtsmodel.FileTypeImage, - FileMeta: gtsmodel.FileMeta{ - Focus: gtsmodel.Focus{ - X: 0, - Y: 0, - }, - }, - AccountID: accountID, - Description: "", - ScheduledStatusID: "", - Blurhash: "", - Processing: 0, - File: gtsmodel.File{ - Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), - ContentType: contentType, - UpdatedAt: time.Now(), - }, - Thumbnail: gtsmodel.Thumbnail{ - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, - Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, - ContentType: mimeJpeg, - UpdatedAt: time.Now(), - }, - Avatar: false, - Header: false, - } - - // check if we have additional info to add to the attachment - if ai != nil { - if ai.CreatedAt != nil { - attachment.CreatedAt = *ai.CreatedAt - } - - if ai.StatusID != nil { - attachment.StatusID = *ai.StatusID - } - - if ai.RemoteURL != nil { - attachment.RemoteURL = *ai.RemoteURL - } - - if ai.Description != nil { - attachment.Description = *ai.Description - } - - if ai.ScheduledStatusID != nil { - attachment.ScheduledStatusID = *ai.ScheduledStatusID - } - - if ai.Blurhash != nil { - attachment.Blurhash = *ai.Blurhash - } +func (m *manager) NumWorkers() int { + return m.numWorkers +} - if ai.Avatar != nil { - attachment.Avatar = *ai.Avatar - } +func (m *manager) QueueSize() int { + return m.queueSize +} - if ai.Header != nil { - attachment.Header = *ai.Header - } +func (m *manager) JobsQueued() int { + return m.pool.Queue() +} - if ai.FocusX != nil { - attachment.FileMeta.Focus.X = *ai.FocusX - } +func (m *manager) ActiveWorkers() int { + return m.pool.Workers() +} - if ai.FocusY != nil { - attachment.FileMeta.Focus.Y = *ai.FocusY - } - } +func (m *manager) Stop() error { + logrus.Info("stopping media manager worker pool") - media := &Media{ - attachment: attachment, - rawData: data, - thumbstate: received, - fullSizeState: received, - database: m.db, - storage: m.storage, + stopped := m.pool.Stop() + if !stopped { + return errors.New("could not stop media manager worker pool") } - - return media, nil + return nil } diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index aad7f46d06..74d0c30087 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -19,36 +19,238 @@ package media_test import ( - "codeberg.org/gruf/go-store/kv" + "context" + "fmt" + "os" + "testing" + "time" + "github.com/stretchr/testify/suite" - "github.com/superseriousbusiness/gotosocial/internal/db" + gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20211113114307_init" "github.com/superseriousbusiness/gotosocial/internal/media" - "github.com/superseriousbusiness/gotosocial/testrig" ) -type MediaManagerStandardTestSuite struct { - suite.Suite +type ManagerTestSuite struct { + MediaStandardTestSuite +} + +func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { + ctx := context.Background() + + // load bytes from a test image + testBytes, err := os.ReadFile("./test/test-jpeg.jpg") + suite.NoError(err) + suite.NotEmpty(testBytes) + + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" + + // process the media with no additional info provided + processingMedia, err := suite.manager.ProcessMedia(ctx, testBytes, accountID, nil) + suite.NoError(err) + // fetch the attachment id from the processing media + attachmentID := processingMedia.AttachmentID() + + // do a blocking call to fetch the attachment + attachment, err := processingMedia.Load(ctx) + suite.NoError(err) + suite.NotNil(attachment) + + // make sure it's got the stuff set on it that we expect + // the attachment ID and accountID we expect + suite.Equal(attachmentID, attachment.ID) + suite.Equal(accountID, attachment.AccountID) + + // file meta should be correctly derived from the image + suite.EqualValues(gtsmodel.Original{ + Width: 1920, Height: 1080, Size: 2073600, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Original) + suite.EqualValues(gtsmodel.Small{ + Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Small) + suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) + + // now make sure the attachment is in the database + dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(dbAttachment) + + // make sure the processed file is in storage + processedFullBytes, err := suite.storage.Get(attachment.File.Path) + suite.NoError(err) + suite.NotEmpty(processedFullBytes) - db db.DB - storage *kv.KVStore - manager media.Manager + // load the processed bytes from our test folder, to compare + processedFullBytesExpected, err := os.ReadFile("./test/test-jpeg-processed.jpg") + suite.NoError(err) + suite.NotEmpty(processedFullBytesExpected) + + // the bytes in storage should be what we expected + suite.Equal(processedFullBytesExpected, processedFullBytes) + + // now do the same for the thumbnail and make sure it's what we expected + processedThumbnailBytes, err := suite.storage.Get(attachment.Thumbnail.Path) + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytes) + + processedThumbnailBytesExpected, err := os.ReadFile("./test/test-jpeg-thumbnail.jpg") + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytesExpected) + + suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) } -func (suite *MediaManagerStandardTestSuite) SetupSuite() { - testrig.InitTestLog() - testrig.InitTestConfig() +func (suite *ManagerTestSuite) TestSimpleJpegProcessAsync() { + ctx := context.Background() + + // load bytes from a test image + testBytes, err := os.ReadFile("./test/test-jpeg.jpg") + suite.NoError(err) + suite.NotEmpty(testBytes) + + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" + + // process the media with no additional info provided + processingMedia, err := suite.manager.ProcessMedia(ctx, testBytes, accountID, nil) + suite.NoError(err) + // fetch the attachment id from the processing media + attachmentID := processingMedia.AttachmentID() + + // wait for the media to finish processing + for finished := processingMedia.Finished(); !finished; finished = processingMedia.Finished() { + time.Sleep(10 * time.Millisecond) + fmt.Printf("\n\nnot finished yet...\n\n") + } + fmt.Printf("\n\nfinished!\n\n") + + // fetch the attachment from the database + attachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(attachment) + + // make sure it's got the stuff set on it that we expect + // the attachment ID and accountID we expect + suite.Equal(attachmentID, attachment.ID) + suite.Equal(accountID, attachment.AccountID) + + // file meta should be correctly derived from the image + suite.EqualValues(gtsmodel.Original{ + Width: 1920, Height: 1080, Size: 2073600, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Original) + suite.EqualValues(gtsmodel.Small{ + Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Small) + suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) - suite.db = testrig.NewTestDB() - suite.storage = testrig.NewTestStorage() + // now make sure the attachment is in the database + dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(dbAttachment) + + // make sure the processed file is in storage + processedFullBytes, err := suite.storage.Get(attachment.File.Path) + suite.NoError(err) + suite.NotEmpty(processedFullBytes) + + // load the processed bytes from our test folder, to compare + processedFullBytesExpected, err := os.ReadFile("./test/test-jpeg-processed.jpg") + suite.NoError(err) + suite.NotEmpty(processedFullBytesExpected) + + // the bytes in storage should be what we expected + suite.Equal(processedFullBytesExpected, processedFullBytes) + + // now do the same for the thumbnail and make sure it's what we expected + processedThumbnailBytes, err := suite.storage.Get(attachment.Thumbnail.Path) + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytes) + + processedThumbnailBytesExpected, err := os.ReadFile("./test/test-jpeg-thumbnail.jpg") + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytesExpected) + + suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) } -func (suite *MediaManagerStandardTestSuite) SetupTest() { - testrig.StandardStorageSetup(suite.storage, "../../testrig/media") - testrig.StandardDBSetup(suite.db, nil) - suite.manager = testrig.NewTestMediaManager(suite.db, suite.storage) +func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { + // in this test, we spam the manager queue with 50 new media requests, just to see how it holds up + + ctx := context.Background() + + // load bytes from a test image + testBytes, err := os.ReadFile("./test/test-jpeg.jpg") + suite.NoError(err) + suite.NotEmpty(testBytes) + + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" + + spam := 50 + inProcess := []*media.Processing{} + for i := 0; i < spam; i++ { + // process the media with no additional info provided + processingMedia, err := suite.manager.ProcessMedia(ctx, testBytes, accountID, nil) + suite.NoError(err) + inProcess = append(inProcess, processingMedia) + } + + for _, processingMedia := range inProcess { + fmt.Printf("\n\n\nactive workers: %d, queue length: %d\n\n\n", suite.manager.ActiveWorkers(), suite.manager.JobsQueued()) + + // fetch the attachment id from the processing media + attachmentID := processingMedia.AttachmentID() + + // do a blocking call to fetch the attachment + attachment, err := processingMedia.Load(ctx) + suite.NoError(err) + suite.NotNil(attachment) + + // make sure it's got the stuff set on it that we expect + // the attachment ID and accountID we expect + suite.Equal(attachmentID, attachment.ID) + suite.Equal(accountID, attachment.AccountID) + + // file meta should be correctly derived from the image + suite.EqualValues(gtsmodel.Original{ + Width: 1920, Height: 1080, Size: 2073600, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Original) + suite.EqualValues(gtsmodel.Small{ + Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Small) + suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) + + // now make sure the attachment is in the database + dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(dbAttachment) + + // make sure the processed file is in storage + processedFullBytes, err := suite.storage.Get(attachment.File.Path) + suite.NoError(err) + suite.NotEmpty(processedFullBytes) + + // load the processed bytes from our test folder, to compare + processedFullBytesExpected, err := os.ReadFile("./test/test-jpeg-processed.jpg") + suite.NoError(err) + suite.NotEmpty(processedFullBytesExpected) + + // the bytes in storage should be what we expected + suite.Equal(processedFullBytesExpected, processedFullBytes) + + // now do the same for the thumbnail and make sure it's what we expected + processedThumbnailBytes, err := suite.storage.Get(attachment.Thumbnail.Path) + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytes) + + processedThumbnailBytesExpected, err := os.ReadFile("./test/test-jpeg-thumbnail.jpg") + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytesExpected) + + suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) + } } -func (suite *MediaManagerStandardTestSuite) TearDownTest() { - testrig.StandardDBTeardown(suite.db) - testrig.StandardStorageTeardown(suite.storage) +func TestManagerTestSuite(t *testing.T) { + suite.Run(t, &ManagerTestSuite{}) } diff --git a/internal/media/media_test.go b/internal/media/media_test.go new file mode 100644 index 0000000000..f3e73ed797 --- /dev/null +++ b/internal/media/media_test.go @@ -0,0 +1,54 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package media_test + +import ( + "codeberg.org/gruf/go-store/kv" + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/media" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type MediaStandardTestSuite struct { + suite.Suite + + db db.DB + storage *kv.KVStore + manager media.Manager +} + +func (suite *MediaStandardTestSuite) SetupSuite() { + testrig.InitTestConfig() + testrig.InitTestLog() + + suite.db = testrig.NewTestDB() + suite.storage = testrig.NewTestStorage() +} + +func (suite *MediaStandardTestSuite) SetupTest() { + testrig.StandardStorageSetup(suite.storage, "../../testrig/media") + testrig.StandardDBSetup(suite.db, nil) + suite.manager = testrig.NewTestMediaManager(suite.db, suite.storage) +} + +func (suite *MediaStandardTestSuite) TearDownTest() { + testrig.StandardDBTeardown(suite.db) + testrig.StandardStorageTeardown(suite.storage) +} diff --git a/internal/media/media.go b/internal/media/processing.go similarity index 65% rename from internal/media/media.go rename to internal/media/processing.go index e0cfe09b7b..3f9fc2bfc8 100644 --- a/internal/media/media.go +++ b/internal/media/processing.go @@ -37,7 +37,9 @@ const ( errored // processing order has been completed with an error ) -type Media struct { +// Processing represents a piece of media that is currently being processed. It exposes +// various functions for retrieving data from the process. +type Processing struct { mu sync.Mutex /* @@ -75,173 +77,169 @@ type Media struct { err error // error created during processing, if any } -func (m *Media) Thumb(ctx context.Context) (*ImageMeta, error) { - m.mu.Lock() - defer m.mu.Unlock() +func (p *Processing) Thumb(ctx context.Context) (*ImageMeta, error) { + p.mu.Lock() + defer p.mu.Unlock() - switch m.thumbstate { + switch p.thumbstate { case received: // we haven't processed a thumbnail for this media yet so do it now // check if we need to create a blurhash or if there's already one set var createBlurhash bool - if m.attachment.Blurhash == "" { + if p.attachment.Blurhash == "" { // no blurhash created yet createBlurhash = true } - thumb, err := deriveThumbnail(m.rawData, m.attachment.File.ContentType, createBlurhash) + thumb, err := deriveThumbnail(p.rawData, p.attachment.File.ContentType, createBlurhash) if err != nil { - m.err = fmt.Errorf("error deriving thumbnail: %s", err) - m.thumbstate = errored - return nil, m.err + p.err = fmt.Errorf("error deriving thumbnail: %s", err) + p.thumbstate = errored + return nil, p.err } // put the thumbnail in storage - if err := m.storage.Put(m.attachment.Thumbnail.Path, thumb.image); err != nil { - m.err = fmt.Errorf("error storing thumbnail: %s", err) - m.thumbstate = errored - return nil, m.err + if err := p.storage.Put(p.attachment.Thumbnail.Path, thumb.image); err != nil { + p.err = fmt.Errorf("error storing thumbnail: %s", err) + p.thumbstate = errored + return nil, p.err } // set appropriate fields on the attachment based on the thumbnail we derived if createBlurhash { - m.attachment.Blurhash = thumb.blurhash + p.attachment.Blurhash = thumb.blurhash } - m.attachment.FileMeta.Small = gtsmodel.Small{ + p.attachment.FileMeta.Small = gtsmodel.Small{ Width: thumb.width, Height: thumb.height, Size: thumb.size, Aspect: thumb.aspect, } - m.attachment.Thumbnail.FileSize = thumb.size + p.attachment.Thumbnail.FileSize = thumb.size - if err := putOrUpdateAttachment(ctx, m.database, m.attachment); err != nil { - m.err = err - m.thumbstate = errored + if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + p.err = err + p.thumbstate = errored return nil, err } // set the thumbnail of this media - m.thumb = thumb + p.thumb = thumb // we're done processing the thumbnail! - m.thumbstate = complete + p.thumbstate = complete fallthrough case complete: - return m.thumb, nil + return p.thumb, nil case errored: - return nil, m.err + return nil, p.err } - return nil, fmt.Errorf("thumbnail processing status %d unknown", m.thumbstate) + return nil, fmt.Errorf("thumbnail processing status %d unknown", p.thumbstate) } -func (m *Media) FullSize(ctx context.Context) (*ImageMeta, error) { - m.mu.Lock() - defer m.mu.Unlock() +func (p *Processing) FullSize(ctx context.Context) (*ImageMeta, error) { + p.mu.Lock() + defer p.mu.Unlock() - switch m.fullSizeState { + switch p.fullSizeState { case received: var clean []byte var err error var decoded *ImageMeta - ct := m.attachment.File.ContentType + ct := p.attachment.File.ContentType switch ct { case mimeImageJpeg, mimeImagePng: // first 'clean' image by purging exif data from it var exifErr error - if clean, exifErr = purgeExif(m.rawData); exifErr != nil { + if clean, exifErr = purgeExif(p.rawData); exifErr != nil { err = exifErr break } decoded, err = decodeImage(clean, ct) case mimeImageGif: // gifs are already clean - no exif data to remove - clean = m.rawData + clean = p.rawData decoded, err = decodeGif(clean) default: err = fmt.Errorf("content type %s not a processible image type", ct) } if err != nil { - m.err = err - m.fullSizeState = errored + p.err = err + p.fullSizeState = errored return nil, err } // put the full size in storage - if err := m.storage.Put(m.attachment.File.Path, decoded.image); err != nil { - m.err = fmt.Errorf("error storing full size image: %s", err) - m.fullSizeState = errored - return nil, m.err + if err := p.storage.Put(p.attachment.File.Path, decoded.image); err != nil { + p.err = fmt.Errorf("error storing full size image: %s", err) + p.fullSizeState = errored + return nil, p.err } // set appropriate fields on the attachment based on the image we derived - m.attachment.FileMeta.Original = gtsmodel.Original{ + p.attachment.FileMeta.Original = gtsmodel.Original{ Width: decoded.width, Height: decoded.height, Size: decoded.size, Aspect: decoded.aspect, } - m.attachment.File.FileSize = decoded.size - m.attachment.File.UpdatedAt = time.Now() - m.attachment.Processing = gtsmodel.ProcessingStatusProcessed + p.attachment.File.FileSize = decoded.size + p.attachment.File.UpdatedAt = time.Now() + p.attachment.Processing = gtsmodel.ProcessingStatusProcessed - if err := putOrUpdateAttachment(ctx, m.database, m.attachment); err != nil { - m.err = err - m.fullSizeState = errored + if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + p.err = err + p.fullSizeState = errored return nil, err } // set the fullsize of this media - m.fullSize = decoded + p.fullSize = decoded // we're done processing the full-size image - m.fullSizeState = complete + p.fullSizeState = complete fallthrough case complete: - return m.fullSize, nil + return p.fullSize, nil case errored: - return nil, m.err + return nil, p.err } - return nil, fmt.Errorf("full size processing status %d unknown", m.fullSizeState) + return nil, fmt.Errorf("full size processing status %d unknown", p.fullSizeState) } // AttachmentID returns the ID of the underlying media attachment without blocking processing. -func (m *Media) AttachmentID() string { - return m.attachment.ID +func (p *Processing) AttachmentID() string { + return p.attachment.ID } -// preLoad begins the process of deriving the thumbnail and encoding the full-size image. -// It does this in a non-blocking way, so you can call it and then come back later and check -// if it's finished. -func (m *Media) preLoad(ctx context.Context) { - go m.Thumb(ctx) - go m.FullSize(ctx) -} - -// Load is the blocking equivalent of pre-load. It makes sure the thumbnail and full-size -// image have been processed, then it returns the completed attachment. -func (m *Media) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAttachment, error) { - if _, err := m.Thumb(ctx); err != nil { +// Load blocks until the thumbnail and fullsize content has been processed, and then +// returns the completed attachment. +func (p *Processing) Load(ctx context.Context) (*gtsmodel.MediaAttachment, error) { + if _, err := p.Thumb(ctx); err != nil { return nil, err } - if _, err := m.FullSize(ctx); err != nil { + if _, err := p.FullSize(ctx); err != nil { return nil, err } - return m.attachment, nil + return p.attachment, nil } -func (m *Media) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { +func (p *Processing) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { return nil, nil } +func (p *Processing) Finished() bool { + return p.thumbstate == complete && p.fullSizeState == complete +} + // putOrUpdateAttachment is just a convenience function for first trying to PUT the attachment in the database, // and then if that doesn't work because the attachment already exists, updating it instead. func putOrUpdateAttachment(ctx context.Context, database db.DB, attachment *gtsmodel.MediaAttachment) error { diff --git a/internal/media/test/test-corrupted.jpg b/internal/media/test/test-corrupted.jpg deleted file mode 100644 index 86e4d75ceb..0000000000 --- a/internal/media/test/test-corrupted.jpg +++ /dev/null @@ -1 +0,0 @@ -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 diff --git a/internal/media/test/test-jpeg-blurhash.jpg b/internal/media/test/test-jpeg-blurhash.jpg deleted file mode 100644 index 6b6ba472e3e7bf0fe896822ce0d7821cc80d7135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8802 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 diff --git a/internal/media/test/test-with-exif.jpg b/internal/media/test/test-with-exif.jpg deleted file mode 100644 index de56cd6545877a1bffa9eadac9b597a01c22cd3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227452 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≶Cr!#&ilUDA0de$F< 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

^{;|vL*m%SA1X9G{<>2&g`rn@s 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

L3%!JZ2S2@Vv;tb_N}&FXXgjfGg7=GpXWe- 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%0DZuD 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 z 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

!yG3r5Yg;sEBEIU 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[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

cZ=(Nl19tOK@MbaRqg@SXV$a#) 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 Y3a=4)Orqb5tS2ea#9HD{euXYcA3ct>v zX7Ha0RN{NpiM{4NPFaW`nP^LRZpHI6RMp7)5c)BH=S zY~p)ubzAQTKT_A)E%967Xd1F-#y zX453Nc>W~r7|=R~6`v|ktlR&40}yZo5uI~Jo@t1P?i#e-013popSn53xrbj(Px4^| znAGo2Vf={~sfb=W8jo(wS+YgqSEu-ireqqH*?;lY<8=EPA^&oGTUfYY2u}3Xf9!9o z!+DbX`>#E(bEWZ#zS#QPQMXfeZwu6ADbNiY{^)cq0Fhz#mzXT`@mjk9-|tla0q~`+ z_NK_8^KuSH1+l6)!SGOR2NI@yLUbTKbtZGd_gS1aB+w?uV%9-R@j-(pC@*ESYWc%;jGcEyZI-jdr_>kJ0O^GSd1n8Udr$Z%oWx`cZ%w$aM*# zyY{1ZQWtTF=W&kJ$ors~NhPc&e}G%5dvm5npRDZfliVuHp#8ioi$GJN9+Vsm9)5eMdy%&|_h&RjZ=HC;Y zSg46TqU1@0k$Z3&Kt{Y$kwLuTw|DOX9Q?$qStv0CjhouF1+%4mGj^@t;J{Y_+p z zZqYqfl4kG9Bi_e4XI6;VX_*8L5OY*xXxrYI(Q~TefGMqr#Nm!JG5Ab5dV-Yseoa$m zRd@hTUl?48rbzoh!dC6R`Jp$j+N{-oMlUiDh{SZ~tX#7fi9P_`wi?GAZR(@DwlY48g~&PK*v zk73}Cm!S|C!c zdC8-T#p7kW8~)c#S!9a3yFJ7uA>=Q;1srQ7M#8Hyw^ip=oy}6oxo2IF#k3TShPK7NS926a$3C zRo_&5-PHfwAnyai0YEC9aN+$nc}VY~{Js9!GyQo9W{#hr!mTTm1v2KtfAX8}D&!rbU=O^86251t=% zZ)$<6^d9vY^oS8jtL{F7?{IUkHs$U1K~wHp5^z5`_%T0fNjwDlp0s> zkC*3!p$*XasIGDB$g%GSd5Yy6=rc^m*AB2;s=x(>SO1d%gTL-bLli6X;;Xe!^rNH~ zK8&Lxg%>>N$F>T$ol6ioaHPgH2&On{05(yLw{jvR07Cbb^%!H}0ZXmx2O`l(G{yp( zSduMnM7mNL}M~tZKN1zNIxkj<@@SSXoK;@<>L{?b3G^n z%|QI*XW80UpuC~(1uA>i>m<^jM_9sxxuz43LePwjJCDsv7~4w{wE35soG@!Xvy@AW z6f2Z4TYn>2)6?64;l-ZrPRi>q5;*IBXA*9IAabQ0VM=Nqg?(kk(bwm56*#ywB=4oF z#v_NnnQcm}`f!<(*@jR(AAet~-xUHW%K`5MM>}Su8U6%v$8GlcLgu{ z;;8#C5&exDrm?&~77sdnRj%Bmfu{FwsbrZIa-XA)w`NF$$V#m@ zr@XwP#$*~t*_1j4j4#$9a<3(ZGGvlo#NPK6WJHG59>-XdkrSEEHckWC1;pAO&~ctF zNc>L%C29*LRsXYlYj`B&qMRhewYR)5l`?3PvOLwc7rj*#DzG%+(u0d=#az;5-_pv1~I=t;L&Pv#DS+-82XzUCv2li`?eQ zYhZn~D54VL6jH^lua0(d94^8>B<%SwiNx_-St+DcyqY2rcctDb7s2D|70!rw>U`{Uedrg4#v3e`^JNsXU(U9iLqPii;{svC4){Bcet z1rASIRfEmVSne-7qn-%7Bwx)h_}`TL&U$rn$K_m?9@<16_k8$h1kVB(bBC(D`r#mV zSEuht(k_XT_kXSwNl(i1mFiwXDbgeNdsjVjba31R<9x?2FzlQ;YRMjG5F`*bI|Q>^ zrfi>*(xlt@ej}}jv)(77!{ksnAfJn%k(&veN^GQ!uyGX~^t9_c%9nKcJojn3NLhBc zC>{7a^Q+HW&xx6gQX*EkuRQLkct4Pw%Pm{7WxP^=f$=7*jE`ShFaG-bSLad$|L^e(&xRREL+9)t zUxch<2`lOkr5)$|jlu)YRD@2Ix(iX-nKgS#F1jq|BZ@Exb2Z=RGfwvdZkVs%&db=d zym$DehO+$O$#JgvsVT*zn(CL?(R&7l&wh#zEhMz$(o=7x7I6wAn~M01tt_-(#Oe~g zXipsRz!`G5qvT5yKJSX-N82J+VW#zh9E(uXuMtV69#hBy6Cl*SJ-=|*H7&dQ2x9 zpw7!TmkH7P-zS+B0=x6H0XO>%+YCC6JyOkj8rH~M9-}=P=w4pxdAhKaPj2Yzy_<$> zEvY*6(D#}Ec9u2qq35KT+e;h8uBPKe#^{L`>sk*QI_7{=NG03b@{y~Y3(j;h?)a~I zKq3~z+sYA72xr`1$is}kvJQ=!lyPii)JF3(dd*m~n)W=_Ho*=?x%lN~*<1K|m_=*Sp_91NC z);wR*e)Y5PIol1a;jxSKb8ek82TY1*^SuQL3WVeZ$h&4I{o_QKm=Xtu=s|Zf zVOdd()JUZ>JX&E;obo}vt^Gqb@1ytrpwCRFK9Q7F9-w4zwI+*fKKBpMhQ|}Gwg=y8 zo8j4S2pw4v*6E)q>LGEpvWk+1HYZ>9paX&}ZRgvr3lH6!{Whp=&e0 zuSTTO_dubDN|C^2q|I5~?u$0@w_U=5zWK?2<)T6->MZ{5{5=P-D-0U*a)!j{(voYQ zn{H1##nQ^53@o}NjNZ^Y@{pS$`)a`=yK4SOt}1@h&SF7BJr^SrOuN$baDX77v0&nL zH!>-3qj znI}W@5giy4yi+{!Kz{^xj&WwKa|@t;E6~cHuXu?$n-LxS+F=Hk-7n>$MBDQFuovscq&DGj5sYKv3Yiskctf zrz~%(W7G;T5n(XBPErMp^BsWfy*g?#a#*xUNFvmmnFTEIbqStz{$p6Ud_8#743M)x zc-&E_Rn~A{N!n3|7(Y^Oe>zRhpKH2ISSx?uVzccI5^> zmRW|1@SDXsN_e2RBvJ<)s4#q23B-G5BMqQ9--l|)7+3Fa)A1o+=XDS{ zhAqk4)^;)@j?N!JMhYR!Os&+`cDR)R=+-Zx7vix&l0ip;G04h)HLW=GH7~`y#peacp_Mdz zMc%omiysoBnt4^?*$_cJhNl4T1;graUYdGgwQA1nVB^5u>UNY(@(aj_vhR;k)o<4A z#DY5lgp!KW7d{W`N5tiTW#+C_l$_=Bcrwf;&z>tqd>4~C(&DDY zQa4G_;LL97zexgy$@W_eB*R|w8_JfxWdQd|(&fJ@nW{>K+u341NKD&i#68i6|I+mM zM!|j8pr6e0@?7*Vd3FFyeNAW-osHH8U94=NqoJ9jYMg~G$YvtN$kW)YoHa}Bg%~lF zyQ0W(j^LJRy%Bod@5&V{_9!RHe>&KHira8NgASgQDor9 z+6P#8rs?AzTLzthy42rK*=*t;eRl6zBoqq#KEq<&@e-NKN6kiue+sinTNUfd-Sa;E zMfD(C2YEhFL|>7WUTkgQl>IINycQE7qw?5 zMzw=8Qn zs97V$+PsPqXaX@4Sg*Af{k%sf%jd+x$3ZU4D|9{U4e^|A-AfKguG-c28iSxcU@+4n zKSAaE!6G=~GAt9gBp}VM{@JdKw2k1_Jye~h0L3CKBvsLpz7H>#2xT<$z{8obQdhyx z{)HCt*?oDx$KOO!Hq>8sR#m4sTrO7QI+1Lz*Pp`(&xyE)PQn!qR6&^l$E%@B>m=|D zh{2DTFwJ*e#%%XOjxwDneAKyHZU1<}^hVUimlRe;Ryyy2h#cZHKxIA%MiHP``#x9D z*|H&$EomIGS^h35T}U{T@LtYKqxD;^G706Hr?qUVmhXv2r7rYT|Kw>mK)RrtRn#)) zB>xau1a;W%F`KIFMZl9S^R*ct5LYL)5q8bT8BRPUglvAh#6xgl^!9RQ{9pb*e=XCn zK@t?bhPCf9TGLOBwW~>i$AFr=--A(xG|-@5q2}8{M8*E*7ccqad{dmAsSL+zmyl%i z_g)|SWsb&3aTPFXGKN;nNILWY$S@RW`T>I@-p55z9UdW8z_R2g-z^f!}{Rk~S6h zGBK#rF-jt_f0P0-HeNr@mm7*II8TjfmNm_N6}<-9E}&p@JzjJd1?NLo1Z6d;uKWs? z=gEgxV7Gq5%W|>LgJY7KwUe#w39BoVTi4&KGA!LlGbi`!hrtPcR7JQ8h~XzEB5l^v z>ZFg3Rdbu5AjqB0{rha8BsDVqD+!O7mslC5n*(Oi5%ktzg6zww`q8p;KTd^ek|k+U zxrolK16yAOOtnkq%lu^$H0oCReS@5kBgJ6lLOHq$Ot$bAAkb6at+LS#1?^VET4d~- zHpjPZBQq}Wdg~A5sVt-jiW0$QYi+~hY^wa()235W^8r%NSz-WTmJ(F!T6CaFBtV`* z^=&QivoBwNiq6ygPPcv;wZkc^u7~dHwV36JVS+1N=7^sm+yCmj)TDQ3MuYMKVT9KC!5G4^eo$h>h-ma{v(FaqxEd(O2XY6~uOgDOKJEMX(dtkAruj~0uWQE_^ znfWe9M1tUdMDZ3mtUd3aK{Hg&jd!FLlq_TDbj2QyE;;&4{1!Yhv(lBqik)Y3O2S3K z?{K#5g;cm#t+qCaVLOgn4NM-~kzgs$ciEfUxU{6kI=SH z0)!(QYJP-yh|V?u=lItHGYCmylXDEIr|2TTED7_j`>weOQ4Iz!D(V=VqC8FlP{OWR zZ^cLJ7SbD;EO$p;5`TS#ywnvysPe6=d}w-h_>X2I$E zD%Q(Kxfss|-ZnNVw@;Na#*RTKS;{pyh@m3km`?Fnk!`MQ66>$TD{UWR4T^(OEhGXo zR60%MxE-x^@bif}fF^e z2k-^a$H~?%25SsRXS7cS?C}U-7E#>wq}%K{7w!p$Eq+x*vz`grZb3gsEXpWNSKin8 zFullb_dm0H9`jrLWeaFo-J0kaZJsU@9ugabZ(FJ`&YOzSgxY!2H;6GgcKG=GPJH}u zfP}3{kpH2o56NPu3G9&9u`1!C;Vp^vW4(*t!t)=1#7q5TLck0f&vJ*2Y|(1A47p3| zJLA^B1Q0vv;@)yM^)1}L^cP2t_<*$8tIt&q`!tg=gS}B@uIqs}%{mp$4B{`1Fzdlb ztxxw%lved!dy{evDiNC>s}VoDHu(BPq!RK0$03FUL=!O5KTG zM9(;Srsx%rksR4W&Ba(C?sF58H_g>|AFiT6XsboUc+f|Q%M#t5)~*C=!FtGreM9HCP;^=%0AG9fSb28FQ~DgWG>AwJly!H?@-TWL%Bg4trgcw z4<f`9*s<#JLcpSpSSp!HM82kOe-HW>JRkr6)N zJhQOi8+eJRiIi8}q9-6$K9*@82isV)OFRR9Z?-?s$v6KXB!D?@iOvzh480F99+1B@ z{$Nx$VXw&`VeZE1Z+kv{@~(N;>wSS<90KPwIpg=Uk=|xXne$Z4Gk?aDmff^J)wR>z zDxG+siPO%CZim*uMLk2caZx5vRobX5zBX18rYhSkV8_Rt{0Gvt!W+6$EIIkdD`QnO zb(+tn$%{#yK$yBuGga?)E#loavX`{IS$psGxZXJSrg`_@U0F&?{ePLq&r~;I0S(>! z9jJswjdKVb=fR5T}h9 zv6QAW=FLZG*SEcMcBOm!GxEkDV09a%0lfqqnLGWQ@98FexY2=3(?MArRlHKNAd;g{jRow^{ z@|I@da{c|V#d=YJ&!-AO2}%(kCt*%0O(>cpWH6C)!{2{OCiKLCi`sjn`@F$9{OL~7 zc7G?m6VFvU=krfNWAGVPP3xQaL?9G44!y&q@$h!qM28~{ar`nV8=pN6l3tqg*4~Zd zlDC95Yk;}qWam7`^iSdpJ>BVRBzXjiHJ)sFkbHTaS^+q*Xl$H4x;C=+f|z!otPv9O z-@Gu|CrF-UEMLC<^acrLx_kBEP`0urEv!aA-6obg!;SDQ?%G%pf{q6YH;o@!d#ip9 zGD@bbD&?8k6a>I*x!xj^;W&&PEE=A8xCf@Pz%8VFs=3p z!s2SIY4W%~aFet>u?;%=cj9WV)wa}o=a=cQGs7{_62e+~@#SUWLm@TEnyy>rWCW-6UZ|DCPPk5^#KeJ2{ahCSoRi=5Gov6J^Q+*--_lEbLL?=x0O(w<9~O$Ye;%RDjMB>u9bF_=LUnh@jwMYfvN*e|oR zwr*$UW=6cmQ{mz8%SS{MvitwYqVEJPyRF@>nF)S-Wx+aBED#=HiRK?p%atw@Oo=*~ zxNDp-eI$?bNf=c%|K-{;>Ua3eu~thq6AuS8&?h+_j&t3xmMQFdqc4mVPg5oq#Wn5! zcrKKLLM#5h{cKPresKIGXr+=rp(;;fa$JAEGy`sOSPLkJ`Krh1?@kG|myhX9z|Il8 z2;S$yEPuJ%lEB4S=mqkXG{H&58zXMAfaiQoqlY`6DyWgefdyPcj4 zLF7!qKDm_HW@DOO0gKG^>Bryd*Ir#t>2kM3;qHbAEN9WyZgoy*AG4{Vbo^$#Q){v3 z=zFxh*5S~*pR2P46?R&*Vw&27HAv86u{05kmYv{~G*r)aCC!Z9%y6%XkDeU3tvkpR z$^jlUxd}1F9xffee zp6}MU8O(_hRm)R{XThn?#9PsZIX_oT=L>=UqZZh%u&jUbmqVnf5zc7+SxWDcCjI0j z(N?n0Qi{ZQOEso8;eBOtwsGB2!Jt_t*5c9#$<(T()|jq{ttfo&rpYa;Hu+M~`0oEpT(_s4!y&*SPV z*>hy%I|IMIPfw(uN%GswOPwWtWSH!6?Nv`L%L**1vRvQ}j>^xaK?&cO^ucWXH!Dia zVD#Iz4p9fZxF>)(wCYe_=w~uWOU`nJ9m;=w?a}_EtK^|2-fXfN834o2f=oMmb(kxB zp)o=!=uzU3zr;Bqx?XYV=T9f^>LoVr+kId0L|oh5>@37hiR*Dr@KnhDgeN=}q^OG$ zn(^iicmW^)zfE!uq!&}H2|_3(s4Y{_DnSue*Ld?G$im@=qKZHh;W}q}4ja5}BGq1@ zaw{bO!2(Z$B%g|bqRt=n9Cu4oDYT0_-+PD+B~8wT)qUBQMA3?Sq~vgeImE~!h2Nbv zvrA8KVLgv!P9-FN!2O0a2W{O}iv~Yyc}czckEkzXJ95TeQmbP|WeZb}d97-95jb~f zVbCkVw)B4-on=&83)ii2cPm~bSdiil#oZxDkQRsFu5ED%9vp%@A-GEq6n6-&2d8L@ zl~OtH&Heu7-yYdxti9%%^O-fOF8Y~WKXZvDK5x-zIK3w>t0DAaOiS`rK3SU*R7)q2 znKah6x&5*(uveVT#SmV}+mj$M&E3Xiv@{T)RZtZYhGx}<%*wzs>{ z^ERdCq21J_(v98Y+5U9X;v0n?4uLTM{n_cqhAJ4Bxw%s4v4puKObWR5R6BHS{w>jV zr}t^xL|hH(NQPeJ6Vx#<*Xsx9^5@ce6>tq%{qlH%NR~bI#U>62nFJthQQuw+#0)&# zKdpCvXuzhQxL~4x5(iiapJ-##07Jie2pvU?_`VNh53p|iSM6fRjAiJu2{jtNv!~iXW)6TiQjDBn%vC#CBu2-@*yx7{ovMAeQ-8oiqJ_$y@nS z-MS}GOBA06X#tvx5J5`}9$G64M)R4WoT!?@HW%Mw9cHR91R0~5x$EMwF~q3J1fwp! zvH}*YhVvR??vzgQ`6GiNUXu+@ftSeBv-DW}w_I(n0q3tftq?K6JgqLQ ztnAeF>ZLFgLeG$;p&gvXv&}(ozZzH*vFbuFdiG6E$cB%=sE)o7m1N4vY@&0Hk+%EW zlh^&gc5zsq!W%SNsDp6wX(sN5C665OK{H+ZG#q;ch(Z8ER@T@FIQ!%XQKSp zVQ)jPN)>>3UEDsI@NhGPw54wqvnjfqHugOKPJG%qqCgMG^Vc5X<2Xd& zrn^3}z*psNT-T?1i@IHdX!LtIEDdhYJl*?eukkU31Vd*`j5W5IFWXv^`X;R-y+DGj zC?zb?zSke)4^S6OG5EkBKQjDSs~_ekhNmQbW%1?)wQZ7BGJCaNK?#h~y3%Llj_WDX zTIxuLNDJki9h9@kuI0svQjv)QhoD@Y>Eoh?T_R{h>&j0DIpx53!eN>WA1}tR2xX4S zSNim0UeEm~u^YC$h4AN=GKC9~c56HhN;F}&LL+&G(iJ(D zw^)??KutB=Y0}Xrpm3?ZyC|fAv8YqDPZQ9Vj``I+VNO+%(G*RDft?lCS{n+BMMIHI zhNMGZyW;-TrOTO!FJjJlL#pe0s0hP9hp&~t35&(zQixbnFyTX1Dw^T}TsLUNG!8|} zLe2a;3cmkAdraBU*^SbR*!3wkdP@I6pA#ILoR5Iwt@y`G#lz7&6j>iP! z7BVy%w%`(@$NLrYNTcX5w>zD%@FHzb;454VC@yy+kSSOtP5FcrtVq)nnU&!fMdScSL`MY;;(&!() zqvpK{@%c9kS=inz;cJ$4R^G$T(hHDm1;xq9{av za`kh7sI&7Xb(m8?Z)%VaVosqYao*JtMUh!iSfkk)I&D6+v!9rR={Y)5Hzc1Gb()o= zr)&H((DU-A*{C;6tjy2+#0@us8LxK;hw~xnJhU}Xat=sgk-Q)7J(`$uiL{7nyZsSrWq;Yn+U^q4 zvR@{Y(+j-TQ-#k{vf)M}h!k<1Yu$&UYH?UQQ_ML_UYW$~tY0_#B)EeaZQS9c9(U!3 zsdUeBWHRBf%7G9bYdx%LX=M{t)(oz2>CDFT{Vu#J8V}JX9szO*EJ2%jfa6>e+E&D2 z`zk8IPOEW3sZk1*xyT^G=)UP;OO76$=ei7znNu@pd<(A?+46#i`Yq*#hX$@i-l}X^ z)?3c{7Se&z3v)M}3b%{}2(kNFRKXcf(dT+vsqC3_eHAQQ?Ll4)zj6KFWG77(tM8v` zlL`SK#}NdD3Jt|ua7zGS-$l|_4&~S<&@Q0rasskY;a^j6@c`{?ym*-BkR(Lk&Fk;%IsI&)-$+8`5)Y-^A8Nk&a=h&mS%Xgt!7X z#}53=d15?L!y?n49yT=l?9FleOhwUlQ~ngIx?DBe;xmZ~s%ab-ifX3-qrxJA_}8X- z0#<P@A^ns!LQJ2e&A0+@%lsa)zs;FErL1sJ#-B*1Z z<4Rr|8)THga0lyO$W6^i=vd*^=898CYVFH}^4D;bHAm)5U9`pfHguNrF(OY$P5;4+ zAVa*jm)Y$5xMxj?_1UcgNFt*LI-~+#e9?_02DA)e#Q)E1t!f$sCF};5zffM=j?3Iq$)G)^#nn37g4pht#7}Fzs38T?>;x>Z8Dfe4u6~-uUlBnd?WUOYwQn$Rn zq->I-{XajtJJThN_8RV+BBm#G1S^Zw9=Mnw8p#&tJQ9c8ABb2Wt-#I>Ns%S#Vz)TLEDMkDlK-tiXWHU6^Fixb3blhq zAy@t^U-n~t7q?651fmD4NnV#Z{s_&Pi@9cCmWKsi@@*!Vt$2G|ii#)?D{k-a?GJo_ISu5D=w>`%7Nh96_`p->wYw{4rxw`DTj5CUR!%=Ic2L**=I!z z+q$w2zL$5R(tf>A?8VZtz^Iy4rgzlo?a)KO$QoKJM_NMiBTYDxmIbp(5~`ck+Zx8Lu@ME~%WLHTo5xz8``6+)$ zTo;YX`}45HF+EDXUl`h>L9x^z5A9$)Y<;;}uk~2=o~4=`;3?%F)%=`^7lH*%k8JMULv1XmQP(+MIqxAyUj7gZp<0;CO2JS{q*eM(|y z?^lmNnW^1M->!^ioEZ)+joKI%!=d;Q166~;3kvEi^3pBY=lk6UsF`%yYX?>2E|1Z)BfwEf&S3S8%~~tv_xLl z%}3Fl*XXi&B<>nAoVDy|LfTjks55l*s?oyipGV!onmA7!%GJPzxacYd`6aCCYPN&b z6i8di?XHycBl;1AEW2~pBq>MgB?wN7)XfxLYJv(V98S!rB~WuLvgw1%em4Iw`_tn% z9b;8GTL%f8^9;#O+`;n-MJB_cVdg4he|J&r?Q{LrZ#>!Vf8Ci;u4881H~YKC@yX>l zk@0zRJRD<`RHg)T4Wz?V6-f;IZuXJZ|Ky3WAJtD(5_IzbK6Y`+ms$$JDd!bUmi?`N zvcz!wmz$5!zE4OCLwCts(G-BBCHO}L8V31*AKW)l=jg%rx2^ZBJ?|s{n#%5LLGxFH zGlh@+7f}wlUuW($d*5VDXkx$WiCS`$@5kKWeTOVBbq1Ep&LsN7pKN!!l$n9dCY}N@ zp=rl1j?V__CfivuMrh59uDM5yo}Tutj?;Q$HazuUb(emY(Dt2B?>SV6mAv!J8&hVw zp%{XpH4Yl2usPypF3p+SYJ7tf@EVC%y*+rYAFr~hC}qRD^#gf6*2aqn#HCkBC{%Ay zXdRZF{6|^3y23uybY}T(mPGm1J!Y?}z=kAt_t#n>=PPP_^Rtu}@NPA(s9_|CxB$I9 z3iM{;Vgv534D&?WZqPM@D-vMhENoYA?bo>~9a7sQ395^b?}b+ZRQg|BedZr)$2JIo zqS>kU!29|#49rDZYE=N$`xaD1xxl|Rx{)au6TY};(SrQZJz9-Aa*Nqz@CPZ%HdRX* zU;3%V>^qLZbJi670R<^W1Z!Gdfnb#wWhQ?3S0qZ?!pU|>Ze6f_aEC?;gXmIx=M$eQ zw!XJS1)^qHzk-UqsA)SvX{Vn^pl0~~ZUo7d{+hReIqL$<&25o^ITqakU3x__B`iyH zKD#>-blM1udwN9fNLq1jTfof|{Lzlsuc=?Hu^RWNh8vDLaf@C}(M!;dmoIV;28ZL( zEIZkwGX?OhPJjHp`}DQ0032iH?4pVQ{DK0zCwP{YY9I_4ePLv)(mb#lSSw&iF|2ny zL^TDL*9g1iXW&#zK${bXGEfMcajMV9(@!;2GIGpEh&=(6FyTsH({}enQY6KsK=cwx zde`!WiPc1Jo_v{~R-8FSt1py+vLSM$ju%nzGGWG8il z@Pn7^UKlqWPp}yDMbNNPFXjt1F(Qz7bq&$Cf3KAJmyp(9f$sDGgO4fR)6I^~$(e*u zAY!dPqX1bR8XS>qrZab#p*kP&ChqY?ygrYTmFBq1Xjxu?t|(a?Dz<^w-|L(fXezC02F+(ZWla8ZdnUcGU&x9pglpn(Fok2_*%mKMfkgtI?&B_ZN>3 z^uS)W$8UPwoo2YM42zKE?w*+6vkffiXTMDUgNh& zGOX*K?FtP4kVr&%fg1xky*ScxiMnC@8GHWd=-Y^XUpFgM#;yKP}p$b#f@@wo7|99t?MF>e(ha;5C|@b&*A&>lUodwR1*3O-`KI9 zyMwpv59r4Gp(#43K0#S+%pD%VE9*Q~$LSskH?jm=;)fP6%)H2frYL>iMC;y2Egjg6+F6@>~pJ>sO8BZ zDABA=E>UkK5q@Q0Kx@kv%4%ec-fDjt~2MO_=Vl$vMcYBxc8HeRj--t-htK!Y} zwtABPT&xxhA(bd$oAk%8u~Og?9TnS|0iA?D{8*O`u)~cORcJ@}ie@+lkGlep#XgJD z+DE$HjpX;%W-ZNAv#M3MsP-A}w`^OzK4<1*j*fFEhn9U&tX2oC4@EjBx6<+nJU+0( zxD{ehjd^7YhuY`!tw>}YX{I0T%xq&j*4O5yWy?RCB)hushW=<)HBOny>XBm2-7}=2 zTN2KExUxw=(wK|`8vlo(vqszZzvb^p2i{x2dw9e~$S&e0!Mw1{ z+kSwACyZx%M)aK_-~)8kD_$D)L9gBpy~%BcUX4>;tm|Y`NPn|=3zg_xc~fO+@N{Wd zLA;5 zGr?hrEFwhK#l{i<3-Sp>@yS zMJL6wm8sG~$^!K7AD}gCB;U^9uD3-)4Jw&aB>L#U^=_X7zMrL-ljFWSMqkKzZ&S(+ z2NL}ekLnLA(l9#D#MhY}z=0ix|9EUr^_)pxmx_;Td$_VPnI0RAp+ChR9Lg7xvngL8c zOg3bHK;mf*nF#8l-2%(O#ZzGtGGVzjjjnV}L8!~DL-lu!_gsc^;pjTbz14~N#UXcH z&yn`m(V$Z9H$&lMkBNd%QL8ZQh_`RS^(%=v8rnz(7-fAbdJeeT@#z37{it2^0;7x z7#b|8hu$K;MYxuEx}92jpe5T^~IrP}F@hGe4gAJMNcingedvS+cg z_8TNqfAo|FD1HE5i-^tkO|l?LO{8iQRhbK^V?uAhXf(~MhIpJe2K=(Rt1&@6oDIj& ztH5MEiUj@lm3UBx3|;Wm1nzcLJ(%bWn zTtGc`Xck0UKuCy(Pj2ctYpztHAV*L4Z&hBN`gzEp-@jP3!nl5BF7;@5g6pW%(W#{k zdGXSE&1g(;`M8wf5*-7h8Z0$(!C-sJ&khlL;5q#J{;_Ir5tpcBNfj032@~#fiqw zdBB9QhNjAt?5ihRlmFz6Ua*A!{_{@VhuUz?24)r&sNFV4uilo1>H61A~4jJs*l`(^ry z=v!h@Ek8+=Oh`ERyus}cIxEEBXD9h+`Y)oyLJ3* zIRyRlH0EgVH_*pDY`)a;MWj~R?{=kzyos!2fhGXgr(8-^AxYi|LojTalda<~#3D=g zHSaO=hJ4`)jV=u-JwY8$-{;)g-Ppd?{=$wsfK;9J|SU4+MGmaX^Tay`HfY9^E zW}3ZMVleM@~p@#UWi2USCpXr^?g#lW9&Y{P5Z) zRzFr>$QnwM*?wgD5<+Zw{1A8ly1aJeh0Ytq0W#SH1YMXTy$UO5o{uF|O-(~FjeFdW z(N%j-H#cz+eGQNkam`OSc_}$|+BfP=*~68ZIIc*`SAsxn(Q{P!KmB6X*U6eQa%Qk) zoePJ&^LbC|qCy9cDC&?IIchVCsbe?O(wCzqW!f*(eemNIR0GizdV7==Z6$x>=AfbA zXQVYX7c5EccVVKGT8G;{`G`Gm~c$=4-ckUMP~u9SJ*i z&v)JN0lgVD*69Fzfw0Dwdd;ZDXv6xtQBDKVxR|$K2hTpa&bG$N=!`G*@2m@rCbUh> zS*;w{`bJn9iBr0IWhUqNY-AEFHS+EX;7@h*N6|^<7(L1+%3fS!b`H%%|8*sY;nmRo zvY}H1cWcedMWe?atMo|*Zq9>AhY|-@B1g6L>Ohw{A-Z^+sD5~W6(91QN--<<3?^L0 z8C37NuPU^A%oA&(P4b5O>*AqOg7~z%a0JOx?zCgqtIYmkCioLxwYBXsZpicv=+O7x zGw1o>*IK+bPH_**P<@*qf!EArE0v$ASRqSW9B`p-Y0O--j}3cwG+5W>z{e1;(3WGP!h%-sq3yvdlp9^ z^YMCnIi8fDh(Z9k)j;QlI18%!7JYQ&zB$apwcPMXCzD&Da&e{ChV4Vx$os=LqAR|M+oU;%PNm3PEz)L$1blq>P|$+$guKz5 z>xouJU~P`RUy~l@PsU#eFA_>}LwJKlo6vMZRK!am7Q%JAf=)fjxu%qy7caSeZ(J^# zbgrH6@8+!3g`w7&8OiyTIi)h@mXdh;JX0D}hQ&So$a=;h5CkgD{#* zLku(jMM7y&B6pgCvi@kyl+++}#S<~xu#7|rN1N@8Hhy`7Ah)&gKMZeY>dDdm8`&Q> z__rbn<7Vn^Q*!Nw3J@y}-BtHRa*$W<5kM}_^R9I5i1pYxo9>KC3T%}-)c3S5mHNE=j z${*KS$kwcvmqrBCwx_xVh#>XYe<#Q%QoVXWGz}5hpq9 zre!vut#z@~tQDwNBUogXqE3RfN?h%T8UveSk0 z9s6AAt=*Pxvt&+Y!!r0m*~XF3J45s$q@m<1X$BX8#!{CE;)r%fTO)Q`RlvIOy^B=LNRs<;0~B z))05qL$sy1Cb8BK@!@6KyV^{68>2WjumzX(Z-RcvCvVk>NgqGc&b$pjd<;TOaFG~6 z^!g_QQm4&m07_iImyDN5+-qO@gk&@eOtrH!PYy?sm4!&eHOPnHM>sLI-sk!@osa}p zc_q0OxwC=pmoOlWdr4*P0gLqWy8Oe`{v_GPWk(N4-hVc_4-uv&jC>Hv`Or#w0RJrzE?mGg-7m8p zzTP!v2vNq)26?lKRyfFr-@Z~A%bE$GKL{Bo@8>>1S&8k`uD`odpRKT+gIH5!@9SfE z1CCi5)2iF`Ij0U%AEyvA7othKAAp38d4yp$yx-L0?Mbcyn_soA{VW7$VyBM^z1mOP zXQNG~+N$2O=90#kqvg^+cQJ>}&IHOMKM?sMVK~6I0Mi2xm4PUXRg#4j^CHSl=bj^C5``AlqIkEwmSZo-HGuZkdH37m%B?yQXKOV4aa4;T#< z$aOiU`R#&h5Vok}Fu-0Ukw%j8+~D=bT#fE_ux&&!7qFS7Q-9U~h}JfK&RLpx*PA7% z6wkz#zNUQ}{LfSvt-Lb{sraa1I<9dK-kHgztXWRVk2x-;8bE|;Gj=0Q(su|!U90q+7A#u!G9H< z!brlQooQ69{T<@M1VvT}T^b|{ z=Sa)$)%EqS>iEj5_rYt$g!2SD=q_}XMqVo`KyPyr$%hp0$` z@PWNS6@W;%y0RLYv%LDC>~+M$;OTc`)ng&L|M_N)07=tjTpAZk$fJBkh3`kN#&*9H;NE#KDRu(<4eVM9h=fpnAaZC7Akv8|L zqtjcCvZ5ZJbq3E7(+5mcvC>*nzIB%+iGMlIdIK=*A-NK5{VmNc65tYL0Qlqtf>+ye z^91Xqna#xY(LyR34>Qn5IZ;mlYCYL!%a!!3P zU_xT6&&`cNs9VqWpBmWZO=UtHAvf5ltbI{6=U(oV_8F8Yu1MV;{%dfg)U@Y7EHO%Jowm%R-bU17fN@H_%`|6H=!k?sh=$h8;`1effwOon)fZyyz0y+%XZ8mY z(Zt*5PLG4EU@mS^?1}iCwBA(Ri@(PKth}YPLR@K*P<0MDkB~I69&Y3g?4Y{Ni(-#T zzGmb`zmQ9YCv~OcwW+Lb+Owbsu|GMu3v2o{wGcVdBwKHQ>Te|l`rjY$6>^HEQ%#r< zGkYa4&B&2Ro*7|=x%V%|F&-kp36nTGy-V0c<5a={y#u13EEr3n+CO4dr+Jj!UtO0G zR#9A(c3KG7Ma0t{zE+9SsuSsdxPms{%`^v-z0Ec7aUhYJ+!zAev*JLdA0Nw?={MRM z>)#t(-viwWtCMgX2pU{1_of%Yv>b_KNTni51{mngc2|hfa&o~Vi-HHYh1JP{W0y{? z{%5<7V7+3ZZ#1wx&h#|^tEGVT?J+b;NmJF7tEoqTT@?z`(PwVA{qJi@-@M0Um*Xf& zD}58vY0sU>oOX8td9gvYtJFRx33pmi+CtB`pLyhbsrMgH0jT)C1SJH;@U4gW^^T!y zo6>@arHN%+3gk1oyO8p>L))l+-{4SN<^j*>JyDI1`1+Flj_)^Jy!zA{tS9lJK2oZQ z#a`GRP_Ff%WQF;-hI2}l6d7eGAqBINq8`U|l$>y~?uegQS?`h{Oig1_6Z?Caj9hl) z!k@oV(Q0E$%g^3#q7rQCz8^hpKSZMpCrdoz*LuixtQRaZDvf_3ISd#;vHxgsgs1SdCu9&}o&Pvvj&_lm_M@VsWtX4^JV}0lcwPA?){F`a0XCBnmRwc%Yitc<&DvA}VZ2(m z`X;KUDSISVtxk1WoJ~Aqp(U^VH@KG$xg*RSJs zLu4j%sG-&b(|Xav2otqm!LS#GKth*b zGnY3^PDEYImyRwUSBv;W`CJ0w^4kAq8>Zjs^=3M)dWg;uruxBOLt-Kjp$2|=Kk6Z0 zJpTb!r@;?QtGc>H`H#86nq~ungvEr}#fA}?b63xrZS|trfWbjW?r~a@&wfTmu!z-~ z$Wa)Y6^lHL*P^PUxpmnpV}_}-(T|At^k?Ea`sJ|z-CcTM&u+}FHKHE8j9(2m1E9+g z9SihY_vgy95|Re>pizc3%5%eZSh1h&rQoDIy)exci_9G@MN0w z8m?vliNBnA6XPS*7m_UJj7SjwtcPz%D(lZm!t1IOfv9djRLxjt8o!*WUvLNSTPeuX z|1hveSt>DRA6RqG|D*5Hj_iZpjWAmvLc?cxV3NkMp77JaJ7?t~BE7ennD|l6QncuwgiivSw^FE^vrf4N<-$gdZny@boIze3x!(`I?ff( zLK;o_iwpDec8b=}4JLij`9d;+qwZ@ps)}71WMw8iiSF{qolew1!NW(NC@q<>VbZf! z4|sQF!D*XH<7W*}t9EPRDiC*t?su@WGbQLdZt>zo?lOM$s$ez$A@6`>(9Wu&LU#g} zWa2JJf77ZJ-L&~gD@NsbzXYn1R3WkdXsYKb(yV=Dkp3^T$hk~SDU~Vxg?e(||2Cfa zleSGWMT#a?*@~oIG?cHvD|&amsjC6F_W3PXZjVRr4IxBS=m011$8sue%;S}<_;Q?F z%!#>19rO6JN?gNb*R%SqSuk2%K_0V1yqw3z@OAgg(of`1B($iZ6~deSpUog!0w9Auyhk9gzj z|1HgTuiyYt+N=RLWmQbd%$}Nm3Gz8BTG=V)T%}=B$!iQG-MkYdu=&NXD(xl! z$W!9ZfUb47b*0_}9Rzdq^V^cSFcmSQefTZcI5|#}G5pS2CpimlJKoaCp)82hPdzG&J|Ck5JY&484X^Q8DK3Ou@q-W1Nr zsBu$up}=^R{#043DMO^u6jh12-NdJ5&lPoI)~*C1R9-2X%{nWYQ(^_KdNPk;y7u-H zGoETAdL#qJ%CTQS#S+$TXh!(!`E)YAxo<$&zwz8L&u{;?{3Q3Au3s7sf5T?ZIpLI> znF{>Q-#pZlsevV=3)1T3WO(3W5S$O~mZO#l@Z!*7z{DQ%bZ>7Gl48}jUiHkQ@4;#I zCr*xEKmHO6txgE0np&Rh7lElOJ;-2m`$HnQ<14LL9&Su}V>G_hGaxAnHMAp>X``kc z?NSb{E4v$=l>FZUACT&_3@muT@C~m+-Of;2mR1pKwFymkENx$H~osp}Eo!M1B8>!`%sK7`xZpGiR0T#^!}ermvS<&fT{Ufx{rGXk)YK$w6b zvGPUmPe#r;)SQn#U(tHT$#3ecZ{FI-wQLqU+LpUDsUD^Av1`Ikm-WnHR6>w0`Wt#| zWyc!n?P%bef+~$rFA24!p+9-Lbk#ZHM{!6jH{=j{6$}M;(2dpV+<$>&+vA@t&ogE? zvq#X)An=;qPun8X%&Kouy|eR@XM~JA{uZbq`HNXcysxj$>}}FJsKN7}%`V;g&>oPL z`<2Rpm=VRU`722&0$WELhaomyN|il%+TWVR2@9wqd0e1(?iJ!-K)g1Ri z6aJ;`fX9x%uV~_ETTH$_tl92ATrnzBrp6Waf(`+G*2ha(Xd@3%HYs^=p zzV0#r%*O}_k9!Udq0D#Zmw7|_`GU<8bHDGRdFzmn_~9!Vz`=_m30j3{I@k2?1KNOs*B%`*_#SijQ>P zrOm^QBdu+TzC3zmkb(ijbpEi$q6SA-Q+Qce za2CZt$+5gyts`;yifBEdJAL z?5Qy$kkv=9qjc94divaUVA_?Uhu+=3yHnodp}Bn97x%l^KGPi-i4pv(8Q~i^*$cXTB7j*59!-#t39#U3H3n9 z4T5L~=V2BgQ-l#BM-S5^rfEQlDLz0)Q-|fFQxL1syhZxdt`L2|ep4a_t_#i@!ptb3 zv@5kHzzp1-Mm48amo+ZBaCE=_p*{8#4W&S;ljl@tZPb|m^V!-%lgWP+U?Kh_k&I>l ztgqiyXVReOtTttd?tnk;`%v)H8xB{$1X_gPD1sJ0J@;iWV?aaV5vJ-FJ@e}q2;ti! zf(uSGBB}CYz$NZ@?)^NnU#+5BelI9BGpMeR=W z!A3eluCse6fIwewSaXsH!@mNqlvWMF|^VaD#fjp#VXsbvIo zL2pg1R3dk&+#$gHI`C0lRLqgNC`12!7*9P1)T3N*q#|&<*UHw>Fumdq$5hM zs@(Nv+Idp{WV#_+Nbg$XlXgofY%tKQ-e2|{M_*@NO`UeKmFV?~P$EU;lT~v6Wj)#qaOad;kHqKI zh3jl%5jESoY#r~&@dZeKo4Zty_;OCAA@f9#aN_|{RhT<}Nu#VE*mnYB?`obCi;NI0 zs(7Bm4Gg}i!7MmH$EzDs^_x4}I#XthkG8sjt#sH->R~^+m{V^!V*F4;K)qwQfwgIj z(t*Z~S?L<>FF-Kx=OXi+e*O*2CYw!8?8Pkq*?7{k)sb^3L>Z1sM(dEz_vnaPk~EF7 zFbPe%rm4lUTJQ%&6JUoXlaf>F;eg-z=kUp;O9jW?JW%NL_F$1|aO5|>e(1u=6N`$> z_S!L+ zme0=yOk05_9~CBL>IBE4%0brt=8ARMhUPin2}i1@-8Q=hdh)256TPM9WdSS823s<> z{IdIdECxSzj0|G7^`|CrRyXs~*t}-jD`R8V<5hd}F18WY2+T9=jiL^*DqfJZ!npYV z@!80Z%zMlW4V8;(+>Z)fG~*e1$V8wh5&mYt@7~6CYxiLPu(tBuJ&*InN}UNasUqke z1HiPiXwxcnSaLUfMM%g2NHl@ZaFmA^mO1DVg)d$j4_oxS$932QXKqb=$2E*~M6BIdO%#);Y>A$Pn+{G@zLQj+#U7W9sOeX8 zF;F@%+7hU)jmRMv9%WtQYA#)#Li0tQZVXA;*pq7dN|nhD{7ik@INlLB-)BefVych5 z@gKzohOg4qO5tfRNI1-#j*7gEC(J>skv|3Pe+yGo98BLjdp52$Uq`Zb z{;bUl-C)~5hj?lrC&52_y!B9$X7Hnq+l1d~r#~05I%{$l*ad%rg4;2BdY@_4U?W7+ zj2&bpz$r`u&^I&g!3fJ|oGF^_5Jw}Kq=Ww~YxR?xtm4Uu@9utY$8NwkKce8q53)x@esc5jM4_wIC{qZGI?K!zQYO0=wH5g zz{zCI{4P+M{36l{jT7)MYe`OLWr8~cR1Kvb=fw)A^_E*UovAF(*jFGQCu{yP!Td5~ z^Sm=>+k@jSWj{te?SKc?Cn+rU@Y_v|$zzipTv6{ZF{?WD&slR>i(SeHzW*{`L#i%iZ*`AP5vn9bPfnL7E^i9uK1FR#@e zUACNqQgz6-s5bE{!(v*D!ef7$lOMEh!4mUb$gU(RX;H@-#}1zlNu4j;?$myOo@a=b zlbPW@Iu2lVi;q6Uao~wG6JCly6KBS%&s*45j)OF3OGynmH9JMqMeGC@gEx4m?x|0+ z_1!sB6F=@pYwq`Iv`JI8i@8$zPv-7(jiXw!bDw}@_DYTD{v!q`K~tx}za1vYD!0Os z2gvtOB$XpU+f78^d3zM!=DFs#8!^ty>-9&-f?roO_L#5OlpGm6JtSNH;?`w3%=V9- zbOdJ!ymgw`?fYh>iw|oYy8HtuA7$lBYP`$OroS)}>`WH%-wii`ShTBbCTjy$yPIz- zHiKAz$-$f+dFd+9usU^LrkuBrtV)WeNVw7<-Um3keRt&{O?T{?AGR@*0EP* zVA%exOca%NjO=RB#5wxVb~TW2+PnsWwuG<6n0KUx9Xqn#@iqb0dPlMVLz$5-s`88G!Dq-ujWexL0Q2&Toy{#y29h$hwi>+L zK@1GV{X}(k#|5N{wp5VGUpH@nKv4LeE0KFI#F)**qdm(p0M#j2XY({m@MM1weN^Vs zUg!wodBtR*I_`$)q?`%{wA~d^kazDE>*gx;&W@lbh_CwvLVS7`i^VP6W#%O=&%rLE zq}Di@$j=V-9XQ=!iL1%0#Twls2(kHCy?%di6oysPhF`Yc-+N)0Tw(6SG6wE61^vU9 z_q^_tOuUOJI{&5&F?F@6%YIh|AOPJ$r3mxc^X+VBqIvENPxO`vp|nyBp7_8J^4@BN zjVNV888JVQ$a7#0+1P>&Y;h}aulNXH>0-$D-uvAXsvqt7vnB^rwj^x$g;h%BJP*=_hOtwz;&F)+pw^SlAOGEf{S=N41J}{JfbD<6g{u;Y7pi)PDB}f zjnS-9%M31)Kpkj<)5bPh`Ql_YOL>T@PYl|7lVQ$50F^)cB+gjM~@zf$g%d98v3O_3g)X6r@~m$2P7manJK4$xf`UwzSiCseDiL#4HmB_*mD&N2QI|twviJw@3_S@!gX2 zP?7FTTopw*0j%?1BlMXu^E00A1WEi3mcb(~&kQ8qPK5Rg5!A$1Lj#<$rnC*Ym%o4Q zVn5Io1t{@gF%KYA`$Zj8tMpPC*4VlK1Xn-^sz>LlfImA^gli4h2Gy;0p_QVdod4Th zGlhS1KwQQt15oU;1j=yybOFMTjOkMp!sIcqgQfaIG+Ay&a`FmDgTFJy{3+%=5>`yj z?B-zTE7C7^I?b`u+OTmd#v0A9yjL^W?D|blJVq+kR4bq*Wpc&XxH6edv2cZJX7FSh z6A$WQoNO)ud6a!ZKWLO?cm{&R>?_m;W=6{3y*PMgqfVzvpiYs5fi+|%|;Kx4|Cix0<)&KlTSXiKB_-3`XWX?XJpg3dD%)78j7j6= z0>hh~f)s67@-OnE^*%%@ojp?Izd}caR-WEU&C#qI*ixCZ6gt=flV%eQ*kW^6m?Op1 z_@3+d*&jDHLg0=S<6Umo~s1E|k&G@|ku&=O-ql`AiTVwV~cgmM5VUEPs#l4;B zCYB-J5Ps3AU~gq2I&7I zw)Rfgv9LC*ssUuo4?9B#2uJ0;fiwbEi8&c1GXL>YuL1W39<+HL#DV}*f-;Q>XIwjw z)_&0%1y&Lat9-J0kW>d+)qCNRVPOpvbDY}yL6<+;xNtYx{~vkV!PivdqChwtZ6h!u3xc(x-K zhS$B{S(mz3v8rVV?!^(95A5Sz84A}x3=q9RsKhSThbf@>ubptIUa<`J8FMyJ0N{+vc8xuKM! zHyd@xy|Le|+Ltm_X&JUwMUjy0t@H;Io9N6IYn9>X1BHowS>=$l4bG`m{pC9-yw_J;2*kD3x;hpf9{XIL4iFw#tHd@P_6WLgqe%0_;dicHYp`X71c|K!YP z!$;h0cXS!*=%^kbJI|GG`20y%b zPex==#$AdwGyJdVU9~*e)Cc*vBC+L__Co>{1Ix*#<1WVvByS#M;utab3CDf18#~$q z`;42cm~y(~@7#fipNZD9=f=+xMv=)If>}4!h!@p08&0FXY?OEg{(4qw{;VqD6|6Sr z9P{TY)exJP)TS*WAy4bo0+8*4SEiI3r>Prv8$37S4QiPb4-EpB(n-+ ze&A@f6f^4egwo=-DYH*=NY%HWIl^hNv;L?K*{}ZViQBK-IN9%x=G^vIJyz9|W`zsN z9x6UwMkrbCKdW${r18cYkX~O_1%%Vl5$3k&b9u=R8dnsp zp&YubLj`L<3(_NPD(vv;$<22IFvsQ%TvI~f#Jbxmffb&1c(K^h$V>8j&L6n_tk5n5 ztbR>wKW3|)pW~cpwmD)l;1K9^_4rkDoBoFKAerIHU+wMuQi#cK`2CV=mO35Vh=y1y zEzQt(8t_{?CJoFC*&AT5^3M%c&h!X!ta92(U@^}53c*xS4w}B0*j%kAM?n*p1bZ_h zdIyly?+=ZKf~(n97^5PV8Q_mI^}J@7>)1)MT@OM^GjV*|y$eH>1fAPE*z9H)6-s)i zw9Pmuv$`M zwD8xc;F&GoPr_$QeI5xIU>^B5!HO~*sSo-#(tgauzEfVd_3KundX%=K&vv&x6rOx$Hx zJ<~+#6wz7JmR7d1P2)UtBf(F&;o|)XA>-8^dTU~A0fw?xrPRCu(x}2q7HQ(7rnc+L zeWS9M9@^ds3Pdi=_9BeV;VAz6R z?M6wA91op&I=&qIRCEGbWE5U*#Ad-Svl<$}+Q@Zkl{q{@%7;z-{aA7@gDBC(%sA^b zVnuf*<=Dnnr`X8ciD(FgBuXjpmUZld}#H zk#beCbYCpR*>o0H^I>o)bOd z@p}4y|IV+%_D7G5b()2VOWE$tS_W`rW4_?g0#2jhK?6&`OhnE-*{HKo%;-vuSfLBlS;0bB z3zf_>S(YAu8}jp#;5(ncux6I}mf=~$G(%PnV~Aw$a}8-}%!M+g@XpQf4f%&`MQbm|DZve2d+qa2`v1v&!xgg;+A=&1j0ov?` zDbAC30!iQP`BjKUS*SuV#;|!|@Gd*Z3dB*m*LwV@$1B5j394yDJ*hdZs`j()?Qe%+ z$FTZpS|%!evwQ-G1?nK*plW)=MxNH)W3B?M;Irp^S#Fm_DdjPW6!ZCgqw{ zFE>VrZSpP(>{A6TLpH{g5+)vMpt?Bq*})BgaGuQ9i%SN0nw)rT_Ut)OmqOE^e4z_@+$7Po`Er*-H zf{+N*-MuGw-9Z3($ylfG>$4GSMd}_rO@~)Z8`Oe=$+WpDryfBbt{j%mtKIvIvsSP} z?`sa5GCD8;^aUd6h0sj^1r!+1HQ?q;+Y}NH%rni^&?hYXi#W4s+Xlas5?xLWsaIJx zzg0>>S&bT9ZFmkY7*oVJfH%SKyD1R+|Bm`XD z_L-1jY?;nY^};^mdeO%1<7?@-gSKFPU{PE^0V7>3B^4PK<8G z;Z)AVMg&6h($m}iz*;7qtXV{Xpe@^IZeXwV`Z~E`abK{FKMp!^gmv<8-P)7A%K>!C z%1V)tsSXf9Sfx#U+ZPivz<0l{+N2-V>mF-8k|z^EgKC*zP2-Ni3G{|#G993Csh=m- zdB@rIa1?oO{q03d1WhzPA>7{(#_m+N7xx|-8sI?l#3t&0y}0ZSy5vr!GLlzHyaDRw zy~S{7X!-@!Ypx5+kj3%Z1SgvheZjZgPJ=zJJV(tHO{uT=ZOv7ktu43gKKYWVAJ+%9 zX!?jZJ;N!km~5+;P;bu&7VTN;6jDPlGiQ$t#O<zqH?@ z9}X6U%15TMLX~@-y9 zMe%KqP!!t6@)evx?=JEr!(X1;XsnURJX4_^f&(Cn^izQJd&1><5DC(<6W;-+XHYl7((7{F1Zi zANEzBSCmQecBRUNSt*|04i@Pr?=^0bDKmrV6L@3D?BVt1dH`vVxX>X|m*k_>Np&`G zVpiOp))^<~7cPYJ?47(weB(Q!0W8(6{!+5cD%_mX;z8Kh#4>W*x^v^IL)m+|E$y{j z$#UgJm<9wR$g>W53fw3x_hpNjD}HEX@G|9rF>W+P)YG|^o z=^`oa(p~;x)UB%GWmA}?ArVE;9?3{F79Q&Ati%eO4f*4sM8Kvj%L52rVmMR&&0~_6 zXuqSy-Y{&acU_+%`?9YIt5JdjT5awyu?F% z?R*(bx>#i;+Xf=e5bB(^I*l{G$ficrxSFl6d-+DN$#cMS+&<)^O%g zX14J_(F~Uk}Ps1 zIpr|=o%MRt5^a+b-pm74J>UX&5(}5w5g6nQ%&_ypEtoWC%!2zy^KZT%!6f^t5~M^) zsAH(ZP2DT<>M$|7fU-I*bAsws=73^uJMUDeEE(GBVXSR1TQ7WCvU#eC^9OR+e~ht; z?^p`d=X%8P|LAPc(=;YGNo8j_!_&l$n?33RG!nR#d|~e3pcql z{sYIkh@n+Frof&fWv6c9JXHEvRh^3Z=4@K0@-b?r)C}kc+&$B@JoouCv*x_fC~yY* zt;10G6RH<)H3*+)KiQ8N6&@fXZ=A(G`8w_4lJ&o^UNcSBC^LI6x5GUT)NpUK)#~^h zuP0Q)NC|5l`Yl7O_nmboo9g5bePf8`t9@rC!W|4x3JtWXNdNY+_(8(sXYvF}D{u1Z z1r*{O&?`w?Qyr6Lz}B*CTD2cpE$nUf#zMst2ST)G3Y(AzC%U2*sQ2#BM zdV?1We~FZ6l~rn%@P?s=u|~e2;w^Lmsm$+jUJePxkSl zG8$~@yCrA!D$8v8yWES`*q!<@`phYcoGOTk-Yio@;qtoK<~UGh(h6AWCuyZ@VEgZA{+sKz&4}r+mq-APTK&A02f{S0-@-V(vB=$NXBA4 z6R+P&UfAhF7hr~U7w{CCE~Yp-ldc8A3^z;DjUSlNHtjHN%AD182^U3ai)uOwIK_qD zl);%FvsbeBz*L`#$o#4+Nia`~z2Xk9UfmM)HNCE90C{__3XyeDh1bIQeTkv=Ncm;v z;SZB#m>2CNyaQ)Izd5_Kz|6^X1U%t8+@piXRa2K%x3JssWCb7{$6K~?^>x*`%q)9e zTW53M5b|!U6O>~2sCzE*f67ehD^MkOJx!{%-T*lj9lxu0SzG^i`9f6ptzVRb!?MLk z{*X0`Sj2IAmW8C*%><|a(ZQdUJ015E@hqJlu3thMMcHIi1Y_7fk?qc<&yhs~0)!%h(Kw zExs5#lvyQ#ZVa*3F4T-M?+$HrJ2-<(m+K43tW?MOQG2p*rxZ|1#*xBE=;O!z+9qmQ zw+#>N=nSPi#@HH80~FlQ;7eoLP?!E0XNbP?z)C>Y(&=h($>n_TDKfskWjKaUD|8Sl zQ}SQl1}1jsaj|VIm&$y;oh&TtbjSv`9Iu&9=?LslJ9(y@T5+g8#XdQ(ulLY8&y4s0 zzyx5B7t%63m+~W)xNJCR>M_xE1tMwPDX^&!X_3OOTHKoZ}bZL-LX=I$Wlw??_Hnd&kdLMT(vPQg!NX@QDT-?fSi?$!Lmh|Ds05i zixuJU8nASkhn8w0=2-WN6TV5ZGur-MZr;wjTGPDD5h8iZm<|=n$iKjtf3uf-V1q-q9!dj)Ko7s;eTn1HWOk2-$1{>CoAvC+@+!y@ZPcjyKVXS5$JMg) z%Y)~cCd24k$5MIKh=|49AN4$rZHqS3H>ZmEWVkV z5R7Wc(8IkO*V9?sK2wte_WOT9WM0NdhH-)YsJvqQULxh!r#beIQ)hECdS6ebIsE=O zD;xNQs8FVp)z=>e&0#hBQVK}p&4v2;O4IHPxS?#0BQmdxm2D)P)-1e2>mn2NtYb7- z4{qy&x?r0M#}5lkBz(UQV;*fOV;6b0?=3ravV%CN+NeIGIN?A=$|<9+!wFHZ&Y z^*+m8&95fWPRD6y2eRoowb8E)_wuk+*lW)J^UL8O(uJk2_PxRK25(7!qV{WkqGeAi z4E5>u6_)*^fy_6ysfOj&f|h#HKt)uL*&RsO z+sd=y$=`eLzjX^gL|J9r>L*8%b)J*IKN{WSMlkG~2O;ZdrVsufJ zpqmsZ4ZhP%i7&F1x00)c|NJGyfk~|v5;7Y48NAJ4N z_#r3fR*G@Ag^sX^&B7Irwxo^Vw&dG*=Co3Xd?_6u!2 zUM@D7tQij_XApylZaA4>Z0XCwWWdk)5i*xbC_ zz>ON~-oYpE+Q-Oi;93Ns^1Z-x-xaUt}u{_C&51b7Jj*R`=*)5FY47wyfJA`3|pi>RYy%7w7BOB=Iw4CDI}QIEV{! zDRLyG^M^(nu5xwv%>B{CK9i1$N_}cB=V4dLuJc%SU8WcXe| zlQ?9-9@_GHU;OYUZc7fD(syAa`}U;P3A(dV$!3x|mTkh}oa{d5nJwy6&l9eTX}@`H z=yFzBqE)MjbY?pDS{>4?HogU3;m=s2b|=VkgfRI=mA1V8Jy_NXAp=<`uz2B%xbhyeXo2~}8i}xcyc)w3eRf{>(-WPW>>(%|7knGcnDCWBFoUy8PyGXSF7|`Ebm8wS&JN ziEOG=$gge-K92GH<2)Jn2&+T7^zty-5G7}NU-7X%NLWeOgp>3}1`|5W+D>-DBR}3b zUDS8V(ADAKQV}a&lnnfXs?|R9LX+UXEljA`dkP$Dpsx5g(S@QA-MH-C_@{DSY64bo z7>{MugHdd^kln(cS10c@+J`@)1Y6g>k#cobeqnA>q<7_vSkj|2h*Hiat*SM)+*}*! zR!AVL^lO$jJRCQEhR&_ZFIZRmwXDMsj!7E$4qL>7QD0ZPs8G^xDkrj{SDt+xct-E1 z@=~PKs0;V>>2yJ7h5f0BKew4<3Y>f`Xo||E&X7<)ndo+aTd@nOxeN5;mpiBsueOf0cwlrtneqjh+h)>;w>hMFNzig z4?{Y`TxseD&cB-sL|l%WxC~|t)Z|EQ%akuXQGF?rB2%m?8Us#Sa-G_I>yoBUIq5H5Atx!)ENSWR&QwOWhvj(XxXLVIlmK=L@sXCH8ywkpO^)+ZJSAPF8R26 z^rul}?BG!E;|FYk?CmO-89#9&wqErj$AS07qlgUSce8D@LX%JvrR4|{CC!0oP-r9B zJ%KT0D?vCx+j%SlCi4Mx4~;p}q2-D~G1``94x!cT7Ge{%hE)&6E$|`{o>|#O=|Tp-YA-c>h$4$WH_w8j z9@95FK}cV?VMX{p)3W-Js$7|kq?eV1<&gF%o#Sh7y^=*zp83-Z7GWbYF}B+zX~GBS zwnk8k1a1CetLi05ie%)4eph#jWOKvQdeQ&HxL>5~6vUpDLvO;%*vJAcic@lvI6oWK zdulNnSA`niSwvy3bEJ#~6A5`wOpf3dAlg2#SBpSenM3d_F_gZGN68UtY?dYpArlM} zS{pl*EoS)VT3Yb%-mO-j%zfJBp-ymnC8vbXHwNl?m*C=BMhx+v4$-jpn$W2^c`i|S zQF~9EObub9x~C(S#au~Eey@5YY{z-{RGWqv&sx1oj(Or7HeR!t>n>~e*+{ciNT@x+ z)HOt#14Q~!c}edrR_M0`N8qtGWF@!T!E^ZLn2up`xq~+RA_hKZEnb1K)ij(Gq5rS; z_OrXq^4KErPp^yFKYmG&+Cq_~mO3|Wd%PJfFEM)?xMDtc)~?)3LT8s1vCqkOlK_Q` zy1j+pXT0|@7g*%{T%v4;?5w}sCTu?5Y&X)_p|c|y_)@{yPIPXbAH4Rz#H`klea`0Z zsA8)-`SzVKoT9A3-yEfh_04bp==S}U^sK1PKi{;YqP8Pfz2LH)rhHtLefr?=n=;WW zG>Mm%BSr+D06#4P+vVfYLm8VNQq?9L#jQ0yXRrU{XxB=|Ndu#wzBb@COV#oocuMLJ)@C1+iGKL&pP=u0nd5VZvGH7`n-a|YnL z7Gh`mAMdm5&BK0SHda9uA@D8k|$#XbRrf3t=vqnhdlE)7Y`bvsO%rwlnM;u6@tf`#c^P2A2G zYbO+kLzVo%HoBRe9POVY%#x%^jwdqffNm5DeKf1I)VC?V6>I)vI)~~=nE+qbdijoC zGWYgpdBDg z_ND=qAX0kwT4OQ)YBbT5pcu}UaL6XJ?nFf%G9dGYLtx@*51v`z4y=YZ?JwApFY#Ci zgs@_q;ic$p)X*oS*8sg~rV)8jhUT+-@4L(oDJU~NjIQJ*A5Z}&MP$_-g&jVBN_2d< z*U;=&VbU96rb{tAs34W^hx8AqdaoM|D4nV4H(BS&$2po8TY@K^KXM^wd>eqY%G+=i z{zX_-{m7aWA^G=*!u^V70&w5^bK4d*L=T#qRS?XEIY%a!9y1wjNh!I!T9GZG{T$0} zXyP>t*nTD8EE8z}tU%t|yJpH3lB_}3*jk{D~&eVcN$o_n7sGCTX`N76D{8=3MqLpA2+@oe~B zsqX0eL{QwWf2_&$TK0YBY4Rk^&Wf^yiJhPeAOn}wVnovYk3IL%x{(5#sa3OVAaGE! ze3eV3b!HVmLo}4eC#v?M3U|KfbRl>UfM1AH@Ug{gTO{FL%J?SF9aO`3jz^U?sM@FE ziVUTpb2Cy7`ny4)KH%C{2Od&D~ZtIMrg+3dtXBSlScBNUA zS5P5Vl2~%n+AClhRHdATD4Eh{rk!%%GokTZ60ND7gs@S#aL~U#|qXda+-LibGUHWb%PbmvKr(ECSON{2;*_%WF9}D z6X!eBH%}{T7;ZAYLqO72=tam0X(AS<0^8m=4TYcSqcuB-inqV7R-iV>InGTv>E^5_ zwcku*@tW1uey@$oVq|Wm?a1EzpwaRog+KFlMpew0*f~6STkke@^d<@7=;$`&RL;UY zKThv5WX=;(?u8oP4m+24i+oTl_*T4In?mv+=%yxn&^1}d zsLHr2-8(6P%hKI2*t9Ir@#RWcqLUn?M~f{REGmWI2|=S>HomYFVYIOK3l3 zznJsP5AMZ%9|Y zqZlHre<|{rL%tLjKTD41e`b%rTd%O!ojf{5l$`u={s~ut3TZeWLnCOx|NU{DpM!n1Q*&^pY>N2e>zJ|N%AjVUV^mwxlfe5U{=yY z=f|0nQn+T#_ZA9MC&4T#w-1JBKITtC)e|h&i^i)GcmI!GSMs77?7yd;=foq z*k8mj^81{Mj_Y0fx=%4~zG=yr4XZApmI>nrwA8*^o4u}VfN!y8OBEwEN{SOiNeLxt zZ=w!DYjUVkqgnUbB-nbl>mWF74|OSzZtj&i851pc%seB1st!u}%H_xV0%=oQ&Cig* z>M6ylHAC4kskJVU|2X8qzj)TU{FbwXW`0WN6S7FMRdu%1&sJqrK>~pT<EX9a=B>ua2?$TyT>t?W$BhBji8FpL$vlCKeQp$Q=w|S-@=tTeC zhkw}{y=3H)M&M<5PGZXq@gf=(-{ODx7Uylb*>!gy&lO&)3DGw9!~=A4gFHkod$}RL zlO24809EIxU0r-kx>94r)AQ;z#&6eLSu^(swLX1|?>&j@3qMn^H{b zvF&-jS1;^a;5RSCqYzsD=SUk5!3JLz^uvtUHEbie6rP5x(OY!Lo<$D!A|apZSwR0T z-P0VJHBNi+ebqErW~!Ho@e4r{ySIVp*BU9H5w3#7Mm5R)RvE(sQ<5{D_FLi~hypyD zhC9f6F*C0GmaX8=7cAqDmocjU;v+l^4 zLtC;>`~2kMkn&$6w4;toV;vy!Z3r?T%aT{(z;QNLgAUg}UKRB7G*kq6q$fjW7ku+I1!f9MrKjY{!b zV7tSwc=kvZoNk6eI7rXto6(lk*nPR2?CE_^>@^}WD)1NC-1Nq)st0Mxuz?%{3@n^Gexdr({FdYzkS z4jxm>Dh}9D?*vDMX*O9YN0YSeZ4yH0wF4k`>xMg1`K`Qe&@OY-_F|LP^rw@yRuDA! z+2|f2!M|a1A!~4@W92e?sS;ju#c!o)uAH%kLOac5en2m(Htd5gtl`yVFoBHtQ++?o zw$5cjrx4GDP5LKLJArawviSmr9$NfmW1us|dgZ-Q_(+Jk^xZ{F#6I@w8A%R$-Apt5 zC({=!k}*-5lVPK~=$j+o!B?x0lB4RsNg8*PxsKL!S##6SK1G{1mZsBAk7)p9%<;dg z_t}4+yLE{joO4wtKx)$!>OCuMawHg?H)@o5nw{s(EL}zTvt>SYG~(P&86=~k!eu+Z zQe>$RJ8z9~Hkd^$(T!~l@#|QP1|VbCx^jD>7&!gy%ChM)dB*1I-Qf=8;K2;l?PS(s z$r!c$#i~!B1~Pu0-xg}(C8Mx&tB;c3((u6EEb>#oIda#=o6{@XMfuKM+D$G6Au5U% z6{oaAH>%|%s@IKAE-2b&ohhRf{f!np^9x4Z-tjii_*lQr-qM63r_!0wMmG88DGf!K zs3IzgnXC|COVUba1mc?Wqts|#d}j?#%h7|vacxXVzzNSZo~fga4_IZ7*OqsKeHbf_ zjA#5APR@w0;Jkm%mSxX+yx$27sEqhwaj6@ESNJ>(8*wPuV0KvV5XVdW6NH4fi;J6R zS_J#bvW$6qv@a!9Mt@!H=3P2dTq8HGL=JZRTpUE)@|4P)>z`arK`U0mH46&`H;%kl z_GKR*SD(rS8i<=4{2E2Bmgg_o?2PMyT(}wcY9=ZT-8sUit{xiOB`ew{nrjZ20v};m zV&X?{l!~-oPGE8Zv$V8a#D)1>4lAjU-)#wft%xf}Jmh3(qQh7Eml+u_we+&HR+`LhC3sgy8XMzYH`#s%?Rm;8-=hk9HQ+0}`0IbBA?YgV50H~lWCm=V zLa0-Tdc*)RU|Ga>WDYo$6dlj|#B32wXW^%eZOaf7FxbjKlqHY;P8y`>@L`{gk0nHB zjY*f#i%&2@v^k>-f8w>H6f~PTWlcM~BSY4P_hmgP4NztuK`XOW(z-}UEvz5+O!t2f z$>A3`gPlpI5)*R5dYeLrv^WW~SBMFLz!pONI0}F{IAf1u-BaV0nSy`DJ``&j|AIWs zciJ;-ZJKclDuerkQ@x2n7Hs`)AQ+VYZs9Al9G9h$T8?OM=QC-Lp0kcwX$OM2yTXli z9kImlZ@7APLe_wanvKmw)qsd=raF5DuQZZxKkqi5oH=DCqCY$$UBoug%4MDD2x|Mc zaKf7i|LY zfM924QmO3QLYeiksn)t-dJtmo1OL@Bv=jrW=|r{0Yj5JImtc^IJCMlj<|Ru32o`M@ zo<==(Sfx+7EnTYp^*X&YTSo9JSD9C_1h|d*LD~lqbMZy(Io`>5wFHM$@y0FEGit$J zjCBu#1L0g!4__^ezV{{-;zYcJ*yK%t#sG=)&bUg05wMUhHck88jqM+V;1KtojX9a= zlb^w^?#WMfN^vyepxE2w$2Zk&x9zIVc?o3wwY(*{mgU|GfEcC_Hl%epD2aD~npt)z z8fc3MDK)lv?@wA6jPAvt|VV4H*+hX9M zb>-q0Dr@UIa3tt}KvY09duJR^3_p6u$TrTe&^X2LR1ae(UdjWDKou;q7^z<>uGD(T z1`DiFAvoUR+5^f1o@BKslo@qdPUSa%iw2wSTIZNT;Pku9VWq80?Bm!C}Ie_U|KB4R6C_P@q!LsGld_M(; z%j%rM`B{x%)!&SZl=_9Zv@}1OUyfuG^0g;rCU3U*imx+%PHeD0*6B{n7RS7+4=Gs} zFjOELG3qg)D<#jr9SK&;UvhtUn!>0m@;o<~>5WX6!=#kWE53y?PyNAW;_y)~5)o-Z z&X+r64I2RpheyD%_lwU|ny@Xu@cI`@yr--`d#qmPQgbl|Mo`>MN;KM!y31`nrJC{) zB(L;DG_9Wixaz~0<#_%qWvq+e{Ms_*|my=ebvJnTddLh0%n*vZ{@ zq1T+^kXYyb-PF#qnWk)sq3PO8^t~Km{xZvi-^HI;g?$wOgA=0~>Zk&ChLjQu@hdOW zPxpvYz6o&2k@wZIO_!u?_I)XBZ4qj|q}dFPQmxCoO&AR;+3TF*@I3Akm;=aU5&x{t zV06-^pK_Y|fXw0(739w?FU5~H?6sUbR7AEo{tM^$ST2i&OOp{EYcLy6jHx+1Hhpj!aeJLQ7=W3_&AjCLGofO z9)C_gr!?`r$Ey(<7z_%$om>oJ`*h|(~ER)l{s$`vY% zkr7b%icA?WN2KJu$FHXhb9ECuK)o@tEC}g;;<%GNEd3u~dDNe}dsI8DyleAz;nj0w z>GM8*5{<=r)sv$nwht6{-zw*6;gpKs)3SWG_7Y1W4Qwr{dj(;a6H*%_pUN%V)0rj< z`>Io@{S~G9$IopP6*v33UKYFD)|gLIInR!%)Lc`gRqXaUSJhfGx^LUcSQL&Hy)QhM z5;M+!s0LR)@egm8%I7vL_voV6Y{nzwI$dhQN^+jwqM7hFPf+tV@O>>S(vPTSxmM;h zf^fCgPfTvqzEdWu6pnqJBh*`kCZh5TO63lCe?(d}2j6!NQ;_8VeG3|)dLlf;U zrZjM&omLuCAej@LeDmr{|C%BN!gA~LOQcY+Wup1s_~;PS^gnaCN-SmPKI zDPM&dD0Sap<@XO+9#i0&1R|GZ7K@rD2jN*IqcqCr0(I0$B=8gCt!=2xj&(8RnN@8l z=P_}US}moR!@;}Jh7mzebw~1oEp(>xk3{>&dd&|-YT^yHziiR8{c=Y;CZm<^jjn}( zD)@I^PqNXl{c@WOZ^?He(T*D>U7eSs^J_IpB7t3&`+cIx*p;m#_yYxiy!}1187~%1 zEoH*G_o@$aU**i1yIo+9D zzlY*I1`JvEkoZ4Fvv+BDFQxQROsGc^QUkTO1gl}gQMQ%e~rha3#LB&l{-}ogV zlci#n@;@757QJkKKag|9&jKdcmI1RBPH08$pCLP19_`REoM3+yhTmRJjSvU9;Yb?G zA|LUD(koE)6BZ&lDrhH5=<*8<%Qc+bbOc5^CZq$+KWF7h&a4*rQyB84|M^+9C}h>o z*@zRIknr5o4X5;-HRN8AUGSuV&l-4E#fgBNnXDSP%GOGim)n&d0yD^~?v5)<2!2}l zj5XRK;gMKj$!ilBg0oOx@8W@&$U}hDK39AN9$k<)PIIkp))g3{#qU2cftT4Sk%HoZ zb;SJa_TLj+3Plw2+3IG=*wsY68yZ$e|K$~31s`_*qlcNnl@qlu8?M(j8`h!*o?AP) zQ6v$cFrQ!wkqcd>0enJ7T;}z*tY2Nl2@;;_ts;F`K6s^l&b_XcZWj1@0g85c7>Vkk z0O({iQf7^xt=8Q(`;W_QQKtgYYMf39CYlyhlew1v^qM-j8d1v0pO_xNHZLje%^p*b z6Kku~P?!9Noc!aiFrmzyd2+zVW877FJJ)qf>Hf z)XqLy&<^-jHBuLfaih!T@-%rU!O!|s@&xPB+;T@d%r5nN`e(6w?pXR0-{ECp(ACoy zy);>(O|AlAV>%@^g7_S5uq|w8MBxh{TkJ zvdHIBw!1+`H3NY%r^XXp@is6@Z6m+Z)Org#ygPeIPf3XrACTCf@t9NO;tWzSw@K(D zDm*j{VTm8T=2W+)Pvw|5Y9L>=W?%W=81j)A4ZB2aRjqHyi3TkHeuW(C(j_r=>$37? zYZ4MiM2NjRm@D2&(6XG53g`Z5#qG&S{*LUyVx3_q^4ZiD`FEr3USyu>h-l&m<#~Ot zo5;Xf#T8iSXgo-PzfS|1+?=DA9?m4nU-CWk&lrwH;0^nPF!-1sr+snmQ2r`Qyi_g# z%KcLYQ`^LY(%d){cJ5-JhjLZBcVv4qb?kE?uYHZO@Z1@Ps3v!u(MrYvU$xtHCAl4D zl`tlAZkVCw2foW`pDKFd~dqaS{AQH8nW-;Mi9Xflje`k ztMybSXRi~PP{xvT5qGyax_pj0MW!6MZ1Y%2nxW>yvn46Hdl6o7+T4B$Pbc5t2jk=? z%NrQmCH)jveT!c*74#=Jif|8TPW1~5lF=rVJ_`bT<& zY)ZeFS;8*JgJ;x*SuGkSFzCi&XdBQ|H8P$T16 z4_@jXw+z1K30$ldA9r)?DGz%BorhSp zwSx2m0BE;#t9Jh*A^9=uC7Yfc63|m|IVFV9i#Hkh^AjQ?&-wS%d+!mOVf2!AAK#VR zBnTs-oKZeoV$P0i=O)(lu(%(0m=1%Y;F@V}`5y(N)NY%G;Y>rkfgOcEE1!#itv)`D zSE1HP@(j6rZf{XtOUX`$V>u$kM*Du-2tn9YpPSh9j7e=N$cz=+!w=xSO}V!t`i$bj zTiTI}J0OdFA~+wMdyIerS{!~ z(!(v!KA3IJI{qCI506uM_Ty{2U?3Nfp~zq?-!uu;f!p?8Gtu$4tq-OjMf;mIGhvC~l{D8TsMG}CkR zIG_@{&JiGO2#Gr0tiB;+C@pPlt^q81=;3oqf_Lv$xVHraa{uBzUOi#S0>>g68qf2| z_)}xgt!@U66f#|o&rExftW3rjd+OAe8Euq|PDZ6%NRtI!<}a`1k1#a9Zkp#BY0==7o26(1S59Y?N2q9T_8BWWh{!n>Rm^u} zTcLhKQ2D``_HIe!3{~qR3ZH+`SF=Qk0g!#u00v;p)^tPkO@bB0@oME--DjQSop&~h^lB|-AY;Kd;j8IpYrQ*7{Y-}`KY2Vnz$)jh~r|$ z)k-GkvEHIQg^Ho|`$duGpeNd%m5z`!w1tr_z-O9FdQQ=-l>3tqi$$R2FAE}<1@^Tb zh`Qe+Y@<`yV=t)~%u55wi1p2g%l{|kkBSf&PG=PD|8B5r7+{t6iYySID%a)yW9nRZH2aJ3A@5V!=PE1pTTZ-f(llNpPxA7bw_etV zMwvAo1eIm4erD|T$@qp`zA;gc8!k|a9x;7vL6+-&lm+| z@*VXGOUky`Fm&E|8_=w0t?O%ugTJMp74<7G`~7LQ9L=}r{40`Tt_2It9JR<&k+R-R zi*DaVWlwML_2S}}`I0;O6jxW}_wSmDXbN#uIUM+I=l6)9-jIh%7ljH{PKPp@E+SI- z?($Wu<2B5=E*TiaJCiUYVvUcBb$^?`@ew7nll*rK{v#+nUi7jX@nts*o9vs@0PyM+3$Q_rmc)N8BpA6<#kL$#u?96>4vIQdyk{l@dsq;Ru8da zCEFA76K9BuPT0hn!jsJ3ujRL9?pIV!K|4^!ksw{hx9V^$w=82`t$9C7nlXfobX;5VwFt){2xVU{nv!v#c{d>q;nuKI;16)W^`_} z7Z^E021pu&AWRr+gfP0hyOi!6Flmt(k}9Pr_xkMl3--fa+xedJiT5)2p2#lD0;0P{ zXI3IU?>!R>_KUm(=gd4yBObulZ-ExZ51Pl1Y<}wQ5beQFW}QI)*WQlu+3@DF^cwN@ z?MPko?B$mAVHUnpS`^}AZsDSm=z3J7InHfLI6K~U z#yJpXY!}y=)x2|4VH@|-tQGJo3IK^JwlsXlLVRkasun>wA| zS#Mo{H^`l_3eMZD(+QSD7%OR*f^rB;Ak(9GcFzS_uoq*}D}Bxy?A*OHH0dvVu3w9x z%EJOx+c@Z&`;kD|Ds&#UY`5(V(w0Xcrm!0`a+|1*I>*fcPxqLXQf$Ql!cre?_ls&_yu8@R1IX_ZgK*5xJzs=E1juU}h&1WBg?Uvo{i>Ut6LeB{@>6CV;PJL(hp zrU7d^!B-F;ve?OMTYSN=C!PKnP;~TpEyLB(mupTQ(ZL*%-rx61Blsw66|PR-VLl$OZN(V z+;MJQ@Own}HOcLWjoz;NFwMOm>`9rwIcO8jNsaubd{*H5^(teOj4nXSs;G(eGA#Cf zPL%}t*nNr*N#FnNOZDXjt#NSRGf%bFkL0O~wY%q3Sg{+x7-B+u3mpv|viLpX$o_jM zU&-zR?g>ZATktO{?cSIgxb8>-<>Qr??r;w90|!)=t7sXU`cfqr`jM5)$dDXU=^-ss zsX$F=wLCYeVde{|mQ0rW@DGbntAbZDv|d&!S+@oA1FJ!DRn785!MO+b@?avv1!+(j z+0>XRZU&40LbGZ)OGn3G$PaIR-wCjhAQIukzwKQekb9Ns=9oxAK}zRzt;Q|D$*)~3 zM2eXEu(WdzUqNS|b%U|v~K3jt>> z#^e`Ilg&y-;&w>-RgCTHM?N^j|9~ot*b&G^aF(3Ze{&#hfg^{??AHy$#P-_t6tv-8 zspXGZ7?Y7JmxS_HShJ(&{kXYdO$=&jOIAY{+k_A)0`1#%u>IO{-Stp5I69u z$jHJq7lYcT?Iy*P^M(4M?52b#mLrONUsk9S=1g6s-X&@s8z579C-nR2SBPy7VvZdPA(-kYp-+-r+OidQTMUx}i9uu;x6n zhb`~yheyv3e8b#wn2mRe7L=AB-;)Ft?eAf}mKM5ewGwX7mvkbwvK8PKgZ_};0bQS{ z)Q3}{&dbN+)sxDr$I$$D!P||FRnI9g!_E0?E&Kjwj#<_c$`;CsTQo`a^eVbd{F|>V z$0KG$4wjB5IXA? zteTGZpIGIrX_52W-s21MdG9zgWBBdFj8S7K!kh5S$86%SePbkVTb*_;$e(=;odtR? z5l(KiU9lU+8NE>8g@&)yuocq7l7lFcW}B?v>}JU(c50DnozITAK%yA?+^}KK>MxPl zxY6abm>sC>hKVp#?r5QctSeVvRIx`2XqZDpEk1##Wx5@P6-n!p69_H`?XwU&}hDBRc(|$V;-QTa#2kSl6gd!aW z1&*hgaWy?{K#3P)RkqD(?#azgwEs#dU8q1z$j2*LOT9e*5}i~4JX1_j?<0w1MCqaL zyO6H@w94OXHi?Bb>j}ssei2fn#G@H-(3~a+(I>gLu({#2zQ*P_{GQ^2esw!4$2^)&5AfiL@N z8zI3qbLn;Qvr16$UDeY~$ufD?pA8+4+H!R7MQffo{rA!TS^J9l45g)$l9JJ(+(RbE zQkNr z&5_f9J3ba`lXDgvyDtJ<5nU0maPB_SYSG)661OPmUbeAWh#c_XIa1 zSE}tTW0C@+R!SUH48DJFi-Q#d>AUKR%Xfo;hcVdRcR8J77DT?JmKGeMJU(p_c7zLM z1y*!)JY$0Mr7Whh*3mvUReDRC`BS?$2ZrsEx!&X0j5hJ>$G$D66rQ>Q9(wQ_>QCZZ zzdsp5OOGIIdKZ;J7vlXf1;;CFmIEx)wZ0wP*8ESzCrdbaKID6Ua-5=zZw0^b7s`Y9 z^3;V7oQnUZ=+MMAPH*BMJqzXxE^;647EmG&q1}75Q<^_(y~LQK2jbQnebOAANjU^b zs$ro+xSg6O(~!mm@1YREAS6By0S>JVsTP6II$fZ8chxL|Vt@=tn@8(vgQ8J7h4n%5&3QAbEI$kq=1I}M+H>P#Z8Ez( z6iWxbGFSjJu4Nn827D%{VW_CYXyr}PWuuPh^czfkC#XSH_I4WWVRErW_ms=9;AiZOLDUw<EX+4X(i-?3p}M)U*L!&Pr@ay6bFSH_qSh_J-=dV?^Db-Oj>3&!YmV zd<`}fvvK-;;iE8J3lB6~9ETNHa=l)Yskz099*t^pTK)>ibE}&V_tLHkr1Zn-rp<^@ zzNWxvLA5G9og{3Y2C(eab8{(DQS2JvFi1!JiIya@)d~67`_?&0F&0A3S&KMxPy4{4#r-`BY8Lnu%TlHt2#N z<)Vk{jjUxTg!-tDhdxR1U0v0kZs#s4W{i6vlg#zPs!S40NOS2$J^1_SLMuQ(L`2cS zILY!xbiCgV2?w%BSF^d-4lZCz7aA9?J6fdvC*&=`L<(}h zr6N6X5aXEKEXn%9K)3a^hgNXiOkdSfzNN`@Sn*yT;x_HTS9hWrqT<1+Ps!>w6_kE! z(#QMj$a*YoCP+pN%Wd-bd!&_Lo3~<_@-~1u`MPF4s5<*5+JHxOna1NXsPUI)SvbzR z{q3xM8|twKS4~ik0z;U>+zZ432g*c!3xj5!z$p6&`YYs@0w7g$UDAaz=J>8*$jsjN+ zXzJAbSdMx6rX+m<-J{FeWO(QMk6}8E4o#{0f)bc=Mh!fxjLu#+=vR0%`HY_l5HolJ zE;Ni!kEPg~U=2Osp1$Q)1my^($#?Q*`fyAnTx|IjGu9#vShGAXP<^9x<2)y@5X4!K zqw;m#8Z=R9jDxqL6QLp;_#Yoy+w6M%LCku$PhHlQNqo$_;&wQO+lNZmCG@u~dtF%x z&w{XB2uDK~;H;1!&{3RI<^^cmAoHvJ@{xk+Kx8|>R=(9gOQZfXVyOc}!@$C>adO~x z`ciRfmfPv^J#x}Y*nCgx^Y_#upD>>?Eg9m~R}{nq8G8$Z9V)0dpO;ktS8d@(d7kxy z3gW97w3te!7THOPjCjs4MNQ`qNO@j=Gedlf^?Y=5m)Wb#0BR1UeZM`-i_3Z}YX~WT z3&mP$Etiw=Qmp=i-d`ffYjLy~nMB+D_ZsBRzSC}qB#!x4V#L~WoNlO`F`Jv}{Nnpf zB2w5kp5j=BeUIEcx7Kox%SV|Uy!kbg&$yd>Lo7 zlOs79zZx-cX4(RJ>fHL6XpggcF?PH=Ay93_yB@b2EZ(6JPcFt*-j*aZV^Fn&cp;73 zYgEAHxR|yuqOh$E-}b}qJy20rNMT9w@kH)WxY23ayx*=w#9P$C43EWPy^=Eq1**Mm zWe#=a0%+u-R>EQ(Lwz&Jl0$15r+5O{FKad5cCOkABur$a62=^}VTRKXR`pA33`8j2 za6nK|u?>Q|IY=VPS=@&%uzp7ZCnQo{xDIcd|y1#1};7s7-gsFdN0?>cd(62d%MwtlgoMDZ`>Bd)( zKKD7YWB8U$H{PxzHRPa@5;$dU6v7l6_Rz>f1l}2X+DT#y@Io{T>NiWG@(T8_IZ>e= zn&oihbsjG$NiB&Y+9SuqOPMfWYi^l14IMfXk+GUWbb4H zha2ScR_<-d>E;=ga#Wp{cA<0x0aDbP9<@t=W8uWijXS>U3h7#rG&gZom&1Cg40%K9 zFf&47RY3j2lHdYHy1?{XWSX}4v(5!Ih8QYJPQa-Qz}SE7)#ub$%%PB zC(fPiE>81G(feo;eOczS2S`kyJ>yRsPXk@A3pLmG{f)3o`B>Hr0&cnF0vw zW?c>)AIEICD(_vk0@{>gOsnd^(}FblFwV*}i@#XVU(UKW*&XBQ_Ag?k^fSjWmt}cw z;*Df>z%rtdt3cLzT}?i^KJEm3Yy~wf>wt4?P3{)8#h0YyDwe7>PXuEKv?o@L`>@$m z%m|56Hu_rJF`{%j5x$8KK$^?*rF_T~$SDmHR3>{~W~(?R2edqOGh_w3QfNsu-aE0L z6@^T4Y8*8?MSSjYAGoXDBrr4ym0elKVmuJmLk=HyqX;&@8ltM|fK71l7MK|K)u)(!f5H$i}(Xh!o9Q#ulFm zw^V+lQvv0YaX};ro)elcToe<7Dit~*EvC(bl-s530{Xnr{nSYRu{B3oX{_2+Bc}Cn zN~z^}1$Da$Nv+1nIVkM*r5Ns_&w^PXZq&vDt?y-h@w3u}H#-wCAb(YZHM?o~-WBkR zHOxGV`{hiRaP=IQW9(^UfjE{g>rv2)pNASL#*%?gMZ*)Q&cGF0TrM*BTFpx>evg3r zu=b+Uryef3oLxLM8eeyGkZKs`R+UTYJ25Uc_laAW5vZrt≈fvOoo&HcdXVHzmlL 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

^01*=iK_<7qEv5La!-w&fM3DIj$X_fLj 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�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≤-(omJ5oME?u*3fVmLF__Wl#`JQ-E<<#?fy80YKF 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%0D>@0W|ovEIt+{7yVZ34X96Txac zmfv}9sUw@vOd97Twq`=ZmMFd%pmj2!_RN0+OykX*=eh6CeV-~L9&znu?MaFx zM0M>i_6x^*nzgWRDAWdAX5vP?*1)C3i!16}r4Bv^{xHl4g${S3@-h}TP16kBx{q)Q z0Qc|&g{3G^%F=8rwU|56+@4qnQhh?C57kl8B@pfYG;NiGc;{tCh6;gLvL?X3DgPSi z`Fdr}6h3`MDE&6h)vGzm3S{#FByk&E6%og3d-|-yXvK{I%E5ibhD!=ZOyd{kFv!Jj9%8I1Q40g zy% z#w2AA>a$|xXvc|SJdJ!~gH5`87?Ddlp|kOP+EVnr3D7(>fAz1JwQ+{Oh~KPIQ7CyB zNN14Ooa~WmZZlCPDo&Z^?nh~|TdbSA!N9BSQ7aTHIN%w&gmfrMlQDbLL!dWPqGU8! zJCo1HF@#;H)@!9*<9!QO^xR⪼=a9>EnVlNjvIwwh4Or(UxAE$fKatshh@Y@-+|} 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≀*ol-Qtf4sVq-2A+(!-B^;q@%>FtgVu1skZ%_W)c_E19(F{vIemgzYpj~py^ zI5#Qm{;xH=LxUDUl-i&I2FUzWppcm5t$ZlYBe4K#{`bh?x^W-HiWN-Lhzs%A^#_R! zw|PmzU~R1X>K?`OW>F8DJ?|Y306j*v$Je7RgZW2$1&b@W*kYr1!$J*)G4SU?uOzvj z@~=hP^{wN_!shtiUf+jJfz}`cT5(hJ-lv2_u<_BooRJ?j*OpG*b|~D!%}p*=FHgas z-QC^zK~PoWJCF0B%I+D-#DGa}HBQ?J~Tmg#8F9?lJBRSMp3;BkJN z7g{-Ig3~--Y2&#%&l_&oL1>9562I@PYW8iyGzJ4_jQFyEH%7J#jrmF;H+FBm=k{+= z)qQ@h8vZb2jdoV(`#>hR`+;####6yYQ_K7Kt8)Lb=9A}9<}u6ecKxy7#jd395X0le z5`31+J=9<;3SPQtr1I6K;r_av)O(#jo<2ozR~9S*u`bQfJ}GLqytUupTI8UaWOyZO zcFeRkm`T#=J$K?u;q$KYPgUNKAXm1(vFXRc;Ad`GX;F=)+96*P__xS}h<`hWnJd7{ zO8fEu4ThP)5{ct_!D~rcJr>l!{l>cTC%i&;&8%!Sf|Q4M7r54F-PN7`_^%QTg}(qk z>`;TcgOMy<4LT%dv(~0TJzq20y$lJ}uOH6VsXPY@4vhi0=IHXsmQT;YwI!YlK{+6ns=*s|N z?2-e3{A#YX-jC`}&;d`>l=J?wNNQ#c=CIU9U^4Ph@MlYm<7teW3o!UZ4RMZnda+h> zZ)gZ)0&#g=(TxO+zuO6jl|@MqnRzf4aS(zkhq4AcIeJePX=e%M=&jgiMFBaLcs0Fm zBlCKEb{IN|?K{6wj-IDeL<;oaKu4;EvIHF$5O`!p zo-rL!&z-B3nVx4_S|R0HuCEYdS}oK` zz1Ln1^TFh6Wo!xUtfsM>k3Lc}QEbZ%2s$;ZdIi4MsyhRg8}3Vm(!UTEck-lSd(&6e zlJea?pIR5u6WvMngz z7v6T|PsKDJ2HAxstg7^!^}H49=#2brm6O16t`+i7vdi-|x|Z1P?iZL4I;l-b=s3)2 zaw!qCp%t6ke8bg$iy2z|eWkc0U3=~=02>4jr^`GjlXmd`|Mu=r;g#ckO7u(e&7441 z=3F<9D)zJvKDrgQN2_K+=C%+vOBQaI`@uV7EpKdE{6<><0#KgjZyuhfe~v+XX7h-r+Pv*Lmm93Ik^_C11J zr%+BYjPqo<&>Q4`tXHZnkS7Rz@2AK*DTF8Z6fl(43X@4h{-|_r&-I&a{)k%+QbrNB z6~x(8`qCC$Kih>r7$W_z8I(0Hd7cB)j?mDb42$t24>~3+H3)#oLuK>D`X@iA+}3Tp zE=~TSrqZZNY?ROZgldJI5gYP@%SL#Y(T9JbXPQf@2~MfC&pIDge)HH^ zv2jp^#CL>TRaI5rJ^9V3Q0W-AHvCTRMXA|52e_*E+3?5tZyNmbzOM0)f~1diN(`h~ zCZf~VfaM0v)~)cKJoj2{S0&ZK3=3e3ZCib~4u#`gBw>EdM%@WJv@=T(cYA&7tr4=$ z$9DH7b(E@-X?d*$`x9*;i;|X?lGw<{&)5kRY3l!+lCKfTHo1>RJ-0v8w-VJ89_ASU za_r}piPdCr`Q9PMmNCd3#nmMXH<$zH*S_DS&8#PmD*XjY1 z$2o`eFa}cLHVKy`oNxhgxp%)7vTNdd#L*H;Zl$rB%<8UOtHrs74?IkEdwy+~uk#Ds z_Jy{x4uiPx?Pa#S?`A~BKDpGU8CZ8Ea6Qdj{_}p}jcXL!#f|q*h5aUck)`0%&gF$- z4Wgw*wHeLJe-*s#Oeh?>}aaY_>7%qD!CY2=N5Op&j1$F+`4~pa8c{5hU zm$Xlrcu!VfEy-tN;ra88YW790T?P?Q-fpDXyGaMbu&o~IhZ~;PULnpGys2~%XEt2o z`{~cd&)>?<9CoB(=Ej92sBN=?^fW_P%|qFryF`b-Mt0*1Fk}tyX+VKy$=5hjj@bMR zj<^YR&P)wyigQ}RLqEm4wt0N!n+yD_cQS@vVK)mrlZlBN7tA&`qX`nDiF-OsR?uOA zdm$FNkjE@ ziH)0Cgf*CruA!AeiKST z@D{(zFRTSZYOq3jYM@e?40#T?7^qqXalTGMT#3kU8ISzA>QO<~76ZBH*Ho`|WFtQB zv^(ldi99?6jn#6jR)r4(D_xeGA+%C}b@Gs^8P9F$*!BHJ}s%Si)OBdhba8 zHqq&Viussmux6f`H>-cuZ1GAdEC0aYZAGo{m0AYK)Mrkj!+o?rbNMSHcn>Yi6gDqz`)9=|Mh-fS|Q3fVif4Qw5HUt>BSrRt|R~IVnm5xm=gU zpD8_vB|=>_=Nmq2e;w4I#PPnjN{2;u%u{SV;nn!3M>zT3-wSf4((lsX9Fuw<#pWwR zK{F#YHHw#$Dys&lv1OG*0k_azCxc*N4Qc;%V_S#uG~HS8MP$lMT(&8LA~R5p|G~V) zS|oheOr#AIG)Zayzs0=|M6yN3=cHre#D#1V{N^4;`0L@B%(jjakF@FL`T)02_HEUu z|MAGY3+Zd6{GKDdE2sdu_by822_gav@uYK``>ON5Fo_MTBIM$y`Pui90!YPA&AYM(d1_dkd$ zuH4`IKIeQ6Ex8X=OP#^66>4J_@_GE;nUy(h3i!+YH{}jqv?48=Mc%xDkl3lvO}pw| zj%fuH_#lDm5^!(Qu%^+aH%jZo%DF)FwM!Yhe3IbUL$Z+?^8jEVEi<|JAylvg>_3;7 z31X;u1XVCD`smE5Sh8C{C7w3G7BhFL-Yx!6N4Izu)U#NnOa%dY>8x_+5ZA5NV7un)l&N0*EBxFfs+3yc;=V?8N%_KaL@J5?UTv_|lsz>C z9iiq!Hafo4@2i)h@?O&U4!T8x>soGLj9#bUvM}&@&;hD|^ph`OpqZd7Qq zsd{IAuF8{L^6Zo%R`_=}5FtDKFo$VqXA+@jAv&@Cyw(b|D%=1J=*J7%ar#qu>#jBV zTNrWQW%vHI+$~i4$A(8sm5s@ zn!Z?d6y^zoHI#V=3h>ZbX?NsOOcCw(_c!ZC-`n31IeqhGl0UU&aRp+`Fs48(Ec+B@ zK2tHu_^L(g(XjMZj(U5olHX862&VrKR#c$m9obVh`u}x+zdLgvoBMTZ#ubto-2QMJ zYkq`(N+@iSdzgLDUMhT}KI|G`09@N4j#q#2+-pnvgQX&y$EI>U@@rV({^FSPyUJxy z*WV$jLvk!d0z(=ZaOtHnH>W7>dKC2AP>rZJU*3|>4cXIlR|cx@E}vGN?dpILa{5Jw zFSKP>VY{Dm{p-|I*4~!9s+dpIqR7W(s~h4RYWOC( zh`Y8kgqD|`Bcqq{3EnVqmfP`PFspkd4KyHz`^ID2>K|;QGzTJTFDu-}{q?xr44k58 z;30H3G30aU`owmbSFE=Bt|`ro;$-b>;=3$OF&gXe!S-AV$Z)xRtoIglf(nHn*AmPT z^#8$IZM`H(oOFEjK>4P6&0YAj0@1X|wH|d@2=B_dv8l2e%u*nkX|_J_iE_r9YVT%A zFTeNBTMx?>H#v&aLK(ww;dCEd>CHZyozEDw^S}Y_f(9u*Q>0Z=`*9FX01rAvznD~{ zb}D6{58UDVV}etEpS3-sG(*E;UNCJmnW^eEu}tqsy;ORXWZe_*bH|`PS=DkmGu}B9 zTn>ld&<@(YzavOam$Y1V9!LY!r)2*Q87Hx=lGK`7tlqZ1eE}_##RF)pY1OEin9L#89Fb_&_ z7ZJWi{Te}He0}d4w!|1bzhg#g;0Ll(KZ@8VJOPXN`|k8NFr#|5zdq8*+k zL@rV#W7X1h@lL^O+&qmlNvZ#4{%FH@iVG6|^Xk!xF{W=; z6!1>F3X&=z+}i-mv9*+-tyqhX&;h}gpd>&yBvVof-e``TS&R%GW$)?K{7R(F@KpF# zJ`2v)*B&p#Yw@gQjfqEv?6*chc0fK9cWr9{vS9jHnf?k&TZ!e1m$l*bM2^Poei9FP z?4gxoe}AjRG|B^-&;fHuuBR4OriMh@C4zTjhOv1FnD=+cUgKDDMxA*=MeO4? z{+pNL*hmgRz)g*XfIbD|U6gk!MLLIpLkV68jD@Jx1ZNPLGGAQNlU@HYUfe^AGc~`- z<;&2MS{NBc zQKn-#l012_-2J^rLq9b!ZX6zvV+8KvT8gMRk49_$P>?TuiqcB8PqVtblbr+8U7^M! zdr`vS%{i9I3z%@D2uriSxFGnrn4WPW^~E*;FX^%hYUlL=spMF* zJVKP0pG?e2dW~I|k5~V%Yw7~8IJGI^FEI3XvC}D_Ub}(EO5L?1Zev6J1>Q$dF$Bad zq_CrB{bTh}{OL|2Ef;A4NaBfUOR84aIYVHSb(V+kFg|Ei{YH$0_?>-0%j6LMys_WG zTlXe?*Vfj`9Nkk@>e>%Rw*qnPZzM=G@r*Y2#^~LNEY|XtZs|3etP-PPs7U{b3O|;V@5l~0< z3Aobf1M39!NM9Sa)N{U2`-Adj=V|!dWX9&|Ow`?qGYGHlyK!r!^3303e;-J(a?kB;b(#+6xmU!1vgcc0VJrIdEnnhKcc%Qqzr7 z;&3jqOg8z6Bb&3L_&KAA7NgCm>o2bK2jX$3f4)$e9`~uG!RPFGAdRt)Sjh{knL|GVO+?!mwj;_H0zvWk~hh4-dneKMKJ-_U$$ zQ7gkQGczaw}3@9%%t#ryu`cVwDq7Wf9XBd4*H_n zdvNyAJYS)5n~eB$Dqc_Hx|k{+=ZgLgZ9Q-RwXJ7>CBU+t?amEG&SDg_v-hO0*(W`R zSPtc|l7oru{52;@>#o5^Wlntdyj#!^w|W7Frdhi9-NK;Av$ zj!ZCUeX*Kx2=kOaz-iJh5ejyxu)KBT=W)k`HgD zxZm)jhjA<&n1_6X5@`x7@bx}!jP7<3vq$yze!$Y}e}uE4;O&&M0*l^5TdS0)&MX2^ zxp)kB;_%-3{ZTT}bkNIhFd@Zdzfdl|mn7h&1e9AZc|xr=fu`;dzeYKFW-SlJ{`YY{ zp}&JNFnS8b-HyTdwX=EX&$ezoS`6!q>Z1H3aiRLaos(@RLSWs@5T_J7wWKURVr2LT zmgs176LF0fy5}+~m<%$E#^IL!DMTuT3K1MNv;$3(RVX6Z_TLGx047yEksG`IX@lOj zE4gk^tFu7+Z_O#~8MG995^rZQS$q3i-5XDB{m$g#p;k2T97sDeV8w)tGRqRce_}vKO5~ z4!Q-zx@B=OV-wnQ8Rl}GxIW`W0iBa@Tww@prZ2%dV`N=i7(_xwj~*NwwC;YYY#(LH zK=!!aa8V(NLLa!X~)^5@>kU%#lH%P611ft z;x1|t=jVkoDxcgYPGTekBHQZ z^kWGBWo^KE)Q2$6numgMW37nx_)h!X1q?fS}l~vrUR1o%2Lm(T)WCIh;Kv>>9ba_f`#8QJG*-)zsqYKWP>ucwsgQToz z$JlA zH{acxhx-2e-$JFt-(yhPpk+q~MR+L%yxJ9GKzOuBn=UT=+Trph+Wk|jE@yeT@1U)b z8%*lMWesHpsf)6F=5?S;0(bKI!UfZ8(L4=uRYk%1&K#Bv2=dYpP1aXYsn%tD9r84N zu{vR3vGpB8EC6=V&$@eW3K*N`?=mtyjcRg(aYs%*kx8dDnQ3t>^C#Zrs|@mIHMDq^ z9Ppv6RhGRqWQPLWdEY!0JxWk!p-peH5#i^w$rIl#a+hr-1$J@KFGK-LJ~*+${}%Ub zdl#btd3+_6Ub1wr-+ZujQKBQ^PI{b_sudBq`auHq*lgAtfoT$dCaRGUFsCAHZimM7 zjjU*4*I|c3H9q95vmm|Y0`On$b$HdfTojd;AXWZ)CX)Cta^$scE+AMCg`#!)I)4{Y z!Lml0gA+0R&(q~rIK`Cjb7h3r!Xb-PD54jF~f_oXIE! zaT4KQI94SR;QjFloCeex#y)dykltiUXgx3qVGvLaO&( zltz#1Ou9&9su+fJi1oU#-5fnFzCwsN9+w@IBPRigDw3cMJooRcD3aO2u15$}`H1@| zc?F9M&EOIUpEzq3xdN+Pd_Z!v0tK`2#eMI~Em*UrO?2a-4Fp%R*gayf`42E~Bvr#K zw3yiwg60oUT`Z47@^Lt#2S@H;S6QE^J|7E%DW%57U%)4CZ_aswYCc*4O-C8UjB{D( z&!nc7r+FCwSgI`V*LgGFa4BnTU0FP`D0<%#jAEzz{&nHY<_>zWbr{5c-C znDn^wT@?kj#z;PWb*~Gf!skfPnVF3+3;Ce2y=Ekbzq!3V7$1RpvnDN)GGJb)vy_Ij zOLt%%7BP%mD)$njr|j(~oojYV^>}h!$v0H5uuMYM#gzrkomDroP1j0QQVZ{>#g5Ru z7W!6o%D8+x5w_h_x+KkKNvEwz%~^MoXv;nOD6OliGNgQsAEDKiDUd+g`v+*}btv+$ z6zTAu;Z9@4)j-NbKM|w`HU>HJybXQ)Q3W`#qtU`qhHbD)zJ%m76AJ|i-SG_Q(j$v3 zPYBRpE@iER3|uV8%rLeQN_RV)@l4~llMft_LKM3GptiLD2D@r7rW(~aA*$A;MPpR& zYeN&^2J~CyWJUw^ucePu%j!{+V^x1vDzs2BpBqSzv_-4{^9Rx$QiVv$KBDYDRZSBU065+Qor{CC!~7crVY`46IPG8t`k_*jB}j9M79uOUysVFrXeMeyw^8CLF8-E4 zx%WKuSG7ixQob}KxVqD^wbq^gQP~ocQqPqk@ev%)YZ&NpNj=Gu7(UxVwY&0hI-@66 zK|gUKBuQoS9ZC|TuJZIXJUq{8^@KcHix0XrzHTgzO7#+vMlNyk9%X6;G1uk(_HVhd z0=<>;haYq@UeOMy#`e%KOm6+Nd&%`e@2?^I|OV3p!M zmbWNyH+vt!No-hUpA|}oP$L~g%3sUc$M-ShHhv`N52&!TJQPe>sXnd~C;-Jq2ra$s zlAZQ>$JS4Iz?Q(8rYAAL5jV{`FXv4Vyd&srMG;DF{<5*uGWv}@%x~4+L^j0!^3Zev zFPx;Pn;(j+P4o9DS4xesn${qQls{#4l#rQ(&U;t1AO$rb2Yl&k%@X!EsU1S|>cEuy zb;T@f`rdDh7kwOPg|oFQuU{Uv&bRnJHY1p*m6+2`nb_(q5K*#Zir}r}RmxG01J)bI z3@~Fm1$;wrll$3klTnIb>b$wlu`G}))%{jgtEtXHJtWXh%;g`I?Fxd2BrMkAP;ZMl zLP$k{p03GpdI;#1biW1QOCbxutf=X$AFkNfiiMsjfK}^ zsB+veyAfl4lKaR*r*v-Q`N8RaUC-Pjrze7yE#u=25vHNA#sCcZVM`HxJ94SCv(38n zeC$A7btwTJW!ylrU}c&ny}ZC)?v%s+&R77q#l#Uf2|CsHSkd7F4z5G{NHm`-p}g6> zhvkCQQQH#4QFePfD-`!4$JKIl*zj%D)8;&yl%@mTM~LoRI~x^B19hJGHtSQj zBDsXTqdCd3I`E9Bn)hWnxU>Tb@pc6wNx{s~$r60>?RI_Vg;@khuKwOY3ZSUZ;3wQJ zYAk#U7~5}nP8GA0$29}Ju)T2!;*`=-B#yb;>kvT5K=cP5_?L9%?-9gmbzz19cP<3(200eAQ{Y6m;q@=)qp9FGbj6Ph6kt~x@ z`)-Hu;_ltAA{Mi;COqB0iPaCo>9*={8P?TP8H6t;6evB(Fd(NYy)a^_o>>qSVMr5w zl>ulqkT+AIOC)IBem%`^683cYWUU>XUM^3PB@76M!Un&HR%^0MFh6Y-;7Vvfrm<^SL zAvCq{6mYLYq@{$c&|FKPY!6 z?Wu!@?Vnf5i;1j0i8ggVx0ginUn=A>-AI}Pjq!(A_?gsriuo2FK{ZP#_*5Nu|2aT{ z$GsbD9i%NLG@LVCu5st*xR2C4LEEPU>E2YN= zO1oGNYwMZt=B57q_8^N`Z7XGAs7%_)byIpMttXs*pAH`9C%$T$Lm$wFqoOum_?A86 zLoHI;-XWfWaqX7V8#4~HQ_G^%r_lU9`Pi!ky@+3IACi#rmA0$dLN?ZXyf*@%+2Gi& zripOSa+es+I}_!+F4j#Q0ayX$=5j<*KU&=pQzpNx-RD5kCHF8d)ePzyw{ud9vPpG~ zKLG8BVqi~sqTtMV)s-kNmqV_xq>pLQ(Ahd0*7s27c>YY;~duXxqCLPI>g%-2Oo5`8QN9C!$~*LS&Kx*f*bSv>gF z=4)V>B$Xm7O8y>I&%m6`nf5BAV%SOTmK2M7hfSc)#E5^tll>-(a~gkN&Z8J;2W#ky1d;`P=^rDW+#V$Z zQ8JYuPz8`(I=TSyr_zEcBvm9|P-KT(QD(fT8MZTmQFfW0$GG@TxmuT%SElg;LmOcO zN9{POl8$$6t&YLxrZTGLA|~FBHo+zlk6`z&KsVdgPlEonHHtS`c;)Tx8?r+%aXzkc z#5P}6yFpz8JpolP94*U6m(z$?;oCt3}agjcjz32aHC;W|D z*HtWaS9oyceV-&D$vRcWjYNq}eXO5VTUW*R^5VHh=DyRnxhm;YS2HcE=`l)?inpJKf;G+OLUuJ~M23@MPnm%l6mAL;6VyW9B)jyBzd;tcM<$hn5H zF5K0Y0ld`&o=fqAK3JC73I4`86B`!ds`+`>SOOC=-Ri-GSQW$d1-3K zhRG%6&8d(w_Rk@Q+Fwn)?yQLduIo-75kqS6YnTECGT*^TU){zG$BcKEXEu|P?qtG3 z>M{}m2WIH+F>UUFcWt?(9&O5yVUpi3ToO_1x4&BrwCj(ERe0?0S~KYQIfoUr|06Mv z&p=DRP6pCCvyTZ=L~VE-+zm<>kRCIe!ykSdCO=De7pc}hkt6$;?!64F1fS<}dkTu( z$p0bk?ii!z6;|`>*jGj>D%8AgExXOTtGc7yXpi!-paTW^RVl#*%kF}$@pHFSyIilT zYh99mrW!xmW|>b=YM2&eIM1@kXy*lL%XbfC*iC*066U6a;h2=Ww#%!LO0vW%UyeQd zV(!mf~B?$)U+ba{} zG{_J~Z2@jA9_QN0sxAwf3?&8QEaO>X%DA$gXe%h^_fb7zxvAF(+$;`K3^<`6T0SZB zPsxM{8{Q%kdAq_zc1q()8QNJzur3 zNQP1bpwgxtsT_yo2E70Y`f0A^f8Jvr_mxW!L9yO!hjM3-l}=s)-Zgwi!UH z5GUu^HogpX!Wh_Y(jm+(ANyQV>rr>Rl|58Vbw`>(^PHLQ%9#GUMQbfH977*y{J*%< zITOnO==!$ig>C>deHST_L~8)m5t~BYr*s|Re4F3+BDoK&gdIvL$;!bw00&(PF^WZpm)4wevVDGo*wf@zyBbZ&j7NW1g zbEXkM7W%v8&F^Y)MBfwv2N^4Vu6Vnvq1V@g@N<({Z^{HV@!$FY*K!tgv& zzQUfe$%`5OY91Y;qIg9WlLacZ3}Rluct*)j=6s&2rjshm`Qij2e?q#|CO2|JonoRf z=)H8D5YoGkYqL~Dn?2=fc+MdY@gr8<{Ui1TwRoNJ>;?OScd9U@D|F*toMtgypPsBE zbHb{Z1B=v2f+pi<%r68FW0RP0_ymwSS z5GfCoec!R_5H0Jwq#;U>w$^8BbhES-?t zZlF1B%v`on&<>lR{zUM|@}wfS7x*nj8kn?JcRAB~0;u5)!-C&LtS9d`UnX#jm^8Z} z30jq#;}Rj1VBfq&((Zs6AZ5IJGD^AJ%91PZ*J4Pb!Gp~HRG_M>$IzE4vvMP+uuQ&n z!4z)J{o-VZ6L%zFzxj-Cr!0?32eaK$;&=7+tBUeSmE*>n|CuBfDmrlMOv6Oe_Pk>V z;O>j|J0l9gh=*KpJLKhh^2f!_cg}x(oO+U=kBMA~ikIU8r z=L%`uMuax;G?hLI3)C(#@uQcu(}B!y?hxs{T7IK`;jKImKN~aan{F(VRYwvR#P2OB z;DL-u>-CXA^cGyg`A}TOhN4g$7qFV3fCdMiQi# zV8vM@clh-@6%(AC0nUs(6-m_=`eGnb(U{EX#yqAnDb|v?DcJ`CAHwSdy3xDiL7iG^ zuCoMrj&W9a%~x zy!+qeBSyN{!AYiG)w2oOMYx?H-Bi_d78OzTqYrT#{O}9|3kS(J-Wzej!8#nj(DS%; zfVShS@Sr*)TJwmnA-rC?C^E~v9jv)-Ld%9$X%>h+5WSJXTyl?k)Yq%fdI>>C>1*3( ztAI%xgt|eICxz7X%9Gx-c4c!uD zJxZWft;L`r$Y~en0ea=DpgLsvKrvY!pp#h zZ8;IV3{O|>%HK)%W6}HaAF(6rveAPO?Sixal|h%OuQRNH#U`X$0YHFVKBs-s6iz5UNV zxxcN5#9a@adqXb+O%%V=jFU#M)`1o2#rBJX1wnK~TxR>MA#B2iS|rh#t)aBw5@9rm zhQ1jlXv}TN9sKlE@FQ+&*RP#gcxFx~`TXZO6_eg{7BZj;1A>i z_mUndlLP}U3Nm;XT&ccE9IUF|qcY2;|Avw%3*yw7)EIyWv13i;dTT9Xp7rno?M=2P zzHmV`Q!cCPu~2^4c^C{Tn<)H&&Re)lc>kY=PKV~(s2q7oP7UNw3xx?8`o>ACOjnEe zn%dXtfs;lFR#NuwjCHYZKg{K3xQIky?y1fxYk>AhngO zu)pcT?3ZdqS#g&83{3sADRsTy%_L$F5D8|?>Z*JCc4bj;8N&g%_%bM8Y>f~7(7z(IgAn| zG*Ilb66@(q>TtJK`3_r}Z`2kxSP1J;iazS3BZY+8to)hgZm!Zv8@MycCYfm%@Jhkb zBw$y+|G^T0M^cA04qTs|7s$-Sz8Yrf-sad-eFn#z@vKa<`S?;qFoh`87^o6=reBIH zIO3;sd->H=rRGQ+L1$aYFPgH>NVs@ip*aT44|3A zUFl^tI$FAROY@NdKC{pir-etCY>J!!P`j{QB}z*f3R6&;c>LOLzlN-H+?;qPn!i$U z3)sDfEdZf(9mg}3tDYcv@XSqyYn%;UpQnpNu<4F;`NHv{)L3(SZES@c4vnxbrr;wm zq?<^s>+*%LnVlF~pI%nQC*5pJDoi*c)#mn*v}bG@-U~vOaTbI%96ng7o_5f!yD?d_ z_uWze@gKwRt7cDzuLQ{E`R+XF+Y*z#OvtFjLHqWXBcJ z2*Bh`MO8Z~gP1VTSj=DX_;2A8uo%?+4vkjXAx)M=>jz5)ZdMsiVaBNEJ}4(#(co00 z1LXwi7usYy5|QZginIHay@Q@6LK(twUL~^PogDLnEhiN=hbQu}iHL+Z6I+!#&|VL# zf{gH}eO`ADESZbSpBbg6-LvTCo)ZktCM)hynF`jE?Boc9+8*w) zHX8r&a+46_@^09ISH|&|Bgu+~`VUlQU2?DA{bft5UDJP{T%Q`0qGB$=_jSxFz2&vU zp@mo`5$3bF>#+Ioq3C%Hba}{bLR}&tO!K}kuy)PG=j}x0y)z*>`Q^U*uRx(QGm_CB zx4`o?pwh(4Mg(G%OMS~q9^2&>_>tYp;@x`<+YW~JU)rdK2_EAVO%*fBY=%Z&@nBc` zxBk{G!akH`b$ak&%?Rq6a2TmbRM^QRY8&Uk9(D$mRsCvL*!~M&1-y z3t9jp=(S4S8gfr+kkbGd&2eT~cm62dZ3~7GJl9DhG~O(VyTHG^YDuqCW#7SK{oY#Y zg(4|rryJ`I@+AKi-!DcxPhW5mR4MB`9dy%l_A?I}>cT3`JFWMNy1P3dQB|raQKUF! zN6o&t;9wWMKD_wuWW{jLiPuEy9ka~?%wWs z#5oDD5&sE{2B8k^+v;3pJCUCDZV##CPb=~-Q{C+NJ=VClSGp`_{#(9r+m!GLJaGwsUkQu9q^(#jLQCL9n5CG>#tPgbh@1sH__f3F2+E4cmjn`||WM!P7QuM7C9*Vu8iex&zh zKzs;I8w?h4%--wCxA38M`clz61dFR+rwMOv=AGfWf~V2d{&49g9$!xC%d$;o8A_Ms z;gK(9`FTqwyGee##1&R8EdvldZHP9|q`HrXx{4*WI?<4;J+F3qAJaNAq`Y6X4z@6I z=Yexb??C*9MOA7$!Yluqy`U`>G1;0M4p{4I_5MCr5|)1>2E;sV+L;L6QMieno(VC! zkI^lB{?_nigmqzHk%Hv>nrRJ_%k@<`IO+{ZZocYAmA53KJHaiRNk(o4HtH?I_Aa>i zv4b)5q~QedtyqTxGn;Nx>$y@ZKo_^^ElMd4*g^`qBh^B2^_e5C7b(uwf@!=`UC;{f z!CVfj5y^UOl(@93M;;r`bNQckQe1-+5;3 zkyxa1G;Ld^^FKb&d9UC^4)0f`Bnv9845YB)LwmTtdtmCMh~K}!+mYXMWAE3+coy61 zh55Yg;ITB*QpOcHsviwb9L^O*A+vCvuP zyF{PDtjNIXP@s3doJ5P!?5u`>s1A64t8?=Fu4Z7r?0q~#hXTY_*)a^0EeL@1*0%4D%c+seC| zjg@`d=6ff4Lr#QfUAX-_O9?YO%T{Tf`?tN>PW8(fGeai*-h5o zIkHr-&+Da0_)7BKZu^APO$#0!!5odkr{4eg`BB?S0%8~ARh&#%?cSxFeBwBn)T{hw zm7Ar4@x`PW1!}e#{Ne~c5o!8GwzoL?AL7AF@xbfVapbTedPxR9&f``ZTju_We>V?4 z9GOAR)}wy3&-o)XL9M*b}ypcp3 z(*U22@{?ROOW*o961`vZCRajqwbOVB&Q==;_Ffo9DOBWLoJWJ~yXI8q`QukcL9CMy zzOjFlC|LBx-ihp#=dHD#hb~ZtpFi$g{34mOfm;W+tVk^hk{rU&#&{mP_$1Y9yqpi6 z9od#I8$x;U0T8ub^L_ZePA?B)WKoD{nr0WzNFIKgRW6y8xGyOy<&GcAp=%h_{rK=8 zHZt(*ONkzjUqML{nRGq;qw1ax99;Yp%NiNxPb8(@xmMkdK6LxD%zqDSZY6fJ!Fo)t zk)C23_h&a>9rbThx?|JB$@Mu1P$>QmQeB*`za+ysTwl2wZ#ruHb$wBjOrx*k0Phed zGXO+q#=BTq1$1?0fBVN4w*;QKnb`R7Xq>ng{0rc@NCtZ3dQ;NvVh2qy8=HeS(!~YF zyMCxXfC;T%2ybmc)T;H~<~g68vO1vS}^xp z1-5}^^`Y~hPqu61jT`BDuC-jfk=|T%SDS^g;96ftI19t_O?BMp9+cl9Z@8JS8#`~M-wK= zAvM=5@A|5F+NTdqM0hHRXRrTA=7homdUr)d0sD9(l91=cRX;l2o~;f8E^rwur78Vw zRPRv}zg`UWNqU!h{e7lU=#eB&8ONZskCFooU6}9Y2dJAE-Q%Cb9I=nyPg}5jc+Y!_{9{#Z@HvT*en^!_ z?46rbCHY)I2!2FI-Y1rqsIAk3Dsp-I6lNkYzu+?#!tiv*dz(?3)CIgn{xIo*k0EHjed_Uyee1TgprwK``HAqS$Rk@kWl$TStzgA@ zla>0i=GyYUYIIN)PgPF(Kjh`|V2?z;o z`cT5?k-7CvwbCl!meQqv<5M+JxY-uFeyipup)}E+Luagr?ZNB650t*4vYg8(YVGs~ zAjvs*K@&T@WW)aY03}qGi6atNSkZOMMifk5~EN zfh;kE&V4j;#_o|FS%6BFM|}0(==0t^Uw?^eY1C0>tODINOtkAxA4!#S$#W~DpXrj| z_g3;pq*%B4>{1BoM9(06cA4wqG;dV4%k!5k&hy}a;7osJ6+DZ$#C@s$D#|xhbw+BD zimKt=RZ%iAl8NWZKhi>2AbV*s(^P5Vpqj7#L;J$&Uw`PDkSnWQv1J8%`le;ZHrujm z#%qqS&!ZTi;Y?nW$X4!!4|2O_VPE^rELlqQV*;?SOOVf zo3DIbXyY(-LgzZLL%dcx%Eq z0pk*)>PZMY&rGL`o3N!iU;?f0uAhfjN0vCz4#94-2cg=TD^x$mW~A~lXpRb`oO1Fe z!EnFivyM+y)Ft*MUkW0m)!Oc#av7-bR=Z&Ii>`T5tp%cX(VZD5wtD96Ry_B#=L2=) zkt<@W{cky|9B6eoR{ni{1pTCc<@=V~HS`ZkA|I+BPnlS0TfCe(r##!IOq{er_Bm2- z^#?XMzrFTM2$09F@3{c zLBr*e5ViYy`J>vQux3uKheD&GDZ|7*2?nG|j_+bjOqI&u<3$3iHiZuL0(9{Gw!-rR z!I)zvD|ezP;?LThxI9JLUAp=zoKeitjTD&1b8VhDf)NEQa!|l=jo01MgiS~_F z!GqPDYED3oo;^Ld*EyH^QVsJPbLHlf0^4=E~G znpEmSnnl3_BOc{cQ-~01IO9%PAU9SJ`2eqf9Rd~FQG+V1ZKNIOwIow_>pVqW*xwG* zDVK@pNiY8m992hI#|R2Zz97cfTZ4Xt(Cehl6|oz+t3cO7VNKq)b6ulF?s+feY(DCa zt3;-pOk3FY!DU!ukjV>^ipm=34zmv}6be$gE<3E~9UF8r=Z#-HpP6E4jXA_LO!uc*0 znHYYzA0dWZ6EZ#u5#US%Μbcp8qr6ozc} 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 v%wmNfZjW}O9 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 z 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%0DyPURXV!0W#H#&MQnucb6AMLOJ zT|ALzv+<87iNiJ%k1XTyBJ6t{QQ_%mU$iA!6TQxvt>cwiD2fYF4$6HU);}>i93_{{ zKKs~rZ&?lx?NG$KvsEK~#Y)pSf!nI=eRB zqift0UtAEKiwFJ6K#o)>TA?-c5eiU*;wRuhH2 z%zm%LlWA{sdg7@vbZ7yO3Q*5^ zRubx-`>zroU%H{>3c0>+{A3;XDL*v`zFCP?B(f#c1QAZJM*KrSXu5vH>MYzvMN3ANIn8k$7 zhUgrjtMM%t_%^e+(9P)Xl>3oG}6Ip*-)Di6|6h5~@I$Y-FG&lo!x8!W84@ z#K6i_B06E3F&(uc%rIsWkt#0|{RzJ?W)W`*vyC~ZBITFF*uq@nS5EmgF_1EkI9HjE zauPC)-=NBbmyDNDKgw@e{S!t2HxC_ZHcnoxMtScz&B-ZEC9-;}peh{B(YcTkkVpN+q`z`LxR z2!AzJ6HO|ABQ6sDZoG$%6xJB;6WJ;MAW9L|8tYJ~!Ux8B;sj*_idoob{L?8PqMDUW z#5>An*8YTl86Oc52_G9`BNI(!jkrYu%is&Up zRFfjwNf8C5h>lW3O(~+O6j4@+=&PF}?AgXzyUUKy+K$@F&ZMQCT?;$oJMCRGw|Cae z-t8UM1GihRG_{^;V!hYcdNj>?xsmmJs$GqSc7<-UtJc7-)REVD<4KeT^k*B zY{aD4D5`BEtCo$nTWkc@v{6~ZMrw5%z13_)C)+5mY9qgjSwm&BkVJB@TopyG+?2LEYyU4b8w#VM>Uh9E<)+_t1rw&-}9kd=jWW9XYdOpXl#u2+h zNA0Q|vnzSru5Rvi*F4Wg!U-E4CvC)>vQd<8BkQz{wlg*Y&)TRwXCw8zjou43qA%Jg zFR+ncXx30<7IMj~rr0d$vRPM&S=^Pf@7b#@2FolpYyJG13E$Lrj?o8xUF_0)`ANR& zB<`G0*<~UXe4XkpGm+ps0fpTwC0Ayx_IzQ*Y> pr}O+#HaTNCFR7Qw#(HX5z4AQX{KY2wUH@F(O9eLhKM7e4{|{o@_}Bmd diff --git a/internal/media/test/test-without-exif.jpg b/internal/media/test/test-without-exif.jpg deleted file mode 100644 index 274188ee706797b69b54c635bfc85bf0dd9f6671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227452 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

AQ)An$Eq6zX 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

a*6JyC|ioI@y+1 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%0DY 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

W-IkNJ>T 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%0Ay%GA} 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

5Z~Stnc#%5iYD?99N$DUcQP<(r#Nn`vSDW* zpOcE!Idy)lJN_}aWgqmgW97fA&Y*`m1*4v}xgZJ_GdSORSg_J|49# zkoIjh+BE;Bc8s`Sp4}-rJ@#TxURtp^f>TS$?NYxe5Dq#ww&J5F9yYL1iD33Iv9Zy? zh9gtf#rRW)Op4T(({ioTZRtk&^&*xl+ytpe`v(cCwRQ_Y{0Rg1qg|7dQJE{Qf zJwg;J19Ezz`oGmmRb=#+Cc+aneha|D zp;(t_5!|T9KQ*yYd5Ox_MwTC-7_xX-T9i$72@^E{jFi9N4_PEcJftsB0#51u8apyX z-&NjPoWRPRRy4yVDnEPKUWsUn5%QPmD9#-e|DKmr1QX}B#drPB;c(AHJPF)-KoOsA zYYgjFb~NnsLsdEeeBHJkUcH4T*7G8ayY0QgwfQkDEMrQf&l3!~M7we& z3$=SqL%lXZ;UERpE?%3l;(BXb>|z&h#C-et z68wc!ey{J^e>=l2A5Ug*t|U%#gTDs$3@ppwMX)_yihl&WRJjX37|w&DReo_FMp)JJofazKEzN1wn58*~EJL?*FK42}zg>Io-H$=D=ENs@$Z$ zWRXNpSdrobsaW;#Qw#rJx%>o4? ztdvW+Vqx@6g^x`m8~U+%KTks$Q(PUpED|-bC07a3oy~1)9+vu(o@gHNTt7Gzp}3T% zaG&L|DzECWGeV*&rWYqgJRu6z=Y~uP-$z+G9UqLiik+&-d4G6&GuU5!H{Aj#&wWl@@Hf&D@O=0KxoOAMe(APCM6FinGJX}k zAi)%rZN0ZIGWNAdb)U#zdi)^!0Lp@ISY?{yjSp8O9EMBXNZ7;;Q0Fy&!f6f3)3-h0 zNnNe^R{yvV6cf(7+}I;AFNk*d}B)2Zj$D=|P6Kyf0jN`BHVz3hyp9U|uSGK`<@=FaH>hlLV0G&u>j+fgH&mwJTVB>@L!T1FZ!S z&*XP1aV{d}F{VeF+jQZ)^3qh4Ep{^_K=;A)4glCj#qnN@k^(d=po00ar|vQG+wW*} zar}b`U}DGPa$-5<#kUj4iri5qeVT$K=dmaD>1^zWJy2FLGS3!^l#l|`ls`y8fs29I;MX_@_|L1$Vn ztLmJ<;SKNrfl8n((w)hDRMKAwxg(4pWp{UTys<$!j%MSddX3dyt@#wGEr%RWp}l$5 zR`R6UN`hTF2)?CPCx@m#Er8`Ge4XHIz-y^>Z<8kb{z}oS5;z^n!*Zc8l<55mlAJkGZ>>U_kIt)CYFR z*L1q%g9cY9Qx@fbuJ(iyvUdU?nI7MI^g^=cr-Y{Ux_qiIxtsvNso|cbHAxb=k)fur zBAQ@&tm>Y2#{LK>bU_v+*}xYR@5uhgoc0*Q%aCNW3vIB13?Y1x^|5jQsQI{3P;sel zX`#;nf$oU`>S#4uq+DF_hc(oVt^c4JU(Ci3?{#n+qZOK~(XP&_SKmOU9kvu-DElHq zo0zQZQlGwNc9DmlI!)kp2B2MA%2=K<0jGL*d{)pduqt4?TEpwF(+YsE{5E%Y5OgxT z3@FB*DL(xoHchSnHR6i|SlH+9GD?^6vXBcfiuO!$fp!HF&Ar$oA$0jQRY+FE5$iWT)h>;!qCF0aLls` z`H~GkVxL@{`n4lv$9|4sSS+Dux9(0w`s)8DqPlRB)ld%LR_2`b`(=W{?21kVI8^v0ia{cb`)YeN9O_dNJevfRRrpsnYdmUUkYOi=lh|Yb7jwjDd6#8*L zJ0*){2Kz|Tr39$&5skmBR%nypDHax<*fmqks=J@5ro)cXRLIM6I6&3IRY5`W!{j1m zs|S^_cl%`{$z9vmJ>fqcij@AEtaf{d#!YD@UHsYXSHQ)`ttAE_@?K~*%#fDQ`?FCS z3u~~1&@N7SnIzLoBpehp9oF>|rDc$M_C|z8ax4B@RRXe-bi^8I%z>O`Jjdy0mutFA z3hh=X_E@-O8gS`Z@oC$s#gdhFz3XVV3%D>6S1{o>bhon#Fbscc{^%NXyJPvn{|!t( z&T#RyyR&ETF3!;5TeTg!^{U1R?C9qTs5WP3t$8}>AloV--K5d1ywhcSP~az)2MEpy zclQ?JAE4h4{9ilapWF=%nKEZ-u50&41o26h7;z^8Sw^LaK?XGqdC#lMK;_H>`|tDB zVi-qbRf}(WLre+Gki(;hUh=XxMwK0*%)4PI;QH8z=5xRoBBP~P}k}0 z2~ZYrEOer#Cr46zS=I|-wss_BRpn}^&;gtTi zLD_Gs#9zkulmu`2B+ZwMN~C-_Qs`s~ltn(Np-!BOaO<-^E39ldfqoY$`I2_B&ZxB# z$K}SU9k!UJ)j{m~x{Y2WRE3hpZ#l>JN8jy({FfD7I5!sv+&v%a9qE&m%IPYxF>htK z-$hrbY5GJ_2p79U4O-K+cbMzo%uvEj=vYtNhB_6X14UGy_I6s>fE5*X#i&&-=s2$p zsD7BX*U>=|sr(H77k9d#r5^&_+|>qY_|j4J5aLO++F*6TkH|-)j$?vJeS#-HGWuT0 z7YbcJYcid483-B7vFxIre6AA7OBp_jE?oiwSQ&Z4MKZ+7c+ zg1PK9s(C+FrG#=oQ^Jlee$CC6Ui36xh2~4*ZzwxWi=c^jX#-my?}cd#smV9z=WDjQ z{!S?0F2xk&T62@DXoBS3ue;+~t@+1}Qr26#p2Jqj_~NToT`s(ibkq5W?xRUQftwzi z4;7JxJiy25#*lC7y`9`4e?@3j5+kwm8lG=rI$ifH+ipDxr(je5BhsP>Hqq6VyMMO` zVD;yL7$%QOaU=K9l)RFAekS*#=d<C`s0}XNv$Fw4UScm*b+ij-& z&m^%}*_FFNJBl}LFW3bG9t3sXACnG%K4FdBC9cqv`c~p_|Kj(jk6bFN$X&Ap*EqU} z`RYj@#qZfWEM&DCtGbf6aYIkS0_)cNXV?116{xQHbNFqbtpW1Vwj`(*PJ6Sz>(sRk$PRqWr~gDFT=PCqUPG!5#Srj zTII(ZH-Rr5i5DJuUcTWsUqsE16P6= z3+ti5>GAA9p-RRqHBg8qcL%c4V16=tMB?{Chkd(k41cWQXvry*KYFSpeht_osfQ-U zLn8F^^6JJTRrIP)%tYhg{crN&Bi$Q1Nk(opbMb1$xx4-v7=?6tc>$%953!rvkPK~8 zTags^&Dekdb>`owh1?B*n%(O#|9bs!zx5#8N2vGJloti2pb;GGxtDFx91#)fj zFOZiYoxk>qi>(SwryC6S1&m>BBjnNBiKr=1&8=z)cTUm0$3zAFk9f(r3TQ|zQ2_xg z=a8Ow0>V5zCva>K`2)O)$2Trr-=joFy7FprlU0}5Ki*gpG=04Nvr)R$u?x;@BdXms zhmXE8+N4VM)lAgbNK}h5o_XbRGlu5kTopV>^8nYinBn`f(}@S=v3zEqP~{`8irY^Z zzJ~i?LY6EeyZWS+I{!N$_JQ#WKX6fhIP%KRQ0524Bw^HAy^ai(;6X_M4~PWz$v3R<@s&N!(Xn_-uO-J=B<4j`|Q~?r_X#{-P+vHY|>06 ztTM7NqRXf;WU`-y%1hVbyZDIj5EPN+7S0b{4y)JM$p2$L7uk%FlNxvF0u6h9k#(NE zstz3EiWt^(eC#nUI~B?rsvt~D${$C!8s#fjMS^buPQ*L=%PuuinuiU(9`G>yK#k}? z7x8_BvYj14-UJ&x5H3l-{iLUI1Ob4{!VHc@N3!q2hieKC$&9n9z9WUp{aMtfm4|eB znb1a({dH#1FZ(!vHikP>Us=H_saG`(XfU_=MW{JgB7yG%r8{3a-@&sd_D3c=$Q&sV z7G?M^Q|T#js^)2nOh?nW+Pb&te$)E#7NR!q3^dSKn_r@9t-{aN5Z&}AMJ{n#2MKDn#Mme@I7_Be1 z*?EX^{6=Z!qV(?5kmYZw37;v4G{EAG1$vrkm4SF=iMGCl1pXOoQ#c_TtusBJuu>*& z?CmJQcYLbhHPp_vaX=&DClL%Ej-SPvxmT3w{MorBDw! zW?LNI<9g0yH!_igj|Ew4%8j_DS@Y-~2#!x{d?J&j)MhNzn$TQfL4U8}!MTfKzV7Wx zXD}UE>@oAV)fauM$)OQ0r2wN}mRinal7~69OLf60zLT3;p>-KfQniq$U8w}*#uYDB z_VQ#;J9N5}tdeO*0k5Ua41M>s2Dz4T>>}!fu{sUe`F?b?OlzTL&K-7rHRq7TbN1C4 zMh{PtaN1z$T5SdV&h%SmH5dQuoL(Ip$=99;K`CKH+ybc^G`P#Rl`8WfArgG5H%E>3 zX>PMfwbtCvTEF7xy<|gY;oPBc$#8E$!t66YGhsm%{`gXd?yL&GX*Ny93I`(w{~FQ# z_5Oo=qL^*-P?`2`%haIRqdl<|Map}Won|IuL!8DTsrHLcuNY-m0H97j>nfzG9N1i1 zcIx?C?}J*R?nx8;ooL}&-pP0GA-WKR)Ucb(l&gLLXUEdD=&iFfxqX=_=0~U7Q5NvU z36P^rY}C+|lDR0TWeEu}^o~{fGCYMrR)KpD^%YYXLRH75wG?76WyDXm zn$zE9#_BLjaGM(??uv9>g(yEs9;(F-iLL}Vs-p7z5o!Oht08X&U#wfHgits0!f@MZ zrPa}?R7?UiK4ogVY8Tw^Vo{h87J0zo?1CmjxbIdtxn;JnkjzFUUSl&OHP!l-oSbt4 zbh3#``s6 zxa1lz{;BdN!kotw7U^wog^x@HGx0E=r9IoNCr<<}YQZZb)>BHtzM(3QJb`uV2#?08 zs)y&il2R)Jk6wd9W@kmBT<(Au>p!n$PvR|Ol6iMC1)gIU=qZZ;TM&AQ^>wR~^ zPg@E1#v(P~hR;__Sa3dBt(R zl!r{K)(w|DAYoV-tnW^OHoXU+0lk&4Ux)9D4zp+jqnOXl>Mx$AJ8hdM@?5B=;hJxk zgbXzxZd%@8<=#7uMjVZO*4p@R~X!^|ZsPJy)E)m9@-{UGzOsXnyI zq}%eKxVN`UH?mp*DF7ED?W#Qx;u-Ft(t>oJSP;llyppd)OKPYHpfW=-@dv;Id>0KK z{>rE)!)tShwGL-~?dET@4=^9uKZjAwegKAZ!EhUyx>Rs^TP5Tmt$0bZ`Pvs=7P7()b(RriW-g1Ai@GG~ zpbXLyASCCgWUM#+h}ZKA6nmCobfEw#<4?HhnByMzG=#X7<4Yd%Z|Wx};|}r&yO-hs zD*1&OwGR9D_PA-QBG!s^hsMB05(b5@8jO*3fZ_Kp_=nxn^Lu6gW@jAf5Vhasr!8C| z>wLa`U|e4)m?gN@=Pd~)?Q*Ws}-8md<@6`3^GDNmVA052bhH={DrZ%e+52U+5K8 z;{y?EVfSPqzbfCN6DLKijE;RZF34Xt+)MJ_!>_Q4X&Hck89kJ?3fUtp*ikU4-JXJ2 zF|fwzeRTWSh}=Q-hK{MeGdqM?Y**KNR6xG2E3E3@+~vJ8e#7ngQQ!5RcK09irJ)74 zg1|(tmffjcL$(IuaeJy7bG^+&Uawdz1IYXi)e{MXVB zy4x}L%<`8NUhs8O*zCTvbV(?dKbe7*tN)J=bkWZ}czJp-aZh*UZddwUe4a-0$0JUMLnT)Vj4B4$ zo0vqLjgV)lYn^aN5e%7gc!2jQ%<&JcjbvBw-8PRMK@QM4fkGp$dM$!>8@azoX0U>r zy22ao_=Xn~`W$bu&L!Md3|&P=z_NX&Ld> z1m{$we)9pIQ9vk#uk|_Tp8{D;A;b_yIID%#ENG;;b!YBjPZPJ z$@S*~Qz6izYr~~BH4FC|Mh2!Gs~_E{O-X*db>Z&stj8vq7vT2Qi8}a?VmV(8m#Nha z?G(ntHhuDi%p;Hj*9czi)B5wE(>aD{dbITdx_EuP|?6-aSTxTZdCQsQ_o^aTW}p7L<%CD1kc zERLOIcPfi1cmB-1mk$|@$RK9yQ#v_d`56+g*ia1gujY-D5YzF}L+{1&0F8{1Rc=D` zv{m~bUFlZ?)^>C_BJeh*Ax?F<7kP?io(-`Cn!gteuX!o!X0XC6?N++zhoOnGA^h)R zU794`wPG9=zP;A>XPDOIoOmWnLa!zGj(@izf4%)8WRW!N;(7PdSCOR6+zp+!RncW0 zf+KU30hZl5E=l1AE9pULO|Sdr0nA!S8}ywX62q*QO+=VAtL(DvHEWO ziPL{8+z-(v7J|2%4Bv>A(^Fxw|LqkhA>Xv5+qFEI-k8?~^2XhVD+y5!mS#AFY01@K zjm8a*H}UE0poFrtk>1Gq2D+|2kp6slB>q4v z5Z+mxcbddQQ04g=Y0!q`>k)kK3}qCNb^Gvot0+dN&eIM;PrY(m6Fa^S=C;j0XmJVn zrq72@U5r*AnK$s{YF+Fy3w)^HdBN8fE1#87_x1^Mr&)Lixb~?y&HVU}R%~&l<9qb@`kDU4)G%_IKUgq}qrE-x=k`QSuwI;Vc#n#3$q9ZHdlOQkH z{Hh9Wp0Jh_ZXMN{JJZ=w$Ty(fxtyI*VfXQAvY#G;?m>aClA-=X?)k(MrtwE;+6Y(#J_O-vQ_-Ty@xDAit`;F?*yC>G@))y}D)e z;3Ym}O5_YQRw9)+aA_g}<*WiVl9l@JMMQ>r*sm>fq0~vH5 zR_nc=*e#jad`5A5w+{eL%+gogxmr|Z4SII&I8%u{vDV-t#h+T@vHCVdRT0pfISQ&S zJE0e5_|nh$U-BlSG-j3Z)dD({=K^Ua1sdWK&7;kw;#umG(DC1&rnodfEGU^pd7jF) zg{q$32W+pjkhlR3xkD}qd|DZ9xak^k^D0)m|k~3EqaD5O$bzb>@#w}r*!;N!;n}` z@tQHq&($+6Go}^Bq!Onx#+awxg-^}WFq#ZkxQid@O5bGG`~`lUy5>Bd@uu2n{U1TmK=-o*dj@B6Y#7;Rq?^sQaa{7oaF|Kn^#u#gf`jNgTei)@A3NM@q zY3E{x+-EKnViEAXGtrN)U8qg^aW`~Tp1BS56dq?_ zHmAi~HNY$sv^i=+Spbv50!m3xYu8NsjN8!VdSLuL&pmG!x2`N9yd8qcYG0RZcfLsJ z8#)8SNv$&eIQ5K$Bgs7Xw^Y`*GkGQ91CdueP%*`hM`x_s@*FjYM6Kc*4rF_wfOS-N z#wkqGq|<`^q1u9Z^-1LwkO-2{VqcNM|X>ziqZ znr+GCz3N`bOPjk5M6C03yy14NqR2mXX^;xMkeFRae8afR^v>-s-l$q>tSX z9zhoT_cQPj(GV3J)q6lu{tEjGYPnz=`i}q?h3_UbJzr&_D{t|R{tr0xC^EP`ZCcAi z)e6&zOt|<(+AY(gx@4ND}Fn?LHa77x{#*nZBYlD zZ4zzxVfl+jKNQ~Ta@*^AQ_+J{kr?JnPu=Jm|I^lij?bg;);7YIgjS$U2`va~0Gaz- z?ud+<@U;^v;8C|j;}2qm^4a`1sz!4r%hP=Svi2hb{Q#= zg4LwK$7>V`8x1Nq)!^%oztF7qp{(`Sr$L40`BeT_m7^})DGpTd3I!%K)el@-Mcl5E z&~obNOW$a3$!Si~0OvI2~%9>(~g__rOyoLZkS=$kKKx!5E-c2AS(APaE$yOavblIeX~1^obZn~kjYn(X_hLXm8q5Ho z4S+_Y(&+C~y1T^pzZr?N26Rr3(VSl5?U|J>9{&jZjeh8pq~bZk}P?aeuw>@82>mmw`sTUeSDd+FvXT<1giZTh2u5^DVGDJo!>{ zR_`S7kUg8MGI?=i%ib%ismA&y0cS|?|5{KpNJB9PFm|pVhNX{;;$Cc7sipl>lO*o7 z$?5Y#!S8DtP`X&+wiaXzFkfy5O%#tvoa#6Qtz?e`9WB?vHjdrA=bxsl&a#%vAfMZA ztPhE<-1Pzl*S6#m(k`W;g~4KEFR=Qq$X0RaU;o*9U3>S~?Ws`|?u`#s-Tp`y0VD$# zD|bDz-Tss^e63!4%KzkKD>X4_OUSa`23}ngQ?JXCVNKpSt$!_8_)XW-oB2zPwA=kC zI;QEUt#A#Q8!;`j=E~O0&PnZ0y`VY1jyS-k?g^?V&m8WAw2k4#OG5t$%q@4FQte)n z&o}eA9d?@$J)~94{dyo_NTJPKi!XTJm zlkuU=P-vBh7wafLzRKe z2Ei#|o^4azeto?>qPs4~@n^|R{|~>z_fbsm33S&u@)*>@{y@*8A;pU|*jsb_#5jAp zrOo2m8VM$!2Ka{0F0m6f7u&a{jk7-)-zn>HVO<(37mgV1eZ+sjlPv~-i-A614T(oT zhhexKywXu46z4!%~g#U zuizI3#LwZdU8PZ;9$8n`U@_204H7ynPx!*aEsxOz;NM?;7%7xZAaRsAbpf&=u4y%T&r$?n!jM?Co(Gx;%qxbo-KQq^0uK9%|w6B zd2grT7gK3ALhAWP4n{#NSXvvM3v?z&j74%l&cw(s?rqc}Q!T1eHCz*qkIfIS zxj$kHtTYfM9rB3%`x0Vr@5$Ib%(V57Tf8xsXjRMjqhMViAUeEJ94q%PcQXJ z_rz%#17-D^t1X`o`>MLDg)FQFuEIT%RC|>Z8>4vUU@{{mVO%qn1CL}r&C-{t zYw85%jq!H6+)w)V9&`F7hvXjqtV@VgG9mAFTjyVoXV*$4P! z5~*Rh=N)2^nWATK>|d#!5X`=OiXB3B`t&!z_0dzRD#Ko@s=a|@L5wZ(#@lPF36zs&FreLDidLAN@3iDil~_AOWt3?f5ElX|X1ne3&37Id(7Tf6 z{QGoe%BJNliOS_4A7l?POAiMProd9Q*-Gr(J~q3e@G6*OuKPTOnAlWo2~ddiW?YE) z^s~lg3DktnX<2fRw@ehQl;Q2W|7-q!cv5(0Ioje0jAN+g1d5jFmp=2bE8Tp8lrj@?M-d#=}sld8~l2IAxeF0-`~og z8*2KKpbadZ{hPgxv*D!;S&H$UlAJFw-_S1<`qBJ(Y}B@h1YILRW`#2s|Tm5ygSfI}ZbJl^#LIWpRpTQJ*COM;@-cMOWp zZy_sctv(7w&l{wzBvb1j^rHxf>wotBY!5m9X(rQg#(ivx{ve}qlf6*fdSqwy{s*-h; zC-Kbun?JAWNQ|85r;edrM&DYlYwKtW>i6p)LDK)cH#xmh=uf2@7*Kt#zfresPuzuKIRc1o1n*#o=(`M z33GbE0G5CwAhVR&ym=gNYRpMc8c%+X>OFSJKqy=;W1kNaIDC0#go8awnOa@QHDvTP z7A9A!Rk5-_=0AYxH>t%W{yE5_b+UOlUoqtTZ($`6@>dM$!cUXUSn!4+QG#W(*SK=z z$LOEY!`|1SZd{fLpf3y^uu@CCK9BxsHxYdS>SPADGxa+Tv}kV z7d1*V{J?Lx_wxv*^>v2-bo9u^5%;@($7ufc%&NR2b$pw>cD=`pB6g8B7HRHuwe zeJ38c$#i0Y1;G1`U|WZZ=zoj9Nhnsl&UMbfJi60b4dtg&4U>t4!(sa~MniOCmh{?6 zwX%V!UyeVnjBPs<2bu%uewNRb3cpj}D2rID*W@4T>0-mG=*#H+oRK;$AI;>_8!?qO zh&?u?31~+$Z|Q1%L#qp952f{038$+uzN!<_s6)3!D>EO|4|DTIm`A<7^rOKEWmip} z%$KFhH|WbS?;EPko!JOg)(B;Z7XC!*4HZ)Bt99WstQ*1V2TGy%`qzVC)W+hU#i;J; zS}hBd8lHObD>fxC``toQ3aGFE7=3x$7yellTpsHet7z`qSC%TzzHG>l17kse)en;k ze_{-X5rrZ1oxyDQl2YpVdOJyJeXaP^8A4}4@yYYJxRJkRjQwuxp1{w#$BB(?R7+)^jK0uTAHnJ56{e{~Usu?0X&&(P6|5_X zE^KPS;|vVBSn+*oQtE;awr&-!mbyzE6lbn9lTglLK%;&|6%siN;pDKp-xA92_odo2 z6vBrMP%YFSDs&Zqi8NOn?-#xMu9SpJ=@`oOGPkJ+XDUR{ZEu2+KMko63duN*sUMlb z5s5z5zBzhMVG9&043Df9C_YGQ3Q`Nnjn%>YsaoQheR8wtgC{DdeHW zls}1K={45bUx@$bMsqguTiixN<#gD8c2hi^(da)zt4@2VAV;o@*THgJaF%=n==>NV zTHMcqK!Sf(0eZWzv*ImZ|EF86R>drLKc9M6QeaxbF~zuoc9Q*gmEHUt0eD{TI=4c> zJ0{1NQ2C-wNW}Ht6V(ixZB(Y4;Yq9j!*JBZAYrae)FBrgSO#qb0;ohR7ph#`aF3s# zLK+YcnJTR*QbS2Jq@f))4ld)&uz*@jiC~I3e#^X4gSscv1XL( zaNoPc`=!KobQDd+Q%JAxR(4uh&*7)&?jJ8Qr9B?ZVnq92QtG}l@(#x8G`8Kwe%)bV zOia}V-i9x+jW>vHYSv;vlBn2(=H8dSNtx6UN9MLJ`!-QywGO%*fjUMymDYMEj}seI z6`>BzWz4Q45(`-FaE;;CndJ&xjsu%TgM6*U4MI1j!iR}@=uVtPiCP5aEqd^96j|}G zJ9TCHdD4DHWX;i9T{eYhN$PmGPl{fv8`IukgOBM(SrjJZWhGmVTCfl2E7z@k{A*xt zzu4ft-d!2aN=t2popLlbwDT?TYh$@nSgITvQWW(fQ`6=@E<9Tc8%e5E00%!nI!qLA zbEc0_`|fKKcl5fWMSMYHpa+akW6ak^f7BijQ+f~_psi5*>lF$tps9qIiJ#TZ=7C->V7{7=oS{WU4t~36?DKJn2PP0qPDsXiNBIoZI>SV`_gFVmoeuj z1IoL#!_AfAk6Dz@hef;7nbmc9YX4i>{%yt+sg+|cLs-Ag5r4+95)0R7?++)&>c2vI z?3hgFFF7U=5jD~2y5mP5%uQWxSpzi*vPgsvB)yJ@wXreDL(UME^)lD51$ z!rwy>ViqAq1DTqafQ><{?tSfhgm1rCHPhD54e39o#o8Ly#{?f2;xXhi&*Lp5+`OuEH?Q*FS7YxogkpgGc*Wz+H(DXt@g$w zWWQTN0?Mc;%eTAdkZe9K;F`H*Vslkpo+W}HPi`CGa`CRJuCj@aCkZ;hp}Ise=j{)? z>}MA{TFQ6jY9$O*)<_LlR)b+*qrI@F7Y{9Xh1i9AH6fjuc7BYu2q$(iWX2F?;7g*m z7uF3f6Sw{F!<4qPN8(w;y(5$L&!dMPHhycBxzDi&#Ni=}Ev(J|mM%i01Gbe3PK-Ld z&xqd>oa^$`?|REI(siWs+sil3G}c@*arp^pD_f0K(}Q(yKTx(j2IlyDl&}4(ZlpgX z$AMfRsz;~!*1xSeDDSoWVrz*=nRpv(vO2mctqr#Dz9$d`&2AT(DuoK3riO6o?cHh8 zE(}ikOyr}jpH>VHF&$W%VBTkpB7aA(^|k^INmWUlaPguy@=9vQZ1E}Sl4)zT#TcdG zw;ZitYwMbvW$BO0Rhu=YnOrgc{OXR-ckeJV@huiO6MDVqXgQvC9?L{WOJ8Kqa&gCm z{5g!@3IFK-MeT_8(7-e@T+#*wX7r69HBC~#rJ;{ZZVMe+h+}veFNKP1>%}d9q*+fAWDF%rY_+`1lX=(m;z>9#t#d(S(#MOjDEkHGDdfH><3wi6 z{|IXb{UzbSp948`>sU#n=`&v{zH&{(D@XqbVvnWX@O{)<%4tMoXuOIseHSm?pgx< zoRQnFJ%ZZZqm@3Mmj zw$XOxHyGerR-EIEz4@sl=JA2?XPhqeqmq10Ptmc{MDvGQd|;gsA+TjZ&wN*@jMbi; zJFyA?Votew22|3z>bu{aqL+Ihd7q=QR=TTTP<$@{>)=IJxwwXQj zA_gq4->{HFpnl-sy zIbsyjYUsk#6eZ%YGFd0y%vSyJM)9;pYMf;uY|iemq#`=vu@<@4a#cpDQ2XO3-MSo{ zPnJ*po?aATC}ow8kO~Ja{y)A6Ax_)E)oa`t&q)V>3(Qvzt>6vOKkVsvoaNx_QimA1 z$PD*Pxf;?m+Xh5p<-&YnE|Q7VH{fSuUe`IFFLoAfA<_N-W?BDt9r0fgWAG`+cM#>< zV=@G>q->i8gZ$B=s5Z&F$wFbZEmH|$`UMO#0zCXyDmDAtjW~m(Mhw#!HVa;awT(R1 z4;oWnbf{4errPeN(KKWn@*|2<#)&dIq@_Hy2w*?RcS7?hbehgOHS!fMxl%5%IQTL* z?an8gQsWRkz9oM>m#j^b^{p25yt^3Itu1t?s&(YIq3P`pk$Oxu5n$Dhu(S~{SGUaEgappU|Yom1OceehVj{?w?it@m?@~hMHXqZZ_ zUQ#VP{KMa)w7u9NUhrC8@mtj+`PHu3!uCrNq=R)@ASh%=)f(f+pSizp#z%WmyO|yOsl+LVWcQCbqRMu7NtG5WLGC& zFU3qv*CFGZ%|BwM_f?l}{r#7Te%3r2Fn{DmP`bG7rh)3ts#l|$%#ElF-J>xWTpTqx zp*E^7$2a-a_mEk=1P|ScX@A@t#+%>N`1u10-@x2h(%H&$rzl{7RXeqgpBaF434L>` zu1^m>F;MRe+gb#ATEfR!+s5PVUXfO7y&)gc9#b)26_^ew;ra{+P)OR@7>EJohV5z? z{Un^ozv3WsPehyW(`k|;bzj6YK%0MCa3{;(HUhpZdN$aNolj;OhE;|J0l^&98gRR| zWQR>k3w|ymhCD$t8pX-`Lhm?{zFgr++=^Rr8M!OzZBy?Fy)aX3@s{l&Pwf8O$3|x~&8s-1Be)Vt- zB_3`=MCV!E(Vk-J@dh<#U$Q?hY@XbyTcurRKh9Y(@w?~}0A+<_335Y|R=cz3yQ8-X z>JXq_FYfCGsge7_;t>ENuTTXSCjymqOzqp>_t`vCg|&Wdm#jG&pGhagJ451q9N(0a zKFeX!{1o2Mwxx5_c~21IQ+iL&^`pW0%|V?}jW#JDz5SbaPa#)rn^QZ*Hx=szeU%4N zU-%Bu4oU*8u4mF*m}gE}A2%Y(NW3G{4haznD&2h@d+lV>50P(7mYD?Mgs+jD<>~r2 zDMP9GV@Q>eH+K>@!@r#uUFzksRxi2bn?7jTVH*Sutr1~&OQX^=(qNLNr{1VcPbogW zHbjy2O4Wo*Hm7VPH-WdJOX?UjtaJ)F6-u`KgGrRVQivqQlWbqH%G;{w2jsiNDhZTh z2ZqJV{`h>~-|#Sl?g1YA7zI*+Uj8^b(%TO(iu@)KFHU!QWbrk7VqQ8sh!BKM5z?Ug zCpQ!To4REa_^&<7b6#?)hH5XZ+E>NV>^g|bJaVyK%*XU!%_A(NV6VGplgkZWp0$)o z7>2I$ooVJdab5M#R_z?I2O6=&pVHon8_B(W8nv`;tK&v_u5bZWuNc*^p9V@1PH6#N zDC2kAp55wm{sJuGh>WGANFI+>lAk3VuUt>6jMy2}lk1KAW|~+bbq8r%D>1e8f5k`# ze}1>Qqp@)bk&*n-1D9U}~I6{P;6Kwfp1FpAoY`sNc7iWDnzuQ6pdeJYtJ@--9*v zB((Qf=!zZ{p%`$qz3es<;7qlHP>#;|yjK3MU|&O!LqW_|_n~O(BpESQefe$!m6Bx} zL~d|Eo|^bNp&L-_>rb;0v8TM5WBn=wvh6ke?v$eOsR5p-rF-TD_I`Iai(&RykA_T< zB|FOHqKoPf?N8O~y6@}*%!(iYc)a>pIxB z`qq)dfz_z-+4xODZ6}1SO{dTfTrFWo7S+ z4J78Z*>$p*BV!|%0Nsh$gX{}J%jIGWse)&ycYItaTt_lc%(j`8o3l>Hoj(MPR$A;X zMH|PDUiH&J{9o~W>+MK?618Df)0ZJY%4^16_cq{9U2a^~mulTlIa1oHT7u^X?faB) z5Ce5%S9a6&_DHSLpY)&Y3u zJa+HMcukghnSEKSP`#%3u`bssQC zJ0W?bNk{O8es?B|oeL_HzV{LChFbRExoJY1^j67WGRNr7HX)~(J>mD!cjCF2Q#<9N z{V1yu_z2=?vm}WvQM+eP2v7Ag zihI1WGEKK7%^Ou=mf(zL8tpZEf*}!h)e92C1Wi$kWSg&VQG19Q?8e(Y*2kM9`sHjj z^Ug0pXUgwX+jrLHtKc{4?g;oA#(3h3s2X|nX=bIK zT2l2&9wI%v=(6!-`+-DusbL-sNZPC)*5LwmBJ9bQh^|oIHw{-A+{WDsZveC>Yc@BX z>UC3GqKYi!T6A5vTTe~56>$+w2eLD_9J8P(jJ@~)E&HDaYD|LYh1^8L{GjC6*Ggdc zb$OdzkfyxX45BDhfp*IbSO@`IELUfor2Oml8Nr!BEr_%%;6|IIpp|f^>_r}Wu#DnR z`I}R3K_Tm_QM)kTaG9|eZW$n7zAhw3HnH33GHTD55S9?$RZ8#^Aqzcdc)G4Pq1v9a zk%k0U^%c#mS{>oChmvAB0wUfPwqDwZrX;$nFe_t7ep1=M31uFE09+CQBI$pPzP=u; zDtz^}nlow4z&(kqd@OReqT4*@Y<;4^-LWy&LnSh_F(_GYqf)s%wOteMiN~1u1a;M7 z;aMsWeY+||Tm8fX!rO^XJqxcqwi0RK9 zd=T&%us0={gR-?jVAn_b32LErymr72#V>k6${ZsHc|9Fa&d5yt6?F2DQ@{6J_Ez!8 z9Ki#+k(qc!ba4zlWffyK4jx<(7{TEg$c2W1!6!C*3kny(UhQsrJLLtBDl;ez>p9Yg zfWeO;PQU!bd0{$P6gwuS-L%a2gs6QA57a1pWe>#cw+++BV57Sc_5Cc_77i-xMNiC? z8dD9}PIcD9>s75o1}{v3S%;Kq*v=&>+|G8MVZ9Q)eT#Gm^7b&pSLdE4$L5M)Ndl2I zLqgc6i0`I75t3hKL`{{6AbM!Kl?m3jYWE1_57hR!5A~Z+#jzizRlUF%ADqMMLM@=$ zH}(o6+pe-}R&N7BEaI%E*ob{_Z@C=GSp02?OCtT^1JPwYa%nYqBkkusJK4p@1wH9m zBr0ACCCod`RAE9P1V*~HUn_u=?(ve!QFP)%#z|IITWOB_F5HU`{UF9ZMGGeZ_Aj*C zvbL_|qN{R>N-n><)OgW4RI5}*Ga30yw9dWr93~td0+jdS&D{g2@tzgS)m4ttN zBWO_YaJ5dedyb2ef;UCni|D&FE+Aq2eg9M=Q`}w-r6k?z8({IJ-?_VLruW>8w<3## zJKQmpohdrUDjoDImtbZW=Z$>I*CY?0ux1rYsLCwl=cbf~3tlVQ6)fNFP}jRp!`*&1Cl9Vms9O(< z@W2oTCsH`)``l^ogVcjJ#nsu%^*1?oF{-aSL<6T{rF5XW_cDqHVE;%b6PpvJZfC4w%)L?Iy6zcS5ls=06V6|U^|o*uzXSS;Cv3c@%u zlv%kAU*2)H1SR-Po(6^^bi#BA%MjmAoY{?*%bxV0;;=#Y|?v2H~ImissnVaOEwIBEe0E%;$#@7{KP%AEiOutByjAOZ;9 z+O!XTDYdA^UJ*h&pk^SSc9POzCnQUW+?uzuk2Ndbj*AH0;G9WT_sut{n3}_)GH;R_ z2QJi?#6CkZCblR*br@<%2b{5j<#w+{Cj-cJJe_Y(t*Q(+l#h&a`TYC-;kM>{y6@vD z$w%{q3F_}~?+y2&|9;&z0o$lin~kMTMZ;U>ND6~k=?SlAFZTn{wsqm^*r03->`YrI z(S=rKs7|OzjPLHJnGYRp=UqwOQ)ljEo+Ekc2ZZ&ew`#nyZFF}KJ=d}w*hkO^@yig% znN&Fg#N-8*XOea6L|<`iZn-1?GLGU(_@ZF=HxZNaYR_WzmFM}Fi>jqGo$r3cKpEv4 z-IVth=zh1AO1?!Oh9hdRJL{Fkto}sej+gS363X05!`|+Wapq0@+{p@(G=EbbiK*DS zCYuyB{Hx%5GPT`8$Y}!$DaIWc@(}X|h>KX?;E%gYXIDp!QthsXl$IF!<;Oo0)J7-p*1J__mqy04yRXyn3lJ3bR>qs!W0 z!$ryS)9!|C*T5Jd_Z5WfS&*{{Vt0-qptpfDn8C)7^-~i9ue~hU=S*w;=N#5>ln}39 z`WoQBG(WT83|pS2hsrEUlXj2wz9nd&9`xF>a8*^xy~~3NZEEg8XWdqL4DNY zRv%YYA=FLRONmCzeB!B-g{|f35F)Jxft~$0S$cbKl%J1{W*J{O0h^oz>_|wP?J77O z+g7*ll0tn=^1D~+8R~V&_AFvL>9t0-f^3A$?h7O&w$X1iQbmFiQMVsFl zS`cBipNG#OzWe}`9bO!QtH4yp-l(cA;b*!yzTs2xKprE971n61M$cqsKCvQpX!y%qJ7m6d1S4|uG zGa93|dw~Gf!96jo!*d`RKcMU|BmEcU`IhihG)vF}E451$s(CX4)NMCRE} zOP|_Ja@EsOM!r86|H$-8fjdcz)h(;BxRMWDUAKk};UmhD!`h+Yba5KrU?02l)h%X4 z@si+a2b+#e8dJE%UsSl2;9H6=@~WIm9x)FZ)EGPGwck5p88 zDhq%Kr+j=ABr5ZfN~Yj|*MxVKwx~gH{%#?l$R{U@-h`8K|M5aqT&2^WzhZTqghchH zqvizET4mf;!xVxlG@#hmV#(J1-p6_@`w*4PGsbeaZxJ2hQ{Sv9lx`}hNlNr$zF~e( zGP?zsb*h;4*ul9F&<5e)f(A!bhy2|#@0(`p1Jt<~9eYBF(x{3_SF!7tAaR{0=L1<< zJEJ|9yXDT#LXbOx#vy_vgY_lE)1aNnQs&Om+fY}ei;iI!*Emr{6do*g6x^_{d3_8i z(X(UN%Yt$0rKSQ;^r-5*tR()Cy)0jS8p^%fd{5E_=0lr$v_^%Jm5)mbOu0H;xT-hlM!c9|}lm{WaTf9;v(3DW>*b=$kQ z(*M?49zkVSX{K_uPBgHL4W3yTEIg1g;gq!d7T2g_0}H|g2tWd4r`q8mixVQ_5M zlMco%N(%O5QVo!M3ZH~^^*pUTV~3oB z`+R?4$K=`_+zSQE^26cWHv6X!$~5zqSpta=>M;3t-KigEh*>8&p~2NXr{+d}?SFdl z)^g9E`Zn5Ctu>B!LV{aosV#}+Q7F%)b9_;WxYZ2@@!s|Yt~FaCb4oPcFDMcc;hMJX zk}S9URyLIg5||rS3IY)uP0czv?1pQ@6el{%9SYQ>X#oj% zZdl@K%MGaXn9v2q0-8z6Yc0tmAE_6JRk0R0Nv5hPo+*GcVHW6uVdgtlk(nPG3gh*^ z6aVq~`Sc?L4g~I%qXr_7zK?ehl*)5zpx<9U)|nIM;M(4L5WS%kX(^+fH$G(#y*#LM z+H809vy3_VG5d3!qctb9&)TCuey3ZEcnELROQ4A?;w_Ei2fel$vB9HVaZpJnVB&u4 zO~V_}hM-#2&j%)@Wk6E|mTl2-52Nf!=o3}XgVLs2bk)@}fVYML^qIK^CA$WX!1%W= zhPC^Xb36mE{u??|>z}67u9TWq>_=DS2dv$X;8@Q5ae>AOqZWi1pOq7{2>a2qH@1IS z=Tnz<$Pm&1TjdDD9IL8qz1UJySbyxBFGPfo&z=@J8OUL2ba7QNlM=#3mtZ;Wyf9`v zMd}u37C&oSDWE$^i7_a2HSysdF3k;XIG`E=RaQUEYH@5pm$e;OR)uVJq~^HaqrP~= zwjH%t4X|dxDmwFYosEIKD{NkKjRUHi&7@oG3RwG|eDW;v@Xi`vS4F?R`PoAC@@bxj zfSvmJU+;a;A)(rDg@acE&_1V738$&jtl$vAX#10S|B~4)IkC8IbZ1z)O}#P6GpR7v zez(UuU8jW@i+qj&2^ylIXV`!b+6XaR3o>~l}-rrrpxgJsO&`FkH3s#Th zZC!1lza5V#7z=Ld*Uo5j{iH1)hhZ&@o_k4DiV!-h31jCMNcxQ>Bi9csq(8m<9|;1i zi!WJIfJC`Yf%&s3O^|MMg%{4x`o5gr4zr@j^4oEk&}(cs(GA6G#+2V)rZR|mSyLSA zE0ueykQxJ;wqaTPpWacwZ}*pFZ3W1=a%o1{_6vPxbw#_gTJ4C}#5PRgx_|3ML}AAMy8fGWH%mFsx)9H+prWfwoo#zK^JxI_78kiCAL$Pi-Tc zK|binJH!~#)j!7wa{JfJ5hqLJZKu_;peRI#IMf;s=4w5vkR-oU>Gm*^xDl{S*NZuT zj>g0eP~G? zY}wFv6FdIw*!1@S2d`ONl_BwGSu7b>#P7Qp1S#q5N6V;~QUae|V)cy|mPHR!qW5x4 z9C4xqjqTPU3~h;z?zrj%wpc85nsJTQdMnlMy{M#H}?5Wvx>M+gd+Qv2sMRD4^M*tBZ;tBr16$A)#eWz1%0FCtg%ot3N~7WEZWK(mWn z_AI(hwY1XVHHfQ$|PO zBjbYE<{N7pBXQi^%jtxT*asb!X~4V zq`2AM2R61z-iKfY2R<|GW_6L2Q%N8s;oT?3^v?6H_YjAy27&(w_{s8AxmH(fzBozE z9x9#bc9o78s_uE0UCNAnS@T*&FHNoJuvcCou4G61J&{_7rThM(?T`d}{aEC3`oNvu zzYbEGRlON1qKY-#ZaH=ap$E#M{Re0kum9F{UsM`IU#gkHArA!|R>>@QFr~9i4($mA zpZP8UPtPebLVIGj6L9Y%$8nA?7T!-yut$HH?eGG>pRGbLDmNAOO&18+Deqy_-a0lf zALO0({F!(g;PR9R53y~TI{@rrI^ZT;V7E!`CEXrGs+A$__Du{=W5z{A!`3YJnP|=|M=7!9279E2uYQAdr{pN08$F zBFR$Th?l~Q9Hvv;*SYCff9Qc0y^&Mp`AjweZ0r-Zi|}XCnbkcJe7XnZ`16=X)v*fy z^)`bebg#mmgs=kl9!cvC+V()$Wl|NIiWV^Hsp#&ptIi?2B)7 z893K3*gzF=2#}X;pRh15;&lJl)u1<(cMKyC@ZZvsI&OCLG>m-h7yhy#$ES&Xj6qlC zq0@buh`Q77QqAAhXDT_4(YL?7V?Z9td)@}RFcj|W@@x_c$4(4@Y9drqI)^e-sa+ESe!|xw2`dMbD z(GMFPuyinNia%Z3M@u^*i5kL}zw>`Au3S$;=7X|In>_d{4VWM$8+imm`fcFy@k zk4rS_Z54WD@TG4RES2$(8Ze|xB|QxQENy|cKNJ5=!x*4oxJB81o>@zXVe)*h2GsPO zF6Tk}^z&Z<_YM2gyfP_h0>kn^m7Eo(wOg|UyP=n%6R&! zNYf~qNs~e0+5A#RM)-~n~eRRZ$i995eFg=fuD@k;1EWa-6FMk<*_)c)je2oG-o}kQl zuqM|^NdLNVQcU!ndTRM=nCiLq&voHqiLv`kZWxP2DfbMM79`1)NLpyo*shK&_x9DX z<>bDURHoWx$&1;g!?cVT^#gq-5Rw)DS(EORPSeGaM7iO^ni!L-+o5`1j#di_>@NVM zW0Xm&4SfFb09p_vH~P!~wf{(zu*EpqBcZ7@w_`#A6`vU0Kne0RU~?_rN1SfeOLkEvGb6EPbi{F*8`llrbiRMoUqv=Z{!d9A4cD z5rtkbdY;QcOLxZtIg_-lS;=6CoQH4JhkFP$y@wMh{>vfaN=4}_ClU35yCo)%e3V_R z)kH<`>O_wu^6^cT58e$$bg$YC zvxE;9ej>-8iFsC{T&>a9T5?;HZ16bZ5G0dvMHhC!CJPW$2p;6))k!ZRtO7g9g2Vp% zq-6~~^6p1dq8S6<4m+MzJdX-h8E2FR9tdzJ5OM3=Tb#lSU|hQXx%4=ms@a zv!6b|sN*aDJ(ruShMGVC_H0iSAg}fR1DyNzy5~&M&&r_ZTf5T-FRJb?Y_p6r#e#x# zo#KDm=31cu+Z{0+FQ2tn{j1|-@^Hni1KN}S`@)VH8zi*Vpk2ScRNyht*R^u1>Ws#I zrAz80jvRGmr-5gi_)(Cr11;Q~yDG^_BI?~cAwsXu31sc4IQ||hMm2Dq&M9YG((fe_ z!4V^t>?6yRHOQ8kp?hnVhEeoMklDVKyo|Uf%cl@yOU6@4u+xHy87r>$5x@%AE;FG3 z&;^Xm}lj^sv4tf!inovv#N{2iV-6{5Kf;dwMqyG?aKW8g{RmDK@JfMK88& zQEd!bi7cjd2Kuv5JO9WE%;A+t`JjGAGpPMcBH2 zGB+Y0mpRH!v>DEMWdeKS9p zop}WR6PoJX9uqv3LgH1XK>l&!XJf_btlU~B--5}8uw@X@tci!($I)Pad|)50ZnEO< z+c(@?Ku4rfgWQOfWV~KTS|6#ds-yH?8m9v3;gKfWf60ySK9;**T=^$>bKl7~&wiSH zMLVv5abJrD*@MUT&DECBrZ}wxj<4h|Y}70zwUkcxgqbdw?AShS$O!D6<&6329h__$ zWaW=S-{q}Jzs{__&%sB_2_L+!z3*d1{TaZBQb>mki3~VoI-5_(jNS*#^zIaF1f2Nn zE^X#EAoUeuK4v4Ua;yel(~-AM(}k>|-44V@U%GiD%@KuIz+^#s9!b=5Wk=R$;QQnS z4enkABz04FOEvTx{<+{Op{zgHbsXxO3~PBp&M8`_BhT?&>z$=x75Buda3j>ni!c+n z(=H3MSsrp+HpgQNY@TZaW{pV2DK%$bD0J3L%OLm#mEHm>7mZIZqf+U+Xx(oxR8DQw z2d&Xc$gzUrch{JGYNQo<%z`ES;m2DVO;V9+#}t`tt@?wO%Dxx)^C{i|xWl`cp+V2F zD9>u0S-la>Y^@J)Tvf8m2Ny$(r$=w^#`r!dAj}rW>_Ns2o!4`(=167=kG!elRLZ-_ zA5^}q8EO(>0}qPS;%d`&Io>cgtKC75I7jJ`%i>KkxBA_HmkVsiozIjS_T1=OvnT^# z3Sk+V9Dexg^2+A~=EYCoB8P{#$mWT!>FRE7JcWt-r281ZU}`v=J)%~{mNzJ zW3|U#sVVg1)d6--+4EIM2|?kh&Q1eIFct5u3ivVQ@ zia<93hLzbeR>ys}rvM*1%|x78*8cu>?P|;RE$RgCA zOHfLgNqAEEx*7!ypW+ppPRGhcBs1qj&Bf!?+x3GT%Ja#n-`gq=yvk!=>Vs z7%_<{hDa-8sN(LT>ga9c9TbBZ39geYO569Z)to(HTI;~PB|%8q0|?8wHxWY9e`+zp zH>O7L$8t;#2wDXNXgo$3PixSf2Bp&4_ zag_FxG~-zp3CIHnO4#Wd9h@qyn@CIapDIsMDzIng{aCG+h;I*YS+45qq#MfJ8&HXd zJ|Qq#?L44_cGq$H={}^8Q0zgoA&1`QCwW%IfMl(Me$UzC+;S=0_i>IR`yj10=`6Yj zhSf~Eer^;UCzZk5C3ylKNwF>ay0Q@4H#EwPJ1AZ-7E%nEHN2`3&$B#+0W3^J+vwsh z!s}_qxt>=L@oG^Xh$(DH*)XfBx;A_`A+m{9Ny;m-3-{HvotNrR z(z1I+)^9nJL@-+BNw>i!A+y3i2`KSP<&TYlR_Rmdq$M{J%T?k?qxFs@2uZ6dGE)sVK4&(Kc)M);FH?zQN5 z#=UE+8>*o)8H%%UToY1Rb~U}Ad%j@{F5XVhV9z%K9AcY3kBCeIS!z`EUbi3*uk zsgROQUsL6-9j%|2&G`kBrG$OiJP-wVe84axDUK4IN|hbKTB6-f^osp$A^6(eN3Zrf zljS6+jy5fRwKQO1(P~PrbpzDoJ|2*stXbt9dz)(s)HU6OnNLjxML`%>3*iTBgMVQB zTzZcV<&UHuZQSZCAzycMur>+tx3F&-xFtZOs>pIJtR5$+B*f@ygI+0H6fO2_bP80& z+Qx$h*7Fy)p%o7NDy^9qT_GeEImr2nc;kQbmnk@dm(dT(8$p9o%Mbp--d|61p6VVR zL8=np5_af2&znW+gUP14s3#OuQ%Kxt>fQ$y5-Oj^3ZzLT&G;7BQPLA1^?46c`E3o{ zRm1893wZvt8p$(1n!3k&YhkEkBVZr{xJLm;TFd-EGUqGY(%ykj zCHDBpO4ki|&RjqE{m5Ps1$rd`!pQ|{&g)ocj=k(u&1NE29tVIl6DA2;g^j=4*m=cP zux*_Mx+cvL6$YBFi9f-ue@Z+f!|HZZtAcHR)cy{@b7H2Fo!j#1j< zb52VR)gddLea{QN15UAwq{LYjT>~u2)rdyDH9j@&6o#2a7N0K7?vt*y@AvxTN4e_> zB|+X;1U+T{d~gRnnb&6*&>efh(Ino3<9J<>fNr*2L?rnp7NB=}MB*$bfdL;L3Sh?l z0gH)Ka0{$2t4xbksbPUm$CRr=!cAOz$yOfS{O#!gOeHs$yD_}p)kbEU*Cb@pwqvF* zmj>_JzF9>#)$fJte7g%;6>j6zyU%Vh9{EwP^~wJhcW=mY4hdrGwjf=?8U_pK&kmG$ zL}*l>m|2_zYdwwwx3W4l8{AZ) zW}YUFov2puZGv!ws=I_ybBAXSZwkH-DFmxzb0$d^Emg@Aat(XU*}D|F>`e)BbNrhn z_WOPMjNI*E}B@LiK1_K6}uRblabTz^v#|G{0gk<=R01E87HqJp1VdMlZk1Zw| z@bsJaF!tR@wIPdMz-{QclsNc|ZG1Ak%Ow&O2Ixa*J6E69(N8lYj3x1C;&ADR6|lmPV9Z4T3R zi48xdGo5{wKif2lQyAlvn1$s=Uj|Oa3`{Ven-{W%)}L;aIOISQA0jn(F%F5=huG$SA^a|EZgXVSx;58opHvH zHKCo-1yry9R2LditqV#Ej^u{cXMJ&@Z@!I%Dqkx&f6V&fP>RuZ3-Skkfydk4oLX&6 z(^b7==+xP0!YSpFPXbiyfw2IRiUe<9%R!ZI8*3eaj&Nf*cdF((gg@fBX*lpgG19)v}i*w-_BX8&(vib^~fp69>sEqlq^NCKA9Q^0Pmvpn9ua0p!2CB zYTR@DE__G0%KXY?JwEtQqh!FCp3WY6Y}peD@UV!l%yE)QpK*u36usx8(%%+j#{HS4 z;X^UC3}IyY@MEIf$Or6akr1~mh1xD4#21b5hEiGd8d|5 z(=gKBJ??|{Ga5%zuTFO0B}PI#dxOJHHpAw!QPBoD78jC3;J0`jj;At+O}q0u)&0W> z{$3IO>fpWkokb{Zgk+H)8Gb?N zgRe@k)_zK(m8pp9J&Uz6Tb!#-{a{T>6vv(a?@bkz_*zx3v;_mY!)el5xZNpr#vbFC zR?ga6+mEh27r?;WV9f?Tmk5EZSB}IRIERf9+#3y9(Ei+;I#QVF(`V)df#bDQ5}W zm3K7A=5U;Hr7hKlGT{L0@Ua)8qPBkc3&;3>9@hsY-+eV^Pog|a7?sp3o|H0q*W|nLIzOmk*r|z=cTGiuI$i7?5 z#h#OpaBSRDNyvm#pR#8QGf+Chb+XAhfZJ*D;?wao$`iFSI3==sxuI`MTd!oi(yGgtff}s1ZIXlLFwW9AdtxXnUO$q^;g&AST#+`?`jbP8E|Aw3 zwEOG}MPAR-yqBLHv5k-h{^y@^~&L ziRflb{2;U3xRI@tEXF221ZwHM^LL6t4Q9Y{<1DabhuPHI-!AE-X!WSu$uN+ei``Ui zB$=BaH}Wvk0_DA9)apA2{Rkg~0@FH9d_shF!DoL~9bgILeoLLDa>=CPRwlL8Ckd)< z=rk~NvxNa}6UDqL^l_ALlk?P7O~!=HbQ>^v1K`eZqSDTId9VYMA9osV#Kdrx?K6}|rUBC#?<4an6>!?ye6gon8TQlm=H*{aF8VBPlv z<>G=dBf6xRXVKwwrCzhtu)gMt6S;RY>z{rv9$#-QK{B?xCErH(|n*GgqUB}~5O3qH1UDe#`!@dLv?v941hHL5xe{*K&!l_>jaWq`t5IuY&x0AXjf-#^+c21uEDJaaqFLig|ZzI0^{etuaBh6`ESW#6G(ZOCjP3fynAhh zCj?hT5}H-{LnX>)RxyTIt4b!2sV}tQT~eciw1+Yvkm(iQxvplgdyzlKI4l{<1gQE& zmrv+A*;Fx#tMzG-TSPZWLfmH02xscTe2duNm{H*~3-z-3j$z507Y(vbVnXmi_EDYb z5a50a0e`Bit}Qx7f1lKTZCA++$j~v`;ZUG@{-M}QJBZ{o=g5-Y)VrCPRm;4@RE&9F zss@q0A@J`>45-!S4L%nDTk0L?PNTvL7SSyk73>wT?J8_Dz%>cF#-~45`9>Z}Dj8qw z+x=g5)5jVJ4nPNb9x?rRrJm<&5YK*UG!?6;^ftfsQVdx@myWPvmID@uWr<0CD#&k- zuKH=^I3fA(&fb8f{ArZ(B^q2sUTF5U-k_F(=uWe7faSp&I1~E| zf`8Z5_4?q6be(IDla?cCT*)QSbH0GPZC&LNMxh32Rxl}0^*MUlYn2oK&kKlXC~+X~ zq~O*)E5vSRnw&R5aXV+pye1(~y2Pu^KG56l$~ICx(k*@1no8J$f0gXRfJm?6^P zO;#Xf93(~7=*^R2GYNQwzYPzFGI#)c4u;$#gCC*M03r&?QrK)yl2doUn!aJT-wbMh za+X3=jHSawwctc$DMhN|SXSrTqvsq=KF!Tqs7yZ3@)t?x6xk`_vyq7vX^Wl6F}_Q)4?0y@QPxN5RuH8)QnyxE9xkz_P3$F22tu{&nE% zUA|Q!H;#I@*5W{*nOI5|O%eCvjoi96hpsX#bT%vD5qvT}f{(Y;ba^3k-nZt~U>9j4 z>+L5e3KV1^T$x_Z&h8#jr3b@Qemg`#>8Z&c7*f2GfAMDoU(yL>);{b!k4qoBSH9aI ziIo4S6+v13*u>+Z{u)P+?PBX#bGm$Ru)Z-4{*J4UASC_Q$W(HodmoiRs0A=!aw9Hc z=^J=rnD|AUW1VI|ZmTMN7iC4(r1;SA_8^8!!p=eKXO7r*2E927n6}*#h{8+?Q~(e^ zRMKX9^@?)^nG$lo+okkV^>B#AKA~IK16OFDpGSIP95gD(yc~&?)jOYAzQIeAmeCnrhIxgI(1$7oGXo;f9-r3MjSjc{+8uLiB z8x3=+(`Db>%9qcn)g#n7iJcD&t?>uET5gIM88n$@8Rw`{w`5&(Z2rVR31I%BE0JUu zk}wPE+Zg8BX1Et^Js%S$!;=2m^4YpBJNVsA!^PBj>`tq>&#`}0OtLB| zt}D>*)WxxpL9EJsCZZ~Lyps@GEA;UXYR!?}lmBag7JsI`8muu1$gKU9{BvJCC{gsp z$5wAALql#;4@>olM&Nn48QM1HH z$5zuJ?3pxu;Nvv?poD)S8*pqf*iYAQi@|r6i#EV9ccPzW$$zIk46t5Z)$A^?6itz4 z&`dT+uL(1GoJOT!17+6VmmbH+&FYi0X85x0x-l_ms#jU9o2N=3vhh85xB(KzWyc)> zF9A1wXx&=hdLWM{T~MyVUHKN)O@mspNaNB5{63q#^IaOgrl_W;?y zgUEoKp-ruYaa?qSTk&_*R#B(z3oS9B&Y7k5KozWum2z~hl*Xw|YHBRa#$G9G?nA7X zfTawi=j1U?Fz}tWaL5L_7#w7)2t!vsPTJCFObyWCstAZ$V*Yd_C`)c3#(qL?$CTg5c)^>f{yINN<;W*;3_eVqFZ8%;B<9&)%^N+ zLCdcm&V>gjmP9T7us0G2+)Ur}X>-yOVgwxipQ7`OXLE1kxV?8NY7={u*t538Ua__I z2x8XOV;4n}5UXm3#9lFqmfEX`QM&IBe=yAK{qC5gPP=DsvCTa<&x~&ISr=yw_2*M=&Hw*BvFIcp6 z`HIZYwo6j3nd8xf8n*{J?m06B=WWYt0)Ub30i<)W_(_WsSTI*LIjn}GK_u454$?PAvJY$23p;!xC^2|^$C=gy`ihl1Kom^Q*n3C#`lg_0aXnrYVZ0oZcynl;=8Kb(TH)_*;% zv~BWGd$sX2B|NAp*dQqNnyvL;PmsvNGBwC*dTK}J&JgO32aE~!xg>nXFaBsli_)FH z65Z#UiFIgtD#9fFX5w3%v>kq8gX_9%E39iWZmbWhMmzpCXw$~i*L`HWeBP7Q_5JG| zXjF^VIp%04(JMls+h*i|D;%!2SKXD+@{a7NW+CRDc}9xr=jggYy+rhzA7Hh!;YZJw z9cvw4#U8UR*ctRT*$I+m17it-j2jg(ZMpds(p6zZ4)DttM;$T>4ljG(=>%VZIv4LP zMjBike{UR6TIW3akI3|y#SfpF-v*=me@n$_7@g8DW{dSLL3#`|5FwEq@kW7ekClrb zWr-^Zn-@avuV~bl;3)xAx&Bdn*8bgXdQnu`AgxZ81%koj4BWr6-h}uf0qGW_hJ1)y zY*aw!@*!^dRtf_0sAQ|-$Fm>YU4CqxC>8VGm<4rx`N1w0eN*S;STsMa&fTqnZ<7J?H#NDvUTq%)`NeyHn1djYEsaKUp?uwrUay!!WahV^S2bvRva4t<*z=7sg?U0Es1`HjJBrD<@p~{tT2T z=A#DCw_vpbj}h*Yb{~U~&(C1jkE2+O!?bQWv3^_f|1JICP;_{BwjwMP_H@*#U6)H` zUooZ5X%yC*{bxMSxgh7T)#so0{ne|!2L2j}WFIui19UH7M2}8g{`P-9j{NG;)hLpg zL3dpxi&Wb0@@KvO?CmwqV@yRq!Kley2bj{T+GGMQE`}J9HU;0K7J9aF@}BB8)M=%i zn#gih3x^0GdCS4D9D84`YhKO?;I+`p;ZYgo(`3kIXkq0@tuaxVIMF1=6-zQ!OxH7m z7qe8s+HG-$F$z}X+%Q#K*EOE=`MG4h0&)@RsII}Tm2TPqzOfo+$%>HBvSq;$VWPe2 zNV&FcwTR|85;j`wAY~Sy7#=_Ty%zliBV4%N(AgqcAe4lE!KL4x-58ZC-u&Kv9b7;E z!E3X^liRjcg>eEKDoyXV;5AJXH_XAc6|MQhtPH~9CG!uBO^DCSfLhjw#uAxB&KWlr z91FXbfQ8e;rSbbem&&2Z_`{9lGz)ySTQ9KoBPn;;Ub7*mdH7-p#%Fz#V3?U4=B0Ov zq$Om;uKrGo&ZuC8O1$?)gKWXHbi{)V-bEuM=n$8$o882|hi@QgpT{YZ-yGpvtO6Wv zE2-?v#=3>0dQ5lCsbFOPZ-~4UeuBqgzelkO8+g#51Z`ZX3I6?-+${OfPKx^*r^u_| zz{g>0Dw+*ocSBRuQ8n|OZ#0_{&zJ%%Cd6YbaBg~Axr5u?jjt@yS7e-45Xx4 zebSi{jV?bx(n}$RP)C1MiBQhn9`b&MEFePBeV;1z-l(m0DxBU^tYnn1(p|6BWO?1$ z%1~O31xPrQ82S)&i@qLm+fo}n*n7FbZ%^dK%4Qs<-KbO^6QAaGcFSNYZW{)55ord0 zpiQH_q9L4(H8~zr@4ewf!))X;&~Yds7oy>94w@B8>=7!5PL90w0;-#hFyyaEJKf)u z7;_;SoX5k|9qc06<*X*2-u=2kQ<>^3@0u2)eAelukg8T~(L8>KY-5euj75uOijs?j zLNq>2o~~|=hBk@Lc_y)&&pL!~M%HIFDE8`a4#Z`ZS@&jmc9FODU)mG4V*Qk4wI${;&zGTq1n2<; zuxJYzXIZ6(a1N97s^cNlKRK*$pK&U(7~E4@;km1FSPgkj1gS9_pB3~Jlnp-vL)l&t zg_-fIn(ia4M!Yg_F_R))SppM_4ggbCw%9cjjFfm=Z=B_a{=L`G--Jx`=gfRUg(d#x z=PpsGg{9{)ckEKAy4;;wWP@MtVCc%*r$Q@vT=&xMiY`yApG(OyDx_~kd8^qXQuUlL zMU#kPhf=m*i-n#tM5BOaOh|PTQ#EK!1Z%+A9Y(&me>pR<)bb!DQDP`Z&sSv>XlF^y z8iuT~L8?se^I%^*NEa{w(cVi`zqF9ehS^M37aV26@0+4{{4+Kju&j3iUek>K5xH9S z^gNA+8<-^d6O0TulSD$KP1Xh0$Ux>}O>=quC^MmWoI2<}u(8*3yPuL2@9jzC-XlY= zD@}lzlwK*qM33pM-y{Ml4{atS^QD`z%m(VWX1-{z_9x}$R{x$27!sd-0MS*kj~ z_HT5w44o#j**j0M2MG4^Da^DWr~FHI@JQ#l#!xO*ouE)DA;Q?#yFESn$YUHunP<7@ zmuwPZM7Gz_Tm@HRwQGbPC#zsY*MU?=c^T&fcl#B!;NP{a6)e>n7g>ak1r)Z5|Fb)D@R#iUI}Ky_}4#&rb)rj62M71keskkaz0*Mj-#km&1r z`3@43GRYFZHJO9h{01SI&3NqG8eL*qpfa??pH!Si-mzWYaE(8uYrh(3GlRWWyU1ysDU-F`y%?8y-30gNc8Y~zt8IjJ3&HP*L3a0BBC&& z6FYvCiyI@UOltmx-lMacJj$DMO5eNvkdOwts&B(86#7wn z2ii!Va~@1T!8W434kz|?fDs|vcA^F+ z=3ewmpFS1gIODbfNQ=%`D6Bf{BVNY36-t>$SIo9k^K1Fs3YK!5PvvDr%rwfssmT~? z=u8X;Pno#2PVzV;tNpg5O1x`l9A0VoaHQH=adu|G?yt%`HK6`$Dcl4bs^4Lno31T4 zP6Pq*a1_AZZm`W{q2u|-xhN;9;!iW-W6`YPE(E;S{N+tz+h#k#fuWzSIn-NAX%NV4 zmS3PkNp#gRmG{U%#gy_&H9X@ZnXTNgfTwEU!&+$SuvOm$JjN7!E>S~= ze^)e;4E@m#)+v5&Twnh}gp$Y_wncW&&=^TQYe0vlCfh@o_6bnM)ZetqE3I*1v4H_r zGBBd!797|&9C}vFB+k3cGm%9}l%3Ul^KZ;{PG_8LFDs%_y5FA8Sj)h$D?4KqkmW^n zGx5x08KxXg&Cdd=x0VU#+>>-o zJ%SL*nx|eSgsRy~=jVQd2Ar4zU(dwQQ#%d{Q$$|wHCgEWgb|N->TNfpn1fuv-b0HBBec zP|6L-*qZqC@QHDHwB2quGrs;WCx8HTD!oQ4?Us^jJjfNB$%TN)9=s7003MV3;r^fN zy_oa>MQ=6Th2G7J4#aHNotA*`ZdUmWltZLml$ zJ2^&ifuq>OQ}&a_M{6}KX(*=IC(DSumw(Cr8-Qw-YRG*Zvrg^8o_}G%R&NND*+vh{ zxIN^>J(hIX9V8=)TTpW63{Ns;sc9E`I9^dZ`B0xq9n5iE`^krViu<@${19GY%a@~M zKrVZBg>fScke@6oDx1YJ&IFsxQ{0Y| zrq{30`Idr|=db^nlmw9S<92%xTMLZsaaa+|Fm|Q6iM}SZ(Q<}1h?9T8!;yaUK(6^f zXRtnWi}O{8=Qm>kJ!XcHAK6RHfhrHlNF>6=@IW8x%kvHObPrY-7E;_?3~N=XXp zYlq2OZH!8o>UG&(%_{tQVDOYl0YP685@)*tEL!dSV6XWGQr=O0AyL~xN~LF5mrKn$ zYbAA?DTK<*QKYi!Z_!$|v4~EBhyt#gIQK4EEleXS+vEvil%U`A7_XM3mMUzwXAErI z>nZT2SLt_G3wEzO6eduFQGXtLm-4yT^_#E{O%2?f-i+0NEA$z?fzU8BrKXvR%b4N3 zKhkssVLI67Tb6$!ja zwi9$};VMuQ^y4isJjt%|#aAiPDcVTR8psT`vBnWqXI8<>XxtWg3NYaSB+Zv}$Axv9 z3Ki?NctT(T>mjL#^^!;uw(j-57q(=@d@WNFzAV|vgf>8T7C_B}N`nDmb@=nsk2lN0ol9_4z`Qo6)2}OLyTAzv9Ax^dH;ui#F_t})lq| z*vtUEc-N}~EG}Om}|f>iC{OWox{(-*Bc}?%*{>I*8eG9f8QLW78^^+yvQ~ zmcwvC2ftN=^ENmt+X(vx;qeBQVtDpamgmyv8i)zu5xq{EapYjd0HEz-Dz>U#YN<;3K#G{V*pfhg~aIWi1t))i4 z*I9+ivg0Ztper7Unb_pU7_Yg?YMaFhcK$BHMJ*FsP#T}(&1Wp*QgX?k~O0Y zv>=#M>qfNij404qqsue(;a|miuKcp-)efsXW;Sox+;@wmjbolKs*d{WshEV{6IJ;F zElqYLCX2@@3v8jJn$cZ`M)0oP&7~h^#DVR{QTtY4|1x$Yl$mS&bu-s#mOq?8VgJbs z^0av)n-H3nqpW_$9geS74x*yld>Nah={~^wjU5v zmPygl4xYN7P|2cZlupjeCr-46Z^w~BrGEp&Q+G>Pj@_>nV-!h)eb~kvvSXJ8LU`iG zOnKjy|-- zCCYNPgR3IS`6Fl5bA$+|W`At}%I}TfX*?Zvn*&RI3$0o>@>A`(qgFzEXvL-%@JI59 zOA95C%fp>4j&X!1$FNm~1`@7QyAfv|@pB#nL40f5aM8u!rRmcGCWy{ZL!qRgAxR4< zKD|hR%hiY^dFD4Hzir~+s=-?Cf$kXOE~9=n#L$%s_J}44R@aj!V?Ok0B?;KNcnCI4 z^`>|2?#i{JAtHupB!}fwe1-6ht{svhY%~gw5&C z9~{M^R6Wu4i7s@d3ooxiH@?!8#CD}!Hx-wQqW|_hs48(2G^`o>F?sC@oujoY!xu70 zQSg)Kr`>)F8$+QF%tLT_eDa%((Su?->n;n^6`;Gv3+FA9P>u|qUd|>>BNN#TskBuB zwWwxrG?9`tdr2*~>Q=7Esj@FevZ#t!AxZx^X^Uon{&+jxl>zrk5C$QW1>||#)08Qa zd1k5;GmciU&Y9|CaR?&-!|v&~RZIw-*awbS4n}ngRVX~ni!g58?;W)pb%;dXY^HO& zU0RuXI&vm`iLNh{Z|aDNJWjF~z{NFKbO!M!UCqi9@RdtHDekLx?U%gq%$abE7U@9h zQAvvvr)i4B9T92C#vZ*5JI0G>0pzyb*$>&E(WBF8-V%!dUE zKz3A3PtHhO(N(?3FEFXLRR(FUO1)|3{p_@le|?_SmaHte>RRPm3@C%U;}Vbd4@hg{ z@EJ2Kh`#LQ&w}lPD|3hK@dNdfC_K<3kk1??wT6faI&qv;XXnRSYPRW7eEq+ebe37h zuZtu&{YfT1N{voZbR8~^z%?4i$URrZ9oJPY^oCkqYb77zH*EY=0ij?L@?hy)hw`bq z=&-120%RB@;Fb4*rw`v|FN3>iGzm1M`L}ZoR&_z=t|KK^l72h|=cK-Cb99Gg|Bm7* z{)4Td`D-%oKTVoYBLY4um)Zj>k!_sX1#Xqdb1CyjVT8Sbsr#C<)_Q_8j$OV@y3+Ym zp78I`n4qKXyf`I2x|dKiU)imUNoi!A$D&YwTt*#}lN^m&8OnoC%^YyNT~VM41P4CA zp@Vxx6e$Jag!Osl&lyrxW1cM4Z6#|;BhB*96((33t=IWbu)&$yF|&xd^Sk76i5B*O z)tIN**UbknZF&-&$?Oi60x)`V7e19#%+9WHc_5v`b$DObmMtfUI@V zRXd(=@zu$58>Cwst2bGMAQoIlTfRN^O6RHuJn`1=fRgjiDcJQjjegI5lC>mf>t}kh zDqDEYHVX4bddVE%KS|jI#q^g69jg3-6b09c<5quL$`c0Xp8*^*Mt2QH_-{AT*Lu`w zp!K`-(d?Q1N0Zz=v(t+mua9%(CcUqPaaoKCZnC`j2*IhEf{9V5HwyEkQ9Z{v(~=0PIyWveV1Pg85dY4Drz6|8x(cESPCE$Ln0lQ2 zk(4&!{=ScmlAdG?=B13cX*{ENkIzX8wj;va zU)DLHeehsW6aZcP26B+J4a{BJtM2H|q8*Z|<2W&U0C4H(L{hqk9FrZ~Gka@diJtc5 zCIrL3SQ#i;N%=KAFYD8(_Fm3VN~lLP+*h`F zJmQhlg}JFn_cl2ixWR)g19Z*=Py0mKyjJ0~Y{wtjh`WnDJs8Z?;cGP7j*ga|JSX$| z-?1WQbAReVyRTr5t#R{+yRdT~z%QE~#Qz-|4?~53DyM@At?L7=BKDukv=udG>`cW@ z=g@}Tmg8d1i7_`V<+0`3B6w#BxmoAz=kHVS74imB8-kC7Stz>mfy&b-r;eRUenakn z1NfF^bUpj+y^~|Hn)Y8d&5E20+DRFjC!W2Ih4Nyey$X#Z_UwiBZPaLw+7=y{SNEj_ z?AqL)e3I#XpSC7+lTamp=NBe7tC@Td?0;{9=k50sy%_OO~pl8Y6=szCv=R`%Ea z5^F2-K(FYRFWM}M|99d7jHKE2Z^G%(`5adFWyc#SZ^M5G&acLZ(HFC*aZ;5=e>mm# zz!xHKmLo9L6Vs*5=5+Khwy0YJh;W#u>{Oj>sBl%S(e%k|J=@4Eg?&Xfj?;FHqp zQ6M14In(;8c$%nTlCyUGu~WKCP3WlCnp6%SN>1ph-i^3aofMLV3+IV6tf5v(0s(1{cwcYH~Tvnw#j zC%4^s+OUW%`X)UJyq_f)B?3i?VepNiXVhSBnIDDj=MozO{RCJo*@L75Z&Usq2s(`O zo{L7nq5eC$FVL-gzaPlsqjAM@`b}$)Wi~w2&N^5Mr5#fb^z$CA?;q;^K`2PvH8o2W zDe%v>7}(q?E2@bhtv%#3)+daPr9WR6&zq}D;SB5PH|sIM1&18DF>D@VoCgUzJ2ZU~ zbjYK(@i&b&Z{MP-L9FmtFWa^wF?}R2W4KjOYRheGRGmw8|1*>FLbN2y0&G1%)?{k% zoPz|*;obdCUhePYXGxhO@txPq+^8*l=l0>TLFTIpZb*$j{7iSZCZw&|eg!kjbGGnX z4)D;^p3uv^&V}N{G{YXN+6sor%G;qbTPGU5I-W>xBuk{8O1N<3A3DE7`^dQe$Es%#=H#)V z{Fp2?*)!Ypt#x4HrA7KVSJXy!iuG9Yj5no3oPB;Qd7R^e`5^j|jfHD4;2$v-dQT1i zp4J96>&csngZ(mc6VBDKaX+9OC1%#oAm$OO>r)G+eq}m1iehq;g7jr<8`%ry3qd}c zGsi8OkBUvgh@CC<$YYVFRY&=P0`{>OMWksOO#`oi%c5vc@*}CYCZV=9+;uv2?+PEn zy`~>5AjO%^MB1b?vkW3Q;}2HeKWY5XCU@7CwFN|QBUs6oF1M?4cbT)MdPUcpU4$_2 zFQCH7vQa%J=AYxo|692`T6cRQIrz)26!dj!qlXghtDj+h%|VKTuCa!H%(__n67I4= z&595$2nn5FtM;bA_iAKS`%=rD>y$<)R>F*#W@6@yYeZ%TGHUL%VleW;`w5a)2+<^ zSQb&Mwqns~N_zWOVrk(o^3a@m&bU5t0~Mmak{?BKVtDYGAet?40d!pp1KjfPEpN+( zFjD_8JHFs*+@1d}X}A4F`+5ELW)=W}Bt_z{g`f zSk>LauPTXJjNY|GF;^pH)(YuC!C^Ti`5a8W-h)A#Ww_+V(UclyuTiq1)$UU2PA%Ub z6N+g;LOt;NZVB~~h)OPp@LZe^1#u$nSTrVh&o{*KX$xBek0*;kaeT*0X}yq8oEJm> zhO=mP0lX}R^(IFzBpgJ~W!6Yay3+W`A!CmvokOvl){TTg4jdk%K7s8)u@d{J%r~Fs zx4-F(CMim7zuwCu|FHa7JaLygdX9h(XK9!?Y8LR@--)abGoKTgA5dHDcK>Xh&j~g> zv68M5pJ0Re4a>TPo`Mdw*Xi{P5x)Q7uhVl_!z5VKyoyLv8q6q*fb@zLe&64}jRjqM zOqOjC5t|u)sSKf)ofKkp2i-+~XH?8a)O$ze=@7BMFDnA|BY%2C;EA75Ff%qK_2uq;gv`fu@y zI=_7nDK=#B3a2G3^-0;dT^gSCbLC|Ws2L#{Hh?vi>6 z_jR&|_>gw<82B2oE=*BGQ{bqO0Ch&E+)WA(;U}kAcK1BIEh)wv7PFHUg)o)XmgAHP zt5w1o3XWL^ZN&WR2AcfdaJtYHbhmAe>@Z-thhM%Fvtx%4X#4zoNknB-(`dHMKut1| ze$Kd?&hjAp(v{f|NO0rba)nqXvS)Q2a5FvnwWN*B7HeP@MBw|W8p`qnbCoCwWX-ZR zHzx6;ZQYH;y)vN)A{-2npEV{dozA8Lu_clFxty_U#0mGrSNSlvX{(&sPi3!BuQSeC zu_(t6b2b>jvk_Km-#AGttMm2aSj*%rnE4-@`EHr0%`it_D|#r06!}b|J@$;$b4D0Y z4o;c5C-wxR%far&wEnH!3*Vfc{S@P|!v9BZ)4MbIZVgL5%jZEFA6w6iAmxV|Ob^rN z`#yn($%=)w$gJ#@-RwT0QNgy8xIxnGStq5Z>GEc^$cF}>jG@Wo zJy{*-rt@hDWd!wODz}NtXsmulU&jYEJ5%k6YbEu9{mcIgFEl+iK^#HZ+S4R?d`mz?x#Z)?^81eU7i_LtdNX3 zQH4Dq|IA#1+$Cqkc1+2$Kw*U@G0!&nbIFR>){sbn-}_D23$%S=kNQHcrbHxMc7l63 ztf1J#TZh;qE~2qWR9d-!eZWF^xE$4yl~6-<@tmY1-^8@z@b!SIqSM}T*16v7V|YHt zI8S~4BGsgDLm4QF@KFBdB$_S%4qAcFL`yIlzl#Y!iqG0CnFIl{B0~~R4<2aZFRD_9 zc-QK`k&+@NG{5*A8Jep85%=kJj*H~?&9ZCr=ZNBUD@wVA=FC)R-7gnDDKRATED0D( zg$Xr@1hMKIDMh6W)&X*)iYW!lR?zk-!?vN?3raeBZ9bFqy-BNX+;%e6+!Lt+fRAQe zMsn-3DOvBA&RNz!3x!et`lvDMVVyqpG*z8p09@+=FediqT;2XEpN)Hkw+L=<~zDr(UMH2A(z>ba}{o?`0 zbm1)NuOZNom2dYy4{kxG`pcttX#Ck(4LK$b2nKt<{mg&uO=G#Osk(Oae^`SK#N@Jn z%sRQwT8^btsE3wDVCqnU7E+1iay1CRX7#B>^!^*O_NTRwjG*|nrn!OAN{qKh?f|`s2Xiw|&ANf|bl7j~WfFH{32MS?#AY~r$`YT6@gu6&AZ>C_18qZ|v8iJaaNbQS1kl9uV9)b=a)=n(;|SgtO! zHJ1X>pW_V)tHXH#zhC9hxNVtSd<1Uu zM>&uS)t%Y~Xa7jFgjZZhTB{^l^)K0sHTFG0Y$$@^%c;p$!Y$@i9qWR4H{RODS818? zHJmrtesn@}v?z{Up!i$hLUsX$RxD_0OKqjJ3kixO9y)Qnw>BFj2WI5yTWU3x;S}LA zKK_nz&-D&UbPv$Qt1O$SP~sal*&h~tBxw)COTA`g8{)Pph)iW8<vtjENRewuK=5}f9x9{;y=NnTV< zF~pd( zjgI7XfDn#gstkG(E*>g0<~p}bufL)TVg+=op4dt60GpK)B!b<%40r*X78GTz3Jd2t zvszxV$&KMBCf;FF#%y~fK0(Y?Z{RtIo@lhyZ9oFlP8D2mNyoCS%s?#%Z(2;4C=)eZz#?K z>ZuAoc#gj558O7Z_WJdaCq{naRndi7NxA*fe&)~@$2Ld%sIrJS+p{g_8p3ud7R;Kw zHh5icjx>6D$V=Je*xFXMe!s_2nIsI#wefikh`l`KWQ!EY>CdcnZRbwZ>hxa^lV|tY z-!97Q#eEVR=lK$#s3Op>)7S1ma9dPO{H4!)BQD1(ZDa5tVTO)D~Xst2k2e249A!*6I z);UNC=hQ=P8l!wl5^r2w*(W{7K~307;Xa2-e;1|LaBCf}i{YErVc*9%tNnsAjn= zbTNO6llxYrwtKNL5XPB*{HV!9vC*a)Nayp`<(G)fV$<3AfuKEr^dla5F)LmBiF%@z ztYG*sOHi*H5Lss;6i8NPabgE1nG#fg9hzr7v(O$>oo%ZlQkv%Vf!^RBx*tZp(Y*Qe z_k)_x@16IKuQV86Y(5bO^5S^1KTP)~@j2mwaJ8F8T5t33H=4u*O9n}Wkc%VU+LAQS zacM*oSo6Vv_pe@+>*?sN*@_S#gBbFviH%(UoOtSsS##0%Fp?7ObrTzcFht_2ng4BT z)Uuyo3%4-8dh#Vos#axa5F2so2&=vXoMvA>Q4jy@Y+-A7@yc&08LUCmMwT8yR9==@ z0ST$_DY`dN?4{w8=OHECaW9jrr0J;?d`1v5@d)jQ>t7TrcFvBh-w;9+I~TCFRDx-l z1bGIZvN=}wIVx8O6UrFJh!#+Jx#Cq%bv>=%;;akB(gzJ0?@RHs^5}PRf5t28%+qSN z`~ONfPR4~$aT01$MJD~4s!bI8Yr3t&o!X6?f1}5ne1^DNcy)JDR%*>YXnU6O`ojP( z39Yhfw9&Qd`4P3-8N|#)l%9~$4QD#tXPtxP0q!E_;ZGD21hrZC#{kEQ9xC{)P>zFZ zMY1>Eo8reK)ZZ-4Vt_`8z3xkv2!r26sjr+2XRQ#2CP^HeHru6zj3M>Z#{`K_oxvp6 z$oN5QrBrfF`%_X7}ehszk)M)@2v$PtJ?)0JUy>A69v@pYBh zW|5qT8@~-1oxKjT4PeoxFOT^AhkBaU9Xv(y5IV&5;21-Rb4KoQE>3wUN7PeL%6Mmf z*OYkESQ|7_-eheU#78*VdJw?zTK9aSzNv1U8kjc0eayOyTE6KheYw)P?cm+TRLY>L zcv)aH-|Yiggzd#JSdeCWw6NwHNU7OHM1B$8fc21K8<0jq2B{u$+qIycd@nB}fmff! ze}HMlH-Z14Bu@4s=`OO$jE4xt)H-0fx%NBiPtCL+?64)U0{~YfT)igQx(QAKi>CU$y zo}FdMb;yMk@*=Ic5}l`lm0(JqhQm3GNErm~h4YqP_%|kn?B2bL^b0V-UJ!l z8^)~B%MktvUtpB;%&mt5D_xg1|K{epX79c@^nN$Or82u*3W2YSUS@TBJpwuE1Md%6 zjkDQ#Nm1)vGLPd#(%cK$3`Mr&53YHaJ-&!F=RswN_S#dXg9IFh0A&(a?8Z~A$45}6 z#{Zvl{hJ^wnC|n}|F^zSC?_e-EHpTj7UMHj=8u0*=SYt|X4WNg*Bu622JR`R>PH{h?SQ<{?)U2OG^=zwwvckdbn<8LK~Ryv!NR zD8#19aaFay+CnE)=kZSU2=Ud#Tv#fswzk_*zn3&+yJ=P`?HP!o|J@q>#HlwN5P5!I zKIOCIv2*X$7opky5>2d$Bk&lHdH+!$r33jjhN8K>Z~RE!3zG0O@__1EW=q10V*tk zqFKnO>92ORPJ+FXfHdZ|IcTpp3ma2ja@;aSQgx{4zMVTzp4#^Bb|;>TFQE$Ee=4sO z{y}Z|^SKdRdXHnUaqXLLPd>jYX)-jFYpilQEY|XBbqqw1fPVG1m7O0GPgwq=X4KJ_ zHe$E+C?jh%dByidIIo2szQep?rSR?JxXbOg?&Z3p4glM`)dTBw(^feKV$J$b>-YDx zBfrNkQ@i~~WGvG(juu=Lr9PfMQYMOQ0JC+@7Q*QVBvrR}C}{CWrag@Y-!eZ1nN96Q zWLvL7T^i)rBLz&5v&MZbNsMo1wb8cA{pupXlzsMv98B%V!D-L- z(jQ|~`-Mf^T1QjPmCWE_mAs+cCpMQsRGM5p7#Y@Cm>B>NzRyohxN-9O9l;i)1NC1{%WSkm^CT?YPBdu{9m>9IV()Rut0^(sZp8XF z2t%9@KnX6`w}}#~@vLY7Dqc~!=UDXqzfFZ;mI%P`tWJDVG+_WVWQAU;1$14y@HnU=ZsFb2hDNzqYXs0~v=%o-gX`>&mUe%%(bGeqq|jI353x z1$B)t=COnat5n(s{i*Q@Cyn;6qokL5LOEYIdCQhMPOMxEjyiINOCi%Md{xA3%aTz#)&7osWlfX5&0h(m1uN2K!2);ASp8=?Ntm*q6G1;@j1tYDuMAseld(VO(nLZ&OFuKy$H;K6b+P*fYm@ zN&SDlULxZlt*zKgYn`5(s;|lZN`UzCqMIvphI7?jwvL;8S3M_DeBX8bM{$*6Z=?57 zbs+?>;h*!jZ|P&%7*r49?2-p^M%-N~w8x;?1q&9k@ou@eN9Wa3VxQFr;;XibbN$;@ zqbc8^Rk76|t_?lOIgbDZyoZlSv>?w3hxQENbz3iy{;Q={i zfouZy#%5D5-AI!V5l?u)u3UIuf0$$Po2_*WZ1R#~1$*CDp1sFf=LCd_Vz;_Nd)iJH z*sLac^b`gV4-%5eUEilugQiQWg)7RQC?=8dIT_(Z`RUI0Ta0U-hak`OM2k`+&z$b# zYi>VcD|h2_{_qXZjCVeevDKX zm6M*B+oN(nYQ`-#S#ECJO+2$Qi)5%7iDBF2T~pCx@w&$FdIDa#e2->hnUtz|u5KH< z?C4tUDG;AzCg|K-Nj}h@w`a(CTd({b=$b-T%1}X*yzLJ|Z*i59W-U33JJKRPsMfbO zg2_Vvme2YOeY5OGz_p2fFNIH7KLqeX#a7AJ$4esFGWQ~)F4kf+XjD< zWZ?p;qHrjWZUh5aQ{H-s@JMEvz3c2s-XzkmTRlwN-3QJT3rQBrB9+u4Iy=>o{=Y|X zt%ng-79e8;?X83|0#OK+vy!B9mTT>obd)%f?H!SzbVghZW!)s?l&!8_QP?5TS2|_Y zRxNP1R`?TH1g7Z>CTexut*D?B@_wYh=+OuG-4h#_B!0T691uDh>~H@pj8QIR8#m#w zxiNOgblY5L`kI48-7XM)58IJp8sflcEYew~IxM+s6zntuu6t6&?k;~p#~pL5R7R8#aG!3AG$Q4+Y(WzNNs`~v^H4!G|tymYevCdOlPpxz{G zk$y(ys(!)A)qvTf$7ukq&ueNNf@_-L^8IiAZXE<$?HCJ5jA&5vG&yATOrN!g-IH%; zq1i_Z!>xgJB^R*BT9|(!J5`zEvjC6T;!j7aiZj&{+(0F{72H){fiE2wVx`3UHJQK6 zp9Z&ByQZQd8B#>a48smJ5h1TFvnUiZ_|16~xwdk0FT;i|EY#T!dG3Dcso7ApcwmUo z1<3})I9eM>?36xbdvoqJI~FXhOL1zmVaAzV@kr6DVN&4tGHk&_YiQ}VUJfb!wO7i~ zVoE}ZrO!KQuX*e}bKA?uIDTek_#+8Af^@v_ZO@~E1bW@H{$5UC;tB(>6;I<{iX6=p z(JAGX<{o4E{l(VnS>RmYJE>;4ZSj6?V_dGsOxaNIx#pECn47 zFT1K`iVI!u;Y3eV3k(7v7%I;+!Xd@#9nM0HZ3iVDZH>w|?p!Z~VhWsB*J#!UqlF9*7*~1u90a}dLdb=F=w%IEhGd;pl zq)DS9)_P5wh%A5ygEl((KG{9fVh)gOG?v+C?LyWJ#I}%2FZ^~hXPB_>iZv_UR+t7_ zyGO~+5$2zHTb@MII=;RlF2aeTcwv>B=XLd-?YJ9^w*0h37+Qe7P^!&`R6D-xj!QoxsQEy&E%E8f) z%d&H56r1dTV&KXuv#KV9me7fnlNzMfSO#rMv_qNf1PR1|955z%aA)BSoDU?aSXS}? z@Ru%EGY@$Y+`cRLF_RRee^_CdHD@|em6#1#-Yk%m-^G~T2GL#y5}jjHmAKgMxY zq@G_lao`nQ@pQikFuWo=9hAn?<_so6G10Ah3Q1SHH zr;x=;y~!J?CJryjH4yH|r8lf2B?`A5L%uoqf2Zg`di+;eN@KFPw?B`XCB|9YN9~ID zeeTSlsO&W-lQ47JMdPA$hb!zf8HdI%h=1`M+0&}`l4k9eBZNm<3mI(W&z2gbTmP|h z7E~|MQH@YwxteT8MPOUTcz_ofR2qPWwC)&L(1a`Hl(>Sm?|&a}Uj#%8y!6wtG-IKr z6(6-=_O?D)mMoCwm)P_zxd@DMc_R6+7s}$L%=<(D`qhtF`Jq!_n?%mp&?7WhFVBNW zZPDj+fI@=)j4Rx?Zr&KK+Lb?)La{SOGYE+ILJ z<&YbGpj&UqJ|Ji$6lP||M0EJu{zJ#2_$+J-TsKN(Nz@<@=6(T}Gu{)QL2I@Orw@t%YN1cdbmC3qP|fa!E*j*?y!m2Q5(0x#Sy5U1btb8D(MB zOO!Zw@b`u7|2VbdviYMQ7pAAZxWsdeWg5WWLgOHo}>wyp#PC+Nx^Oz z>S?8j&`YT{@dhpjyykCW%O0aVG0io|)Z(`GN{sVopM6lQF!8ku<-&WNTu^T`H4FrT zVVwwS$LTQiBhDr@%d)K_dOx`%OOAW0L_yD$cy$U@eO12|PFy!)%+CW2h|-@>b* zdN76=kbnnF6~cpUGO&_)oLbc48Vj9tONopihJZZ<^fY(wMsOtMs&A~vQc(w|1+#acX_HnVypH%w7Xs?N&;Yh2%O7n(QG}(&>Spi|Le7`|j(mB2F#CjgBi&61pxe&wGWqNjsZpv^BF zC<6JMDK-6P)6S1tsdF!kmZ*Eee2!bwQkQB!HDI^kHi z-YZH>v^u#}C;itdGYa@-B(C46sPs^)9P;1d4i6)Pyt2X{FDo6lf)Lu;*U)R$jmXO! zk7B<|)za$1ZNt2$BT5c+;e8^H#U9^o6LS)3acFu}&Qamj1-Yps{M1EZX0ns~mOQ#c z{D0Su-ulXkl2@~jnk?Z>xL8wD)w+(`JRa9g3>~#e8y372>#M)wl4q>Ryt6*+qR|8R zl6VwYooy)6#$Ap0zouiTnRnxj+^gh#3ZKxzYK(nJS#`MvKVFjxY`Dw+M5CnqcKqg% zo_~i>K9a&cd%dm+8r*s2U<H_U! zKcX6TEO(lnC=Yy*iQnSa@qCLvCIz~|s4ahC$hzyXR*3OsvQDs}k$+gIPl?yLhY4K8 zU2reTD0I$j(-{f+RSx_Bh~xUH2&e|bG<};0^55T0Uz;0J(R5Mbtv+<3q`zi?6|-VO zEADf@#p3sjwKQHcbK`apSQ#HwYM{8;zyEH%X3ESf0G7K<_(9VMO86~Gq>zV>4Pvwo}_aKp#b{Dt`qFPG?F!<|*bGqGdcXuh{DI3Z`j+@fy zU?m^E66};pdf|e5Ct~^n>Ejy+ZzygCJyVL?|6s+FG>9~U>WK~2hf30ZiV%*Si zK2-Xfz3fn*_Eg1SEw`{NBLg5?qK^2X6E~?1KWOUg!FTQ@M1Pc6;Uno^wn!`A$+7W) zMXP=gy6pH-m44GE(3>G?y{fFK11MKZ$F=jo$m6S(dgYb9N@PtGclG)=wEShxrcKYe z(I)|+-EJ#+!Y2MpVBnDNbzJ;2-xb(*^+BhBVD?aQmo2?oBbc#1AE~2a%5bB7rX%;t z%mbY!C&nB`u`%bP!+)O`#pv}bA2)z-j+^5IWz;}ZxpLI)d@h5PH>p>fgCjv}gpkWO z2C{z`*^E#ajT4h1UE3)ye92ml5V-#0#Vor&Ul0CbtE&=haD?*V2TK=*ZIE=>*KTuD;P#DI& zGi)rQ)n%d7B#!#Y=n9{6i&i7MRtNxiX;e@1Lmm5FyOM)}q`>E`|4)ex&!Ajh(3b^Z zc3R(wMZMXKJ!ImML;3+%8fle`U}uLWDLtL0G{CO^h~yb)7PA8J@uwN<{`l4H{gqW< zFLuKiO*oCr-(69tVMH|Ap3iIAG8M6mfTlC^{M!@07Lh!It7a&#);2!>>vwE_(W(P< zqfTy7G(0iwjpnALM2Q7{X}C`v978IMP0Ktl%R!`CDYW{vNPS-24cV>`JA7OK4Wz)Z zL-kTr?G}Ar1<%y}M})WCEr~q*_X!#W_Mlb zRi$n&vv)O7G@PZ#l1-v`zJ>d{nGOUc1P@}bamN1h?jp!}rV2j+_H@@pC`#|1tR_UG zjoTsxsZZ}~ZQK)ewQM3<=KFvk(Qx|dkY(g7ms7bpj|I!;z@#OmjOy<1KPol^zcY8y zda4Atf-KmT@K|u^C!@@i>RrQ_vX@c~)ohGoq;?{0tOk`>tM4NTjipUv=ZH6)Y;*Ox z6N5>*sfMf*rQtS!_You%$LiuRRt?+9UkLUFxqIm~Z7y~3DvM(G4n zS|4+yQ93IW>_D%p$;{|$Rj)g5*4HDucrtv_{*NuXW|~^rHgJ+s`Lj^69NEQGze&2V z+=`(rwB~b)QdsJ6mCb|vpX3OE2kqHP4tq-&)en+#FIqX(hS8KTJc0Yc?*qTMj)2PY z3avcYu|5hSEq;R=M=+O}7sM7e1mtCYpMTSv>o}T!pSBl**GpZKSYdvd z&GCT$ub9(NR{o5cs*PO(=V!{?0CiayTFI3+u7f8;Tbo@71N9I?)X=>nT!WZVsgZ8C zNg|v*hWcpt$~#+`It4Ex#>$6<4SlKsqFY3LxBx+g1HdRaT3o_0eH?eR4EaYP_=AyW zDIwMhBFA{FHpK4LyjxgvwK$)32rO1p%zB-b%X?IVIa2oG=i>YEw$SK!>8pi{Y0uj# zFa3qxB;-|s!>eow-P)X-MQCKBzWGeB%2J-Y29O?~P@p~~esVIqTDxpf$zH*{crcWJYdrQw0 zb78bK^zj#3$ihP{!P03{+ty7=`OF6R9yxhvuwkka&9VP?ZU*8Y>1HosRYsJ0V$vC; zaKZgn2MUbr$Z}^k1jjO4O&LrsTIoJ?%XdTCDMG5uebCCj00YXxx3u(E9Co{5ed=ds z)VjWhi4^c0;eAV1l82%2?(~2oPrBmKnkto(cgR+6;BOnzqhjuHX=SxI8z(|p%F5l( z&d%;8lp4|97CanULMm}gw^CR_HNDQk0|CH(&wt;4__oM<8JOx|aJhL4`j1HL z#8$XDb3LHpKceVoeyV1zgOuX0un%W=Y!Q z3XsrV^aH2oWc;#ue}YGI7cH ziGxaB+jVngb^~-VGMLKalfZsq3-0l(P$z<7MjglT`VnDzQeOmCrMSaXG}gy2XWa{I}bT3{UYYS#-p9;in47E7Ty0qa#%bU_XXaRutWvFReMKT z(k5v)C#dbGP`thezKye_F%a;)*P*U{8m(z?qaO;IGReO@V8?<+9DJGB9bj2fW?_2o z@NiC<&L4QLx_;ty3K-7GnDtXcuz9Q$o7fnq_xc@;O&B~_g;T9VvbA)+GLOuiUe34L z$ttdtFg(9&g-(z?C0?#(F{*1CJ%;VK=Mj525h79!U-g4fM08JYziu>fDf=J_D;tbG zBEfIHFefYu`)wBadV-C~u3^iG^S}(jjHk#KYtqw+&@h0ljE)pA4xP;FI{U9S({LgfYrDcH^ad=+4IkF%_)epCpzg~vB5 z9zTEH%GX4gkvAx6Ey6}wNO}Z%ap4d;f|j)#_8JaSc$iWp5*YoKIPjU|d6y^Ni1wk0 zO-O*K5KU`&3W+(GYfvhgoJc( zgl)e>uQ`*Y#DGJYcQs*Wi`M-5WGMMrurDw{P+4uUT^#AdlzP7T+u8x3Z3uQer}Z3v zE87s9@A^Q^HM+*xSFGV!5y)I2P`% zy9OrPxDZ-_Wwa%2w0nk9B+^>r8f_AY&s|$Nh}*#vYl&f*4rHymo*uA_wuWpeCMtP6 z5bjF$-l!*Q6krg=NbRXi_scquR%beFq0N+HnVq!c#~-}L(caROU{M4P#^0=jFTDCW z*im&~kwu9_c-ZT+O5Rr9hP|^CgpV6`*E~)om(zbh6Oa>H35$w6Y4<)m8P@g}l&?o~ zA1p0?@Jlo998u-0;~Dd&^d&UL3RURS$x#$=(-$RJKiSl+)MW``AGW>k!6$poBQET$ zA0tJTAO1PSfKW1icirnN|EHY5E}Jxd?JJ3la+e^7B4GL1?M3Z%tW}%ePoAjER{A6y zW_yYSQdvdUWlt)EWUOu32*YvfYRXRi(kMUJR03J`wkr6eY6 zv+UVGK?1Ri&J&zt*R>{f7+6-cmpATTLZ`1>b2;)5+TnNDe#D`XSm)q-U=%3G6H~Xq zsO9}dw3`Wl?{ThE<#_{nzNA%+HqN1yF0P??I~b0v&z9-mS@OydKur=HK2;%hsDXx4 zvFuEwy|qy-{2QG}v<+!-_EM(LWuepKjgj3o#-H|Z5AKMk$S z+;Zrs&umKg!a5h@97r?*+pflblPpTXoKpxO&=TF=HIXfKv1wod88`P*6RVDY3sLl$ z2}Uux%3~;C{KR6?Gv?-5|F^*pct;2<7Z6Bk#A_cYB*wH8Q8_f~JFtr%G>hhe+YP8T z!YEH{s^vyGEH-0lUg~Aqi@1MK`zEd^j``}1CZ{sD-mXc(C@q_0!c~8j_(J9ODGL$1 zB*dHsD$k)ei%*AA)~Vm!J`s(z@$2wy{`UT1C`eiIFc&l~O|dp;e)%4ZjrpQOzCtx{Wq_Se}`1HjjpMjvaMHX=D2p95!C0)mMbsjGYHexn?(S7t~h#)9iE+ z)E&oJspBRQyk1n+&x5swVze#7ud#vlUO`|=G8-m8Ao@svNFDz1g^^ayl)D)keEDwI z%+X0>oKEO^$}*)@tN+wTOcwJ~hmYF@dVdnI*jIaE{=(diHZA(p*ThAPMkC09eDSI5 zC@TTDc`Ei3R(?5^7Oj3;tL5{CW)N>kdpSf3DvGr*engmU8|~Jf_q6A@ORht?R?-y( zyw#)Y%)@BE=Ut{=IN4A&xHadujqQ|>$A~mk&bb+%xS96H{)Spk-^4rUuS58Fe+>Qu zSjf}8)q@CCUUi~*Nv^9^uYp^bjeB7wZ6C_b#x#6G^}=M8VIT%UyszDMrJ(O4uuhs_ zgX6eIa8IMW19eD-W)@*f zTjbWnWs!@0BKqYq@u;xSK<2&)YaL{5LdPewa)_Vd~t;H=jS!A2G@(4cw(a2 zAcu{Guey!TzrPO!%|KZGo4@@Vcz*bgWR`-;yC*8)xODmvX5zy3m9a5?S7gLnwqpmF z0K%_bGBIWccJvB};*_@8?SPK#$}g68xWIbV(;3hHhyE74Tr zXVb2_pFF2BmDR3wrZ$O-Cu)NP`vjH!I(fc8#|!!B@O?ogRV@ z@crpSPZwCJqiDGWJqL%G_xPlqs4T}$(0KazstvGm$1YvT%fE4~D(LXab#iUQ+uxX! z1<*~Kx!rbbyq5UdJc3wOqPpgW80GkpOfBE4GNmhtRkpa)8$ihvP$J106#oR%_{ zPm58`eH%OSWtFRYDKFG|(u;M@Sj*9ZxWK0IdFxq#RzBmg+I9WQo68wWvPF!W!AFBW zRP2JpW(=F>&Y}^g;vny%JVg$hg+o5hY=KCB%&`LbXnmELd_VTSpW-2yJFQj&Zcu3v zN^Y!aG&QHVYtj0)2YBi0ng3`KXTm1&qi zlZE>}i!FiWddGM}?oj>U^4BB=5K@wwd!S5)`4*pSOHL6M!$q6n(rMF)m|E91jIN~W zU$GMseYppS*YtyVm0tZ;dIq%?2MZO2U@l6HYY9)Pae_H> zmLfjxDD05IeYmvxiNGeMAXve#tAlj5D%$_6-ox~zOMPDsn-SJ4hX8i*F&tV1GaL_K z1DnL_yFE5PG3gdRJk&RpJ96v03?&rl-Vf)9sK_m^=T95wwq9311_pyZb`UCeE|+|D zDEqKJ#F7{{ea&Irn^XbAKW$!={r#-XM)Qv_)`wq1?8liW=$(mtrkPnl@uR|(UC4pZ z58-ow5BWW)KZ}>EK7=gi=YNl<+DJFv|2=^v%2hK6SEUNJDF0rW5-sWGOMLhs+RABw z#6!|C*usN8&-qB?aATT|4I$<$G24iw!8{ZCNX`0985}DRf>y2#s(L-Sp8OZ&!0F|) z!R5hSl3!;j6M~kt*-sd!orqoBdkEuptI3rz;q%@#Q^w{@#m5tm;u&ROG<$F5#B0f{ zEr~L(#M^LoPDa`#d5&NHm}wnVA++%mJDF{jCTstF{CU&vsp_uASttrj^H%#ShT5!P zEW3h{ofXmh^}SRVR+kr+@5ifZr!(2sXDdSrs2g?YkKa|!m=hk?ZEhA+(CBp`yCn3!^v>LZQP!|(5BT34mHw` z(78tw!~m}o+c(_H;UfmOA|%y2FHLEb$15jsx%Vy?BQH^M<_>wAnIXgc1VZ1>arcQl z60AB_vglIWFm!V-yBtFP0&v(GQEl77myxkv-UD&J%p^A`fQV;}ROT7;^PF;u8N6YQ zQ4TBg|BfBAgs~}V>(HA5v-g3Ec5PTI1q&+5l7FvR#sG~Ky`~_N&>8@38mo&HXgEJ8 zw^p-azQ~yiC2uj%L^h(~zFqjI++`?4bM#%P(quRfjt%-5?&~c?K?kF8V$mTbq%#-w zfjC89w1L|#7q&{@<5@+f@6X3h2%-lM!=5|>#+oDpc9@nElL`5*?16;DO++|+9_gJu z-yF-*xPsEB$u#6%Wc%{3D{UzC9WEx%)ymFeDSDH3Cp4xyz6mr^%|AF*~&bg{d4)%D`)|8H~Knxvi3QgiL(*e{l|c5!D>;0 z3RHXq`@7-6+gUC4dV2FyWG;E)Cga-vnIUbe4ra&p@Wp3?s@hGnc`E$x|A_c?r6yov zr4oJ){GRM`2E_g$_6^zQ!JcL#xX&IxUGWu$sP7~2FKo*{Z$9}lBWn*}&n79eCM8E? z^n^=;6zJ0ObJg`!H+3JK%rKb~(mH6=4*mc^*+S!X-T+O-BZPo`d2^fo5HO8@EIW`}@fJZ!9Yux(_@HZ;KLq)HHZKl$oNR!9SlCmCOwkf%FMfUfP7x3 zVsG}$q*DYVOuqU<4JJM>u>Gc~0Bn})Z&uQNw+U`4pX7EqY(XSHmKNO-OSM}IJ*wTJ z7SeF;yjZRpgGtNDH@I_Dixv>e(Q>v_n)omHpY^Cu%Ug7(nRbP={+pMZKMx{DHAVXW zwmFwu_8XTM|EBTz8b^D(<}pXn7eIP_ z+20F0UFl{k+zdwOg+~PVUL_1FF>OByY%xaHzzdgQh=V*zq9quUW0wsF&)Fr9`2zO~ z;$D)`<*E#JTEpcxh+U=*S|X5bFT)r+IOL^FQQ9_NCI`eJJ0a_clD9ltpirk5!n(Xk z&;3mm_B~-%j74b33Y!u85%V9>BQrXkw2$eGgc^RXPL9Z&E7Q9+Rd683EW2D=pHA8W8H~bnxDiLuOcm4LWh3tJbq~q{frZJJ zB$>waOU0ouSU(xlYKV1fvPQ@-sN5imX}dzp2^X;SFrtML% z;H!h}Wr1u`W}Z@u>s9SukIU3+9%}h9r903fV&~Sytxku(Bj7NYT*G)c@7-{qxV0)_ z%fG~~+j0A=WiH8WjX~vUOJi%ofXJtdWQ#YuC45tlRPKI5Hk=HbLMyYA&R}2oWd=-+ zHS!qk7E|5(&UIS~>?9zWc`u(4;lZm9DP%tqxTYL}KDyrVaZ6qc9++Lv5mxRt_~xkF zvZHl6(KXgh%ursNO{tr=`n5uRFjo~Uy@0iTI;S*uF&mh(t2OQ9&WwL!Zv8HETc*#l z=2P2n6IE{vo~u`52~T74f7f+;J04ysvLhZ{?!fLLVW3u+um08<#?Q^kjmnwkvgM5vyZ$E3iIY`xk(L=n8A}%)@YzL&}6FtXXyb zecx?PGlzH(uIocx=|{$E4p@eUKJsLDOFO}7bct%`J!1y#BM@x$UUh0^PoYjG@X8>^ujU;_v!CSQ0%X zPEw90{)d3aE14HtRg^_EcRMetrXLWtD1l9JxtY#k!`FmrfVh=5!zw6TZ}L1G?a2^TiJe0Wqy zW_i5>(OUF~=9x*W^)kO-?T~Cck=kBObAtal1@%s-sd4C>%zl#1K_2qC!w&_!kKrq9 zKfm1u*KQY^fvUR4awyyj{KpVjz*eC|(_kzVb*g=TgOB13 zlAs0got)9S@;?HD=@$;Wj^ALd?#%wglk(sSgU~<5&XalSjySIA*pO&@ZfVsIMxln> zLmZB32Z+qCik*D?eYML%DO6-fg+k>##*XdH1#XOohQo%k9i6&`Cf*; zN&SLgP?q?C-YtZ6$dt*}sY3}%nwU)5SDC@DE5VfmJ!IgL54tr~kTbmYqCV8@RT2U4 zv|2eeNd<$_a?=g&{aQMUC^UE}LPYaMZoW@)UxFZCRmkbDq75l|Th9y~3~6a)Pfcx> zzT6nFDa$Zeh?Dj0EmDk#fMSk?cD$O)V=i~k1RY|PeA1C6#f0nz9Ydo%L;WG}NxG)3B& zKN*z`CC_Uc582bhMIuryJNG+$J(Wa0;GZ77SWqp9ydSb5o9T+7yuyOHI=?Ow<ZXf7TSN|(_M0T zhV)AS;K`xXvSn$NZc4rj%-^YLPsEl?us){AQN(#e!QKlE6E-o3K2-= zo=WxNAMW`81_sd8xtTCS0L~tU-qO-fVj~uGp)$%Oc$TpLCsoB!)M_qsQMHbGKHGLf zr87+#YZ?7p!zLb?dXv>*^Y0_%KXqa{z6#2l^g;*~L)&p%3tw*IZ0z}I6I9}0(<$@o z8@Gm;MRRX##VH*l1>BL5YBu+BXy*fM9~gPwWrc<6e^tk|Is`1DUnDo(n-Oh%+0@5Q zR8c6kpDVnbw6NULAhL+}wn50*Dv5C5(+iDXLPKSKl@E5o)_@_00~>bXKkEt#?*BZW z5o>1yeeu9JCo@$0F384JCYR=-dxl86Q(tpP#7@h<qv=n7H|Lh~ zfB8o^s-KB}+FRa9XgwpjOzn^LRI}42R-d#4zI9oZt8K{6jkrB~U>`bfd`$jXcD=l- zI3V}jm5^byt&<^!IJ~s<@VQ~T%@9sJkmi=}EYz6^6*sz9=ar_JRO&F3xsRtEPMOZj!K0NLUo%2Xr-NK5D=lrMzzI|=02psDTuaE2$iZi)=7#8 zNq)zl1u(3^C?S)d7EBwHk9ViZ1QS;$XZy0v@d?9dw{SS;HLN%&YOk!z7M1@7*d9Hs z`K_({yvymqb5MiN{}Zh=VtIDC|K!Z$?VVdgF(yo(W9n_#O-2kUs@gFgulN{MSEd!8 zIj{X=nSPve&KL{IX(R-NO$3!JvO)qeSvQWs;7(8)0JyO9j;( zn7J~&!R*8VtgqgW!w|8po;P5hs8dDXJ$>RVK_slbv{oU~|Fn!y@dfSomb;xtF~Ga3 zAhaoER#bd@b*`IuifS-jKOywnghn6UJ~8rG7aGP-8of<%M}cg71We5NW)BSrQ}fpY zp-e{a6Z_bV-rc9!@v$`T0|iNCIyHWbS7ZFyj(L}^Y&9B&>EuqIX#};*(62=wwN=iO z@r?%_|1A19!pu=wy4cf=I4c`5-%)h?*b&X4;+5zRUHI`Qx1ON6msZQCO$ zfKb?a$6o5;>a0Mf3Ztw6bmUy^ls=Y|MmMr*o{+sEN$#|-1kGktm&qH zHKA7r<@#vGc)DnE(|EofS3G~)O$hrY`O~F*Rrf9HB^a)Mk$iG;R@od4eN!1S3V02~ zD^z{`7R=avlBQQfEY@jzxDGlp2m z2aJbZ|2PS1WGI0_jYV%Dfob(Q-1W-X^Mz3pM|wOhME&FqAz8P0ce9YPXylRm-5hPM zJ`N-SEmx;fu{xr(E|!~sJ<(a1I`sdUiRF@$LBKgw*0iy&zh&^CFxbM?8Xdz}wYhqt_MWKf8+GVz z9$Ow@)&xUrGF;S8tIwdOqJSsF0&uq&8?>V-Bh)b7Wrn3nl zYuEE}Bm3i43Ch2r-JzSCddDiI)u7bcmSHK)K9NFOg_nx0#VZ!7a+ic!Ji((*p0HuZ z1*!ML#N?f>7SkY(j?80)X%@l(@$N?xYM`FydElnS$ev-8@@*IlI`l=zV<3~7l=V+> z2HUTKkS8k7RCyf$?VHf>`lV3zZtSqe=uFq^araBiaL{Dsh8ER!pQ1cMSH9#vd8l*u zH?hkN`O(e~A|-8tz5_?0Oiiszul(Y`)ZsDbhNy`#&r~|x;&6VRxVXpS<)-G?(}us| ztmYE7G1-P>--r1*QG*ZiNrI`58o=eU15(koZ<1TRbWf0rp>VugX9VqNyvqD3c(o&d zWlixL)lHo=>q9E1PO=+t9$@->^~yQ8rtC)*LvVwZnmf`)9Ft8LpG;qp=qBVqiizqy z2oJnYP+S;ym5>q-ZZYSDwxAPQ`E3bgZgsL)H!E35xn|RGYPnM~DHEh*{4!NedV&Gq zDI~v%^YEV$%WlZ3Vqb6#%sRW0vjDrE=Em?_u#OGRd<9>mT2q-L16 z^x@`alm*{bxvV=rwmX#uJ^I>miCC7FoSsOGeuOs%*W|7N-2rSu6&hcE8=4tio!eWF zE9Xo}UM{cN8S=kE%wmWoMr7#a`>F+uVUQQ$8ME*_GQU6bUHuo9!|-oX&IV533k^NV z{GF^>A_>#-?nl>>jn{fz!Un)?{l?3mf)5%@F#Iu3P^kNgq@QO(X~Xy42j48v=___R z5nyb+k|`}ZyeDR+8UVCT2VU;_xFbSuw6k)p-orS!JfvlkgNF)0rg)X;?xB25QjM@8 za?}4O4?a@6OsA43L8(+35LVQc(GlRqN2nsKNj#o}i7Y5ocn&2OMU22b^jZVPwA7=k zi-)#S-^s5}dE`EQpIV+v?HDV~`sej>{+`YXBEz|Z@Qq6DvpYYOpkn7a-A!L4ieDOg zyd_}qYeu;&N!UajrMl2LOHh&i&2`pIK8W`N-AhOR&=KP|+*!_Byi5T>hWh_~RKcg;@ zfqVdqx3!|15D!pAN$qH!ov-5UGCrHWNI$zBt|cPU8i1p0mjnwccImIS4VtMb^`k21 z6xBv>@n13e&mjfvtd_=%Xal4x16aK{-@-wE{87e}N8TMTgFS(WIO-O{vGRL+NOj!_N?}DY4wJ*=RF626zekUcCRSqHx^zm^oD$ zf3Mde{F?VV6bSZ^g}X2GWL>)K8cU^h19*V~CH45dh7F2{?IG{R+Mth4D91$c33V?v z8O>TPKJMocZVzNVWW{M80*c&oyeEa1d28^d@JlTDr|jjD#4d^Umw}^X%%ga#@bE5X zihcf@S~&6f=4^kNKxj$ts9Q$|A>InZO=O!qD+O-GFB)76|6zDAL2;W zRiNvGaOtozLm@s8%FNGecz_k+&*JoN$p&z9c4fI+G}+T8fxO4PO;8y~n3cCj_JVEc zPKsYuBC6!pr+E*b6fK7jKr@^Z1V1k9iViWZj#{2P7FXxuw0yJ5TBEKt9JC5gTn5<3 z_nj3UKEBb*h6zy3FvKo(kUT5bR<2GQHCnN7u0FIxh79|EE^8&Ai0QZLUN@(slAT;& ze=7hkZ@MlVgmoYgZ@vUY6xH3C_S)Pk89O+MyIGco{@Iz^$6HPLqF5MC-~Y4Z=mcvC z+$JR{P#C*zmPsn^)#{c9{+?*0IK27d7cVbq;K8e_VtYUx@Z$+;xehAI_Bp*4S=l*~M zqfES~Qv^Nz4p=9uaU*bsp13W z&*C%wU$yTAPem^D|54rvLzDnc%Tjmu@kcj^rQZ^JyFDo ziQUWgkY&8^kaJgEXT4Rf!qdiSZ3EOLJ^Wz*AHERNL?Dp)Lx!vqLCktXrF&q#n=H0f z(ku3}302{HQ6ly|ne9))B>mFf>X}JRn5zCCqA}d%tAfzBa=}c4DYO*(&9E*%O;sA{ zdU6Jf{CU|>L0%}`lelp4KTQcIW+_l4(~qi2!t$0dpO?V`+B8E|FAQs9rj_Kq4_VJ% zAP!K3^ty4R?2tui?(caYuCG=;C35!WM*d+j1!OLWlAY$KxUMZ5x0L1MFkTQRiFgyR zf;182r)&f{%$_yEI3qUc#ZsV8cNQH9@x8el6S;N*GkU(RnfD!3cEY$Mx_ashH7WRN zS=|rgna>n2Z)2?SP5XK7StMsRgD)_x-NPFUp^S!er}ofneT}3Nf)f$D?$gr6WIu+8g-Ce z>ho{-966sJo_;dWQs-fcL1bWD;fywJm7|6g_-zU2%pmG@(iZgApm(seM3{fx{)y@P3^v9x&kWT(_mcZ8;zVWF z_M=V~aOFZR%j5zqxA9}=+;NFH*6z9!1N>ab`I$HIR!Y}3 z)bpMkPMnZ{B)?2mP8dsz_&XQIuBr&820i7*`+PsHtHooIXnj`+Wt5B8>D60&L@tZS zs*f!F!^V<@GR&l7)iVTjM?CB?cX_Nym4HEm{6eoo7F^1(T7P$h=HFbjEMFoOAh+CL zGJRh%G0dhic=UjEpHoKU85m%kOetL5XG~+qI_5lfni&%T^E52_I$GE+p#Z9X1f~Vv5qC&9{0Wy|e!8RrYGbrz-duiN-vr5{EPZAgkQa`c8>Z4vM;%OlpuaJ_@0j-rUD@;dFg) z&LV?Et|%M@QDuLkUcEhK0AzW`gY^t#$JllbK|^jn&BW(6;fGC z-%Uwl2^MpdCznZRrZJCaIx+~2y|TJ#f;9=@>qB&zpS+7(Xed+-rXdLx#pu~iawlBO zSM>C>q3B)!Be0ExE`rOm7~P^VDv`1u*rY(Kl(3T#Kjp(s9eu*ngssqy54gF_5*z;?`#ba44|Xl|@FVXRw%2^%P@`UE__Lq?-Zj30Ine2Six;xhJo^j0 z+up?G6Ng&FG_@L{$A0_{9u_<2cy5Wju50qm9uz_KJVEP&eE1$p(C^6k$r&PF@b@eR z{Sy)-kSy}nVZ>lw;=j4Q2m`%Fs8(t0a48U_iM;@ew@ao?26xIm|ua~Ld@17ro%W%+Zou8P! zPvBS1h~_zU*6`V)$xga(EKr~QZ~k&5t&TPeQ!%86f{ z#FY95lg%a@xRNClS>s(8I3k}u&m*0(L?mSw_P=?RW2yIY(nT&BXU+6(tRd#S z(7kUuozi5%8`(^5E2w6r2hLf3X7s#F!^Ed(8e~@x?HCq`k&b^4Ss(D-E1S0T7#>4CoYNzzskYBZM01bK#W2zd^6Q*P-8^ z&zrI*NLP>aAMcPgwBWyE6^^KcrgM8`jRSY zy0opcLtg&c<$(Qc_%8Zi|75xQyXi_{${Kp|{79%%ft#o3& zKGV#P-jzKWe%f_?U${eGup}>(M;)l)KLwzC%Ymy@OK_lIpEj)3iKA}Ts`Io$TYpUnfW6d&pEu~sv8Oi=D z8S5ro;am@W)5$1Y_V%RKdEYVSg_>u^)1|M^-+J zcM~D7eY9Rc-*@Q7M2!8_3y}_Z9&K^}-2z^GGg4y9sUYnEUQPr`DQP1mPQnvlTjjn#et*bdXNu8K5}nD<4v@Dfk~r=i$$0 zy4=|O5UiVm-Yo4%(+{m!3NdZM#rQnr-Tvsn#aJAFx( z9DZkS7TTTdKsEc!uFVA*`iVQ-kQYKlI(3h63!q7Ap6w)`I~bw`(Xa(yZ+|N!1lhp2&HJ32?6a)$gXx+d!DHFfHQnyStCnMX)a!aqAT^8 zX<5;IySyf?#n_wlg(8i%*lgn(S3hP07S&x;jjt+G;a18*S$NoZvHnCQ>z-zTewW>A z8yk0Bzs@-Vv52ZU?te5PSUS$K*%#!XujkapkCu6%cTJwT9{vC);kWcy zYUy|OzgHVqkmg&RAa?Dp_+znWE;Rn9gJ9@?<=)>33cs<3HB9n|%}IG3q8 z(3j4GdDLJ}Of*GJ+X2=Tub%jl3*{QUI~itWE1}kc5TRk0up|bA0)0k$$CYTgIVN$e z9f`)g;$Gd%?|gpMR`-^x$+DC3LO^erjeJ}vSfgh21rS|kWZ9pCrE?8EjfwQI-VY`8s_nTlGjfn3#`r_1<9z|S z@{LAmKaB}#GUVaepX0RQZ|Mj(-*!UsT0OzjZt5ED7U@VU@x$mi-tO5+M$s5g?0KFz zn_rr5)~ItN3Ns}4=;MK>x}EEKu{;N}_M+xlpbKO{*+1EKlX$9HAMhtx@b# zWUTpG{Afm`vKkk0XJV<9C0CVw_CQ@^&3M~MI`mXf_g=T##f+J>0wJ%uiZyJ!lQ`tR z$aiesnYty^5*=8(+EMO^rv$9B@cO=`wvdKaF1=UTX z6K+pT(EGj5m01xImv4i;w_g<|9cV_%gVZUOx~%@4n6j&1hp>b~lzK4{QL7I#%g zic5s>Z}~i}b(@f4PU987oZ&eXB1##mrtU)zQ{q@h(+ycW~M#Yn^o|-%7&_tw?r_o~#kiOeR=hbHJ10R|V zzOF5*KTu56YJw5Dz6xM@Py|IROTi}x#Gy|jF1t1T~g-4GCnQpvC0YgE>0sz|**ZTkY@ zE4{Ytz}drg9BI9oif>zgUHtAwK2uJ%l#H@9K0Dx9XZ!tdzE?`%KYMMd1}=DGphJkv z&W>xXBUx)hBjGh`<@Xi5WnX~!&bV1i>Wu_vqO=o`i5Q`I3(##@vJ`wgfV#W-Qsf3^ z+tz-(P}wzat|A$6$v2Rt{r9H%%6`VWgRu9ts1agR@;y1N5JwK3S>)$Yh^nP4`^ENh+Jd*rnF=_xhsY_b*5!J(V~ zRI_}UZvW4R*XcV}uNPUVIux&{AIi*^OK9{Y#KsW6u8Z#?U;4=AdPYTOne_%ql9%Wl zRbdo{_2!_JwXpJ}-Hbk>T8paqR5z`qT6=aTxXIj^(-hl#9P=t-qj5W(EiL5L zi4wOB+)f@)XCe%%75`IDHidJ?8pNhRP;X=}KSe95uO z%IhzoCbsHJ%I)BRi3H>?{8Bz8($! z%IPOpFd%T1=Ln36;iBKQq!g8mcc#|Nx<{KeND&iazd_c!gDgROBi*y@>lrvWiIh$E zias#y?C+6cV>+n=t zc&m+zQyLl8p;%3HK>J@J2jmCli)7GsqwM5Q*o)_53`=(HZd;rnpMqvC{}`}eIw9Zsfg1j4EMtGl3j!!%i9+=ARMi@MmJS)d`|_yR*&0I7 zw?v2ekG0ybapK>It>4|@9J}ne3pWNeX_w#5jjuB@#Ai!-jY-5^zuD`E<&<$KcO0eE z-)z8UITyXsx-iG4U9w9to?fHD&uA_<{cNdEa0>Do2@^sdCWj|Z;6K&Y)Uzw~Q>?Dz zx;duLV-$tMD|u(wME9+0~rx( zqTRJhi^;8lhZd27Z%vCFfV2zh3R76)DU`)30XMhspP(72LN|1aHd>$NcnF5xm#WYp z!fBfo3%%#xifJvuer2Rk?mS(C418fWJ7Am8>U83JI`DxdkoTt_`kul+2|QPKHdx5+ z=>k&%{*rEPt&42kIf45ugrp^2T3&zK;I?fUzJRVr8aWc=^Mrn4rB6dd+t`&i@M*n}z#g7~ z?1uG^?Yv0O2)!=BuA%5G{F38<`@}%-B8%5SmRf5@=nLCSSUz5v=#a0=@{G>-^qv$c zRUOcu6TN`Pd?TNorV!7YhXhIsa`Ou%L2F{dg_* zGFB3&in7655F198SBcauE)OG$F8iNDhAzDefFYMZmkZ56ivn0h_l$Pr9;bFRapZ~p zx%7U}^q7qI^^Cd+&or~romGwWh^^q+=af}HI6Z*~_4^`rh4RlfMR_N%j(Su}qBv0a z{(usYo-{Zsu9e*FrbIYUMa@1XG1B{*+ptsLG zzkTp11~~Cz{ISF3QD&KH1ILMg975dMmCw%L8@& z)M`y7>fKXOzuU!3Bsc4}$SK*5(ihlzinDk^6y^>g%i8tImKWnnHu!5=8m;)%A>;jy zMK)yM=lC=Uz1A^aPh2}%O%T0da^p_@{6-N7`QE$FtTd=VT#QyoZqTY4F66%Q%p=RdTa| zj*U&tnVM)z%>qt)f4J;k;WKznd`AueB3QfzqAX&oPQKV5l0-dSr_AyD zA6EmZX2_yozEPplmYtA~w3(C-;jE}}<>R`W4Bp4SV@BZl33R3s-xI`#6ToU0d=}0C z(svQ?ounjI;BFBjf{1+$fP<16{#H|$rPeJ}+_|g84Y0WWkALw)K13 zuw~18BXFo>gz6h3-;lfd2zp27zAR^oagpleXc!qC&L7iqxGz$xE21md5y_Gf@0G2h z0(NdY^i!>8W%I-~?o2S(+sZzNsNp8b5ii^#Z6;`O&xTIMt79B;88?o@#Yy?U#lu$M z#WKRtxro)O^6QdngDu;409fXarTjMKp(Tdq(6Vs?o8mUEg|nA%X{5c>sp=JbU5{WI zH92T9NYeHQ8dv{n7Ix7UA-sdMq@*W|L3i(zDpQrDm>Vs)b zoJo@=sz=$wNm@2sjWGzGWfg1oKqVC}A?kx<(4K<}(mJ|+r&$l=rLa=fCzZm_(9CXF z=l$>E4JKo7BgGEmxtL_xg_IB5@>tqoZXVlE+6s<;=WETzl&5~-Sozd9$Jb8_1o4mv-V>}S0koY z#jL2oi!mi4sXd}di=tFd)I2A~eC=hXx^Xtg7OH zAaSbNRExKq(^0&&x6^e6hDFsMDk9y&5U47FFjMUAbgFHnVOL3YJR6ZI1 z1O1i8*QI2Ze=N-8SVUZJ>b*ELOvY+-16MutS=a5K6C7$nG<1e|i1ZTQ%XqKdLUJ1G7gZ0IU$=rRM`fjbgw#l5yv*xfbQNUH|NHUlEi$8U>g!2~^BC{WL2cBNAU-tnwz5X~+{M9@yU^c2bgX>)s~<59cyGhQWP z8;?O86)zOBCArS_k$P2m3CsCuq6v{GbOOg^(Wrd*ky|8unW~^J>?C<`S#~zmjP!Lp zRH+w_%Q(RSFEwqL50jjgpBf3ecTT*5?eZGxWh?aa$e!4^J{}YDDAzjnzZ{n$r^YV~ zD)7szoLF92*ITQ7uXeGno^otD$H*!cEWI)vHw4+aV>*8D{-l{Pl?g`R5W2 z(S4yDQ?!EVG)cG7^PtP`IrACtPB9P2$cH3ZkVplwt>(W(00$Rf9Cc(WK$+#i;0cfU z@(_mdc9#U%YHry{mu;8sCPEsq+DhE&k%B!GRIw-qM~cpNxp!g1ne-^E;;WHnq=jUqmyw{4-1Nja^WvJ! z1)mzhDajimFFXP#RiQ9Uck%-Xa=YbJ)3YD1G z;#b|Ob)0%=`O=?`zW)Oz-P{N2c*(g+wLEmh)xrECeR?p*Q> zKx*L~8%3CX8}=Loh(;3#)j9cX6^|H^$^xlOY>rltS}WAl3kVB0$Kh9A6Uc3=b(7f@ zTuHS8AVVO1ZKvV>bg&+FZNn(Ahg~Iu>5`rQ&vAfB;Z~8^1G2Dq`;QL__~{WJhLmua zcY(87hOW=8t0)U@POVDx=I(ra)!YsmCSJ^UKkf=>>h91BCFWIk)OxS0q2cpfQvBU$ z2BB4aaTUqhhN<42a{v}~hDzh?p^*bslBuV50-1rp>((j1oOkB^EuzE3*XT^hrX|lV zDQqRAsm5778&NHc+<)OmLv+*BWTRUxJJG2&(clfwM~I5NK?y&2t5$FR;T8Wki7Mt0 zuie437^W3;(LQt=>P3IS8^xlD=E-p$B*f9<1NTeDcTPfRrw#!3&gcHW3 z>)LPGeVXcC9K30%M{|xxopR&$>!J-Jf<61}LKM3OA|UrXJpG^J%(rI*In$BGJ8(^O{@F<2SUi)DpY!LlQutb}Npzy# zvI1j|QRxGreA}a#z_6wTT8}N7nu>KS#Dr9aXIIIMDrwXh9J2RHxZs;Q&1{^o&t}~T zxYi)k$viO!_y>a41t#YHkJvsmbYG98;TGM!0Gdz6PMm-Zi#q>Z{^p19(&r{FUp5&D zk-61P`3S{IH|0(B`$KD<(hYjiY$rI4jQo7d7kNQ4EZ#a_@siPMTIa|Ovlh%q4D@+& z{s__RB5o8zsya?UlDYSUroIDj5W5KK#SqU}<^e^4J~szdpie%-x0-ejs4|vRPh16? z><64%Yd7Z;C*v2!SgB+|b@*X)s2?5d7ojrLJpF+-)b-#9)hZ|dyF*G&R!6H*lDima zB=O@(q+{q#vKX0d8#CWBSVN7U&x3;!Wn`;gbv1>_BYJ_*w9s||O_ncnlp2*-0aUR9 z@|h@F)PL9GchT4`crnZVsgq|q-c@M?eI+&yF#UPvYq721gqdoWZh(y~dDlF{o__)e zex%^yl>Y0xr7Wp_aD3qMY`h5eEx~ab8Sc>z^Zy8NH1km-=ov{I`C;j&)AA78WCybcDzzMCn9H)E@Zmq*yGG{;JLe8-8^02_u$3806 z(N$lrpN-!cZ&1{iAX8!d5wSDIA<9)ja&c~VA#*IIJA~JZ-+xWqi}UPBDc~bby+Tya z#ppYydX+WcV77T&*gF>w@@LrV9{Drh-X5mA2k^H*zb=ub8Y~8czb2{Z@5&|@=8joJ z)v*qxQ4dli;RiyrI?&YYz>D$54$%Bm`XGOKK@-zl$5ViN5kFbaOt}PdDB^sL(Swl~ zz|+0pK7*y4+N|uQ;8<~Ccmy$X59K$YB6{)|>?IPy4Ep#YR&gqUdb^+(Sb0*u9P4fo zW#CB|5aoNuoG-n#yXbB>A31{7!<1-mCo`@{Ppu`*ln#-8mS}Ztne`y;SJxd=CchOIla6|7w1rfZ}laJ3*jJJKP~Sh5?x<)0^p1?4+0oMLWS zso^ z^QS62G=koB;Ih9qzINRdB$l0<8)()#j)fz{Q?W3f2 z>o^;4ge$)n);lqae2yHIFfMja+_*&9r`=00iCqKj0$f5w+$w>z-vWGA33V%>DGXHB zL)DK{q;Z1&Y9Kq@?tPFrjGw%Hv-G0F$Y|3Ta#!+N4^}dk+tHXzd9tbpI5Xw4Y}x<4qSBY(_75X&rYkv5aO3)z1{Ym7B-nww+n~x z(mlIP49pjnI?KWO;{o}=oD_9)Cyja{tG8BQv!{=C9Hn;GgK?^m8&%=g6b}|kG$T2G zFLAhC*R9tSM0zBBOqTdH6`HwU%Df@L!O1>15y@m9>{Yc;EVU&49!YeS?}SpLt>y_) zw5T1E@T3IpEfxINt`c$0R2wd`C;pt>1^8Y_j_Zw0zirHSwIFi^$Ym2ZC@#GlV*Y31 zrnSiQaA_l_tKE5r$7E|^{ zMr80M%wud8b$v{rRV^688; z;iRs^lyWkT-=SUxw^na=8$07#U_Q}>B}qQZA*|=_-gV>ON`FEO#M`$|J!K^k{H%JE zzfyyx1>UjO#Wx+8_;Qz!#k3Y`S0Fc!FQ{FU<>S5To?whpSIg?Ul)Q;T;Yps0rOQ(p zbR#rLM5F_f%%2$7R%*tKC9Sozr*Qxhw-%%cqV^xAKmUro zA=aR&d(xn_kjKt*TWb~ik&?9X$fgE^ObNV?c-E=ixcBiM5JsPHb#5)^Ll$yS-T?v* z?b&~A2v4pc(Xch>R>r}XieI?dg|_&@`|Dqv>PGUwlZkQ0b?&5+LiEOfH}|rsH~{t?^I7N-pIIkeY1!&%RiEC@m!Oc@NYVm z;%AJ6R%ush-ueIrzd}y?r*evxvPW)_J?y!6&4Z)lhW>S$Ol*-U9~JW<3IMr=tti%$ z5WOIT++^?iV1vZ)J2$3(awV$8zRZZLjR{ugZTixMy+rUD5{M~^NdPM?Bk>CA){#6G z%{ZGyB}JBDMiY`mt8F{CHP?yMH7!s**M^XQ_pdHTLaA=<_l?dOZer`#60&<`MlFV4 zrCA^qsfqSps8`3=3!8k1Z6z6-Mw2U>+&fRN9q~DM{*!J*)Ca(P!$G+J;G$ zB>gWGk~LG&TiOqmX8_Q$STRX`HMvDQ7K$Il<--X6tW_%EuGmGXRbI5ZUBrUdDxp^i z?(5&qnVP!>=xtuFO?0uhcCm3AM4l9KML8El#EwD|5>?TG{t0WM-!rQwVS6)T{$g$}YjR(;N#@#t*k zfhdUpPB(7*2*pD&R!bK!`i6Cwrzbw^@8%`RbacF(WI+n3qttkBl5%QpvHZ*Ghanb` zrlw0hoGzyj3M~nQnb9ZAvGD-ToMwdx$qA5zZF6b`Ie8#E!+i~a1eMrPZyFg}#p}S! zH2PpWW#7fg^tKu#)MlKJ`-cc``#Xgd%zf)TG4D=8JOh}HQK~^WUv@X3X+XHZ9UCJm zf&mKTPfB9AKCtDj<0-OU*d6Id^Zu7#-SqZJ%4PMjBtjl{nh27<-Pc@>Yeu=rsg5Z% zcr&rB{u*(b!TQZM!x9!$Q4`3o0 zOA>_!m{+G*Yo_*y=j`R6^TUh{{AU1NOc5*L!Oi5v@sT)d-1~}Cm!E0PKwn4ITkmEQ z>Hp3-&XH={&-e^oQaOgrOKEM5z{dg#*Srm|g^6Ds+BTy>2a8&NXpWvUph70@`W)Uy zi~Xv)4-N)PN$o@l#l&|DW)mmB=&F-lIubtDc)rv1Th7SVmj^nDI+8VPm5O&v#j{1a zZu78f8QNwKYdodRyyB~3T|5(2f3g+BS=)&z?pNhRUsmRNDNRN<(r=qkw#1>45p1xQ zuSDX--A3>+p;Jki{R}fPaxc2NJ3WK*b#44oUe$Q?s4CB&0EOU|4yw=LmRdOBHIr~A z-xm;k4sG{3CrMv?OrzjaYgu(JDK>w?`{m&;z!H4h^?)}p#L?A{!t=_pduDtGJo7;K7Ngv$b?qB;m;h1f%}%cJ{|JNeC>zfK zB0Z>`V9gBmJ~IUQ``+b7*S=RnK&M6%Zdzr=I@a2ea7CfWyvLdj=%?jdo|ojxU(5&rr0vt6-!vU=-cSMq8<(C>v7JRnysvh;1mFT zBw^cW)(w{mCV@^+#O~>_!>+&|*`w!O8_d}SGjlg^?+Ww`rUyG|ZyGNiHT8qW)|J4{ zdwqX)AM%FVys4VNFucV{j|Xp97_H4wMsr>_Q}x?0r$SnBeYYQwqSX6YSe{=Y92Y)A9O8Qx8?MQ`YzCORc zm2WJ<-@>0;AtM^P))W3gtr^1(a#m`h_rIg=%Sd$pvjA~7kd?cBUCntEZyP*p0i$n6D zB%M0^v~(NM-il%K%AkC_!}~DNr&1B*5IErobbhTX8vb7PSYpfZNkJ>P*;hzHA%M$MncpE=GkhQgXgqR1nrG1Q+9kCP6GhkB` zOIS>1<+Qx9-SpN#j_ErUZ22`%MS1>|L${+t1_4IOGCxF*z{c*G0R8%ZXAJ+e+!+}I#C|Y_-va9Alv0b=>1D%D=8xMg3c~a zSrix{slC_Nj<=LV1uux9%qBM7DDIv&2rko@+PtNi{q>|^l~ReekoxU3Y5C2B8n0|d zrAY19uUNv@@e`h5#+3gXE!Tpmp4g%ZzLgZ*CLE!Z*XjKSsBL~4!_J){B#OdwHCgd7 zZnw{bXR5y%2h@=k5+|KLR{4e>h|%0 zcY_7@S?-==^6@SpO=y*D_~wrMIkXbktp-VZW#c z`i4}&aym?UT`7C!z4#9EJ32T zbjDLV?aP8}FstW$MA_wAvg~lz7p)|v4l{pCJ<$-XX0lgGL8(}~U40khpmspEZzw0? z;NiSGpzkYI=u7HHDbmp*h?I9ujzeE=jCu<*s5Xr*6;BzRln-|v+!sr){*7xl?~4{s zl$Q|kr-SRp$#uN~%h(c{XE(l5_NS_XHQl}aPU`}9giOZbt+w}KGvkL$5x0xS>cuCQ zsBh$&ong-*l8I(J+U3i(E?G-S(j_$Na66$6Mp)#zV-eOUH7raQrwq#EN&UIp_JzXa zewoTCqqxQ_M0)kDMQ3Kk;sWMR2WSE< zEH!<%tvb*;aj4U7bUkrZt$KN~-O)s|m`rC^Nl49FR{lAJyWV-Gd~2aUQG~i7fRoS< zzA1f6L?7&46z_pw9<;Vpv0^!J&u*IHYreG5L@?}{qdb>xlt7j-K2eHy zJX_2X8B&G{Y&`Sfl59gtw6<))#Af`Y2i~Z_)pDC7A(regiD5S*Bb_}5{TN2~q_`s# z%(T7dQ5VE80ww2$EA64EPDsD#eW;Y7iF1_*^osWG?EwU4jjZNNf^<@(1ooF86vnfenOW9x*6OC@=n@~7ivgnt}f?&Bps zuL=1~J#F%XXZk6?tpdl1BWL5)U~5W3etF7jI9+B_ZUtqv-6Qj!XnvkOhs;Fb98nlO zomq^?blHO3{o-5;>s}M#`vPNH;@{9r$$LpFwcIRFCuxX=l?h`A+47y4M3_WZ$sQ{2 z*pGv=w%C>f=LydVM{Zt0mR!WzlJ5$lrQELPl5kXM`_$%&bP?5khfE_BWVUc*KLA0(#dr5bIxlk7dX{l1@rp^cQ|3aD3}Z@T)K z*0M$-9iHCH&FU>@0Cy&crNdVE8W+raEfFPt7b0{#?<2G$ZCHIngVd+ZNViLb7BFBP zyYQ2>_LAc$!llE>6B%=#M2VM$K@vRlhE~sJ1qSbfr%{G4Lu_tZGfUd9FEVU@9$1MZ zxG8JAGem4M)DAEQ0hwpfTg$Fh#AKsE&?s_o>y`E%-!6FwL1n>#d_dJaOQ5yy;!}2Kv5lB$%5+-w0 zwdqL4y$o(V9v|u8VM$P|UvX9?j<~y#evznlqMlRXU$$q?pg{upQWj8Nx+0XDte%ue8K%t>cdfVC5M`k>4RPI&~h0zMXl?r2Ghix0JramupwkcH- zQZMm+hx93Uj_I^IRABOx77vxMk!}b%<=AXTsHEWc7Lz-7>Y77bTc8-d9{k!N*C3X>YqCy|NHNapg9eNNS-avD~GY03K;?);+t&^ zdzhvjmtk=8s*0oZ}+E3NJ zieHXv(ck?LY!fc*(NP|qg-9d*A|cyh0P=>FuDq0nd?RU5uyGUY+kYF?;9Et=zw)ek z@+|_rNO_MFRJ~Aou!Mz;b+Epy^9QT=-?*xC8&(DRHld^=E999I!c?2Rm&ewOik^fX zQ)gAshZP0zG}<}5?w{_mS2`ts%qM2H-xA%w;HKtop&o))D0LL?uKwWcgB7Hc_q!*}v3xwLcAlz)W42kxU{=+ElGW`k^87t_ zg!dx`@NBnrW^VYbAjV?o@^_v>b{Ff)7i&%b6Z>KV<|@_w-o_5}=u1)U<*2q*&{sJd zqo&=2R?eMF7Ruug}F^A%W-ix6a8d};1qma6a{ zuzsf(0nzl%tJFY|NyPgqzX5KX zih{-PpE=8*$s6?enhOf@RhrYsW^g}= z<2@RJ4IS-)Es6d*cPG#**!+bCX$mH=XB5_|$|ubePqJ?mnfhqGp>G*KIsUzm*|_^^ zGPGr%30yeMyQyPaTkI{5h2H6Whnfg)A+r zWBV4E?1X|f{A*J+L+}6MtX?spiM{frKk9q56*=%@iGh>mu5qZ%XF%wu-QN7kBpub0 z#|qv@QqD4F%zq@R04(g3gaIJZB`5NUL8(Lv(pvD_LMsKiYwIARmu&@3yYMyGV0df_ z^nH0w+HlbP2@i(%gsmiJiS@^;is_nW)Ox2eUFwpJaUq0^h%9(aIE>N>@ zK6+DmMgSFrz2&f7do&gd3R63B^mX2gsEBk3#WVoH%-?rFMA8N>^PhIE{I(Azt~KAw=+0=YQ$~ z86iVVFxXO$LME0Ls+Syz(-usB>A^Jv{mvg3^WcM8O@_Vl5m5z#*5wuFPO)Zn?xb3^ zjF)S%04&vJ=+to9aR(4PD}uHV%hT+*)L06NYQ0o>0n6vHjuR=NpvR^6-5XG z><8b6zs>+_8515Fv0g49iLZd4UM561L$&p)&J1@ zr0_EojS?|=62-YDA4YD*lpQU02(1xX+mLhzD>H;!V7$dQsd*N9&$6hme?`&E!AcKn z6b<0x&C<@$y+*1P&HT~lk_y%d>2>#D4S&Rm(PV*PV^4Hql^*@P2;QT5*A;2ScI4mx z&+L)IgAg`bpl9j4Ct;rb{*8Ty+9rg*H{xZV$RM&rjX6Q;+JG02_w9^$-`T3R7PsG! zzl~uUot}DoVm+potL@FVbmL_MSC6Up^mv)LG~pZNS`~R&)@Y@k+@wF=du|T5ekht_>c|A) zb-V{kZXzX%2u%LF5HZ5fm)wBoD2}e@RcrjF$E-K0dff=3DV!48q%Z3vDeOB*A@^m;@2_Yrpe}lB=MYP9raxRlb`tsgJ~Z>7C`6tuIbfFQ{8f z{Ffr~@w0o0AN~>l0&zgpW<vF7v)wL=)`=o(z$32x!*eCl=B& zvheDM5uEI46fN&1WTnPRt>@`-`|5KG)CgL+RR7BwVJpZ#tR5hDmd{FFm(uc}rM}jZ z6J5GoSsVKAq2W0HYQAT+juT_%D^MV)Sd>4y#y8_#Y?{`9*ds6VDxUGnKV=0et2@nO zzB~fO1U_?r4$Fp=4UyaH$!_3+ubhBr{RA4cB6DD!IKJr@MtpQ)C-lUZ8NQ#5ZP-us z+xlhKot92mw&|HP3+t?W(0)|m5H$5haKijG*epm)dW+=&=dpqv z^>$e_(3@A`vEuyot%5Y|0?73VDCvywrVy}OiJVMKCx`aI=k(W3`pd2`5cdms=7ItB?{-}5r{KV?c;}myUo^R z#no#mP>ikbOF07rpT(BY`Sc!rg!XcofP~6;EFlJ*;kvKLvn-0|t9{9oK1AeEzU(U` zFGJNB_?)$o=VD!H?&y1Tp>lboIWghOixe3BO30b6-}+fQ^DzBbLT2~SR4q2tJs#s0 z5c@0(pwDDm5wy#WBfuON;@G+rvq52$km(dl+jpM9-td`_$3{%iRU{1YxL%WD^YC|{ z<2~RJbc&Yp>PagV%C-Hk~!Kx$%Hk$9o-iYDMm= z%C}B3n0n6Td#ijnNjkBXFh2AwuUS?qB57j8t(Q7JQxMNjpf_}(B_vJ13W-8&7H?{M zv$h$ypS`btvl%IsNIsd3DMYg}6lnHXOAfbRn>Rm^8ufAsdsABuC^I8Cz98Z}jiH(e zb}J6C9Sn-j7VuT>1QXf?TJM_%pT6t^y*U_jf`dU%h#@Sj6rs8NMQR%((EjQXm12_s z`as4ApMPS(evd3=`YaZpV96CS5{{Z(_Lg@Os@TcVhbk@pr9Tn@B zMfw1omxm>czVA@?5&8TS+um?~AKq9|r3h}-T3eQ6wR)hj5kFHB?%B}|HJcEO`EA@y z<63vcN=rIrh2ocUW;{X*Qg$<9CmZP0u#Mr#hw*?%N$~T z*(L6>-qggHC}*qmc756{r$+BcDn=W^OcBR=SJ&I?F>`DDIR2i&WmDuB_A#BKRIovA zz7XlT3p2XEk&&P|ys6=~;A%t;HhBEML3pq%_!!YSqrNo5#f%5$ov<XVev5vNii}DGlnFt zxqVO`{=t8M5vKWM9~!9x4XE6#B3nt9@;CSChEc~ukwd8?779Eb;i%wpPcL8YfdL8o zC@Nc}A)%UpH0O4x#+xBaju&0zH+`d{q6GEj@&kdQ2^y4z@u@<`_$OM-R}m@YqkdYC z?CbR!;&0rjE?-i2BIt`?2iH~9y{v3CR#^2cVf=l?=K16>!Cp73lSjYwZ&7O~*E-4- z|GuO8G0=_BrQNW&7EG}!7P%sO74#HPC1L2v_k#dT4xnRvB|UU%cQm>gsEmKU`RUwx z6fy1W)1UWc0(0kciylAYCcZ<*W5U*ZV~N(RAe9Q$mQC?|T`Dp-@Bc}~lGgg9Hv8gSwXKL5pRH&`3QA!XJJNBNjXVIcIu~)5Xt)gfts_S|4{tfqa z-RF1CcYM<8KGn~{C}czq>Xyc->L)1=aC}HTcN;QUz7H(f^FkE6KPoRxnX>=|=BS7o=@%wkl!&s>p2c`r$|7}JmDLdY-6rl;r+F5CC{ zOT)Y4`8aQC0RuL}{NL1vZtHB#>zUPDjkjM$dl^G`Jfik{!5aWE(SrbKV)FE9f4kXc^J zG;zBWUG1)jHxl}8EK?|(IR>|GP0<4bouQ*n1HqiJDsos?$U(1dDc=)iX_290ZP;PN zO0~Ves`sz9yQe(p@I5fgGOh$45~dz!(3ayFZZJ_mJ`x#^i)2r;Mprzyf7iX~(iVH= z^49HUD#Q3o0mWgp*Po%}`?iQ3uI~+!`-@wODFkswR-URMhlg$<8%o(0l z%D#|N^z#$q?zD3&w=X8P-pOCoovsd~?;(61AT?j@zEqlj+sQIRY&1kvWrk)Wm#7i$ z^h);2F=%HXnG-_q+&n)bBDk&H?{<$d5*=c8h2brbaw@Yqwx8KoS%M)%^YWH)Dw^-aruSOfhK;YLSV z+Rt4pp^OGb`iV1RqzxMd3i8L-8V!p|cJbfDyOFw(JD*g(e)_&xH~nx%gUf{JOE3e2 zF~yl}rMY_7=LL*#0j|9sd&hNNVLAEr|GQZZR$>1;HM)rg&)4NhRtOMN=+52?sbzMw28QW8Ca&&@Q8 z5^lytB2f(W0F4;h7oC917yCfYPCn_Z54^SY;+%U&_2c>Le5RJZZE;nXb;Q6oWL@wp3!X*>DPw-06T^;l~OnP6aduG zG%RjCCHVREeM!P>Gq{Vqsc9V6*{Oa7QOj@QCr8UOo%Nd5zEXape55Ih=! z@!z!9Wt$Uf8mgP03@T86e74wh92qB_m-lCTpn+NTZa*Y&i+!PEsXzaH?pV}e9qpQu zviF!=&LkG6==wCHcmR|Y!|Ji|M4&U^__o-9)OE0-R~&DgSc8%j=8f9Lg%ln!rwjfF z<54QkmMaOGfjX+6+TYHfcx<(31eLn7o*5%VcI_WJFV>IqWgcoRVQC_hep_EzERX3N zy-f)iGmf-!s`dctF^#(A$Bqx!b=&tG#aeo3cg>G%#$5tK&=E=Ift?-)E|i?KKCImW z?&H&zO(YHO)&jd$3AxYQ4$G6oQW6w@S(IzG`3GcslegE9pe`d<8<-yP?yguR3MQ!t zA2J;l0-rihFl%q&)unJPU=EoqnY5aTs}1~#;f(q&dppfk?C-HrEun)oJ--AMS7xsM zmmXVqcFtkW&S#<7!*acyAX*)d^;P9sFo-R}JH|~r)6j?5WxqWXme`n$f!-nn9iyw@;)O7voJWl95J*2LWVYjIR2;mm$OYd# zO9FJTy~_^Cz3kq)-M3ljuOIbst?OsvA;gqg++I1K*upB-_`#3o$hbQJ@+UEgx$!67 z)e;uwmp|i^@YT+G#At&#{W7Mqk1sBADtiXv6cEGz5y;nKUHR=z{#*Sq0n_X&HYOVo z0op&xFMO={G)hJU zSmsn8UfU!QOI-1cnI=7JG43>SPd1&uS(v*snd_?EnU*x7?$6=6Lm?+^epS%2L3)t2 zvvNokVjp#d8B%HkBucI;Ue|pdcpO-Dr%LjG)&eg@_0sOo%3#U@?W0SbtZIcs@|;nY zAqI(wa#={J)wdo;@0`1SrF=NB{JzulzP7SQ?0Q13mGgsDz_lv&gKI(n4VW*e$Yn>@ zPR)~PQb;dabOMa)U)13x|6s9Wv+yDFCEz0zo7AJHzf+yeYEH|LLjkclnT zSP-=F&|PDwdOYw#B#E})oUf_ozxf}N){~c5K+d9FX}$>=7TU@`h=-T1KBTPlcpH74 zIQ|SurV2c@*ZxBA$aVzgH9P*KtnL$_hvdyXh(qqcjR)jX5I9C6m~I=xoE+3f{fn|H zBKlHpTy2>NC7?grjR;5O8<61hLkjAYg-eHhuB;-Ga2yCDl7@*Oa!*rzn9qnGlVX={ znMPNXWw2eV;PvRlc=j;C#exxMZ1zf&} zD@C5!syD)s)#aFwY&DBfOXm-^Z=*KsZwigxb?WiZcX=1Xo%`7*pwTT_U=yahd!|RK z-gS9Xq-TlcT(9swpV^d?SL}!4<_2Mm^fA6>Az;dTKG9I7$Q2>kG+*gb*LRUQFU9J_BA8)A@86NhPOrj63BKF%qqX>pU=HK4nCC0= zp~JMm@``r1A9ea9icC0uyrb?$)HBTjHCew;VubrRAozv&n~&=3_oS(Bpi$3uXXIu9 zWyhkn7W~v4;2~|(Q*A=;zIC5jUa*|3ByjS{SPpp#=TWAi3;9Ml*5*}u4(FmDt~@G= zf&=~bTFRNq&v~&?@7W~%MnvOeRcO{E-${7mR-8z4<3w55!vh=APgeKyKXz9=c~>k= z;cES9X=ZEh9rLToXF9}-KmC|6BfkS2#A56>NFf4|y`Z$(f zjmG=dSsz$$G9YDaQL>NeU!_vhMy^7`_jHjV z`#)|fmkv;2Kn7hnrq~6AZ*TZ@uISJ;ra)F(7hS&k)A@=rNhKbA-?o!!Y9B;v^ujmz z0)fi4yvwYDq)@*HIISe#=>8_ZGlGewOH4$Wg({OT(0vrP9UxLMJBTGMiw)ZR5U68g zWA0@2nm^Vid&e%>Z5SGBOTmwA&Y8?PUr~2faxp(DN-(#ng{E@gZ-v8yE#ITEJl z3V*zBxnJcKc(i=!ZcVwv$yX+xQ>WY`x03%Ag8q{FyGKmO6`9x#L253Qe? zBuogIY@niqlvV7h)>$_o85P(B5ZQv%fsfU)Mv{{@rVB0SV>n18foLjJGF7XlXyaQ` z!F2Eoawl)e5h8;SZ`$BKwG}VJfFfle3n6wqxV2mAB+^oDnq5~n3U0M=BEx5;f~e_w z#l9vz4vev5<6I8BGfU;enM%#U<7iabc9mHJl~&E;0=}m3;31Bi(_z8*XKkWrc?w(@ zkuOAZ#W%@JgZtX_7N*dQD`>rOXWJLN&6-tSzWHj;LbX~3C3i{f;jXUnc7@yw20iav zjUMJL>Vl|W7~5xw5lq%@Y(yn&S;mRJbxwN~@VvI?T(cRZzmRacQ=B4Acwg}^@Fic& z72|*o`2BF7`u=KimQ<0&0g+nA2Ty$Ygp^fHv9^8rKE}<0Vr@#`=uwqVq5@7?sh&E1 zwex|LZdtle`+`uyaNZSS5%EZI6{lE8hDA;&h0dO_`b}fHEK`#LsG|}YG`{r$gn<4ccyxIG^PCk-hCh-2L zqkH3~wv#BsZsufDl8l^t6}GBSFh0IGo2@r|@Y!jxs9?uK1`y+@fVP!f?H7fn+WanS z-~0e|X+${hXu=C%XT1sn79br69M~Sf^|{C?L;r%bJ$5Q{=?z%7UdJEX7+%`V8lsD8 z3Sn;`_>f?bkydc^cu@WeTG2`(aS5kvs5R;L1UiMKabz9_v)iS0_awu;L0 z=RRM_{=cBC9LSsB4Jl$B1f~pvMOg!ZT>8tJ8rr+J^%M;{M64W%DwKGpn4!19OWE0> zaUuj{k5-;>4XeQjzFV6|Y zPzl+hjdVVxWTyL6%HVC>lxOT4s^5j+#;KJVuY<25Ent_>CD-Z)t+m@2If924scX23 zm*h;`(I`(Wq|l;(N|=OjlXNTs&?+Ft$_R9YDzm7 z!^)!1b#+XR$oYY-@hBUMZTpOo5xaR)XlJmBp7*P7%2wV0Mv2c6WSN#&b{pQ0z-+aw z7Ulji1_c$5s;o4~&WGLi_X{{-iroVStAXUH#Ux&06vPFV`*^=v0NU*}4z!6Nz%r36 zA1T&}^GXu3orp-d!)F9dBBQV92()k@qDOdjiEFEm6S-wkR!nNaR2slVWByUh|4?4V zyc}?Lh)Qh6sHOH%OG19;rG`%6G~~0NibB+fRLlWEhN<~Ojv6?Yg7@riDvu zpQI;3U2uV4&%GDk;JD4+EG_3(Q1Q)@(tw?j_Xh5BjYeY|pHn%!X7(zRFxjq0F~32% zi^kd}d#!ch#Pkk`P}Von5Q&YgvW*(Hn&;5Yw0y#(tokElXKwBBno_+V8>Le0PP4s{ zlF)KGkmPaqNLrd^kEe>bH1HGH*g zl$|Bxnnzp*-kH_CgEQ-sz?XdOTK)$aD!lC zNt)KlcgI%cX?ucutOA(IG-~WKGN!$*K1*d%*DKPu~eLlr|fwAY;@h1 zNXk2GdaW$B@iU4mK6d=b=JN(qcDJ13=e%2*fKUeA@M;4Nh`w}$~pG9fc|0}Xi8!TyYXLJkFGT0PWkSJ;JL7{2Sa zF1;d(-id1ybc(T8P-KQO_{~wnD-3H6s@2W*B&yrqb+V|FUgY*Pj^D%$J(^9%dtOHW%1iD&NAkz*dXI?*mM}Dw=N7+vRbB_8qNM$MySht{i+*| zevH~EU;1%3@0NORwR<~axOw{2EZ6Xih*D`uoS%g9!9J@%^MFM!(!*sTHPhU|;EhAq z5grxj^1z)fNcS&WHmoP8Vg0(UnQ4NYsP5GCZ?d72=vd?mz-Hz|ta!zCvDhKdlQ=}}d`tKU=#FiWQC&_?P>Fpai~6A*bS%$EFC+Zc z+kBmuR|3L`>Dri?+R>Ca_!3@!7E08HN?WE|U*G5D8i};D_`qguj4gb|>`?J0(E=Fv zB`OkDlscgvLHg)J<%FLjDPOB-xNPv-y^Ur@w((BcC4<6vWkyg z_hdGz^5Bbm2EM}bK!bGxwzG7@Nn^g&5QNmXPJDe&HI9WeeKsl!{tJ>z2pVibex-98 zlKt`n?$>A2Rx_Zb=o^mFAyb&M&DB{3 zl^UGRVN=|-a9nWHc^>0rVd$M5fYs7KtC`E#tgiZ9-f0BBu6j~pq4UTMgh5hFy)_NG zuit^A7u&G49g|exFGJd;xDW?(z1zlyFxYE4>g-aM0VLmvXgIHJ6g(C($+dimSDJpV z@OdrW>WLe*AU@?D+H+sK>7yt3U%dVCM88Yw!Xk5=XdwDhEoYyh^2cA0kSJ6j~J6$tn9{61-Ka^ z4Dy}wF4PIWif~PQU2!mgNWw8#@a6+ACd<}7#>`uvVGS<`Dvxm|rdQ7(Mo)(A-)UG~ zz{ZZK6k{Ak!-x&!t@-@|u3($BF1{C^0EaPteSSIj>8~oL@$6^krNyX5Z6yqfPjZvG zuoYj9?sCZ1?Y95p4Ce6xKNv~>BQVZ1ad!()Ug9x{s05L7iC1fp zbG%a)LnN~Elh1RSDMldC!Q`j`v1Fs+^yE0RN=~wD!PcdZK?(%BOO2#Z)e#!;@RHQ; zmeHpr{S1c*Cr!&p3S;^8fLsflo|y=3w3S#HzL!uuG7TjrO{k&BR_DqTpkB?7907#Q2=O@&L{h1K8@esesa6q{6`S{Nb{8t3Rw6WYP&H9FZiYXlU^HK6Dg2S>IX!slK3dnI#w4$qs?!C28DL z%Zh{k>~wOC`QB+Wp$D5Kd-4vV{K5&&TPpe$>me{sXA~R z4YUa}aZ2Q^6(jgmB;E$=enrcU;>Ybj}i_phm>4MqO<+;JTQ2ve)sPnepJ zs_}jU)<1QXMqjNvk&2wNPso~uaz39iojojGfmxzi4MY@g>b-j>A}Hp{z~!269!kFr z^8?67`gE90XS2C(WSubT@MN_HaQD>W8ry0%2sYlYc4$2F){AyF*QAYHi7H4}glr<3 zcHF$*YGnWmb|AC*x{!LlwsU0rc&N4f3lc9M_Q2394+UY&%%ahhp{Mf?X7I|^)mEke zUC$T|i%jJIRVSvZa*cy?j@OZO90{5C!tUE5KN*Nx3JcY5XoWD1I$Rd{9(_2k^s#Tw ze~{NOd_!746gs$@)>Bp-zW?{bRI!x)e8RmgS5+T&Sx8%^;AWD$ibvy7^1RQa%$YS4XR7x>R9AX z@U8JpWRN^wEny>+oZQ4hIfcw0JmosRV1g@{84m@Fa&-4*B&Kr4uVQV*uJpRBRHzGA zlDYW_ERWU2NY}@08%XeW_MbG^A#(whANBqfTOhXl_F|t=+(=F(vtuw$4Ab9MK8D)= zq0n3c`Q>JY_|TmrI#K7`oue4N_UNH)*MWY3S>id6O)yKZV+^8}MKaMGq8!pg!0CY< zhf@zqV=BTtefdGCxya`o6!cS>>A~u0ZYXXB%4G%!Kbb)MYK1qk=%M1^nVAwam@R`= z*%S}^yy;r2x9nl7-nP~AE4CK~Sb-R2rKO^qRXmz18^rR0ZQ9&kbtQEX6&uN$b^+?| z!B%&eGxXgEB0b6ndK0$IjGxmOr2^9NGSnZISOT%}A8%vGE`(09qDH0iS#7 zQ<&Wes1_NV*DKpMv4^Q;ew1~+uIZCz^Vf9}oz~fKf-QJFqJeoZ>l_82g2pK zg>`!AkJX@t8iMrw#9_tjE^@dwI{z5wP#=pUa znb3C(n{Rg`V>hZ3ze$tks{I(5rho5eqhISdR=&Jyr^sNZ@lLpkH%~TZgm$N+`bIC; zGdtVyuoBmfAAa9$gp2uPlP5TT!$P*&`eR?c_BzEIq^3OR$7-HxlKHgyte&qI!k5=_ z7QVB($Zhve>8=)-PsTvLMZ$*Tia>aQSlW;^A$&$x2#OA?4!l2T12`L zOhS69!2ZV^nTMY%e>?PzxDb6Wbu*tu8(KwL`nyc$>#-eHA!R|?=2AOoq0AYO{PrxF zPbd|A#fTd{va`Gk%hg*_NSSy!wga$P)hP62t5&Oe_~GB|i{rg2WqvdRM;^e1VxQY9 zPggBq#Y}w9aH=MA^02V^5FK;GL?(*wp4~%2Qs`<>=DW~2xRs%!LGBPvTDcefLO}4j z?~JONh0A@ZB6FEI<<-OF@ZoEhu;Un`An{rVEj`554#P(|4M7R9CRxq z?|sHU_0hTMKNa$CEVRG=#u zU;IG@r*mf|ESfSgGDfamI;Hfs`G!t;hPRAkgSv9*(Paggo$fauIzZHBaAltVR&X5| zH50T!zK)WsUjVS*+d9EPTe4zpd~;18bE*|IoqaK0p+w0v=^0e+j8!JzH`AG+k{z9g zUpI=&=|$+D?}2;$RrI5K1&O+aFun1D-Dzv@j6s@o<0O%{U^52_emUaEbtHgB+O%0&$o%C8MPDTeGQi#!CUCBMLtmm7akUXdp#!=s?P(1 zl+B@mBY#FxE#HnXlz-*0M6bLMRD-}&R-YM;P~4kn;PH0Ry-(Qg)eZ$*R%}GB_@)$A z)6h@YggvT)^|)s++aBe2=yyxRQV=ONe$WsI!t{J?O>2sTJ;x2lX+CRGO8lX^nVXf(>ToXt}m<{Vd~_3OjVYu)^JUsZ2vTkkTOPUFpD@d9q#z?raW zxv^kN{iNJjD~}w=7O`R-bK2MdW$)&Nmf?{JdAYNUfodxmLjamRwN z*3*Uws5*S32D#hro^Cs)hZNlI!}NOd=Iytza#{&5i{X0-cjCNO#ac&|c8;m{I1xvl zec98RX^CgHwl<=^`RNyAn!bC>_>Ei7_^E&)KHb=Idf6pqy)!W*god_Qrw^^U;(XoAC z8qPF(-|~Hzx1707ZD&rXR5NMSgIqv{{T>&HyT zPWn^v52$P&(ej#Hh#<9fH(0Q`yiH#no!i+9!-r~rBz5+&q)%&7I09*4=b%1PZO%RB zkq=wtCMaQxStGxc5qjz5dvktk(?ZWV43C7M;x&SHyv5HOV8j1d*Ce+7`U0=>`dCz~ zcseR6Z8mEL%mv$PGA%4JY7}d19ortw7;hY$fvqKsR{}KlFq_@(IVz-QFckH2&+>;Y zv7p`i`khbfrYcFJ*F*tnG(%Q^{gv48-Pq!ylZ>X2k`1R8$6m0EzD-!X{dVV&aBvq0 z#mnNR$IU^Sy%Z{JgK0d6n>*|#t zoQQlZ+x^0OPzBNJ`|K0BaEa~R)!IUVMVoZyc&FPOT!}#dr@NNk=N%x*enz=Vz1;0w zX+kqnnHct{NG-y&MM&MG(_>(s=&633Vv*g9Yl(@^YauUGJ4Y=?w?$=-c?k%qv)&5sfGybNZQ6P@91(YUteI_5Vq3=T=06n}Y(ByKKui?>iKZ#P+>F!> zHEy3VN_n1YyaCF^BFfcm^-QwejVsJQ72xJLe&w{MddjBXMsW}4{lOSv z>Cv6iODm^DWyjhmp3+gcx7zN8hVBanuT~X*)_Vo)Cblv?Ba9Z{Ho84;pTz4ai2ZLPuwlN(bMOV?fgQAL6%exU3BhQVjx}g5^AW@S;7!g^V4f~{3^tuM?F*3#S^|PP;mel7iLw!_Sf1w-9G$vU( zUZEickT-Upuq?k#Cr5o^5hD--;nz})QU`UM7$n)mi@y+V|!e)SiE99v3UKiJTAJ$_PxD{&{!grpzdAzwT( zv8@V`O;aFOGc!c|vRONt;QdjJ3mkfJ0mcc`gEVZm3jp7(s>xrq6%Tmhq(lN0YgbI0 zK7W`qGe@=Qq=;7VNF5fb4$GD$A6pqDt?k>d81%&xToKH5nrq=pG8tyn998RRe+1qq zY&+|eE!HI9U8(9Lxsf_L)k$s@oJqr92b++3}q#x;GT0>PO7bENyEUC-y$I zeG@gc#C8edZu(EU6tdR7=KU{h?H}+b3+ffX9f9%*pYbWYsKvHKMKWd|dEf@Ve+tT) zri-VdDY2rM7=q2P?b1*G@z`cFGZEO9h!$v_i&fYgvCT#<`B#8=1M%AWByd98duad= z*!q8jDq~AG{kQ^PIWo{1;4V5Aj)R==eR}Pf?XbP49Cus$Ld)>K`EQEOp?tA}LfK~Q zI@bTbRT*^o29`yPYEU;yWG9VdU$~{e?e+Q0IEil1OaO>goZ3Fbj8zW-49NS9RHE59xp&0PBK^SJ$Gc>~D;Cl$}j znh^%(F=>-XZ#KCHfUFPX?<0R%j6jL+tsnfx5S1zt36%hnz7SEnV3HpIx@q_m$&MfI zK10Y+D_+-!Hq+V1FX9vPvr?8Bze@gF_~xKdopGo}8$=^sZxq9M(4d~=rp_Eudy{uS z(e+NH_4WbBjR(B<#Mj&MQSK5Ka33N`MSI`2RWQ4q;0pnsQIq1spLCuPP`%S4EF~fO z8ElrmiZNpi+FHg^ifE9Gpz{rOX;<9wV&?~iI_yfApK$z6W1E;K5!rw_9&LB2e$0IU z*534g3D%fA#d#Y^N@ar$?U|JWflUTN2lm6b zhcB@u?r~Am*lER^p6DnPUMu*tz5 zSm>H*Il~=AIF5fJu?aP7^Thx~NZTZqlbI(jEFN5vYkpvAt1SwnAN*0qBxcSasS0Fs zW+3Fi0`xBlP5*AdGZOG))Yt1{t)F_%7gFvb=2w9;5_C~Zmgt{jM#elmpl-*NH(cY! z!>$9mQpSmU)8KMuGG4xa=tm@5=A!f z5igyq&2cKu-d}z9C`E0kJ>%!=z!Vo8`6N+i1ZVd{I6bABAIh5Y7ybi7DwE6TTd(M@3RhDt5()5e(iBa4vYhHFdSzi@MA4|;im&|2ppuclA!7DOo2U?ro5fcx*&M>h^De^;;g?u^yRnAOVFrs*`-fr@w~ zveG-?(of>S{G#DG+Fw995~fzz_VJ$3CE+d3PFgaW!FmxwQT%;XT@$`j@N7DQo6a(L zRNx+evGU^jY+tHh&n*~AgI`4c{G%_5 z(u|HsY4umz-_&<4)VF~p2{*}bOd~q zzp%=>a7VG%siq=#0wk3XGj?OK@98r!$NWW4#dA|7d5ZY(Qq`Y-Mzg~#jy_+yAQfW~ zqkL&@c{&e1;*0`|P3aZyTA#>17d4y)h=fWQnfNp-xz#9CJ+n-ut+}%}J9lKAD!*nu z!c+nfX_VlhRQZ`G%LVUh3aZ>em8G*YGdCIKKjXzw7UvGzp<`6?ow8g@R7=@UpxL1cYhk@ zu(z-!BNprSlX_C4t>$SUxIy1?^lpQH5qjiq3=3_@( zLt)|aWoK3fqwGsbu44fft!n$uW#_oFIUmeFf}dpZTR$3;9#YF>#|HJDZFFj<06c68 zxZ~=FdF|vM?-*;GY0oY^oRIXd8DA|k=!>eOWFfc(i!;5V5*)F!K^oa4SOQ1+ z_bnfc@|ijXe$?*^C_9Vq0m2J0DKsQ2jRc~vsP7dbdqtvkm6 zGUF6ogBOg7Ax^iiZVs=1P>4eTgS}R6N@kmf3>~21Byy(#R;6*V>>AGO+%R zW=fkz{Hd8ygfxVS@UiSy198Tj4~S>YU8-$h>D6QAZY7VBK;E8&SqL6Yj10Sa<#pDl`a=wkahGxosCPcd+77ZsO4Zyc6ZI+xf@kzJH(-cK0Qu}VviBk z4G8l3t>UbncE7hq*QHBrR_4OoK%lq#s%p!QsyLhYjjw|Tv0xh~_ zdoZTDmVqm6l=JXB)G^J*0prNkEP36<^=!l4;Kv~mpNmpTcWG(N+EV9wt>H)#t7$Fl z1xuii&adx_&AMN7zv&tKWcP!7WrTA=i;Ya^b#nnuk(OOv`S_qOhXvXoJo;x=aRk#T zM?%iW8G+g_KHJ}3ZGP3+E-tUv^W}ek$nUIYd-u9&eAOPUMV<3i^OD5#_=>Gks*Rh* zh-;Y8w7B1L9ss{DMR2s3F^{%;l^INHWPEeT@lsk;&2UjZrt%zIRo3EBlqW7wSh`A z9&8f^4m0bE%}DAIh(}(hiSJ{HMjG&CsF2(`tiMkHuV?B$a^R%$ph9;J0JnN((6H&| zwJ%K8dtn!1#hI4UDdNebvR7+8V!x3M{T@) z_6y4IH9}799B~bHZv6UG{F@-5#^!3>PDN!xXm;JRZ8d@4tA&Z&)n)B0M((v*K8I7` z(o#dJC!I?GbZfHI);$=QoC(Ft6ZQ@ZLxxv8pOu!v@smqPxFIC#Ya%|QH`v(vC-37@ zmltJ&CkM!g@YbQ^N)cVTZz9AAMss{5aOA&EAXh_NM73nLb&LH{w)J@CPJX4CY&WGi zyJWA60=S@jv%?7Vjyl4AHPw!gCl~(D%El^x68Ly&rw%fYztR0hob1|5PxZ2W#)rDm zK>l41?B=@4Xd!3GkyTZ<9QyD{zX`$GY}a$fhq|cuq=W}awf^Vki<(OkLE#Pbu|UG- zK|pD?4Bo6IUClv7?P)B$?ZT&Zd8mYRT-gWno|BNdLo+(ob7 zfCAS|y;=&W(zNdyxC3$Xuv7_DX@p|H3hZ!W(RaSJxQNCC+$Xx(Q+VIDfvpRF*!%Ny z;B8L$jMv8mcUz4Jj`m&!<_hBbfL96Ndhsr;&fJTTX7bxbsm2RHPewU9w9pED?k*|; zKQ*Ek&mIcj!?#zIG1&E!?DI(Nn|stzcbka653y~R>flk5xF1sUb<(y+T^vTvcZYu}9$`8Or&SWv`7{oT1S_LbKn!~J?2P;)s8ObjT0jn0 z#3_tr0YXv|@Z88EA=MLQ5Oy>pPYP7+smPPCFWynWFHwmKUwzf4TxMMJc8L}%lM&-F z2HZcO>_V&$g|P-^YDE7%PQ9-x~Xh|)wRf&`_i})6&Dbt|$T0+w?Rz+Vo3()uq(4<6P{+5bt) zQ1yX4WM$;Z33^+el9H3?Hqo?4B&r9`*)q0r zj(p{(OB#8paEd`3?&Hp z&2))!B9^!YiqUz$yROX5wW_@Z{=HlHUz0aiAu8KB@lis!-okcP!gA(xHfPwVW5UcA7x&F` zZh-w9_70>dIn?m)U^HCz~ZNbw}|L?Nm;?Vh^DhpOUf3&C&hT0wv7%c5-?Icy(`02+L>PE9-c`PKQW31!;;?vARDSg186NXAg4C-lOiE* z0Jp1+&WHYJWp@;hw7jF2{;pNNdz=98?9xu{*DO)AkYK@Dr#F$npbM&v28JMos=Hps zkD7M!7H{17zgH9p3pQRl!pu8UOrGf2EH?=k^8f{IbxB}L7UZxe?-q;3U83q{N?E2$ zX7jWS?opRK^2r$DCmemLl&I^H4_e!(Q%){-5M$%aag;JQ;*Ha#tSAQN^+mZ8G6A|- zncDIl#n07TPfddH4XG=CRI70fh^xj(BK^Cd zjJok=tmdp>v~FYwRzc-mJH+9IUvzI{xC7QLB3~wRv62GnQY~47iI%LS%W=(_)9c3mf`IsVR5Nu*{$8=NB|MoG{RLjE zP)cZiMPN{@M7>jVrre3Mg?1C~@pt|BUAHCHhg<}nJ)hY)kCe-r?<3GP@{y@mY7?C}TkR>5fuXl= zGmM_uhF0F9?-IgK<6+SDzgT7c)(N>WrOYv3^M`ch^qk^@KN>-m500Gp)Xx=a7m57T zwceDq7@mrO?>u`qN@GBwszC=$0*P`8!iV7T<64wtP@rAsGs#I#g^bt|Tl>M6|E+x% z?-UuX&2EFk_E+@vl9tqB9zSq?f!-?byS;82ASS1;Q0^gKqeN{2e2=@^RGinDg*(;0 zI2Zw0Jp@q2K81|v((=7cW)IOk1rG%*qn@&!MfL20W^12ksz)a_)o;i;&?NGxvB}wu zW3$S;YO0llgC8r+4!#B_g4{3jSbo&syT1phOeHgWdetMZ7X=SgA8#srs9yX_}SiLU>@e>nD@#B$bAc_aUp;a>= zd=TKrJ1Mrdns}|sptQ2y@|CkV_o140b)M)DaWs^$sy~Vclj7SEGxoyF9L*(z!E6vb zu01T*5hp8s$O>4-_YpG~L3W2GRjl+fARp$Kai%+hc1fw}?>bF;tQT5ze4zNE=6{{( z(cGF4o^1HcakAN@C-1X*`9U2vaWqI144`|@dSS(V{=udqkCY39^x6^PdzYwgW+G5q z%e^lJDEvj4VvfAu^|VXbvRFrxfGqIod+_W+z21KdSfP1&6i)X+R9q*Ofk2NyX?6di zSj^a~zo2~vwK$RX=bT=#@xdQ4wP6$Sq|K~`Csc93fe}*rtg~aC6b;6Trr|&z?Ptbx zSJ(A|tyeJ`KWdUKOUG?<5McV1L~FR^VaQdW1@{lZF*>J36MQ*@nUl;@dr-i`K}Dwh zY)Ue-IV^)UM_p(D*vUIcy+9o&2cicl2L)Ta4>I*e|e+ zS#otYNMybd8~gXySLx@BKdwQT=x3`@8Y|i{SF2}Le5aK&z!i2>FnX>}bCgq{f*M`uKCH3zvT$}$Da7{1xbW;2v~*YJhMrucYLtbYZC z|46=_qGytfy5N+Fx%Ke6kj7qteN4gj{^tvcsi%|1~_MVt2KBhl0!0Nd~f@ z!vd`Pas}@X^NQ>X%9$S?d)B!bZ(n8i#78gCJfgE`?(W5@OW~WP^r+^H{%QZdTD4AI zC94EMKF?eyXjV!rs4<>MGl@oGnD*YRV+p+v4?oS%imX_N=ZC!vb$Xj_SKZC7P?BLv z!AHseG4J`1;K3n{Dfm6wmuY($*l23K3ZLq2!f(9?mk57+c#|Qk{J4b9Kyy$)R;f=Om+pBSlN>;Jb^p;()=}ZUr*CYUL^*U4H_PRyEmZb}F`krWta!@cdTR7d z*=3)uiqu*b?rihkJolpq3gvd&D0i+IyDd)A&%=FcHy(N%8PhQje*PlTSZla)P9Skw z$dg>Iid0hMkoi=qOp>)i1(6>ucg9b0~JP{A^p zMl9iRDVvl@ti^yQ)s$D_M6neY=X7HLQxy9LV&l_E=!h8}v^dGZMn72NYLs)}w$%ZSnEDfSw^HHf3Cl0|Z}rvve4osC zfuSpmpQ4!SN8dJcs}$OhxzcG_p78yl7T>)sCSISA53!4JJ#s*#@Yb`qDoE_8Z!J!zE2W^?P}m8<8!KK9qi~xV$4}!;M^jnr&pS zf;xY4yuNDWmH3*c%7#8;l3C|iEsk05;e}rklH8@0tMYz&(fuv_#`yb#(_=1*JI0u7 zthF;@GLsG0&7&RWjGFHX4oaxMNHGqy^?M`0F4f;nU1GXE#T=}ocU4H^@g@GmZmsoz zWL;n0JWbY~z4nn0$wG9hR=ycCsLLCPbvH84M}|6h`@y+yLk&L>7S80V4tSb~J2SJv zr+h8*q(=Brjh!6T+kGOt?(F|H_;rHX%9C=*lxhkiTguJVBs<@q6(x&ivn}s5=1+Z`S=78|;kKC&t#46o^3#y) zAL=LQB(7VrZ6EQNSU&h6Mm$rtgg5aRx6uRTKF2QavL(vE!HWL9omWOX^=9C)Ye@06 zOrN2KaOR8yH!(6*gU_p_s$R{qQ^QVHw(s}_p7`-s$}#RlvIRH z?jpA&&BPO$qVc`}|Ne$gl5;6D%Jq5*2U2VcZ5xi2q`Yg4S0-cpnr#n(E;+gdM+Y#*KWXuP5d=VN&w zy3%RA!|OG9mjZRE_{4GHNUXKb>}~^>NnC-#Ti4|f!(!#cRlQNd87I3CY6?r1l4JV{ z1y8J&YM07YrhLe1ul`1>jVEQfadQyMO}k^c>|cs^YxCYn z)@DlJiaVy3!2Y2A>$~%cEotmLDU+R|T4{nZiuDThg)Sk^3o&?>;e9v3o+LrZ7O@^NIZ4OnaM+iDJgAL@u_aXk)2wx2JZcE(AtqVv}v> zHG7|pIW%9EdHN;UC$aTY=^n2(w??C3W0f!aGb*SQ1S|5rBnHmi&{jAsWZz?Oz`9wR z&v;kA%M}K4j>cIpQ{Oj)j(ZNgu`VgDw9!oM{-#CEyVcto8))`qSwtRBI^mZ|x6O7L znNm{Z9_OQL;E8l&JqkxVU-w+h5RsKU>oj3Jb)P|SfmMgLM`Fr0r`ajGnNxndOy%vS zO*$qP=8o!E#o;%v4rDj}cza_j+uebx$Wk$5_`|fWCt2g;Sugc2;pU`SDXi#u*EWW{ zxJ{-(mNY{?S+?O<3+qos8f8`@RXC*$$9wl}SDu}(w@R6r+1e!$EvBhzAeCtw+iPnn z|7|WkDz)<>#E{+N9VlrCOC$_%|?Bq|6TsJ2i&xV`E$wZ!#wQrWU za6(fj!zi?5Le|uK>fuQ*#=gAUZKhM|K+-i_#kk z9%@wwJXLL$MsN9rX%p^wbg1g5#Z?PVe_Kp*6|Q+^d%hcfWqgN0l;GpTMloOE4oCy1 zXWX&DQ`?ih-%8jT$QIevDjj}uwEXxEjygJV4+r^gBM)mj1YT&(w`k;c?iC$tQIs>6 z73|1d7!I^JPGzBUh==vL@%m1J-~5M?-Ou~adF$Lr?q{m2-c~=QNh4=S@eV&BxR20w zbV4=br}NF58s@|hxJ|Nem$q!EhNyAq{kdPL%hS)UvgOKjY#z@ZLr!AxnPnrMe$i)A z-;K`YMI!o>aSDPm_8W1G@J!t(KbFcfZZ}03F8O_5ViL)=8M4~u$RO?&*k>m(M$ZATG|=fTX75yl&rBNhYicSOmxl$4LO(nr|Zh!6W4y}p;CRW&akV3O1iztz;* zdNkRvs;}9JCt-4xMw!DtvT}Ekg(_Qd&~}U~VPa05i&uCL+mOht_Flom+S%LOa?Vf5 zDugP|b<4VKbxSq0sJbl7KnBMLnIH zl{YQ+t9s{M%d;GN=yFG)_hU4dJ^Ou=;*6Y2Ht-{HC0O%brDvL|rV^bqbFwFdY}kJm zn{YeQJc%_jb_|;DN6|DbOl4!&xpa#6El-`{I9%;u73)&%)^+iY%4$E0B%7x$1M_Q+ z%w);>rs*m+`>g`qO@X&k3FCLxHRk;3O?}NzcZp8%ZTlc58kwm?y`J%&t5laW^mrw? zb5fdQU)|k>1qX{-u7;z|Vw_7dGNmaOyiZqa^K7w5`a1K`w`9<6ENj;q_rrNXzCj<% zAznPr%PeQ~t+j5Rz2d0=i%Bh(Li$bidY8*y)XY|6y;-JbPPa;@s3`@BUK3K)j$oKN ze(Cm;>SA64&h5E8es??XfyR7e^m2Zfx4A$`shlo-|t2#3;7&SR3XTHw2iVu#}G2VG>m6KMq z-y%UPFJqCHTjIr>(*tb{=FOb>Cb%KxuvWx`;L9PByiO5=v39F8;7EiO;2ayo6VyVDKF2vkz0 z30{9TFg0?yb0K1@UHWp2%b>V-)oG2mr{<>>zKzJKe5TPhYE#I$WaL{uRIjijk;SP) zZ>HW!JMpQK3ToSB{Z*8nxxYei?*-S+PSyJ6p|RslX5CHCE~h(8!O6g{LBG)IF+1uk zqsZoSLQ1caP6*G{-|f}@-s_`VcRVU6Ku^={0UUCuG@y%F+bG951GCUYVbw?tn` zGCh@!>}40D9IUn2b}Qj|%}xb>Q}( zk1ISWW+^>%tuKF4oo2Vr$96B3VN-k0No(g{NaDJ=R^RC%_dECaUbPQ=HEQd+uN#Ay z*9;!h^2VECIu(Y!)g4{2??=v?aLlq9wy$&Doz+qhY--|g7mCzPN{)z9Kga%ITro+& z_04C&S(;oRX?S*zOeYfc4@HjMnjsN*Isr(x>M$7lNqMBPrbU%*d84rp5UtSjFX#c-2Zdl zarKi88#!uA+-%>6k3@@`Pn@%Rrf6XL-mWobrCT|4-&?uTOZ=R?-WvXA1I?Zdh}buh zJF-8KbZQD(LTr~$98|AeGijH7RLBz{?qR?7%vDVyD%U)8sK+irrp@6khbV)R-0q@QE#VHyT^#R;EyCnwo#AlhTRvU z<2eO)P*f~)+4sYfdcSHt-!ID;oatq8LQ7$=o`ruS1od zcXElz77bD~L^Ihw`h}QuiY1EcmAT=$@}UpTCbE#Z!h;-6-h$ux_#o3+QtZlOB&E%^ zSeBi#kgEJusY7D-bq1uJbxCoARc*%EW{2eEcZ*cVq7zR%wfe9ebM?S3VY3bo``%p2 zvB9*Gnf%<>R1RyAK1#L`c{{q;e9TlvxBhfI$#YY?oc>^_S>v~bGE4qP$&H-NW6SaqUvU;bEoGq-q@N7-b$8bPQQ`hbc?N@@j z&L$5$kNj>BrBkj=hkShBnJIY6;KI}1(8kWWI^Uvz9_o}!(Vc1(zMfcbz@nGIcA-?Md+cs}ZrQu0ef~x> zTigtJ!W5J;#inz6uZztWEt|AwvADnS+~MMWz2c^LmlWBR+bgEsW4)XoL;n;k7%in{ z{wcWnFn#%TyB1|+N_$B2I#(in6Wqq+nkiL0-y%HfvBxek%gAKOz?EWaF+KL1Js97^w( zYIm4;<|(r>T9G<&Nh-)|qO8NV%r7xWNL)-vPRl*JhjzZuzf>Zx|5`ZZVA-jupEp0- z+h6uEIq1zVGqjVo4P}#_sw^gHjSG=#%H*&`ZE60RNjh*<7pX@V}sVG z>%6E&57T@mq)?xYj*m?mDv0E>$}}5}8(_Tfd|HFs;c4(4ChN3ZZ)MK#W4^oL4>6J| zG<^CPx)ZHKZ^*2598=pKQR%Tuu1g`zWx8y`B7Ui|Ki!)rPVByoU5lBN;Y`4f!}FhV z=A)W4Po(zor#~)j_2#C$?5H5v1`i9f%XBG!O2xvWN8w|_@VxfaDu=*qrc2APxAhtK z2;$EHl zwjadaFwFS zOK~|Np{ZD}v1u3KZFz9jU}_p}Y*b@`pJKeSb7s0oyUS3YFJAro<(iNCB4u*+4qu|# z)wz0-B3jrzSez_=qG)ni?meroH}zZb(Y!;p+79B?QN-;TMrQ^G2Y$TbbX(W(F{Rbs zc_84kj~;CxAu&a`EihG%v?}%|b;}<;#7}mQ$K^4--mc*%lx8e%7h1FYmdU z(Gkt&ePpDNj!lKhL*4YAQd+v?*V;C9+6F;lP4rTOMRt?il!R-zp1NW1>Yf^Lm8X>| zOY8v6KI$slMZ}&Vf-oS!eIQlFb=T{f4#f$A%T^t>fkx9G%P~*^EzMMlDd{4eV z5H~!|nNjlo=%M_R$+mT5G?!KaP45_wF9wg*%f-OMfPbvV8kl2s@ke~!jQ59r)Jy2_2Ianz)<`=};_J&aHinHHpNdbt6Z|;FNWCQ} ze@BFbVYAI~P*796FC@6NlJm|ajg&ZAVlBh|N@>AE9S z*4Z<4^A}DfOX#wo<6{jiCtJeK>}I?&ePgFb0&+O2;3+<2UwQtXJ`aJiocF2IK~~kS zcY-ZL_w7+g;u}GwggWJYT6Dv#Vc&L@a1B)2H_*ky&8cQB4VNfyZ@W6**+;3Ty!*{0 zalV^emrjF>5;G#Vq{up7GR$CcX9#*8Ja;IJQpaC|`$XyfmFd5 zySmQ#aH%d{=~Qm_pKIWJK*4iEPm1=cOZ3E%H_1Z!{ot(`9cU>*^_2wcha|)os>``r?6;5?^NNtG!*qk}qCj zX?N8yEK3ui5K`-%3J;IktIamN)kX8;zRiaDrT$*_yhz)^H3M&tbE=1<-S}fhcnpKu z>}=G1mM?Q8cB71sre!+uTFUV?m%bVFivJq?#2h#oRy==0Q==>|{e+lhZ258WaS_IP zpAD?8+2F9QR^qj0O^aUFpr^E1<@#*79zNQ=PWAGkiNv2SrCqGFWPPeU@64`U9yV;{ z7D$9&YJ9A_w?jGcm@*G*e`C{Rt1RCwo`t6928AOd0&_`?g6&NOzHO`rZt(CBWSM&3 z(%07y@GN<~(RC}URcWrdSQgcp*Oc06x!=etQ943pk>^~RrbWd;@8;n1rQS^8VK!GU z6@;5wwYyTYmhbpAly~>l9%luYz8v)(;&w06qs4ajG}LR2>iabhT;JBuw66J_VXA-k zKow@9`-yhONaX5r4F{PWTf9MyWsd!h^eFPjX56>ClmkuDU)rr283ujf6{JWoTbR*M z=Zn;-;SfyaPA7<3=gpOr|44Yiq<^PWw9#inQq}aJnA7Ty_$EufoP@cH_Ow&Qb7gyI zQt2jAt0f;Zy4l`Iwr_RV2s4gxX?Z8qq_>vp(`Frh%qd4C!SMk#JWpTQcCRcGx!JGb zT*7P5JV(aw=aYFjHu?-AmwKA$4|7YFENJ9teeJA_(j1box-re&Q`s||esDsXe5kP8 z_`6l2nk`3++<+6igy=?O-PwUFJ5RrsW%6T=I>0k}tSMq$|I|p~Ik9BaU@^j_UC`v9 z8|iN%bnC^!wf0VI^Sz66nvtNMk4c){QSn3iF5apdbPGCmem*gc6;f|{c-~i}p-raA z6)sa9mHQXU#9fM{#q8%Z#w7aa`+}Och#Z>>wv|tVl%#3@WK5h47WHmiER0BDLd8oh z_EB(wZ!YCUsBqL~p(R6qUDaH^VXKUSGiTK$K5~0*1=soPt8!|snJ;dh_=9GkTKPP? zKIKelmxudJx0lj)RxHwew}o=p>_4^=rQyD9TWTtgonk@3`IE9T(-zd^d0M?%Q|gY2 zBXL#yEagTTyF?~5YN`y6m`>N{{K%u}7!u(Yr==Y`?#R_lDIZ{y0LSxwW(`aEK;1QkPEr z*Xa9#p%l^2{>BGs1Q+-eR_>&{XnbT*>}6wptYoaeOMEa&_EsVJ-J-63my~uUXOy)1 zZS>lp>28sE{-YK#i#z9CiVfug&1ITzsmItcx?i8<{yNMX{E$}j=gYUo0&pKP(0fJF3K&9yWhnnEw9!o?}YpgQ}ZLk_m8J0FZNwFT#d z&}y@pdPwaT{WTWmV6{rdm#ZUXT<*M$a=Urx{_%w?BkK&B1AJ$uA9r7{P4ieZs$w77ad{#c_=*gluJ?FYv1 zHj``i^|`$0Wp*e{k93GJq1i_8>X2-q^)P1cKjoT3DKXGOd~Li_Oz50m1b=LQyQrCk zn^+aieDLVqE2Fgpi8oh;Dkz1cDi53`M%$K7S*Ec`=$_1}*`>m3$|656(K)|U%FMJu z+yj2=cnfnrpp<79c`^EFvzgD>ilOdBWlSR=nX4*Z^_ap+yJJDxZ7%tcIG4obn=$Q% z9s5F^`-Po3sr-i=8k4ymXVA3kjBvA*7n*h~3h*j3{1~yd4F3F?rt9H7&-{ooo`Et$ zo&?_$${b!+4@v{LQ$t*;eXc0U@-^MI@axfTj$BN;Z}&XYb++5&*2g~kDND@*&c`b> z6256eKGOK8PxpXw8W!a{;wtiTf@Z!^`kymAf|1g8OiYEhq%M5&PWzDj=l+{Fv<^AXf*k$IwO<&3v1Gfd+B*I1%ycen&u zE2_n5**|;ll`&VQ&Ug$dI9r)kTl?M-`ufg$e14+fJMB-b6TaN4_>sJiq8& z7q&>Tgy#ijnOUJKTW7VU-!J!_YC1TgYi#~GC|ow*`|i}Q!H=RW=7hwPEZnigss-c2 zkMqL(z8Mu>Zy>7=@Cb-rNO_W%p@Fsy&qu1zMl z<63Tzi~2p0+!$R$&gxT2{c(q{mNZXMEyzj=X;=l7_bH!8vgpc44%eJ6^Z1fzrvjb9 z-szapxw`Q1W^&E{M&qiGh+LlKvvm=ojE@o!y5Qfo$wrPByt343A!z=*AS2)fac(Ug`I*WMdG%Rk0UtXFh3S z)D+8}Oc(t;$|Pixc^uALdhVBf_DsViSIu70UiZ;k!L2m3t3%sAJB zHdc%)_T`bAd0x&Oo-B5dK4r08F8z3E68&|i0FT9o(u&`n9`U>BCX()GBR4$ew!+ui z{cVI_>`|^WzrtGs&vnh$@d=lon?$g`;h?f8ye8byd-fIFGTE(_OEmc|t#((8qUXS} zX@t{FlTrS#7hLLb3dN&CPtM!(+SNaLCM0OBGoy3HsncN9XriY5kIRo~@_N&Gq6`uQ zqHVd9=Vi*7gPx)Dvzuiv)@-Er3r72uQ@tO!CU}k2sV~RKB}i#kplSK)l#GLdAk#?` zhU!_kgT&;EQKH^F6sM1`y|@Dp$rS3dDFsn3O=QF!wtXik5GZI#+?aT%;P(AS#QLH_ zi45b&4ta;e>bka%%{+U8-?}Js3B5x*{QH8=dZu6ApIjTgVL|V*^EeglxQj@N?4y$g zSytyubRF0XJxm{cD&8-8mCw|WT$2qw?0UqXUN&}|_0=AQ#>H}ryx2XddgA7Hg%TQX zY?m839u>j(PT5eW4fFPi3}rhe|5%`yW+5e-cq`8;D_^9jU&3CqgUvRTEr^YV_3YW# z7t4+IRlp4>ANzQ;v2%C5kA~H+K1zCRJm0_+@5_5stU=F9{chvO;y@$HF{ZD5u?$`uSF}WYB$--rGA_!Dj&Y7Umr97749+OAdi?UOzOLHGjI+|^3pTscD)iD)~0;f zdu8{O<6wzp=QFV-rZQXI@LH`3^DuRJD~+fOxEN8)XT4mQu%w?# zmS}9>>?}enNYz16ui8}lvwSbMYisT{;t zR`jcjGWTG~xI|62O+?j83+>bIq}i?3Q_jk?`)EZmOqd7zEY^C$4;ya=`98g9YA_i+ za@{?+b&-=Tdb6ywE%|IG{MmlO&V>|*sGcjCBed~{S!7#R^pB?w?Va2#Ej?KF@!FmS zD-*&2$%sZ~)5mjVmd-+qJn|WtX%aUL-^IGA1t|y;n^Vry9H(p1J*xa78PK$L)-_=^_Gl`seH_c=$ zCvMS`n^(PuV~J_w-8Ty5#r*CRJHrT;vI!;`1&oQj;I^1huIOxnVzRv7(BT)^A6(Aa zCLY)?#T?0?{mx}8*@u;{E4KGZtcCx$yiUKgVo*^VG2Fo1Z0EIk#v29~Eo!<4_sH@>Wc^c)^Kq4(`TTRnJ#gCbKKFjJsoij1QRpK$Cx=BYKzMqT?neGw# zYVWn8wIU^!H*5TrI#I5enVT=iUFEVd*J1s^(y8OZ?nC8@5-Aru_3vvkX;Z-kKEVmo zw2+W9H?%JZYh9oZFHz>dtK0u%yDOiy#^s*=gF96FuKYqmit*_Qxz^mGMnmPN2g+?4 z0&jQnZ1L4*XFA>Lw*P8&Aur{_WM{PyTlKQ`9e&%N-w&|RP`G9^*CkmAe_Y5IJ8^Kn z<%aUrJpYgB&xRdhT0=Cro@P?96nnH4=+hu--(ERyf#nheel8s56JM*k> zVatPoMLWe$KHFzG>%y;z={n9FCmbuft=%qo(b2p@K4-^kqbaAiO-&xT>F!er)H^jw zto2ySEqdSNbHV{yS%l;+;RnjZRY~uOFUouA?#EwqVuI^@KYpR%dS%96$k9fdpQWfk zTk2edo|nl0+7JMR&Y zlNPX>(v&QC`8bcFZMgapi@fpmD^AgW+GUVUvaO_SIr&|3IKCG9d{xk_fZ9Vt zY`$DBx_y|}(p}a5fVN#%o7)RYr=H`cQw>BwXXRszijDtr_pa>N~Cta22ZtWb8Ge3s)}IVuF16FrT7vdLpHk5e6#@^=Mm3aAB5B~2%I89uF1yEV*k+34Vs znXP?%jlPeXbSY1>_%+$3d?A)judw4CVpW_stMd*E-hOKHsc+972A)TcFDfV%=7#fh z`g9!Yn`W81df$`9WNLw|?|6xor8bwKl3&qVa#0IO6_t#i2ZWY1UxzLX>g*EI_17{W zgm$neg{Hlb50|JckZ@5B(Ed?Oe(MRlg^Hd`p*McrkITs{kgFQ`8)coiIJ-XL6Z560 zyzgm~_Ri3KbVtlQL$;?@rrcA!!(cHjIVC3rf0ft7*yT=rFzD*a_L(`S7df0{%cfTb ze<7X@=g)IN;ZvRK4^x95x_H;YV}$~l*9U~Q{W7AXL>EVz_!8ZNWT&>8^7o8;Ue@jEkmS3?s&^|bkbN=p;OZKeQ+|M^ zo^zba!ChT9?wJ(O+s%;2sMxyS--y}FxmjXIrKfjf)Y-a2u2|9DaJ3_UkCf$pxO+xq z&XzIBYA$#1+(OK3m*9`4Ws`D|ACCr(25cUvzZf>_t#ISYq++JlgG`*>F9cHSBrdDJ>)e_QR6N5L85W(+C9Qb=Wg`7-dWt1ReJJjo#>K@Nw^6m! zS~iA@ipdS<;7^9$f6J`n%u_PX@vu3`y==UgqA#lErp;G>Uo}E_c(P!OEQ6-AHt6IH z>y7&tN+h%z8hj(`d<_74yxEV1jX&MX`)ymgixe-Ta9y#!Y(pg3!qCi#2 zW5Kphg;zS+X26niAOYB6I z-iP6h5C-Q+5qi(DlgfA=UHe5^h7gWqq;D~F@vmiDAS8?-bQU8bB@iSaR>YnyZ;_2Y zApFfLu~WHD$&?4=%3{!Nj1S(ps0zIK;QbTcRHP;F;s4{c8~gnaArAP5>wuv*_y>6L zfWmJ8x9=h%A|S3G{t`Wp>x57>d_KNPhExJ6(D&^`RBuN_ysT8nU!903iizmwNh)Mr zL_|kUP?6;Jad034eCma_*(4bnj;BD~R77O2L`0cKsLU59=!hi|eHSO9jS?ypyiP==d~ z(IS)&au0jRkX082TG&ZMyY|99`zR5mJ`rhwu3=VG==%~8mGJzQGhf6|I|Ra0kb5vf zhF<-oK+|wJ)K8R%G(#wnnJVabjfhlXUT>bl_5^>+8CGD3g94#>kbCr+4DC5UiTvq7 zA0r|qIr=J}WZv>1NNae|zZ0ukM#qeNdf$PnQ^5q$yMiqR6$L2q(oae)#g zK+L{U`@O$^`Te&S|Fi#p{VO^C12HFI0jT<4 zz5W}!{1>MDAKl_`g846AasP$PzeI4JJ+(!KPDfLqi;%NPXNX9QnhL#xe4rd5qAP|} z=s_0bCGg?@`vr+egTEoM5G^9#ju3IX5`3ompU*^ChQI!0mwNd8X9fYytdS#~VgfpK znhYJ=4P>WFhFIT_p$kW;k=-LQRQ`^VB=-jX$G6@I@8KH++ErWD1%h0mCjm7;tx~Ndp!re)syjx3Xf_DQrjdXa94Jt@KN))X z;O}zTAa@Dua=9DoLJk4#Y9^qfK5`T`2DY6fpf}7EsLdLDQ}lPahai`Ag@Ej#2Fzs< z&>67lU_3cu93-Hh>jX5rPL6(AkRjjVzst>lTxc`_mF*-)yR!*M8j+*H9_T0z zlA)CraK zBgE%I8##Iaxwl7)4BbwnK~z>`NMxN1_3ooa)(eNb(4Va>)tkoGK;yo{XVZj12W{!smmKCt?3$>fhq;0StFw$V`_U zaVufS>J^6SPEjJRI~aPOM?g}%RA@+_fJ%b?E=LCn&_Z#c)FVd;&{PW6W2nJ_5_yzj z$Uu*P_CudU=Sn~Uz%l>+!jBmqZ9s2lN{)W&VQ4xPLmzD@(cMZ66)+RfB~7SD{=k#x z|1NhN$Y zLjxdpPlOVE20gQB29=Mh{^r$auFbB2*!EqLyiBw z97`mC-1ynQ%N2oK>ncKhSINXx9}E0rfqyLUj|Kj*z`t970B04H;(sqWh`|6;hc}#5M1Nur z2)=|iIH&fXyqKAO3ou~x|NW^6T#x_qHHZ!W*RuKBWBRYPym+40rFr(EEZ4_qrol%>S5eiE}$2-A1ed2#$>T3z<5jv z%K}Wo9Izz7BJ4Ew7_biW!rB1auq12(&>K_1`T_GWW2_Xg0_5reCt&?MfPI)7)&j_Y zy++Z18>klH`puy(ex;!74Qsp7)uAVfN=$&6(&HMhZUxb)xg*j;_4A#IgD|=OEFKZ2k zx?<8;HH*;falegVS=cn-Bg~yNzXhy-G~UE+WAm__mQano1>8l5 z!CnAbV!KH8nFc*^KX;)fl0GA-4dMI!hzgJ)Ai@Ta6(AKhiQE8xq6riT$cwF`ctCN8 zC)}T`7%Nr`co1X8a6gM+RhWX)k zcL&6`8-kfY#A0ws!4xY5ybXEs1h5zLCdE-7b`9%;@ms7A8wZ@g;;~u4U4(Sf^3T{s zQrz`o!6ZLAVn<1KS_S(@!FmY17zwzA9+TqcJNlg$bXYs`f#nQf1w1eIV;|5ZKsv~a zL_kUG7dl5m9xNHq6zq;8u0O8lWlV#le*~sW%F9%UpC(uyhnbP=+kn}S^r*znU}La+ z82bY(2KkDmkn(>PyNZpFmfMi>Y69{H_vaQY$N3-_Q^m>w$+2E^7H}2aL)QSuP%|k{ zX3!H-UT|P9NqofsQdi-7M(jH&|0N;I@O+VjG44-ojG7cr8o=v#o@ijA7@kJ~*a_@D z;5CRRoCoeWL8KXAXc zV~M~(xL=h?d?Jf|1zj;Ok?dIp-?ziK z1N6mtY7V=G$|Cm=swz<3V3gKYr5!NN&-Glp4{)_V&6!t+B3^0Wnz3-8z6>cvSIuLFfX0aC!)xIXXD6p6PeV1Bs2=D-i8fb&opodLH)UYr5^3E$wnwFmrx z^MW*3D+y2%@;nys2>1in+Z^inV?aktiR6bU@IwQP!+~$`dJ&J=lk~n1JcaY_H0X`n z|2fokJfD}bQ1CpS*NG&24*tOBISXU_`$niYLx3!>f1FR2A(QI>sliKl{osRn;P(0e zS%T;F7#cuMfV9947XZJbS0ujTf%=H^00Y#+a6l30qi{Y`fH+MBGzUNA16~Ecqyq*4 z|KfG~2J|8L@;_i6IA3-Ff8p`g27HCbLmL)G;^z^FD?ATYpzh&3H1n5#D!?E3d=viS z^Y1VNoF9phx41n=fp;?iWiUF@ey344a)dDzWT!jeJMa=dA2RS}93VHgif#akLthvG zs1A9K>#GR;748pLs3UlM{Q-RmZl^G?`(3~WED{(SLuJ?%Qk)E6$ygPPpI||t37#i+ zNPIAWm5}-m0-=m#_m9x8EW!5!zymmMnLwW4eig#LL8Zp||1*hahtV|2zRVaI_8gW! zL*>XAa2{2V;)o9N{49)V!K-*a?0|XT@pTaDIj+9~)D7IuHh<-V9^?ZaXFibM`2G?x zOOpLtA#OTgoCWrO3RnPrAf6vh*frAfZkXRNj2EDv!t;TNP(mPe`&VZhgTpRW$Qi0?-l z!$|!DE%qAWb?F^M5^irJ=oj$(8UTNI0}`Q&!1&hwMaomn9P`~i~ zQ^4$S{$T>W@cpX7JbD3NLUlX?NDW){24nzfyk2|-p2PEEAH)+LcPF8r!tHSZ@&o4$ zU+710{r>oi7yU6;k{wGSpYiza2D{?+@5FAB^5P{HL$d1&EP%vAL=;!hN_Zs9Keq18~aa9P&0qlm)0|PJMdbmTs_6l$c-6h4-pQwk# zzj)T*eHJ&&8%ITu!}T`+e|Q4wW4r#czXGX0y874gYy4lwr8j`5>R`QLEQ-WKGr&K1 zT(yFIal5^MyukIuj|cJiU&Crhc`^paQ{P}*0e*S|_#W~e_e&^tniQuh*bWjO@IpPr z_5X@~koprR%$yW|+kv(4xcUT3ar^Ip+2M6=Cu|KrPB{Yl_*22SNIb^~{T04Ha;O`4ocTeV;`YJ2E@QwS&}aDqQiHc~ zzG8*=!snq4yp8jfGVpjdperUxsw0kYJdg_GWXy(?@3)~&;C8Ntc*6N{0{SF;`-^|| z7Yk7L@HlCPI*u=Yjir+8{SNGoFMk7d}Q~&|h5JDP`lxe&dQi7eph5_oM5u;DNNYC|00+Z6-;#N&29@C;su?f@_F!*(d(XvPi3pU{0|07!tf@p>)} zQGw@!BFN$M(T6clJPtMGgn0^Xeg?1wnT{g4m(_W{;Ge&K%h#-vF74hwdG#9t>dO;UgS z5Vo%f^H@Vqkr}K<2}dg~fcqiO{{Z9%y}bY};W+O)pe*zw!GO-dgQb91Fdb4KQjGns z&s`ADA7FV0lKTMTk1(FVvPt7b z=Q`auiz1=pV${D#M& z4jlJ|0ct@%6%TmnujBpea6acYjB6m?@i=MztDdz2|4hMn9{LS@ULUY-(zpfYGY#Wm z$me#z8JI5_?7ttD|01oQ1!rb(o=zp{Uj^}k_c84d{{w)LaD0i!)dR@uFMuQ1Q_u+N zAc2nH35cJ6!|UA#I4^|97c*oHJ|A_6r)WTZ@JB450n9ob&;hnr0C)xJUmM`Hzs_g$ z!g(8ff6uW-QoOH$KbBxTkM%=`hR1(3DPFeVd|@YPy)=@(%P_|CWESLco_zxL$Kz`n z`g}aT3Lw64{VxN*J_pRhN=f$EMOXn%p#LKX!4VkFuY<@2zW2E8ux809(iN z!W;T~e?SA^D?Gk};XD#v{{rB+8}~y6)D1k&YJo5DJRSgl%mVgfEhN6BB(z`z*w07k zU-7(s1Ah7lxCHrw*Nai$E1aK3A+K>i;>TIIJ^Fy>@VKgk^AtFL#KCcK4`4kk$LGsI zU?&`c?dlMA5K;hHVYWC=?E@{&0?GrsxB_ax-a`NlfTw~0?I6GKIPwFY!sinTb-WU= z4)PM8&jXkTZofsWoV5QHGrK4ZNkeZRr-4fuW?>LEUlw_sO1ZrY%38}M-=^f~o_Zy>L!L2q>e3qc7`gdhQDP;tJRCiU$^u$Bd^M-SQL z1*ic0oD3)f^&8jU9{3iICokYB+#j(pAH09M19bw=>t|R4={(LCh+B9eMgrX24EPbQ zBjEn{g58DAAJ5woQe1q3KKBjCP5hts&N^I*jU%IEKr`~$C-ma-J=V^Pn zgkJr{@fz&rGI$U_bpV`5T}NQPCH1443PvLb$)7SIEs5)e zvA!1Im)N=3MJN2W@Ke*wqU#I45ii7luOy$^1}+3FKM{@ou{#x{3>I&i?HZU)i`%g80)c4VtW)vc_OT?0p0{1b?+sA7{|JWm#=Z>WOmAQ;Hi&A2WR`Jni%RKEID3G`?T$3@Aj zMuR`1Pht;~%?5g2F$cTb$nk3OL5Y7m(A$^bOY@rkoNVeH5@cSjK5D(P)n3idGjofU z+Y9`f=*u1WzX?7!r)xbsLOi|A@lo|+9T{~6#I{NGM+F>zx%co2OMy}oF!)Sn-s zVznMURg2Ve;lpvmo~2ATT=fJfBGwRgh8Op zlf*9iGhS=JMa*AC-pBFpC%|jw5v@*UKLXPxPNE*KNM`D%4&a= zhB`<+t}Dq^-NCxdTjzkkBE79(AM{83cYEe5f=h{eGETSgkEg-s;8`#dy%GPEO(jsJ z!79ObLN>U`bKG^@6X7F`bG0MT61%y|j9cWeTjv#F)Jepjr6bOWeP2P(Braa@#TVgE z@{d4uUh7jwRf7tVX|z=Xu|($8s*;)kmPDT#b6r8?(Hi`jdAHbaE8@dqa60q-Rp1)p z-g6`l9%;zsZxuU*9utFv2|VLJl**@@kBl43>kh z#$ZaUvp3ggCA#zjYY^{-fl^0U0Cph%ka+Pcb${V&0)Ar`I2Ar5Zfx`A2?^9K?SEW$ zq}>SpDV)$q78yx=3$%mw!^bAK(|s2{QdvjTw|s6OUPkzKs~y_T?_vLESd{scB)o+SRM8+P$KI35&x zm`PrE5S&bWIs@)TZ>64bjXXsB$!qg6k&}9rvxDmZdQ>z?(v-1LeBUOtNa%4Fd39jl zz|!zj*Pdia{7s8L5Pfp0zjZ#A3T=_NVyoR`bmZUYo9Nk5K1ckvOXX0NIbTsVQ$K>G zvGZx**Q$={4rb$S-*a7av{vl7m#>~S$tHIc^Vqw@ zHHovy)OBW#-EgKJfwJ z_k`pl(~M?AfHILqqbdd=*O1tdlkoS(dBw2;J_6J(t^X;pEAg{#`Y-v&F~&#weGxw^ z$A`>)zIgf&Ps99z%(bUy`^mka!{e zABCMu9G^&B62A7}N5ro`qy8lEH=(+(`B)oyC}s`z{cVa|X*{$Gk$i+>x5kGi?cqH-e5p^)}w`ZBZJOo448$6HryY#9)_|eRv zs%bvT=)652S}Ad`h8d&fF_QjEUNwQ|Wa6i0k>5!F`x3{c9=RHO7yWvVJ&M1LQk%4& ziBuP~eeR78NHipjd1sRGff`H@jke<7b=!Y+kffscePr*j8P2_{yaCm z&!4ZGYqbB`gnbKNr;$fA*F7;qR6g*PnMqaE_=yqbzN3!l*q4dD7Z_@|LzUFNG3 z!EV^K*!gbwm<}$WJ~jtD?VGpmW0mg+o? z7$5l(J~o6k3ZE5#A9gi#?u3s5>Y<*GIEjPepQIiq`t%llwu85bA7XdxCaL|$KW4BJ zfA!G(K!g^*l3djV!&P&gC+0<}jkvxLbuQ7XcFg+(SCEHH1t(GWUINZ1zZLzuhuw)B zE@SVrb$zg= znbZ_}?{9vg{q7X15JNd$PJS~Byh*)7?BNLWw↦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 BGnW7W diff --git a/internal/processing/account/account_test.go b/internal/processing/account/account_test.go index 9c7f0fe67f..5a9382ed63 100644 --- a/internal/processing/account/account_test.go +++ b/internal/processing/account/account_test.go @@ -85,7 +85,7 @@ func (suite *AccountStandardTestSuite) SetupTest() { suite.fromClientAPIChan = make(chan messages.FromClientAPI, 100) suite.httpClient = testrig.NewMockHTTPClient(nil) suite.transportController = testrig.NewTestTransportController(suite.httpClient, suite.db) - suite.federator = testrig.NewTestFederator(suite.db, suite.transportController, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, suite.transportController, suite.storage, suite.mediaManager) suite.sentEmails = make(map[string]string) suite.emailSender = testrig.NewEmailSender("../../../web/template/", suite.sentEmails) suite.accountProcessor = account.New(suite.db, suite.tc, suite.mediaManager, suite.oauthServer, suite.fromClientAPIChan, suite.federator) diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index e0dd493e13..6d15b5afbb 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -172,7 +172,7 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead return nil, fmt.Errorf("UpdateAvatar: error processing avatar: %s", err) } - return processingMedia.LoadAttachment(ctx) + return processingMedia.Load(ctx) } // UpdateHeader does the dirty work of checking the header part of an account update form, @@ -214,7 +214,7 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead return nil, fmt.Errorf("UpdateHeader: error processing header: %s", err) } - return processingMedia.LoadAttachment(ctx) + return processingMedia.Load(ctx) } func (p *processor) processNote(ctx context.Context, note string, accountID string) (string, error) { diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index 093a3d2beb..9df5c7c1f9 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -60,7 +60,7 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form return nil, err } - attachment, err := media.LoadAttachment(ctx) + attachment, err := media.Load(ctx) if err != nil { return nil, err } diff --git a/internal/processing/processor_test.go b/internal/processing/processor_test.go index 04793898fe..851d3d5fb9 100644 --- a/internal/processing/processor_test.go +++ b/internal/processing/processor_test.go @@ -47,11 +47,11 @@ type ProcessingStandardTestSuite struct { suite.Suite db db.DB storage *kv.KVStore + mediaManager media.Manager typeconverter typeutils.TypeConverter transportController transport.Controller federator federation.Federator oauthServer oauth.Server - mediaManager media.Manager timelineManager timeline.Manager emailSender email.Sender @@ -216,9 +216,9 @@ func (suite *ProcessingStandardTestSuite) SetupTest() { }) suite.transportController = testrig.NewTestTransportController(httpClient, suite.db) - suite.federator = testrig.NewTestFederator(suite.db, suite.transportController, suite.storage) - suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, suite.transportController, suite.storage, suite.mediaManager) + suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.timelineManager = testrig.NewTestTimelineManager(suite.db) suite.emailSender = testrig.NewEmailSender("../../web/template/", nil) diff --git a/testrig/federator.go b/testrig/federator.go index b9c7428329..1b5e0fdc50 100644 --- a/testrig/federator.go +++ b/testrig/federator.go @@ -22,10 +22,11 @@ import ( "codeberg.org/gruf/go-store/kv" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/federation" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/transport" ) // NewTestFederator returns a federator with the given database and (mock!!) transport controller. -func NewTestFederator(db db.DB, tc transport.Controller, storage *kv.KVStore) federation.Federator { - return federation.NewFederator(db, NewTestFederatingDB(db), tc, NewTestTypeConverter(db), NewTestMediaManager(db, storage)) +func NewTestFederator(db db.DB, tc transport.Controller, storage *kv.KVStore, mediaManager media.Manager) federation.Federator { + return federation.NewFederator(db, NewTestFederatingDB(db), tc, NewTestTypeConverter(db), mediaManager) } diff --git a/testrig/mediahandler.go b/testrig/mediahandler.go index 046ddc5be2..38190eca32 100644 --- a/testrig/mediahandler.go +++ b/testrig/mediahandler.go @@ -26,7 +26,7 @@ import ( // NewTestMediaManager returns a media handler with the default test config, and the given db and storage. func NewTestMediaManager(db db.DB, storage *kv.KVStore) media.Manager { - m, err := media.New(db, storage) + m, err := media.NewManager(db, storage) if err != nil { panic(err) } diff --git a/testrig/processor.go b/testrig/processor.go index d86dd84110..cc2c3605e1 100644 --- a/testrig/processor.go +++ b/testrig/processor.go @@ -23,10 +23,11 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" + "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/processing" ) // NewTestProcessor returns a Processor suitable for testing purposes -func NewTestProcessor(db db.DB, storage *kv.KVStore, federator federation.Federator, emailSender email.Sender) processing.Processor { - return processing.NewProcessor(NewTestTypeConverter(db), federator, NewTestOauthServer(db), NewTestMediaManager(db, storage), storage, NewTestTimelineManager(db), db, emailSender) +func NewTestProcessor(db db.DB, storage *kv.KVStore, federator federation.Federator, emailSender email.Sender, mediaManager media.Manager) processing.Processor { + return processing.NewProcessor(NewTestTypeConverter(db), federator, NewTestOauthServer(db), mediaManager, storage, NewTestTimelineManager(db), db, emailSender) } From 113f9d9ab4797de6ae17819c96ae866992214021 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 11 Jan 2022 17:49:14 +0100 Subject: [PATCH 12/43] pass a function into the manager, start work on emoji --- internal/api/client/admin/admin.go | 2 +- internal/api/client/admin/admin_test.go | 123 ++++++ internal/api/client/admin/emojicreate.go | 4 +- internal/api/client/admin/emojicreate_test.go | 50 +++ internal/federation/dereferencing/account.go | 15 +- .../federation/dereferencing/dereferencer.go | 2 +- internal/federation/dereferencing/media.go | 17 +- .../federation/dereferencing/media_test.go | 20 +- internal/federation/dereferencing/status.go | 4 +- internal/media/image.go | 108 ----- internal/media/manager.go | 81 ++-- internal/media/manager_test.go | 32 +- internal/media/processingemoji.go | 382 ++++++++++++++++++ .../{processing.go => processingmedia.go} | 205 ++++++++-- internal/media/types.go | 12 +- internal/processing/account/update.go | 95 ++--- internal/processing/admin/emoji.go | 34 +- internal/processing/media/create.go | 31 +- internal/transport/transport.go | 2 +- testrig/testmodels.go | 10 + 20 files changed, 933 insertions(+), 296 deletions(-) create mode 100644 internal/api/client/admin/admin_test.go create mode 100644 internal/api/client/admin/emojicreate_test.go create mode 100644 internal/media/processingemoji.go rename internal/media/{processing.go => processingmedia.go} (52%) diff --git a/internal/api/client/admin/admin.go b/internal/api/client/admin/admin.go index f8ea03cc6c..f5256c996e 100644 --- a/internal/api/client/admin/admin.go +++ b/internal/api/client/admin/admin.go @@ -58,7 +58,7 @@ func New(processor processing.Processor) api.ClientModule { // Route attaches all routes from this module to the given router func (m *Module) Route(r router.Router) error { - r.AttachHandler(http.MethodPost, EmojiPath, m.emojiCreatePOSTHandler) + r.AttachHandler(http.MethodPost, EmojiPath, m.EmojiCreatePOSTHandler) r.AttachHandler(http.MethodPost, DomainBlocksPath, m.DomainBlocksPOSTHandler) r.AttachHandler(http.MethodGet, DomainBlocksPath, m.DomainBlocksGETHandler) r.AttachHandler(http.MethodGet, DomainBlocksPathWithID, m.DomainBlockGETHandler) diff --git a/internal/api/client/admin/admin_test.go b/internal/api/client/admin/admin_test.go new file mode 100644 index 0000000000..da5b039496 --- /dev/null +++ b/internal/api/client/admin/admin_test.go @@ -0,0 +1,123 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package admin_test + +import ( + "bytes" + "fmt" + "net/http" + "net/http/httptest" + + "codeberg.org/gruf/go-store/kv" + "github.com/gin-gonic/gin" + "github.com/spf13/viper" + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/api/client/admin" + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/email" + "github.com/superseriousbusiness/gotosocial/internal/federation" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/media" + "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/internal/processing" + "github.com/superseriousbusiness/gotosocial/internal/typeutils" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type AdminStandardTestSuite struct { + // standard suite interfaces + suite.Suite + db db.DB + tc typeutils.TypeConverter + storage *kv.KVStore + mediaManager media.Manager + federator federation.Federator + processor processing.Processor + emailSender email.Sender + sentEmails map[string]string + + // standard suite models + testTokens map[string]*gtsmodel.Token + testClients map[string]*gtsmodel.Client + testApplications map[string]*gtsmodel.Application + testUsers map[string]*gtsmodel.User + testAccounts map[string]*gtsmodel.Account + testAttachments map[string]*gtsmodel.MediaAttachment + testStatuses map[string]*gtsmodel.Status + + // module being tested + adminModule *admin.Module +} + +func (suite *AdminStandardTestSuite) SetupSuite() { + suite.testTokens = testrig.NewTestTokens() + suite.testClients = testrig.NewTestClients() + suite.testApplications = testrig.NewTestApplications() + suite.testUsers = testrig.NewTestUsers() + suite.testAccounts = testrig.NewTestAccounts() + suite.testAttachments = testrig.NewTestAttachments() + suite.testStatuses = testrig.NewTestStatuses() +} + +func (suite *AdminStandardTestSuite) SetupTest() { + testrig.InitTestConfig() + testrig.InitTestLog() + + suite.db = testrig.NewTestDB() + suite.storage = testrig.NewTestStorage() + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) + suite.sentEmails = make(map[string]string) + suite.emailSender = testrig.NewEmailSender("../../../../web/template/", suite.sentEmails) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) + suite.adminModule = admin.New(suite.processor).(*admin.Module) + testrig.StandardDBSetup(suite.db, nil) + testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") +} + +func (suite *AdminStandardTestSuite) TearDownTest() { + testrig.StandardDBTeardown(suite.db) + testrig.StandardStorageTeardown(suite.storage) +} + +func (suite *AdminStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, requestMethod string, requestBody []byte, requestPath string, bodyContentType string) *gin.Context { + ctx, _ := gin.CreateTestContext(recorder) + + ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["admin_account"]) + ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["admin_account"])) + ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["admin_account"]) + ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["admin_account"]) + + protocol := viper.GetString(config.Keys.Protocol) + host := viper.GetString(config.Keys.Host) + + baseURI := fmt.Sprintf("%s://%s", protocol, host) + requestURI := fmt.Sprintf("%s/%s", baseURI, requestPath) + + ctx.Request = httptest.NewRequest(http.MethodPatch, requestURI, bytes.NewReader(requestBody)) // the endpoint we're hitting + + if bodyContentType != "" { + ctx.Request.Header.Set("Content-Type", bodyContentType) + } + + ctx.Request.Header.Set("accept", "application/json") + + return ctx +} diff --git a/internal/api/client/admin/emojicreate.go b/internal/api/client/admin/emojicreate.go index 882654ea99..de7a2979aa 100644 --- a/internal/api/client/admin/emojicreate.go +++ b/internal/api/client/admin/emojicreate.go @@ -31,7 +31,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/validate" ) -// emojiCreateRequest swagger:operation POST /api/v1/admin/custom_emojis emojiCreate +// EmojiCreatePOSTHandler swagger:operation POST /api/v1/admin/custom_emojis emojiCreate // // Upload and create a new instance emoji. // @@ -73,7 +73,7 @@ import ( // description: forbidden // '400': // description: bad request -func (m *Module) emojiCreatePOSTHandler(c *gin.Context) { +func (m *Module) EmojiCreatePOSTHandler(c *gin.Context) { l := logrus.WithFields(logrus.Fields{ "func": "emojiCreatePOSTHandler", "request_uri": c.Request.RequestURI, diff --git a/internal/api/client/admin/emojicreate_test.go b/internal/api/client/admin/emojicreate_test.go new file mode 100644 index 0000000000..290b478f70 --- /dev/null +++ b/internal/api/client/admin/emojicreate_test.go @@ -0,0 +1,50 @@ +package admin_test + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/api/client/admin" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type EmojiCreateTestSuite struct { + AdminStandardTestSuite +} + +func (suite *EmojiCreateTestSuite) TestEmojiCreate() { + // set up the request + requestBody, w, err := testrig.CreateMultipartFormData( + "image", "../../../../testrig/media/rainbow-original.png", + map[string]string{ + "shortcode": "rainbow", + }) + if err != nil { + panic(err) + } + bodyBytes := requestBody.Bytes() + recorder := httptest.NewRecorder() + ctx := suite.newContext(recorder, http.MethodPost, bodyBytes, admin.EmojiPath, w.FormDataContentType()) + + // call the handler + suite.adminModule.EmojiCreatePOSTHandler(ctx) + + // 1. we should have OK because our request was valid + suite.Equal(http.StatusOK, recorder.Code) + + // 2. we should have no error message in the result body + result := recorder.Result() + defer result.Body.Close() + + // check the response + b, err := ioutil.ReadAll(result.Body) + suite.NoError(err) + suite.NotEmpty(b) +} + +func TestEmojiCreateTestSuite(t *testing.T) { + suite.Run(t, &EmojiCreateTestSuite{}) +} diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 27d9f39ce1..b9efbfa450 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -119,7 +119,6 @@ func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAcc } else { // take the id we already have and do an update gtsAccount.ID = maybeAccount.ID -aaaaaaaaaaaaaaaaaa if err := d.PopulateAccountFields(ctx, gtsAccount, username, refresh); err != nil { return nil, new, fmt.Errorf("FullyDereferenceAccount: error populating further account fields: %s", err) } @@ -252,13 +251,12 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - data, err := t.DereferenceMedia(ctx, avatarIRI) - if err != nil { - return err + data := func(innerCtx context.Context) ([]byte, error) { + return t.DereferenceMedia(innerCtx, avatarIRI) } avatar := true - processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalInfo{ + processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalMediaInfo{ RemoteURL: &targetAccount.AvatarRemoteURL, Avatar: &avatar, }) @@ -275,13 +273,12 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - data, err := t.DereferenceMedia(ctx, headerIRI) - if err != nil { - return err + data := func(innerCtx context.Context) ([]byte, error) { + return t.DereferenceMedia(innerCtx, headerIRI) } header := true - processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalInfo{ + processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalMediaInfo{ RemoteURL: &targetAccount.HeaderRemoteURL, Header: &header, }) diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index 1e6f781b8e..800da6c04d 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -41,7 +41,7 @@ type Dereferencer interface { GetRemoteInstance(ctx context.Context, username string, remoteInstanceURI *url.URL) (*gtsmodel.Instance, error) - GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Processing, error) + GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalMediaInfo) (*media.ProcessingMedia, error) DereferenceAnnounce(ctx context.Context, announce *gtsmodel.Status, requestingUsername string) error DereferenceThread(ctx context.Context, username string, statusIRI *url.URL) error diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go index f02303aa19..46cb4a5f4f 100644 --- a/internal/federation/dereferencing/media.go +++ b/internal/federation/dereferencing/media.go @@ -26,29 +26,28 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/media" ) -func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalInfo) (*media.Processing, error) { +func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, accountID string, remoteURL string, ai *media.AdditionalMediaInfo) (*media.ProcessingMedia, error) { if accountID == "" { - return nil, fmt.Errorf("RefreshAttachment: minAttachment account ID was empty") + return nil, fmt.Errorf("GetRemoteMedia: account ID was empty") } t, err := d.transportController.NewTransportForUsername(ctx, requestingUsername) if err != nil { - return nil, fmt.Errorf("RefreshAttachment: error creating transport: %s", err) + return nil, fmt.Errorf("GetRemoteMedia: error creating transport: %s", err) } derefURI, err := url.Parse(remoteURL) if err != nil { - return nil, err + return nil, fmt.Errorf("GetRemoteMedia: error parsing url: %s", err) } - data, err := t.DereferenceMedia(ctx, derefURI) - if err != nil { - return nil, fmt.Errorf("RefreshAttachment: error dereferencing media: %s", err) + dataFunc := func(innerCtx context.Context) ([]byte, error) { + return t.DereferenceMedia(innerCtx, derefURI) } - processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, accountID, ai) + processingMedia, err := d.mediaManager.ProcessMedia(ctx, dataFunc, accountID, ai) if err != nil { - return nil, fmt.Errorf("RefreshAttachment: error processing attachment: %s", err) + return nil, fmt.Errorf("GetRemoteMedia: error processing attachment: %s", err) } return processingMedia, nil diff --git a/internal/federation/dereferencing/media_test.go b/internal/federation/dereferencing/media_test.go index 61ee6edb60..26d5c0c494 100644 --- a/internal/federation/dereferencing/media_test.go +++ b/internal/federation/dereferencing/media_test.go @@ -20,6 +20,7 @@ package dereferencing_test import ( "context" + "fmt" "testing" "time" @@ -44,7 +45,7 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentBlocking() { attachmentDescription := "It's a cute plushie." attachmentBlurhash := "LwP?p=aK_4%N%MRjWXt7%hozM_a}" - media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL, &media.AdditionalInfo{ + media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL, &media.AdditionalMediaInfo{ StatusID: &attachmentStatus, RemoteURL: &attachmentURL, Description: &attachmentDescription, @@ -53,7 +54,7 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentBlocking() { suite.NoError(err) // make a blocking call to load the attachment from the in-process media - attachment, err := media.Load(ctx) + attachment, err := media.LoadAttachment(ctx) suite.NoError(err) suite.NotNil(attachment) @@ -118,18 +119,21 @@ func (suite *AttachmentTestSuite) TestDereferenceAttachmentAsync() { attachmentDescription := "It's a cute plushie." attachmentBlurhash := "LwP?p=aK_4%N%MRjWXt7%hozM_a}" - media, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL, &media.AdditionalInfo{ + processingMedia, err := suite.dereferencer.GetRemoteMedia(ctx, fetchingAccount.Username, attachmentOwner, attachmentURL, &media.AdditionalMediaInfo{ StatusID: &attachmentStatus, RemoteURL: &attachmentURL, Description: &attachmentDescription, Blurhash: &attachmentBlurhash, }) suite.NoError(err) - attachmentID := media.AttachmentID() - - // wait 5 seconds to let the image process in the background - // it probably won't really take this long but hey let's be sure - time.Sleep(5 * time.Second) + attachmentID := processingMedia.AttachmentID() + + // wait for the media to finish processing + for finished := processingMedia.Finished(); !finished; finished = processingMedia.Finished() { + time.Sleep(10 * time.Millisecond) + fmt.Printf("\n\nnot finished yet...\n\n") + } + fmt.Printf("\n\nfinished!\n\n") // now get the attachment from the database attachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index 041cfa6b4a..004d648b58 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -394,7 +394,7 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. a.AccountID = status.AccountID a.StatusID = status.ID - media, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL, &media.AdditionalInfo{ + media, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL, &media.AdditionalMediaInfo{ CreatedAt: &a.CreatedAt, StatusID: &a.StatusID, RemoteURL: &a.RemoteURL, @@ -406,7 +406,7 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. continue } - attachment, err := media.Load(ctx) + attachment, err := media.LoadAttachment(ctx) if err != nil { logrus.Errorf("populateStatusAttachments: couldn't load remote attachment %s: %s", a.RemoteURL, err) continue diff --git a/internal/media/image.go b/internal/media/image.go index 074dd38393..a5a818206d 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -27,7 +27,6 @@ import ( "image/gif" "image/jpeg" "image/png" - "strings" "time" "github.com/buckket/go-blurhash" @@ -52,113 +51,6 @@ type ImageMeta struct { blurhash string } -func (m *manager) preProcessImage(ctx context.Context, data []byte, contentType string, accountID string, ai *AdditionalInfo) (*Processing, error) { - if !supportedImage(contentType) { - return nil, fmt.Errorf("image type %s not supported", contentType) - } - - if len(data) == 0 { - return nil, errors.New("image was of size 0") - } - - id, err := id.NewRandomULID() - if err != nil { - return nil, err - } - - extension := strings.Split(contentType, "/")[1] - - // populate initial fields on the media attachment -- some of these will be overwritten as we proceed - attachment := >smodel.MediaAttachment{ - ID: id, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - StatusID: "", - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeOriginal), id, extension), - RemoteURL: "", - Type: gtsmodel.FileTypeImage, - FileMeta: gtsmodel.FileMeta{ - Focus: gtsmodel.Focus{ - X: 0, - Y: 0, - }, - }, - AccountID: accountID, - Description: "", - ScheduledStatusID: "", - Blurhash: "", - Processing: gtsmodel.ProcessingStatusReceived, - File: gtsmodel.File{ - Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeOriginal, id, extension), - ContentType: contentType, - UpdatedAt: time.Now(), - }, - Thumbnail: gtsmodel.Thumbnail{ - URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, - Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, - ContentType: mimeJpeg, - UpdatedAt: time.Now(), - }, - Avatar: false, - Header: false, - } - - // check if we have additional info to add to the attachment, - // and overwrite some of the attachment fields if so - if ai != nil { - if ai.CreatedAt != nil { - attachment.CreatedAt = *ai.CreatedAt - } - - if ai.StatusID != nil { - attachment.StatusID = *ai.StatusID - } - - if ai.RemoteURL != nil { - attachment.RemoteURL = *ai.RemoteURL - } - - if ai.Description != nil { - attachment.Description = *ai.Description - } - - if ai.ScheduledStatusID != nil { - attachment.ScheduledStatusID = *ai.ScheduledStatusID - } - - if ai.Blurhash != nil { - attachment.Blurhash = *ai.Blurhash - } - - if ai.Avatar != nil { - attachment.Avatar = *ai.Avatar - } - - if ai.Header != nil { - attachment.Header = *ai.Header - } - - if ai.FocusX != nil { - attachment.FileMeta.Focus.X = *ai.FocusX - } - - if ai.FocusY != nil { - attachment.FileMeta.Focus.Y = *ai.FocusY - } - } - - media := &Processing{ - attachment: attachment, - rawData: data, - thumbstate: received, - fullSizeState: received, - database: m.db, - storage: m.storage, - } - - return media, nil -} - func decodeGif(b []byte) (*ImageMeta, error) { gif, err := gif.DecodeAll(bytes.NewReader(b)) if err != nil { diff --git a/internal/media/manager.go b/internal/media/manager.go index c8642fcb47..e344715910 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -21,9 +21,7 @@ package media import ( "context" "errors" - "fmt" "runtime" - "strings" "codeberg.org/gruf/go-runners" "codeberg.org/gruf/go-store/kv" @@ -33,15 +31,17 @@ import ( // Manager provides an interface for managing media: parsing, storing, and retrieving media objects like photos, videos, and gifs. type Manager interface { - // ProcessMedia begins the process of decoding and storing the given data as a piece of media (aka an attachment). + // ProcessMedia begins the process of decoding and storing the given data as an attachment. // It will return a pointer to a Media struct upon which further actions can be performed, such as getting // the finished media, thumbnail, attachment, etc. // + // data should be a function that the media manager can call to return raw bytes of a piece of media. + // // accountID should be the account that the media belongs to. // // ai is optional and can be nil. Any additional information about the attachment provided will be put in the database. - ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Processing, error) - ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Processing, error) + ProcessMedia(ctx context.Context, data DataFunc, accountID string, ai *AdditionalMediaInfo) (*ProcessingMedia, error) + ProcessEmoji(ctx context.Context, data DataFunc, shortcode string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) // NumWorkers returns the total number of workers available to this manager. NumWorkers() int // QueueSize returns the total capacity of the queue. @@ -101,49 +101,52 @@ func NewManager(database db.DB, storage *kv.KVStore) (Manager, error) { return m, nil } -func (m *manager) ProcessMedia(ctx context.Context, data []byte, accountID string, ai *AdditionalInfo) (*Processing, error) { - contentType, err := parseContentType(data) +func (m *manager) ProcessMedia(ctx context.Context, data DataFunc, accountID string, ai *AdditionalMediaInfo) (*ProcessingMedia, error) { + processingMedia, err := m.preProcessMedia(ctx, data, accountID, ai) if err != nil { return nil, err } - split := strings.Split(contentType, "/") - if len(split) != 2 { - return nil, fmt.Errorf("content type %s malformed", contentType) - } - - mainType := split[0] - - switch mainType { - case mimeImage: - media, err := m.preProcessImage(ctx, data, contentType, accountID, ai) - if err != nil { - return nil, err + logrus.Tracef("ProcessMedia: about to enqueue media with attachmentID %s, queue length is %d", processingMedia.AttachmentID(), m.pool.Queue()) + m.pool.Enqueue(func(innerCtx context.Context) { + select { + case <-innerCtx.Done(): + // if the inner context is done that means the worker pool is closing, so we should just return + return + default: + // start loading the media already for the caller's convenience + if _, err := processingMedia.LoadAttachment(innerCtx); err != nil { + logrus.Errorf("ProcessMedia: error processing media with attachmentID %s: %s", processingMedia.AttachmentID(), err) + } } + }) + logrus.Tracef("ProcessMedia: succesfully queued media with attachmentID %s, queue length is %d", processingMedia.AttachmentID(), m.pool.Queue()) - logrus.Tracef("ProcessMedia: about to enqueue media with attachmentID %s, queue length is %d", media.AttachmentID(), m.pool.Queue()) - m.pool.Enqueue(func(innerCtx context.Context) { - select { - case <-innerCtx.Done(): - // if the inner context is done that means the worker pool is closing, so we should just return - return - default: - // start loading the media already for the caller's convenience - if _, err := media.Load(innerCtx); err != nil { - logrus.Errorf("ProcessMedia: error processing media with attachmentID %s: %s", media.AttachmentID(), err) - } - } - }) - logrus.Tracef("ProcessMedia: succesfully queued media with attachmentID %s, queue length is %d", media.AttachmentID(), m.pool.Queue()) + return processingMedia, nil +} - return media, nil - default: - return nil, fmt.Errorf("content type %s not (yet) supported", contentType) +func (m *manager) ProcessEmoji(ctx context.Context, data DataFunc, shortcode string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) { + processingEmoji, err := m.preProcessEmoji(ctx, data, shortcode, ai) + if err != nil { + return nil, err } -} -func (m *manager) ProcessEmoji(ctx context.Context, data []byte, accountID string) (*Processing, error) { - return nil, nil + logrus.Tracef("ProcessEmoji: about to enqueue emoji with id %s, queue length is %d", processingEmoji.EmojiID(), m.pool.Queue()) + m.pool.Enqueue(func(innerCtx context.Context) { + select { + case <-innerCtx.Done(): + // if the inner context is done that means the worker pool is closing, so we should just return + return + default: + // start loading the emoji already for the caller's convenience + if _, err := processingEmoji.LoadEmoji(innerCtx); err != nil { + logrus.Errorf("ProcessEmoji: error processing emoji with id %s: %s", processingEmoji.EmojiID(), err) + } + } + }) + logrus.Tracef("ProcessEmoji: succesfully queued emoji with id %s, queue length is %d", processingEmoji.EmojiID(), m.pool.Queue()) + + return processingEmoji, nil } func (m *manager) NumWorkers() int { diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 74d0c30087..0fadceb37e 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -37,21 +37,21 @@ type ManagerTestSuite struct { func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { ctx := context.Background() - // load bytes from a test image - testBytes, err := os.ReadFile("./test/test-jpeg.jpg") - suite.NoError(err) - suite.NotEmpty(testBytes) + data := func(_ context.Context) ([]byte, error) { + // load bytes from a test image + return os.ReadFile("./test/test-jpeg.jpg") + } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" // process the media with no additional info provided - processingMedia, err := suite.manager.ProcessMedia(ctx, testBytes, accountID, nil) + processingMedia, err := suite.manager.ProcessMedia(ctx, data, accountID, nil) suite.NoError(err) // fetch the attachment id from the processing media attachmentID := processingMedia.AttachmentID() // do a blocking call to fetch the attachment - attachment, err := processingMedia.Load(ctx) + attachment, err := processingMedia.LoadAttachment(ctx) suite.NoError(err) suite.NotNil(attachment) @@ -103,15 +103,15 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { func (suite *ManagerTestSuite) TestSimpleJpegProcessAsync() { ctx := context.Background() - // load bytes from a test image - testBytes, err := os.ReadFile("./test/test-jpeg.jpg") - suite.NoError(err) - suite.NotEmpty(testBytes) + data := func(_ context.Context) ([]byte, error) { + // load bytes from a test image + return os.ReadFile("./test/test-jpeg.jpg") + } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" // process the media with no additional info provided - processingMedia, err := suite.manager.ProcessMedia(ctx, testBytes, accountID, nil) + processingMedia, err := suite.manager.ProcessMedia(ctx, data, accountID, nil) suite.NoError(err) // fetch the attachment id from the processing media attachmentID := processingMedia.AttachmentID() @@ -183,13 +183,17 @@ func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { suite.NoError(err) suite.NotEmpty(testBytes) + data := func(_ context.Context) ([]byte, error) { + return testBytes, nil + } + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" spam := 50 - inProcess := []*media.Processing{} + inProcess := []*media.ProcessingMedia{} for i := 0; i < spam; i++ { // process the media with no additional info provided - processingMedia, err := suite.manager.ProcessMedia(ctx, testBytes, accountID, nil) + processingMedia, err := suite.manager.ProcessMedia(ctx, data, accountID, nil) suite.NoError(err) inProcess = append(inProcess, processingMedia) } @@ -201,7 +205,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { attachmentID := processingMedia.AttachmentID() // do a blocking call to fetch the attachment - attachment, err := processingMedia.Load(ctx) + attachment, err := processingMedia.LoadAttachment(ctx) suite.NoError(err) suite.NotNil(attachment) diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go new file mode 100644 index 0000000000..7e2d4f31f6 --- /dev/null +++ b/internal/media/processingemoji.go @@ -0,0 +1,382 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package media + +import ( + "context" + "fmt" + "strings" + "sync" + "time" + + "codeberg.org/gruf/go-store/kv" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/uris" +) + +// ProcessingEmoji represents an emoji currently processing. It exposes +// various functions for retrieving data from the process. +type ProcessingEmoji struct { + mu sync.Mutex + + /* + below fields should be set on newly created media; + emoji will be updated incrementally as media goes through processing + */ + + emoji *gtsmodel.Emoji + data DataFunc + + rawData []byte // will be set once the fetchRawData function has been called + + /* + below fields represent the processing state of the static version of the emoji + */ + + staticState processState + static *ImageMeta + + /* + below fields represent the processing state of the emoji image + */ + + fullSizeState processState + fullSize *ImageMeta + + /* + below pointers to database and storage are maintained so that + the media can store and update itself during processing steps + */ + + database db.DB + storage *kv.KVStore + + err error // error created during processing, if any +} + +// EmojiID returns the ID of the underlying emoji without blocking processing. +func (p *ProcessingEmoji) EmojiID() string { + return p.emoji.ID +} + +// LoadEmoji blocks until the static and fullsize image +// has been processed, and then returns the completed emoji. +func (p *ProcessingEmoji) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { + if err := p.fetchRawData(ctx); err != nil { + return nil, err + } + + if _, err := p.loadStatic(ctx); err != nil { + return nil, err + } + + if _, err := p.loadFullSize(ctx); err != nil { + return nil, err + } + + return p.emoji, nil +} + +// Finished returns true if processing has finished for both the thumbnail +// and full fized version of this piece of media. +func (p *ProcessingEmoji) Finished() bool { + return p.staticState == complete && p.fullSizeState == complete +} + +func (p *ProcessingEmoji) loadStatic(ctx context.Context) (*ImageMeta, error) { + p.mu.Lock() + defer p.mu.Unlock() + + switch p.staticState { + case received: + // we haven't processed a static version of this emoji yet so do it now + static, err := deriveStaticEmoji(p.rawData, p.emoji.ImageContentType) + if err != nil { + p.err = fmt.Errorf("error deriving static: %s", err) + p.staticState = errored + return nil, p.err + } + + // put the static in storage + if err := p.storage.Put(p.emoji.ImageStaticPath, static.image); err != nil { + p.err = fmt.Errorf("error storing static: %s", err) + p.staticState = errored + return nil, p.err + } + + // set appropriate fields on the emoji based on the static version we derived + p.attachment.FileMeta.Small = gtsmodel.Small{ + Width: static.width, + Height: static.height, + Size: static.size, + Aspect: static.aspect, + } + p.attachment.Thumbnail.FileSize = static.size + + if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + p.err = err + p.thumbstate = errored + return nil, err + } + + // set the thumbnail of this media + p.thumb = static + + // we're done processing the thumbnail! + p.thumbstate = complete + fallthrough + case complete: + return p.thumb, nil + case errored: + return nil, p.err + } + + return nil, fmt.Errorf("thumbnail processing status %d unknown", p.thumbstate) +} + +func (p *ProcessingEmoji) loadFullSize(ctx context.Context) (*ImageMeta, error) { + p.mu.Lock() + defer p.mu.Unlock() + + switch p.fullSizeState { + case received: + var clean []byte + var err error + var decoded *ImageMeta + + ct := p.attachment.File.ContentType + switch ct { + case mimeImageJpeg, mimeImagePng: + // first 'clean' image by purging exif data from it + var exifErr error + if clean, exifErr = purgeExif(p.rawData); exifErr != nil { + err = exifErr + break + } + decoded, err = decodeImage(clean, ct) + case mimeImageGif: + // gifs are already clean - no exif data to remove + clean = p.rawData + decoded, err = decodeGif(clean) + default: + err = fmt.Errorf("content type %s not a processible image type", ct) + } + + if err != nil { + p.err = err + p.fullSizeState = errored + return nil, err + } + + // put the full size in storage + if err := p.storage.Put(p.attachment.File.Path, decoded.image); err != nil { + p.err = fmt.Errorf("error storing full size image: %s", err) + p.fullSizeState = errored + return nil, p.err + } + + // set appropriate fields on the attachment based on the image we derived + p.attachment.FileMeta.Original = gtsmodel.Original{ + Width: decoded.width, + Height: decoded.height, + Size: decoded.size, + Aspect: decoded.aspect, + } + p.attachment.File.FileSize = decoded.size + p.attachment.File.UpdatedAt = time.Now() + p.attachment.Processing = gtsmodel.ProcessingStatusProcessed + + if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + p.err = err + p.fullSizeState = errored + return nil, err + } + + // set the fullsize of this media + p.fullSize = decoded + + // we're done processing the full-size image + p.fullSizeState = complete + fallthrough + case complete: + return p.fullSize, nil + case errored: + return nil, p.err + } + + return nil, fmt.Errorf("full size processing status %d unknown", p.fullSizeState) +} + +// fetchRawData calls the data function attached to p if it hasn't been called yet, +// and updates the underlying attachment fields as necessary. +// It should only be called from within a function that already has a lock on p! +func (p *ProcessingEmoji) fetchRawData(ctx context.Context) error { + // check if we've already done this and bail early if we have + if p.rawData != nil { + return nil + } + + // execute the data function and pin the raw bytes for further processing + b, err := p.data(ctx) + if err != nil { + return fmt.Errorf("fetchRawData: error executing data function: %s", err) + } + p.rawData = b + + // now we have the data we can work out the content type + contentType, err := parseContentType(p.rawData) + if err != nil { + return fmt.Errorf("fetchRawData: error parsing content type: %s", err) + } + + if !supportedEmoji(contentType) { + return fmt.Errorf("fetchRawData: content type %s was not valid for an emoji", contentType) + } + + split := strings.Split(contentType, "/") + mainType := split[0] // something like 'image' + extension := split[1] // something like 'gif' + + // set some additional fields on the emoji now that + // we know more about what the underlying image actually is + p.emoji.ImageURL = uris.GenerateURIForAttachment(p.attachment.AccountID, string(TypeAttachment), string(SizeOriginal), p.attachment.ID, extension) + p.attachment.File.Path = fmt.Sprintf("%s/%s/%s/%s.%s", p.attachment.AccountID, TypeAttachment, SizeOriginal, p.attachment.ID, extension) + p.attachment.File.ContentType = contentType + + switch mainType { + case mimeImage: + if extension == mimeGif { + p.attachment.Type = gtsmodel.FileTypeGif + } else { + p.attachment.Type = gtsmodel.FileTypeImage + } + default: + return fmt.Errorf("fetchRawData: cannot process mime type %s (yet)", mainType) + } + + return nil +} + +// putOrUpdateEmoji is just a convenience function for first trying to PUT the emoji in the database, +// and then if that doesn't work because the emoji already exists, updating it instead. +func putOrUpdateEmoji(ctx context.Context, database db.DB, emoji *gtsmodel.Emoji) error { + if err := database.Put(ctx, emoji); err != nil { + if err != db.ErrAlreadyExists { + return fmt.Errorf("putOrUpdateEmoji: proper error while putting emoji: %s", err) + } + if err := database.UpdateByPrimaryKey(ctx, emoji); err != nil { + return fmt.Errorf("putOrUpdateEmoji: error while updating emoji: %s", err) + } + } + + return nil +} + +func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) { + instanceAccount, err := m.db.GetInstanceAccount(ctx, "") + if err != nil { + return nil, fmt.Errorf("preProcessEmoji: error fetching this instance account from the db: %s", err) + } + + id, err := id.NewRandomULID() + if err != nil { + return nil, err + } + + // populate initial fields on the emoji -- some of these will be overwritten as we proceed + emoji := >smodel.Emoji{ + ID: id, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + Shortcode: shortcode, + Domain: "", // assume our own domain unless told otherwise + ImageRemoteURL: "", + ImageStaticRemoteURL: "", + ImageURL: "", // we don't know yet + ImageStaticURL: uris.GenerateURIForAttachment(instanceAccount.ID, string(TypeEmoji), string(SizeStatic), id, mimePng), // all static emojis are encoded as png + ImagePath: "", // we don't know yet + ImageStaticPath: fmt.Sprintf("%s/%s/%s/%s.%s", instanceAccount.ID, TypeEmoji, SizeStatic, id, mimePng), // all static emojis are encoded as png + ImageContentType: "", // we don't know yet + ImageStaticContentType: mimeImagePng, // all static emojis are encoded as png + ImageFileSize: 0, + ImageStaticFileSize: 0, + ImageUpdatedAt: time.Now(), + Disabled: false, + URI: "", // we don't know yet + VisibleInPicker: true, + CategoryID: "", + } + + // check if we have additional info to add to the emoji, + // and overwrite some of the emoji fields if so + if ai != nil { + if ai.CreatedAt != nil { + attachment.CreatedAt = *ai.CreatedAt + } + + if ai.StatusID != nil { + attachment.StatusID = *ai.StatusID + } + + if ai.RemoteURL != nil { + attachment.RemoteURL = *ai.RemoteURL + } + + if ai.Description != nil { + attachment.Description = *ai.Description + } + + if ai.ScheduledStatusID != nil { + attachment.ScheduledStatusID = *ai.ScheduledStatusID + } + + if ai.Blurhash != nil { + attachment.Blurhash = *ai.Blurhash + } + + if ai.Avatar != nil { + attachment.Avatar = *ai.Avatar + } + + if ai.Header != nil { + attachment.Header = *ai.Header + } + + if ai.FocusX != nil { + attachment.FileMeta.Focus.X = *ai.FocusX + } + + if ai.FocusY != nil { + attachment.FileMeta.Focus.Y = *ai.FocusY + } + } + + processingEmoji := &ProcessingEmoji{ + emoji: emoji, + data: data, + staticState: received, + fullSizeState: received, + database: m.db, + storage: m.storage, + } + + return processingEmoji, nil +} diff --git a/internal/media/processing.go b/internal/media/processingmedia.go similarity index 52% rename from internal/media/processing.go rename to internal/media/processingmedia.go index 3f9fc2bfc8..a6e45034f5 100644 --- a/internal/media/processing.go +++ b/internal/media/processingmedia.go @@ -21,12 +21,15 @@ package media import ( "context" "fmt" + "strings" "sync" "time" "codeberg.org/gruf/go-store/kv" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/uris" ) type processState int @@ -37,9 +40,9 @@ const ( errored // processing order has been completed with an error ) -// Processing represents a piece of media that is currently being processed. It exposes +// ProcessingMedia represents a piece of media that is currently being processed. It exposes // various functions for retrieving data from the process. -type Processing struct { +type ProcessingMedia struct { mu sync.Mutex /* @@ -47,10 +50,10 @@ type Processing struct { attachment will be updated incrementally as media goes through processing */ - attachment *gtsmodel.MediaAttachment // will only be set if the media is an attachment - emoji *gtsmodel.Emoji // will only be set if the media is an emoji + attachment *gtsmodel.MediaAttachment + data DataFunc - rawData []byte + rawData []byte // will be set once the fetchRawData function has been called /* below fields represent the processing state of the media thumbnail @@ -77,7 +80,40 @@ type Processing struct { err error // error created during processing, if any } -func (p *Processing) Thumb(ctx context.Context) (*ImageMeta, error) { +// AttachmentID returns the ID of the underlying media attachment without blocking processing. +func (p *ProcessingMedia) AttachmentID() string { + return p.attachment.ID +} + +// LoadAttachment blocks until the thumbnail and fullsize content +// has been processed, and then returns the completed attachment. +func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAttachment, error) { + if err := p.fetchRawData(ctx); err != nil { + return nil, err + } + + if _, err := p.loadThumb(ctx); err != nil { + return nil, err + } + + if _, err := p.loadFullSize(ctx); err != nil { + return nil, err + } + + return p.attachment, nil +} + +func (p *ProcessingMedia) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { + return nil, nil +} + +// Finished returns true if processing has finished for both the thumbnail +// and full fized version of this piece of media. +func (p *ProcessingMedia) Finished() bool { + return p.thumbstate == complete && p.fullSizeState == complete +} + +func (p *ProcessingMedia) loadThumb(ctx context.Context) (*ImageMeta, error) { p.mu.Lock() defer p.mu.Unlock() @@ -140,7 +176,7 @@ func (p *Processing) Thumb(ctx context.Context) (*ImageMeta, error) { return nil, fmt.Errorf("thumbnail processing status %d unknown", p.thumbstate) } -func (p *Processing) FullSize(ctx context.Context) (*ImageMeta, error) { +func (p *ProcessingMedia) loadFullSize(ctx context.Context) (*ImageMeta, error) { p.mu.Lock() defer p.mu.Unlock() @@ -213,31 +249,54 @@ func (p *Processing) FullSize(ctx context.Context) (*ImageMeta, error) { return nil, fmt.Errorf("full size processing status %d unknown", p.fullSizeState) } -// AttachmentID returns the ID of the underlying media attachment without blocking processing. -func (p *Processing) AttachmentID() string { - return p.attachment.ID -} +// fetchRawData calls the data function attached to p if it hasn't been called yet, +// and updates the underlying attachment fields as necessary. +// It should only be called from within a function that already has a lock on p! +func (p *ProcessingMedia) fetchRawData(ctx context.Context) error { + // check if we've already done this and bail early if we have + if p.rawData != nil { + return nil + } -// Load blocks until the thumbnail and fullsize content has been processed, and then -// returns the completed attachment. -func (p *Processing) Load(ctx context.Context) (*gtsmodel.MediaAttachment, error) { - if _, err := p.Thumb(ctx); err != nil { - return nil, err + // execute the data function and pin the raw bytes for further processing + b, err := p.data(ctx) + if err != nil { + return fmt.Errorf("fetchRawData: error executing data function: %s", err) } + p.rawData = b - if _, err := p.FullSize(ctx); err != nil { - return nil, err + // now we have the data we can work out the content type + contentType, err := parseContentType(p.rawData) + if err != nil { + return fmt.Errorf("fetchRawData: error parsing content type: %s", err) } - return p.attachment, nil -} + split := strings.Split(contentType, "/") + if len(split) != 2 { + return fmt.Errorf("fetchRawData: content type %s was not valid", contentType) + } -func (p *Processing) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { - return nil, nil -} + mainType := split[0] // something like 'image' + extension := split[1] // something like 'jpeg' + + // set some additional fields on the attachment now that + // we know more about what the underlying media actually is + p.attachment.URL = uris.GenerateURIForAttachment(p.attachment.AccountID, string(TypeAttachment), string(SizeOriginal), p.attachment.ID, extension) + p.attachment.File.Path = fmt.Sprintf("%s/%s/%s/%s.%s", p.attachment.AccountID, TypeAttachment, SizeOriginal, p.attachment.ID, extension) + p.attachment.File.ContentType = contentType + + switch mainType { + case mimeImage: + if extension == mimeGif { + p.attachment.Type = gtsmodel.FileTypeGif + } else { + p.attachment.Type = gtsmodel.FileTypeImage + } + default: + return fmt.Errorf("fetchRawData: cannot process mime type %s (yet)", mainType) + } -func (p *Processing) Finished() bool { - return p.thumbstate == complete && p.fullSizeState == complete + return nil } // putOrUpdateAttachment is just a convenience function for first trying to PUT the attachment in the database, @@ -254,3 +313,99 @@ func putOrUpdateAttachment(ctx context.Context, database db.DB, attachment *gtsm return nil } + +func (m *manager) preProcessMedia(ctx context.Context, data DataFunc, accountID string, ai *AdditionalMediaInfo) (*ProcessingMedia, error) { + id, err := id.NewRandomULID() + if err != nil { + return nil, err + } + + file := gtsmodel.File{ + Path: "", // we don't know yet because it depends on the uncalled DataFunc + ContentType: "", // we don't know yet because it depends on the uncalled DataFunc + UpdatedAt: time.Now(), + } + + thumbnail := gtsmodel.Thumbnail{ + URL: uris.GenerateURIForAttachment(accountID, string(TypeAttachment), string(SizeSmall), id, mimeJpeg), // all thumbnails are encoded as jpeg, + Path: fmt.Sprintf("%s/%s/%s/%s.%s", accountID, TypeAttachment, SizeSmall, id, mimeJpeg), // all thumbnails are encoded as jpeg, + ContentType: mimeJpeg, + UpdatedAt: time.Now(), + } + + // populate initial fields on the media attachment -- some of these will be overwritten as we proceed + attachment := >smodel.MediaAttachment{ + ID: id, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + StatusID: "", + URL: "", // we don't know yet because it depends on the uncalled DataFunc + RemoteURL: "", + Type: gtsmodel.FileTypeUnknown, // we don't know yet because it depends on the uncalled DataFunc + FileMeta: gtsmodel.FileMeta{}, + AccountID: accountID, + Description: "", + ScheduledStatusID: "", + Blurhash: "", + Processing: gtsmodel.ProcessingStatusReceived, + File: file, + Thumbnail: thumbnail, + Avatar: false, + Header: false, + } + + // check if we have additional info to add to the attachment, + // and overwrite some of the attachment fields if so + if ai != nil { + if ai.CreatedAt != nil { + attachment.CreatedAt = *ai.CreatedAt + } + + if ai.StatusID != nil { + attachment.StatusID = *ai.StatusID + } + + if ai.RemoteURL != nil { + attachment.RemoteURL = *ai.RemoteURL + } + + if ai.Description != nil { + attachment.Description = *ai.Description + } + + if ai.ScheduledStatusID != nil { + attachment.ScheduledStatusID = *ai.ScheduledStatusID + } + + if ai.Blurhash != nil { + attachment.Blurhash = *ai.Blurhash + } + + if ai.Avatar != nil { + attachment.Avatar = *ai.Avatar + } + + if ai.Header != nil { + attachment.Header = *ai.Header + } + + if ai.FocusX != nil { + attachment.FileMeta.Focus.X = *ai.FocusX + } + + if ai.FocusY != nil { + attachment.FileMeta.Focus.Y = *ai.FocusY + } + } + + processingMedia := &ProcessingMedia{ + attachment: attachment, + data: data, + thumbstate: received, + fullSizeState: received, + database: m.db, + storage: m.storage, + } + + return processingMedia, nil +} diff --git a/internal/media/types.go b/internal/media/types.go index aaf423682e..6426223d14 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -20,6 +20,7 @@ package media import ( "bytes" + "context" "errors" "fmt" "time" @@ -68,9 +69,9 @@ const ( TypeEmoji Type = "emoji" // TypeEmoji is the key for emoji type requests ) -// AdditionalInfo represents additional information that should be added to an attachment +// AdditionalMediaInfo represents additional information that should be added to an attachment // when processing a piece of media. -type AdditionalInfo struct { +type AdditionalMediaInfo struct { // Time that this media was created; defaults to time.Now(). CreatedAt *time.Time // ID of the status to which this media is attached; defaults to "". @@ -93,6 +94,13 @@ type AdditionalInfo struct { FocusY *float32 } +type AdditionalEmojiInfo struct { + +} + +// DataFunc represents a function used to retrieve the raw bytes of a piece of media. +type DataFunc func(ctx context.Context) ([]byte, error) + // parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). // Returns an error if the content type is not something we can process. func parseContentType(content []byte) (string, error) { diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 6d15b5afbb..7b305dc957 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -137,84 +137,87 @@ func (p *processor) Update(ctx context.Context, account *gtsmodel.Account, form // parsing and checking the image, and doing the necessary updates in the database for this to become // the account's new avatar image. func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHeader, accountID string) (*gtsmodel.MediaAttachment, error) { - var err error maxImageSize := viper.GetInt(config.Keys.MediaImageMaxSize) if int(avatar.Size) > maxImageSize { - err = fmt.Errorf("UpdateAvatar: avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) - return nil, err - } - f, err := avatar.Open() - if err != nil { - return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) + return nil, fmt.Errorf("UpdateAvatar: avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) } - // extract the bytes - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) - } - if size == 0 { - return nil, errors.New("UpdateAvatar: could not read provided avatar: size 0 bytes") - } + dataFunc := func(ctx context.Context) ([]byte, error) { + // pop open the fileheader + f, err := avatar.Open() + if err != nil { + return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) + } - // we're done with the FileHeader now - if err := f.Close(); err != nil { - return nil, fmt.Errorf("UpdateAvatar: error closing multipart fileheader: %s", err) + // extract the bytes + buf := new(bytes.Buffer) + size, err := io.Copy(buf, f) + if err != nil { + return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) + } + if size == 0 { + return nil, errors.New("UpdateAvatar: could not read provided avatar: size 0 bytes") + } + + return buf.Bytes(), f.Close() } - // do the setting isAvatar := true - processingMedia, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, &media.AdditionalInfo{ + ai := &media.AdditionalMediaInfo{ Avatar: &isAvatar, - }) + } + + processingMedia, err := p.mediaManager.ProcessMedia(ctx, dataFunc, accountID, ai) if err != nil { return nil, fmt.Errorf("UpdateAvatar: error processing avatar: %s", err) } - return processingMedia.Load(ctx) + return processingMedia.LoadAttachment(ctx) } // UpdateHeader does the dirty work of checking the header part of an account update form, // parsing and checking the image, and doing the necessary updates in the database for this to become // the account's new header image. func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHeader, accountID string) (*gtsmodel.MediaAttachment, error) { - var err error maxImageSize := viper.GetInt(config.Keys.MediaImageMaxSize) if int(header.Size) > maxImageSize { - err = fmt.Errorf("UpdateHeader: header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) - return nil, err - } - f, err := header.Open() - if err != nil { - return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) + return nil, fmt.Errorf("UpdateHeader: header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) } - // extract the bytes - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) - } - if size == 0 { - return nil, errors.New("UpdateHeader: could not read provided header: size 0 bytes") - } + dataFunc := func(ctx context.Context) ([]byte, error) { + // pop open the fileheader + f, err := header.Open() + if err != nil { + return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) + } + + // extract the bytes + buf := new(bytes.Buffer) + size, err := io.Copy(buf, f) + if err != nil { + return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) + } + if size == 0 { + return nil, errors.New("UpdateHeader: could not read provided header: size 0 bytes") + } - // we're done with the FileHeader now - if err := f.Close(); err != nil { - return nil, fmt.Errorf("UpdateHeader: error closing multipart fileheader: %s", err) + return buf.Bytes(), f.Close() } - // do the setting isHeader := true - processingMedia, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), accountID, &media.AdditionalInfo{ + ai := &media.AdditionalMediaInfo{ Header: &isHeader, - }) + } + + processingMedia, err := p.mediaManager.ProcessMedia(ctx, dataFunc, accountID, ai) + if err != nil { + return nil, fmt.Errorf("UpdateHeader: error processing header: %s", err) + } if err != nil { return nil, fmt.Errorf("UpdateHeader: error processing header: %s", err) } - return processingMedia.Load(ctx) + return processingMedia.LoadAttachment(ctx) } func (p *processor) processNote(ctx context.Context, note string, accountID string) (string, error) { diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 737a4ebe2a..8858dbd024 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -30,30 +30,34 @@ import ( ) func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) { - if user.Admin { + if !user.Admin { return nil, fmt.Errorf("user %s not an admin", user.ID) } - // open the emoji and extract the bytes from it - f, err := form.Image.Open() - if err != nil { - return nil, fmt.Errorf("error opening emoji: %s", err) - } - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("error reading emoji: %s", err) - } - if size == 0 { - return nil, errors.New("could not read provided emoji: size 0 bytes") + data := func(innerCtx context.Context) ([]byte, error) { + // open the emoji and extract the bytes from it + f, err := form.Image.Open() + if err != nil { + return nil, fmt.Errorf("error opening emoji: %s", err) + } + buf := new(bytes.Buffer) + size, err := io.Copy(buf, f) + if err != nil { + return nil, fmt.Errorf("error reading emoji: %s", err) + } + if size == 0 { + return nil, errors.New("could not read provided emoji: size 0 bytes") + } + + return buf.Bytes(), f.Close() } - media, err := p.mediaManager.ProcessEmoji(ctx, buf.Bytes(), account.ID) + processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, form.Shortcode, nil) if err != nil { return nil, err } - emoji, err := media.LoadEmoji(ctx) + emoji, err := processingEmoji.LoadEmoji(ctx) if err != nil { return nil, err } diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index 9df5c7c1f9..0896315b11 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -31,18 +31,21 @@ import ( ) func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form *apimodel.AttachmentRequest) (*apimodel.Attachment, error) { - // open the attachment and extract the bytes from it - f, err := form.File.Open() - if err != nil { - return nil, fmt.Errorf("error opening attachment: %s", err) - } - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("error reading attachment: %s", err) - } - if size == 0 { - return nil, errors.New("could not read provided attachment: size 0 bytes") + data := func(innerCtx context.Context) ([]byte, error) { + // open the attachment and extract the bytes from it + f, err := form.File.Open() + if err != nil { + return nil, fmt.Errorf("error opening attachment: %s", err) + } + buf := new(bytes.Buffer) + size, err := io.Copy(buf, f) + if err != nil { + return nil, fmt.Errorf("error reading attachment: %s", err) + } + if size == 0 { + return nil, errors.New("could not read provided attachment: size 0 bytes") + } + return buf.Bytes(), f.Close() } focusX, focusY, err := parseFocus(form.Focus) @@ -51,7 +54,7 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form } // process the media attachment and load it immediately - media, err := p.mediaManager.ProcessMedia(ctx, buf.Bytes(), account.ID, &media.AdditionalInfo{ + media, err := p.mediaManager.ProcessMedia(ctx, data, account.ID, &media.AdditionalMediaInfo{ Description: &form.Description, FocusX: &focusX, FocusY: &focusY, @@ -60,7 +63,7 @@ func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form return nil, err } - attachment, err := media.Load(ctx) + attachment, err := media.LoadAttachment(ctx) if err != nil { return nil, err } diff --git a/internal/transport/transport.go b/internal/transport/transport.go index b470b289a1..c43515a42f 100644 --- a/internal/transport/transport.go +++ b/internal/transport/transport.go @@ -33,7 +33,7 @@ import ( // functionality for fetching remote media. type Transport interface { pub.Transport - // DereferenceMedia fetches the bytes of the given media attachment IRI, with the expectedContentType. + // DereferenceMedia fetches the bytes of the given media attachment IRI. DereferenceMedia(ctx context.Context, iri *url.URL) ([]byte, error) // DereferenceInstance dereferences remote instance information, first by checking /api/v1/instance, and then by checking /.well-known/nodeinfo. DereferenceInstance(ctx context.Context, iri *url.URL) (*gtsmodel.Instance, error) diff --git a/testrig/testmodels.go b/testrig/testmodels.go index 203aaef966..9a9ea5d2f9 100644 --- a/testrig/testmodels.go +++ b/testrig/testmodels.go @@ -66,6 +66,16 @@ func NewTestTokens() map[string]*gtsmodel.Token { AccessCreateAt: time.Now(), AccessExpiresAt: time.Now().Add(72 * time.Hour), }, + "admin_account": { + ID: "01FS4TP8ANA5VE92EAPA9E0M7Q", + ClientID: "01F8MGWSJCND9BWBD4WGJXBM93", + UserID: "01F8MGWYWKVKS3VS8DV1AMYPGE", + RedirectURI: "http://localhost:8080", + Scope: "read write follow push admin", + Access: "AININALKNENFNF98717NAMG4LWE4NJITMWUXM2M4MTRHZDEX", + AccessCreateAt: time.Now(), + AccessExpiresAt: time.Now().Add(72 * time.Hour), + }, } return tokens } From 33ca5513ada0e21c41e6fe13866b4f5ae961f670 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 11 Jan 2022 17:51:45 +0100 Subject: [PATCH 13/43] pin instanceAccountID to in-process emoji --- internal/media/processingemoji.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index 7e2d4f31f6..41754830f0 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -37,6 +37,9 @@ import ( type ProcessingEmoji struct { mu sync.Mutex + // id of this instance's account -- pinned for convenience here so we only need to fetch it once + instanceAccountID string + /* below fields should be set on newly created media; emoji will be updated incrementally as media goes through processing @@ -370,12 +373,13 @@ func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode } processingEmoji := &ProcessingEmoji{ - emoji: emoji, - data: data, - staticState: received, - fullSizeState: received, - database: m.db, - storage: m.storage, + instanceAccountID: instanceAccount.ID, + emoji: emoji, + data: data, + staticState: received, + fullSizeState: received, + database: m.db, + storage: m.storage, } return processingEmoji, nil From c4a533db72505ca5303d8da637f54fae12b137a2 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 15 Jan 2022 14:33:58 +0100 Subject: [PATCH 14/43] start fixing up emoji processing code --- internal/api/client/admin/emojicreate_test.go | 40 +++++ internal/media/image.go | 5 - internal/media/manager.go | 6 +- internal/media/processingemoji.go | 151 +++++------------- internal/media/processingmedia.go | 35 +--- internal/media/types.go | 124 ++++---------- internal/media/util.go | 123 ++++++++++++++ internal/processing/admin/emoji.go | 11 +- 8 files changed, 249 insertions(+), 246 deletions(-) create mode 100644 internal/media/util.go diff --git a/internal/api/client/admin/emojicreate_test.go b/internal/api/client/admin/emojicreate_test.go index 290b478f70..14b83b534f 100644 --- a/internal/api/client/admin/emojicreate_test.go +++ b/internal/api/client/admin/emojicreate_test.go @@ -1,6 +1,8 @@ package admin_test import ( + "context" + "encoding/json" "io/ioutil" "net/http" "net/http/httptest" @@ -8,6 +10,9 @@ import ( "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/admin" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/testrig" ) @@ -43,6 +48,41 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreate() { b, err := ioutil.ReadAll(result.Body) suite.NoError(err) suite.NotEmpty(b) + + // response should be an api model emoji + apiEmoji := &apimodel.Emoji{} + err = json.Unmarshal(b, apiEmoji) + suite.NoError(err) + + // appropriate fields should be set + suite.Equal("rainbow", apiEmoji.Shortcode) + suite.NotEmpty(apiEmoji.URL) + suite.NotEmpty(apiEmoji.StaticURL) + suite.True(apiEmoji.VisibleInPicker) + + // emoji should be in the db + dbEmoji := >smodel.Emoji{} + err = suite.db.GetWhere(context.Background(), []db.Where{{Key: "shortcode", Value: "rainbow"}}, dbEmoji) + suite.NoError(err) + + // check fields on the emoji + suite.NotEmpty(dbEmoji.ID) + suite.Equal("rainbow", dbEmoji.Shortcode) + suite.Empty(dbEmoji.Domain) + suite.Empty(dbEmoji.ImageRemoteURL) + suite.Empty(dbEmoji.ImageStaticRemoteURL) + suite.Equal(apiEmoji.URL, dbEmoji.ImageURL) + suite.Equal(apiEmoji.StaticURL, dbEmoji.ImageURL) + suite.NotEmpty(dbEmoji.ImagePath) + suite.NotEmpty(dbEmoji.ImageStaticPath) + suite.Equal("image/png", dbEmoji.ImageContentType) + suite.Equal("image/png", dbEmoji.ImageStaticContentType) + suite.Equal(36702, dbEmoji.ImageFileSize) + suite.Equal(10413, dbEmoji.ImageStaticFileSize) + suite.False(dbEmoji.Disabled) + suite.NotEmpty(dbEmoji.URI) + suite.True(dbEmoji.VisibleInPicker) + suite.Empty(dbEmoji.CategoryID)aaaaaaaaa } func TestEmojiCreateTestSuite(t *testing.T) { diff --git a/internal/media/image.go b/internal/media/image.go index a5a818206d..de4b71210e 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -20,21 +20,16 @@ package media import ( "bytes" - "context" "errors" "fmt" "image" "image/gif" "image/jpeg" "image/png" - "time" "github.com/buckket/go-blurhash" "github.com/nfnt/resize" "github.com/superseriousbusiness/exifremove/pkg/exifremove" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" - "github.com/superseriousbusiness/gotosocial/internal/uris" ) const ( diff --git a/internal/media/manager.go b/internal/media/manager.go index e344715910..7f626271af 100644 --- a/internal/media/manager.go +++ b/internal/media/manager.go @@ -41,7 +41,7 @@ type Manager interface { // // ai is optional and can be nil. Any additional information about the attachment provided will be put in the database. ProcessMedia(ctx context.Context, data DataFunc, accountID string, ai *AdditionalMediaInfo) (*ProcessingMedia, error) - ProcessEmoji(ctx context.Context, data DataFunc, shortcode string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) + ProcessEmoji(ctx context.Context, data DataFunc, shortcode string, id string, uri string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) // NumWorkers returns the total number of workers available to this manager. NumWorkers() int // QueueSize returns the total capacity of the queue. @@ -125,8 +125,8 @@ func (m *manager) ProcessMedia(ctx context.Context, data DataFunc, accountID str return processingMedia, nil } -func (m *manager) ProcessEmoji(ctx context.Context, data DataFunc, shortcode string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) { - processingEmoji, err := m.preProcessEmoji(ctx, data, shortcode, ai) +func (m *manager) ProcessEmoji(ctx context.Context, data DataFunc, shortcode string, id string, uri string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) { + processingEmoji, err := m.preProcessEmoji(ctx, data, shortcode, id, uri, ai) if err != nil { return nil, err } diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index 41754830f0..eeccdb2813 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -28,7 +28,6 @@ import ( "codeberg.org/gruf/go-store/kv" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/internal/id" "github.com/superseriousbusiness/gotosocial/internal/uris" ) @@ -126,33 +125,28 @@ func (p *ProcessingEmoji) loadStatic(ctx context.Context) (*ImageMeta, error) { } // set appropriate fields on the emoji based on the static version we derived - p.attachment.FileMeta.Small = gtsmodel.Small{ - Width: static.width, - Height: static.height, - Size: static.size, - Aspect: static.aspect, - } - p.attachment.Thumbnail.FileSize = static.size + p.emoji.ImageStaticFileSize = len(static.image) - if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + // update the emoji in the db + if err := putOrUpdate(ctx, p.database, p.emoji); err != nil { p.err = err - p.thumbstate = errored + p.staticState = errored return nil, err } - // set the thumbnail of this media - p.thumb = static + // set the static on the processing emoji + p.static = static - // we're done processing the thumbnail! - p.thumbstate = complete + // we're done processing the static version of the emoji! + p.staticState = complete fallthrough case complete: - return p.thumb, nil + return p.static, nil case errored: return nil, p.err } - return nil, fmt.Errorf("thumbnail processing status %d unknown", p.thumbstate) + return nil, fmt.Errorf("static processing status %d unknown", p.staticState) } func (p *ProcessingEmoji) loadFullSize(ctx context.Context) (*ImageMeta, error) { @@ -161,26 +155,17 @@ func (p *ProcessingEmoji) loadFullSize(ctx context.Context) (*ImageMeta, error) switch p.fullSizeState { case received: - var clean []byte var err error var decoded *ImageMeta - ct := p.attachment.File.ContentType + ct := p.emoji.ImageContentType switch ct { - case mimeImageJpeg, mimeImagePng: - // first 'clean' image by purging exif data from it - var exifErr error - if clean, exifErr = purgeExif(p.rawData); exifErr != nil { - err = exifErr - break - } - decoded, err = decodeImage(clean, ct) + case mimeImagePng: + decoded, err = decodeImage(p.rawData, ct) case mimeImageGif: - // gifs are already clean - no exif data to remove - clean = p.rawData - decoded, err = decodeGif(clean) + decoded, err = decodeGif(p.rawData) default: - err = fmt.Errorf("content type %s not a processible image type", ct) + err = fmt.Errorf("content type %s not a processible emoji type", ct) } if err != nil { @@ -189,34 +174,17 @@ func (p *ProcessingEmoji) loadFullSize(ctx context.Context) (*ImageMeta, error) return nil, err } - // put the full size in storage - if err := p.storage.Put(p.attachment.File.Path, decoded.image); err != nil { - p.err = fmt.Errorf("error storing full size image: %s", err) + // put the full size emoji in storage + if err := p.storage.Put(p.emoji.ImagePath, decoded.image); err != nil { + p.err = fmt.Errorf("error storing full size emoji: %s", err) p.fullSizeState = errored return nil, p.err } - // set appropriate fields on the attachment based on the image we derived - p.attachment.FileMeta.Original = gtsmodel.Original{ - Width: decoded.width, - Height: decoded.height, - Size: decoded.size, - Aspect: decoded.aspect, - } - p.attachment.File.FileSize = decoded.size - p.attachment.File.UpdatedAt = time.Now() - p.attachment.Processing = gtsmodel.ProcessingStatusProcessed - - if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { - p.err = err - p.fullSizeState = errored - return nil, err - } - // set the fullsize of this media p.fullSize = decoded - // we're done processing the full-size image + // we're done processing the full-size emoji p.fullSizeState = complete fallthrough case complete: @@ -255,55 +223,24 @@ func (p *ProcessingEmoji) fetchRawData(ctx context.Context) error { } split := strings.Split(contentType, "/") - mainType := split[0] // something like 'image' extension := split[1] // something like 'gif' // set some additional fields on the emoji now that // we know more about what the underlying image actually is - p.emoji.ImageURL = uris.GenerateURIForAttachment(p.attachment.AccountID, string(TypeAttachment), string(SizeOriginal), p.attachment.ID, extension) - p.attachment.File.Path = fmt.Sprintf("%s/%s/%s/%s.%s", p.attachment.AccountID, TypeAttachment, SizeOriginal, p.attachment.ID, extension) - p.attachment.File.ContentType = contentType - - switch mainType { - case mimeImage: - if extension == mimeGif { - p.attachment.Type = gtsmodel.FileTypeGif - } else { - p.attachment.Type = gtsmodel.FileTypeImage - } - default: - return fmt.Errorf("fetchRawData: cannot process mime type %s (yet)", mainType) - } - - return nil -} - -// putOrUpdateEmoji is just a convenience function for first trying to PUT the emoji in the database, -// and then if that doesn't work because the emoji already exists, updating it instead. -func putOrUpdateEmoji(ctx context.Context, database db.DB, emoji *gtsmodel.Emoji) error { - if err := database.Put(ctx, emoji); err != nil { - if err != db.ErrAlreadyExists { - return fmt.Errorf("putOrUpdateEmoji: proper error while putting emoji: %s", err) - } - if err := database.UpdateByPrimaryKey(ctx, emoji); err != nil { - return fmt.Errorf("putOrUpdateEmoji: error while updating emoji: %s", err) - } - } + p.emoji.ImageURL = uris.GenerateURIForAttachment(p.instanceAccountID, string(TypeEmoji), string(SizeOriginal), p.emoji.ID, extension) + p.emoji.ImagePath = fmt.Sprintf("%s/%s/%s/%s.%s", p.instanceAccountID, TypeEmoji, SizeOriginal, p.emoji.ID, extension) + p.emoji.ImageContentType = contentType + p.emoji.ImageFileSize = len(p.rawData) return nil } -func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) { +func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode string, id string, uri string, ai *AdditionalEmojiInfo) (*ProcessingEmoji, error) { instanceAccount, err := m.db.GetInstanceAccount(ctx, "") if err != nil { return nil, fmt.Errorf("preProcessEmoji: error fetching this instance account from the db: %s", err) } - id, err := id.NewRandomULID() - if err != nil { - return nil, err - } - // populate initial fields on the emoji -- some of these will be overwritten as we proceed emoji := >smodel.Emoji{ ID: id, @@ -323,7 +260,7 @@ func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode ImageStaticFileSize: 0, ImageUpdatedAt: time.Now(), Disabled: false, - URI: "", // we don't know yet + URI: uri, VisibleInPicker: true, CategoryID: "", } @@ -332,43 +269,31 @@ func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode // and overwrite some of the emoji fields if so if ai != nil { if ai.CreatedAt != nil { - attachment.CreatedAt = *ai.CreatedAt - } - - if ai.StatusID != nil { - attachment.StatusID = *ai.StatusID - } - - if ai.RemoteURL != nil { - attachment.RemoteURL = *ai.RemoteURL - } - - if ai.Description != nil { - attachment.Description = *ai.Description + emoji.CreatedAt = *ai.CreatedAt } - if ai.ScheduledStatusID != nil { - attachment.ScheduledStatusID = *ai.ScheduledStatusID + if ai.Domain != nil { + emoji.Domain = *ai.Domain } - if ai.Blurhash != nil { - attachment.Blurhash = *ai.Blurhash + if ai.ImageRemoteURL != nil { + emoji.ImageRemoteURL = *ai.ImageRemoteURL } - if ai.Avatar != nil { - attachment.Avatar = *ai.Avatar + if ai.ImageStaticRemoteURL != nil { + emoji.ImageStaticRemoteURL = *ai.ImageStaticRemoteURL } - if ai.Header != nil { - attachment.Header = *ai.Header + if ai.Disabled != nil { + emoji.Disabled = *ai.Disabled } - if ai.FocusX != nil { - attachment.FileMeta.Focus.X = *ai.FocusX + if ai.VisibleInPicker != nil { + emoji.VisibleInPicker = *ai.VisibleInPicker } - if ai.FocusY != nil { - attachment.FileMeta.Focus.Y = *ai.FocusY + if ai.CategoryID != nil { + emoji.CategoryID = *ai.CategoryID } } diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index a6e45034f5..1bfd7b629f 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -32,14 +32,6 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/uris" ) -type processState int - -const ( - received processState = iota // processing order has been received but not done yet - complete // processing order has been completed successfully - errored // processing order has been completed with an error -) - // ProcessingMedia represents a piece of media that is currently being processed. It exposes // various functions for retrieving data from the process. type ProcessingMedia struct { @@ -103,10 +95,6 @@ func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAt return p.attachment, nil } -func (p *ProcessingMedia) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { - return nil, nil -} - // Finished returns true if processing has finished for both the thumbnail // and full fized version of this piece of media. func (p *ProcessingMedia) Finished() bool { @@ -153,9 +141,9 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) (*ImageMeta, error) { Size: thumb.size, Aspect: thumb.aspect, } - p.attachment.Thumbnail.FileSize = thumb.size + p.attachment.Thumbnail.FileSize = len(thumb.image) - if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + if err := putOrUpdate(ctx, p.database, p.attachment); err != nil { p.err = err p.thumbstate = errored return nil, err @@ -224,11 +212,11 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) (*ImageMeta, error) Size: decoded.size, Aspect: decoded.aspect, } - p.attachment.File.FileSize = decoded.size + p.attachment.File.FileSize = len(decoded.image) p.attachment.File.UpdatedAt = time.Now() p.attachment.Processing = gtsmodel.ProcessingStatusProcessed - if err := putOrUpdateAttachment(ctx, p.database, p.attachment); err != nil { + if err := putOrUpdate(ctx, p.database, p.attachment); err != nil { p.err = err p.fullSizeState = errored return nil, err @@ -299,21 +287,6 @@ func (p *ProcessingMedia) fetchRawData(ctx context.Context) error { return nil } -// putOrUpdateAttachment is just a convenience function for first trying to PUT the attachment in the database, -// and then if that doesn't work because the attachment already exists, updating it instead. -func putOrUpdateAttachment(ctx context.Context, database db.DB, attachment *gtsmodel.MediaAttachment) error { - if err := database.Put(ctx, attachment); err != nil { - if err != db.ErrAlreadyExists { - return fmt.Errorf("putOrUpdateAttachment: proper error while putting attachment: %s", err) - } - if err := database.UpdateByPrimaryKey(ctx, attachment); err != nil { - return fmt.Errorf("putOrUpdateAttachment: error while updating attachment: %s", err) - } - } - - return nil -} - func (m *manager) preProcessMedia(ctx context.Context, data DataFunc, accountID string, ai *AdditionalMediaInfo) (*ProcessingMedia, error) { id, err := id.NewRandomULID() if err != nil { diff --git a/internal/media/types.go b/internal/media/types.go index 6426223d14..5b3fe4a41a 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -19,15 +19,17 @@ package media import ( - "bytes" "context" - "errors" - "fmt" "time" - - "github.com/h2non/filetype" ) +// maxFileHeaderBytes represents the maximum amount of bytes we want +// to examine from the beginning of a file to determine its type. +// +// See: https://en.wikipedia.org/wiki/File_format#File_header +// and https://github.com/h2non/filetype +const maxFileHeaderBytes = 262 + // mime consts const ( mimeImage = "image" @@ -42,16 +44,17 @@ const ( mimeImagePng = mimeImage + "/" + mimePng ) +type processState int + +const ( + received processState = iota // processing order has been received but not done yet + complete // processing order has been completed successfully + errored // processing order has been completed with an error +) + // EmojiMaxBytes is the maximum permitted bytes of an emoji upload (50kb) // const EmojiMaxBytes = 51200 -// maxFileHeaderBytes represents the maximum amount of bytes we want -// to examine from the beginning of a file to determine its type. -// -// See: https://en.wikipedia.org/wiki/File_format#File_header -// and https://github.com/h2non/filetype -const maxFileHeaderBytes = 262 - type Size string const ( @@ -94,89 +97,24 @@ type AdditionalMediaInfo struct { FocusY *float32 } +// AdditionalMediaInfo represents additional information +// that should be added to an emoji when processing it. type AdditionalEmojiInfo struct { - + // Time that this emoji was created; defaults to time.Now(). + CreatedAt *time.Time + // Domain the emoji originated from. Blank for this instance's domain. Defaults to "". + Domain *string + // URL of this emoji on a remote instance; defaults to "". + ImageRemoteURL *string + // URL of the static version of this emoji on a remote instance; defaults to "". + ImageStaticRemoteURL *string + // Whether this emoji should be disabled (not shown) on this instance; defaults to false. + Disabled *bool + // Whether this emoji should be visible in the instance's emoji picker; defaults to true. + VisibleInPicker *bool + // ID of the category this emoji should be placed in; defaults to "". + CategoryID *string } // DataFunc represents a function used to retrieve the raw bytes of a piece of media. type DataFunc func(ctx context.Context) ([]byte, error) - -// parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). -// Returns an error if the content type is not something we can process. -func parseContentType(content []byte) (string, error) { - - // read in the first bytes of the file - fileHeader := make([]byte, maxFileHeaderBytes) - if _, err := bytes.NewReader(content).Read(fileHeader); err != nil { - return "", fmt.Errorf("could not read first magic bytes of file: %s", err) - } - - kind, err := filetype.Match(fileHeader) - if err != nil { - return "", err - } - - if kind == filetype.Unknown { - return "", errors.New("filetype unknown") - } - - return kind.MIME.Value, nil -} - -// supportedImage checks mime type of an image against a slice of accepted types, -// and returns True if the mime type is accepted. -func supportedImage(mimeType string) bool { - acceptedImageTypes := []string{ - mimeImageJpeg, - mimeImageGif, - mimeImagePng, - } - for _, accepted := range acceptedImageTypes { - if mimeType == accepted { - return true - } - } - return false -} - -// supportedEmoji checks that the content type is image/png -- the only type supported for emoji. -func supportedEmoji(mimeType string) bool { - acceptedEmojiTypes := []string{ - mimeImageGif, - mimeImagePng, - } - for _, accepted := range acceptedEmojiTypes { - if mimeType == accepted { - return true - } - } - return false -} - -// ParseMediaType converts s to a recognized MediaType, or returns an error if unrecognized -func ParseMediaType(s string) (Type, error) { - switch s { - case string(TypeAttachment): - return TypeAttachment, nil - case string(TypeHeader): - return TypeHeader, nil - case string(TypeAvatar): - return TypeAvatar, nil - case string(TypeEmoji): - return TypeEmoji, nil - } - return "", fmt.Errorf("%s not a recognized MediaType", s) -} - -// ParseMediaSize converts s to a recognized MediaSize, or returns an error if unrecognized -func ParseMediaSize(s string) (Size, error) { - switch s { - case string(SizeSmall): - return SizeSmall, nil - case string(SizeOriginal): - return SizeOriginal, nil - case string(SizeStatic): - return SizeStatic, nil - } - return "", fmt.Errorf("%s not a recognized MediaSize", s) -} diff --git a/internal/media/util.go b/internal/media/util.go new file mode 100644 index 0000000000..16e874a997 --- /dev/null +++ b/internal/media/util.go @@ -0,0 +1,123 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package media + +import ( + "bytes" + "context" + "errors" + "fmt" + + "github.com/h2non/filetype" + "github.com/superseriousbusiness/gotosocial/internal/db" +) + +// parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). +// Returns an error if the content type is not something we can process. +func parseContentType(content []byte) (string, error) { + // read in the first bytes of the file + fileHeader := make([]byte, maxFileHeaderBytes) + if _, err := bytes.NewReader(content).Read(fileHeader); err != nil { + return "", fmt.Errorf("could not read first magic bytes of file: %s", err) + } + + kind, err := filetype.Match(fileHeader) + if err != nil { + return "", err + } + + if kind == filetype.Unknown { + return "", errors.New("filetype unknown") + } + + return kind.MIME.Value, nil +} + +// supportedImage checks mime type of an image against a slice of accepted types, +// and returns True if the mime type is accepted. +func supportedImage(mimeType string) bool { + acceptedImageTypes := []string{ + mimeImageJpeg, + mimeImageGif, + mimeImagePng, + } + for _, accepted := range acceptedImageTypes { + if mimeType == accepted { + return true + } + } + return false +} + +// supportedEmoji checks that the content type is image/png -- the only type supported for emoji. +func supportedEmoji(mimeType string) bool { + acceptedEmojiTypes := []string{ + mimeImageGif, + mimeImagePng, + } + for _, accepted := range acceptedEmojiTypes { + if mimeType == accepted { + return true + } + } + return false +} + +// ParseMediaType converts s to a recognized MediaType, or returns an error if unrecognized +func ParseMediaType(s string) (Type, error) { + switch s { + case string(TypeAttachment): + return TypeAttachment, nil + case string(TypeHeader): + return TypeHeader, nil + case string(TypeAvatar): + return TypeAvatar, nil + case string(TypeEmoji): + return TypeEmoji, nil + } + return "", fmt.Errorf("%s not a recognized MediaType", s) +} + +// ParseMediaSize converts s to a recognized MediaSize, or returns an error if unrecognized +func ParseMediaSize(s string) (Size, error) { + switch s { + case string(SizeSmall): + return SizeSmall, nil + case string(SizeOriginal): + return SizeOriginal, nil + case string(SizeStatic): + return SizeStatic, nil + } + return "", fmt.Errorf("%s not a recognized MediaSize", s) +} + +// putOrUpdate is just a convenience function for first trying to PUT the attachment or emoji in the database, +// and then if that doesn't work because the attachment/emoji already exists, updating it instead. +func putOrUpdate(ctx context.Context, database db.DB, i interface{}) error { + if err := database.Put(ctx, i); err != nil { + if err != db.ErrAlreadyExists { + return fmt.Errorf("putOrUpdate: proper error while putting: %s", err) + } + if err := database.UpdateByPrimaryKey(ctx, i); err != nil { + return fmt.Errorf("putOrUpdate: error while updating: %s", err) + } + } + + return nil +} diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 8858dbd024..77fa5102b5 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -27,6 +27,8 @@ import ( apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/id" + "github.com/superseriousbusiness/gotosocial/internal/uris" ) func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) { @@ -52,7 +54,14 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return buf.Bytes(), f.Close() } - processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, form.Shortcode, nil) + emojiID, err := id.NewRandomULID() + if err != nil { + return nil, fmt.Errorf("error creating id for new emoji: %s", err) + } + + emojiURI := uris.GenerateURIForEmoji(emojiID) + + processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, form.Shortcode, emojiID, emojiURI, nil) if err != nil { return nil, err } From 6bf39d0fc1286bdf2f4760adab52c6eff234d01d Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 15 Jan 2022 17:36:15 +0100 Subject: [PATCH 15/43] emoji code passing muster --- internal/api/client/admin/emojicreate.go | 10 ++-- internal/api/client/admin/emojicreate_test.go | 50 ++++++++++++++++--- internal/gtserror/withcode.go | 13 +++++ internal/media/processingemoji.go | 22 +++++--- internal/media/processingmedia.go | 25 +++++----- internal/processing/admin.go | 2 +- internal/processing/admin/admin.go | 2 +- internal/processing/admin/emoji.go | 17 ++++--- internal/processing/processor.go | 2 +- 9 files changed, 104 insertions(+), 39 deletions(-) diff --git a/internal/api/client/admin/emojicreate.go b/internal/api/client/admin/emojicreate.go index de7a2979aa..ef42d0a13a 100644 --- a/internal/api/client/admin/emojicreate.go +++ b/internal/api/client/admin/emojicreate.go @@ -73,6 +73,8 @@ import ( // description: forbidden // '400': // description: bad request +// '409': +// description: conflict -- domain/shortcode combo for emoji already exists func (m *Module) EmojiCreatePOSTHandler(c *gin.Context) { l := logrus.WithFields(logrus.Fields{ "func": "emojiCreatePOSTHandler", @@ -116,10 +118,10 @@ func (m *Module) EmojiCreatePOSTHandler(c *gin.Context) { return } - apiEmoji, err := m.processor.AdminEmojiCreate(c.Request.Context(), authed, form) - if err != nil { - l.Debugf("error creating emoji: %s", err) - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + apiEmoji, errWithCode := m.processor.AdminEmojiCreate(c.Request.Context(), authed, form) + if errWithCode != nil { + l.Debugf("error creating emoji: %s", errWithCode.Error()) + c.JSON(errWithCode.Code(), gin.H{"error": errWithCode.Safe()}) return } diff --git a/internal/api/client/admin/emojicreate_test.go b/internal/api/client/admin/emojicreate_test.go index 14b83b534f..2b7476da19 100644 --- a/internal/api/client/admin/emojicreate_test.go +++ b/internal/api/client/admin/emojicreate_test.go @@ -25,7 +25,7 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreate() { requestBody, w, err := testrig.CreateMultipartFormData( "image", "../../../../testrig/media/rainbow-original.png", map[string]string{ - "shortcode": "rainbow", + "shortcode": "new_emoji", }) if err != nil { panic(err) @@ -55,24 +55,24 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreate() { suite.NoError(err) // appropriate fields should be set - suite.Equal("rainbow", apiEmoji.Shortcode) + suite.Equal("new_emoji", apiEmoji.Shortcode) suite.NotEmpty(apiEmoji.URL) suite.NotEmpty(apiEmoji.StaticURL) suite.True(apiEmoji.VisibleInPicker) // emoji should be in the db dbEmoji := >smodel.Emoji{} - err = suite.db.GetWhere(context.Background(), []db.Where{{Key: "shortcode", Value: "rainbow"}}, dbEmoji) + err = suite.db.GetWhere(context.Background(), []db.Where{{Key: "shortcode", Value: "new_emoji"}}, dbEmoji) suite.NoError(err) // check fields on the emoji suite.NotEmpty(dbEmoji.ID) - suite.Equal("rainbow", dbEmoji.Shortcode) + suite.Equal("new_emoji", dbEmoji.Shortcode) suite.Empty(dbEmoji.Domain) suite.Empty(dbEmoji.ImageRemoteURL) suite.Empty(dbEmoji.ImageStaticRemoteURL) suite.Equal(apiEmoji.URL, dbEmoji.ImageURL) - suite.Equal(apiEmoji.StaticURL, dbEmoji.ImageURL) + suite.Equal(apiEmoji.StaticURL, dbEmoji.ImageStaticURL) suite.NotEmpty(dbEmoji.ImagePath) suite.NotEmpty(dbEmoji.ImageStaticPath) suite.Equal("image/png", dbEmoji.ImageContentType) @@ -82,7 +82,45 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreate() { suite.False(dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(dbEmoji.VisibleInPicker) - suite.Empty(dbEmoji.CategoryID)aaaaaaaaa + suite.Empty(dbEmoji.CategoryID) + + // emoji should be in storage + emojiBytes, err := suite.storage.Get(dbEmoji.ImagePath) + suite.NoError(err) + suite.Len(emojiBytes, dbEmoji.ImageFileSize) + emojiStaticBytes, err := suite.storage.Get(dbEmoji.ImageStaticPath) + suite.NoError(err) + suite.Len(emojiStaticBytes, dbEmoji.ImageStaticFileSize) +} + +func (suite *EmojiCreateTestSuite) TestEmojiCreateAlreadyExists() { + // set up the request -- use a shortcode that already exists for an emoji in the database + requestBody, w, err := testrig.CreateMultipartFormData( + "image", "../../../../testrig/media/rainbow-original.png", + map[string]string{ + "shortcode": "rainbow", + }) + if err != nil { + panic(err) + } + bodyBytes := requestBody.Bytes() + recorder := httptest.NewRecorder() + ctx := suite.newContext(recorder, http.MethodPost, bodyBytes, admin.EmojiPath, w.FormDataContentType()) + + // call the handler + suite.adminModule.EmojiCreatePOSTHandler(ctx) + + suite.Equal(http.StatusConflict, recorder.Code) + + result := recorder.Result() + defer result.Body.Close() + + // check the response + b, err := ioutil.ReadAll(result.Body) + suite.NoError(err) + suite.NotEmpty(b) + + suite.Equal(`{"error":"conflict: emoji with shortcode rainbow already exists"}`, string(b)) } func TestEmojiCreateTestSuite(t *testing.T) { diff --git a/internal/gtserror/withcode.go b/internal/gtserror/withcode.go index a00cc85039..34889b9619 100644 --- a/internal/gtserror/withcode.go +++ b/internal/gtserror/withcode.go @@ -122,3 +122,16 @@ func NewErrorInternalError(original error, helpText ...string) WithCode { code: http.StatusInternalServerError, } } + +// NewErrorConflict returns an ErrorWithCode 409 with the given original error and optional help text. +func NewErrorConflict(original error, helpText ...string) WithCode { + safe := "conflict" + if helpText != nil { + safe = safe + ": " + strings.Join(helpText, ": ") + } + return withCode{ + original: original, + safe: errors.New(safe), + code: http.StatusConflict, + } +} diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index eeccdb2813..467b500fc6 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -72,6 +72,9 @@ type ProcessingEmoji struct { storage *kv.KVStore err error // error created during processing, if any + + // track whether this emoji has already been put in the databse + insertedInDB bool } // EmojiID returns the ID of the underlying emoji without blocking processing. @@ -94,6 +97,16 @@ func (p *ProcessingEmoji) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error return nil, err } + // store the result in the database before returning it + p.mu.Lock() + defer p.mu.Unlock() + if !p.insertedInDB { + if err := p.database.Put(ctx, p.emoji); err != nil { + return nil, err + } + p.insertedInDB = true + } + return p.emoji, nil } @@ -127,13 +140,6 @@ func (p *ProcessingEmoji) loadStatic(ctx context.Context) (*ImageMeta, error) { // set appropriate fields on the emoji based on the static version we derived p.emoji.ImageStaticFileSize = len(static.image) - // update the emoji in the db - if err := putOrUpdate(ctx, p.database, p.emoji); err != nil { - p.err = err - p.staticState = errored - return nil, err - } - // set the static on the processing emoji p.static = static @@ -197,7 +203,7 @@ func (p *ProcessingEmoji) loadFullSize(ctx context.Context) (*ImageMeta, error) } // fetchRawData calls the data function attached to p if it hasn't been called yet, -// and updates the underlying attachment fields as necessary. +// and updates the underlying emoji fields as necessary. // It should only be called from within a function that already has a lock on p! func (p *ProcessingEmoji) fetchRawData(ctx context.Context) error { // check if we've already done this and bail early if we have diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 1bfd7b629f..fade64c244 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -70,6 +70,9 @@ type ProcessingMedia struct { storage *kv.KVStore err error // error created during processing, if any + + // track whether this media has already been put in the databse + insertedInDB bool } // AttachmentID returns the ID of the underlying media attachment without blocking processing. @@ -92,6 +95,16 @@ func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAt return nil, err } + // store the result in the database before returning it + p.mu.Lock() + defer p.mu.Unlock() + if !p.insertedInDB { + if err := p.database.Put(ctx, p.attachment); err != nil { + return nil, err + } + p.insertedInDB = true + } + return p.attachment, nil } @@ -143,12 +156,6 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) (*ImageMeta, error) { } p.attachment.Thumbnail.FileSize = len(thumb.image) - if err := putOrUpdate(ctx, p.database, p.attachment); err != nil { - p.err = err - p.thumbstate = errored - return nil, err - } - // set the thumbnail of this media p.thumb = thumb @@ -216,12 +223,6 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) (*ImageMeta, error) p.attachment.File.UpdatedAt = time.Now() p.attachment.Processing = gtsmodel.ProcessingStatusProcessed - if err := putOrUpdate(ctx, p.database, p.attachment); err != nil { - p.err = err - p.fullSizeState = errored - return nil, err - } - // set the fullsize of this media p.fullSize = decoded diff --git a/internal/processing/admin.go b/internal/processing/admin.go index c70bd79d09..764e6d3027 100644 --- a/internal/processing/admin.go +++ b/internal/processing/admin.go @@ -26,7 +26,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/oauth" ) -func (p *processor) AdminEmojiCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) { +func (p *processor) AdminEmojiCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, gtserror.WithCode) { return p.adminProcessor.EmojiCreate(ctx, authed.Account, authed.User, form) } diff --git a/internal/processing/admin/admin.go b/internal/processing/admin/admin.go index 27a7da47a1..bdb586588c 100644 --- a/internal/processing/admin/admin.go +++ b/internal/processing/admin/admin.go @@ -38,7 +38,7 @@ type Processor interface { DomainBlocksGet(ctx context.Context, account *gtsmodel.Account, export bool) ([]*apimodel.DomainBlock, gtserror.WithCode) DomainBlockGet(ctx context.Context, account *gtsmodel.Account, id string, export bool) (*apimodel.DomainBlock, gtserror.WithCode) DomainBlockDelete(ctx context.Context, account *gtsmodel.Account, id string) (*apimodel.DomainBlock, gtserror.WithCode) - EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) + EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, gtserror.WithCode) } type processor struct { diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 77fa5102b5..fcc17c4be1 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -26,14 +26,16 @@ import ( "io" apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" "github.com/superseriousbusiness/gotosocial/internal/uris" ) -func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) { +func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, user *gtsmodel.User, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, gtserror.WithCode) { if !user.Admin { - return nil, fmt.Errorf("user %s not an admin", user.ID) + return nil, gtserror.NewErrorNotAuthorized(fmt.Errorf("user %s not an admin", user.ID), "user is not an admin") } data := func(innerCtx context.Context) ([]byte, error) { @@ -56,24 +58,27 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, emojiID, err := id.NewRandomULID() if err != nil { - return nil, fmt.Errorf("error creating id for new emoji: %s", err) + return nil, gtserror.NewErrorInternalError(fmt.Errorf("error creating id for new emoji: %s", err), "error creating emoji ID") } emojiURI := uris.GenerateURIForEmoji(emojiID) processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, form.Shortcode, emojiID, emojiURI, nil) if err != nil { - return nil, err + return nil, gtserror.NewErrorInternalError(fmt.Errorf("error processing emoji: %s", err), "error processing emoji") } emoji, err := processingEmoji.LoadEmoji(ctx) if err != nil { - return nil, err + if err == db.ErrAlreadyExists { + return nil, gtserror.NewErrorConflict(fmt.Errorf("emoji with shortcode %s already exists", form.Shortcode), fmt.Sprintf("emoji with shortcode %s already exists", form.Shortcode)) + } + return nil, gtserror.NewErrorInternalError(fmt.Errorf("error loading emoji: %s", err), "error loading emoji") } apiEmoji, err := p.tc.EmojiToAPIEmoji(ctx, emoji) if err != nil { - return nil, fmt.Errorf("error converting emoji to apitype: %s", err) + return nil, gtserror.NewErrorInternalError(fmt.Errorf("error converting emoji: %s", err), "error converting emoji to api representation") } return &apiEmoji, nil diff --git a/internal/processing/processor.go b/internal/processing/processor.go index 2626c1fea9..2406681eab 100644 --- a/internal/processing/processor.go +++ b/internal/processing/processor.go @@ -96,7 +96,7 @@ type Processor interface { AccountBlockRemove(ctx context.Context, authed *oauth.Auth, targetAccountID string) (*apimodel.Relationship, gtserror.WithCode) // AdminEmojiCreate handles the creation of a new instance emoji by an admin, using the given form. - AdminEmojiCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, error) + AdminEmojiCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.EmojiCreateRequest) (*apimodel.Emoji, gtserror.WithCode) // AdminDomainBlockCreate handles the creation of a new domain block by an admin, using the given form. AdminDomainBlockCreate(ctx context.Context, authed *oauth.Auth, form *apimodel.DomainBlockCreateRequest) (*apimodel.DomainBlock, gtserror.WithCode) // AdminDomainBlocksImport handles the import of multiple domain blocks by an admin, using the given form. From 723bfe8944f80fd1ef935ad6878fc555fd42b8e7 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 15 Jan 2022 17:41:18 +0100 Subject: [PATCH 16/43] lint, fmt --- internal/media/processingmedia.go | 21 +++++++++------------ internal/media/util.go | 19 +------------------ 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index fade64c244..082c586077 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -260,31 +260,28 @@ func (p *ProcessingMedia) fetchRawData(ctx context.Context) error { return fmt.Errorf("fetchRawData: error parsing content type: %s", err) } + if !supportedImage(contentType) { + return fmt.Errorf("fetchRawData: media type %s not (yet) supported", contentType) + } + split := strings.Split(contentType, "/") if len(split) != 2 { return fmt.Errorf("fetchRawData: content type %s was not valid", contentType) } - mainType := split[0] // something like 'image' extension := split[1] // something like 'jpeg' // set some additional fields on the attachment now that // we know more about what the underlying media actually is + if extension == mimeGif { + p.attachment.Type = gtsmodel.FileTypeGif + } else { + p.attachment.Type = gtsmodel.FileTypeImage + } p.attachment.URL = uris.GenerateURIForAttachment(p.attachment.AccountID, string(TypeAttachment), string(SizeOriginal), p.attachment.ID, extension) p.attachment.File.Path = fmt.Sprintf("%s/%s/%s/%s.%s", p.attachment.AccountID, TypeAttachment, SizeOriginal, p.attachment.ID, extension) p.attachment.File.ContentType = contentType - switch mainType { - case mimeImage: - if extension == mimeGif { - p.attachment.Type = gtsmodel.FileTypeGif - } else { - p.attachment.Type = gtsmodel.FileTypeImage - } - default: - return fmt.Errorf("fetchRawData: cannot process mime type %s (yet)", mainType) - } - return nil } diff --git a/internal/media/util.go b/internal/media/util.go index 16e874a997..7a3d81c0f0 100644 --- a/internal/media/util.go +++ b/internal/media/util.go @@ -20,12 +20,10 @@ package media import ( "bytes" - "context" "errors" "fmt" "github.com/h2non/filetype" - "github.com/superseriousbusiness/gotosocial/internal/db" ) // parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). @@ -65,7 +63,7 @@ func supportedImage(mimeType string) bool { return false } -// supportedEmoji checks that the content type is image/png -- the only type supported for emoji. +// supportedEmoji checks that the content type is image/png or image/gif -- the only types supported for emoji. func supportedEmoji(mimeType string) bool { acceptedEmojiTypes := []string{ mimeImageGif, @@ -106,18 +104,3 @@ func ParseMediaSize(s string) (Size, error) { } return "", fmt.Errorf("%s not a recognized MediaSize", s) } - -// putOrUpdate is just a convenience function for first trying to PUT the attachment or emoji in the database, -// and then if that doesn't work because the attachment/emoji already exists, updating it instead. -func putOrUpdate(ctx context.Context, database db.DB, i interface{}) error { - if err := database.Put(ctx, i); err != nil { - if err != db.ErrAlreadyExists { - return fmt.Errorf("putOrUpdate: proper error while putting: %s", err) - } - if err := database.UpdateByPrimaryKey(ctx, i); err != nil { - return fmt.Errorf("putOrUpdate: error while updating: %s", err) - } - } - - return nil -} From 18047de666c2028b6dd8f90bf3f300b5ed932247 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 15 Jan 2022 17:47:52 +0100 Subject: [PATCH 17/43] add go-runners to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ae50e9f0dd..1d5e5fb191 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ The following libraries and frameworks are used by GoToSocial, with gratitude - [google/uuid](https://github.com/google/uuid); UUID generation. [BSD-3-Clause License](https://spdx.org/licenses/BSD-3-Clause.html) - [go-playground/validator](https://github.com/go-playground/validator); struct validation. [MIT License](https://spdx.org/licenses/MIT.html) - [gorilla/websocket](https://github.com/gorilla/websocket); Websocket connectivity. [BSD-2-Clause License](https://spdx.org/licenses/BSD-2-Clause.html). +- [gruf/go-runners](https://codeberg.org/gruf/go-runners); worker pool library. [MIT License](https://spdx.org/licenses/MIT.html). - [gruf/go-store](https://codeberg.org/gruf/go-store); cacheing library. [MIT License](https://spdx.org/licenses/MIT.html). - [h2non/filetype](https://github.com/h2non/filetype); filetype checking. [MIT License](https://spdx.org/licenses/MIT.html). - [jackc/pgx](https://github.com/jackc/pgx); Postgres driver. [MIT License](https://spdx.org/licenses/MIT.html). From 6f5ccf435585e43a00e3cc50f4bcefac36ada818 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 16 Jan 2022 18:52:30 +0100 Subject: [PATCH 18/43] update dependencies --- go.mod | 6 +- go.sum | 11 + vendor/codeberg.org/gruf/go-errors/data.go | 27 +- .../gruf/{go-logger => go-format}/LICENSE | 0 vendor/codeberg.org/gruf/go-format/README.md | 16 + vendor/codeberg.org/gruf/go-format/buffer.go | 81 + vendor/codeberg.org/gruf/go-format/format.go | 565 ++++ .../codeberg.org/gruf/go-format/formatter.go | 352 +++ vendor/codeberg.org/gruf/go-format/print.go | 88 + vendor/codeberg.org/gruf/go-format/util.go | 13 + vendor/codeberg.org/gruf/go-logger/README.md | 13 - vendor/codeberg.org/gruf/go-logger/clock.go | 21 - vendor/codeberg.org/gruf/go-logger/default.go | 107 - vendor/codeberg.org/gruf/go-logger/entry.go | 385 --- vendor/codeberg.org/gruf/go-logger/format.go | 87 - .../gruf/go-logger/format_text.go | 914 ------ vendor/codeberg.org/gruf/go-logger/hook.go | 13 - vendor/codeberg.org/gruf/go-logger/level.go | 38 - vendor/codeberg.org/gruf/go-logger/logger.go | 187 -- vendor/codeberg.org/gruf/go-logger/writer.go | 29 - .../codeberg.org/gruf/go-store/kv/iterator.go | 2 +- vendor/codeberg.org/gruf/go-store/kv/state.go | 18 +- vendor/codeberg.org/gruf/go-store/kv/store.go | 82 +- .../gruf/go-store/storage/block.go | 57 +- .../gruf/go-store/storage/disk.go | 29 +- .../codeberg.org/gruf/go-store/storage/fs.go | 2 +- .../gruf/go-store/storage/lock.go | 16 +- .../gruf/go-store/storage/memory.go | 53 +- .../gruf/go-store/storage/storage.go | 9 +- vendor/github.com/zeebo/blake3/.gitignore | 6 + vendor/github.com/zeebo/blake3/LICENSE | 125 + vendor/github.com/zeebo/blake3/Makefile | 11 + vendor/github.com/zeebo/blake3/README.md | 77 + vendor/github.com/zeebo/blake3/api.go | 166 ++ vendor/github.com/zeebo/blake3/blake3.go | 285 ++ vendor/github.com/zeebo/blake3/digest.go | 100 + .../zeebo/blake3/internal/alg/alg.go | 18 + .../blake3/internal/alg/compress/compress.go | 15 + .../alg/compress/compress_pure/compress.go | 135 + .../alg/compress/compress_sse41/impl_amd64.s | 560 ++++ .../alg/compress/compress_sse41/impl_other.go | 9 + .../alg/compress/compress_sse41/stubs.go | 6 + .../zeebo/blake3/internal/alg/hash/hash.go | 23 + .../internal/alg/hash/hash_avx2/impl_amd64.s | 2561 +++++++++++++++++ .../internal/alg/hash/hash_avx2/impl_other.go | 13 + .../internal/alg/hash/hash_avx2/stubs.go | 9 + .../internal/alg/hash/hash_pure/hashf.go | 56 + .../internal/alg/hash/hash_pure/hashp.go | 38 + .../zeebo/blake3/internal/consts/consts.go | 29 + .../zeebo/blake3/internal/consts/cpu.go | 17 + .../zeebo/blake3/internal/consts/cpu_big.go | 5 + .../blake3/internal/consts/cpu_little.go | 5 + .../zeebo/blake3/internal/consts/cpu_other.go | 7 + .../zeebo/blake3/internal/utils/utils.go | 60 + vendor/modules.txt | 20 +- 55 files changed, 5673 insertions(+), 1904 deletions(-) rename vendor/codeberg.org/gruf/{go-logger => go-format}/LICENSE (100%) create mode 100644 vendor/codeberg.org/gruf/go-format/README.md create mode 100644 vendor/codeberg.org/gruf/go-format/buffer.go create mode 100644 vendor/codeberg.org/gruf/go-format/format.go create mode 100644 vendor/codeberg.org/gruf/go-format/formatter.go create mode 100644 vendor/codeberg.org/gruf/go-format/print.go create mode 100644 vendor/codeberg.org/gruf/go-format/util.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/README.md delete mode 100644 vendor/codeberg.org/gruf/go-logger/clock.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/default.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/entry.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/format.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/format_text.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/hook.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/level.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/logger.go delete mode 100644 vendor/codeberg.org/gruf/go-logger/writer.go create mode 100644 vendor/github.com/zeebo/blake3/.gitignore create mode 100644 vendor/github.com/zeebo/blake3/LICENSE create mode 100644 vendor/github.com/zeebo/blake3/Makefile create mode 100644 vendor/github.com/zeebo/blake3/README.md create mode 100644 vendor/github.com/zeebo/blake3/api.go create mode 100644 vendor/github.com/zeebo/blake3/blake3.go create mode 100644 vendor/github.com/zeebo/blake3/digest.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/alg.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go create mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go create mode 100644 vendor/github.com/zeebo/blake3/internal/consts/consts.go create mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu.go create mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go create mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go create mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go create mode 100644 vendor/github.com/zeebo/blake3/internal/utils/utils.go diff --git a/go.mod b/go.mod index 71509ee6ad..75956c7d6f 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( codeberg.org/gruf/go-runners v1.2.0 - codeberg.org/gruf/go-store v1.1.5 + codeberg.org/gruf/go-store v1.2.2 github.com/ReneKroon/ttlcache v1.7.0 github.com/buckket/go-blurhash v1.1.0 github.com/coreos/go-oidc/v3 v3.1.0 @@ -46,8 +46,9 @@ require ( require ( codeberg.org/gruf/go-bytes v1.0.2 // indirect - codeberg.org/gruf/go-errors v1.0.4 // indirect + codeberg.org/gruf/go-errors v1.0.5 // indirect codeberg.org/gruf/go-fastpath v1.0.2 // indirect + codeberg.org/gruf/go-format v1.0.3 // indirect codeberg.org/gruf/go-hashenc v1.0.1 // indirect codeberg.org/gruf/go-logger v1.3.2 // indirect codeberg.org/gruf/go-mutexes v1.0.1 // indirect @@ -107,6 +108,7 @@ require ( github.com/ugorji/go/codec v1.2.6 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/zeebo/blake3 v0.2.1 // indirect golang.org/x/mod v0.5.1 // indirect golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect diff --git a/go.sum b/go.sum index 05d7597e11..082158f63a 100644 --- a/go.sum +++ b/go.sum @@ -53,9 +53,13 @@ codeberg.org/gruf/go-bytes v1.0.2/go.mod h1:1v/ibfaosfXSZtRdW2rWaVrDXMc9E3bsi/M9 codeberg.org/gruf/go-cache v1.1.2/go.mod h1:/Dbc+xU72Op3hMn6x2PXF3NE9uIDFeS+sXPF00hN/7o= codeberg.org/gruf/go-errors v1.0.4 h1:jOJCn/GMb6ELLRVlnmpimGRC2CbTreH5/CBZNWh9GZA= codeberg.org/gruf/go-errors v1.0.4/go.mod h1:rJ08LdIE79Jg8vZ2TGylz/I+tZ1UuMJkGK5mNambIfQ= +codeberg.org/gruf/go-errors v1.0.5 h1:rxV70oQkfasUdggLHxOX2QAoJOMFM7XWxHQR45Zx/Fg= +codeberg.org/gruf/go-errors v1.0.5/go.mod h1:n03EpmvcmfzU3/xJKC0XXtleXXJUNFpT2fgISODvZ1Y= codeberg.org/gruf/go-fastpath v1.0.1/go.mod h1:edveE/Kp3Eqi0JJm0lXYdkVrB28cNUkcb/bRGFTPqeI= codeberg.org/gruf/go-fastpath v1.0.2 h1:O3nuYPMXnN89dsgAwVFU5iCGINtPJdITWmbRe2an/iQ= codeberg.org/gruf/go-fastpath v1.0.2/go.mod h1:edveE/Kp3Eqi0JJm0lXYdkVrB28cNUkcb/bRGFTPqeI= +codeberg.org/gruf/go-format v1.0.3 h1:WoUGzTwZe6SIhILNvtr0qNIA7BOOCgdBlk5bUrfeiio= +codeberg.org/gruf/go-format v1.0.3/go.mod h1:k3TLXp1dqAXdDqxlon0yEM+3FFHdNn0D6BVJTwTy5As= codeberg.org/gruf/go-hashenc v1.0.1 h1:EBvNe2wW8IPMUqT1XihB6/IM6KMJDLMFBxIUvmsy1f8= codeberg.org/gruf/go-hashenc v1.0.1/go.mod h1:IfHhPCVScOiYmJLqdCQT9bYVS1nxNTV4ewMUvFWDPtc= codeberg.org/gruf/go-logger v1.3.1/go.mod h1:tBduUc+Yb9vqGRxY9/FB0ZlYznSteLy/KmIANo7zFjA= @@ -74,6 +78,8 @@ codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBs codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-store v1.1.5 h1:fp28vzGD15OsAF51CCwi7woH+Y3vb0aMl4OFh9JSjA0= codeberg.org/gruf/go-store v1.1.5/go.mod h1:Q6ev500ddKghDQ8KS4IstL/W9fptDKa2T9oeHP+tXsI= +codeberg.org/gruf/go-store v1.2.2 h1:YJPzJpZv/D3t9hQC00/u76eQDScQw4++OWjfobnjHAA= +codeberg.org/gruf/go-store v1.2.2/go.mod h1:Xjw1U098th0yXF2CCx6jThQ+9FIPWAX9OGjYslO+UtE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -734,6 +740,10 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/blake3 v0.2.1 h1:O+N0Y8Re2XAYjp0adlZDA2juyRguhMfPCgh8YIf7vyE= +github.com/zeebo/blake3 v0.2.1/go.mod h1:TSQ0KjMH+pht+bRyvVooJ1rBpvvngSGaPISafq9MxJk= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= @@ -949,6 +959,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/codeberg.org/gruf/go-errors/data.go b/vendor/codeberg.org/gruf/go-errors/data.go index 3b242f03c8..b5226172c2 100644 --- a/vendor/codeberg.org/gruf/go-errors/data.go +++ b/vendor/codeberg.org/gruf/go-errors/data.go @@ -4,17 +4,9 @@ import ( "fmt" "sync" - "codeberg.org/gruf/go-bytes" - "codeberg.org/gruf/go-logger" + "codeberg.org/gruf/go-format" ) -// global logfmt data formatter. -var logfmt = logger.TextFormat{ - Strict: false, - Verbose: true, - MaxDepth: 5, -} - // KV is a structure for setting key-value pairs in ErrorData. type KV struct { Key string @@ -31,7 +23,7 @@ type ErrorData interface { Append(...KV) // Implement byte slice representation formatter. - logger.Formattable + format.Formattable // Implement string representation formatter. fmt.Stringer @@ -89,13 +81,22 @@ func (d *errorData) Append(kvs ...KV) { } func (d *errorData) AppendFormat(b []byte) []byte { - buf := bytes.Buffer{B: b} + buf := format.Buffer{B: b} d.mu.Lock() buf.B = append(buf.B, '{') + + // Append data as kv pairs for i := range d.data { - logfmt.AppendKey(&buf, d.data[i].Key) - logfmt.AppendValue(&buf, d.data[i].Value) + key := d.data[i].Key + val := d.data[i].Value + format.Appendf(&buf, "{:k}={:v} ", key, val) } + + // Drop trailing space + if len(d.data) > 0 { + buf.Truncate(1) + } + buf.B = append(buf.B, '}') d.mu.Unlock() return buf.B diff --git a/vendor/codeberg.org/gruf/go-logger/LICENSE b/vendor/codeberg.org/gruf/go-format/LICENSE similarity index 100% rename from vendor/codeberg.org/gruf/go-logger/LICENSE rename to vendor/codeberg.org/gruf/go-format/LICENSE diff --git a/vendor/codeberg.org/gruf/go-format/README.md b/vendor/codeberg.org/gruf/go-format/README.md new file mode 100644 index 0000000000..7126e215e9 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-format/README.md @@ -0,0 +1,16 @@ +# go-format + +String formatting package using Rust-style formatting directives. + +Output is generally more visually-friendly than `"fmt"`, while performance is neck-and-neck. + +README is WIP. + +## todos + +- improved verbose printing of number types + +- more test cases + +- improved verbose printing of string ptr types + diff --git a/vendor/codeberg.org/gruf/go-format/buffer.go b/vendor/codeberg.org/gruf/go-format/buffer.go new file mode 100644 index 0000000000..393f2fcd39 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-format/buffer.go @@ -0,0 +1,81 @@ +package format + +import ( + "io" + "unicode/utf8" + "unsafe" +) + +// ensure we conform to io.Writer. +var _ io.Writer = (*Buffer)(nil) + +// Buffer is a simple wrapper around a byte slice. +type Buffer struct { + B []byte +} + +// Write will append given byte slice to buffer, fulfilling io.Writer. +func (buf *Buffer) Write(b []byte) (int, error) { + buf.B = append(buf.B, b...) + return len(b), nil +} + +// AppendByte appends given byte to the buffer. +func (buf *Buffer) AppendByte(b byte) { + buf.B = append(buf.B, b) +} + +// AppendRune appends given rune to the buffer. +func (buf *Buffer) AppendRune(r rune) { + if r < utf8.RuneSelf { + buf.B = append(buf.B, byte(r)) + return + } + + l := buf.Len() + for i := 0; i < utf8.UTFMax; i++ { + buf.B = append(buf.B, 0) + } + n := utf8.EncodeRune(buf.B[l:buf.Len()], r) + buf.B = buf.B[:l+n] +} + +// Append will append given byte slice to the buffer. +func (buf *Buffer) Append(b []byte) { + buf.B = append(buf.B, b...) +} + +// AppendString appends given string to the buffer. +func (buf *Buffer) AppendString(s string) { + buf.B = append(buf.B, s...) +} + +// Len returns the length of the buffer's underlying byte slice. +func (buf *Buffer) Len() int { + return len(buf.B) +} + +// Cap returns the capacity of the buffer's underlying byte slice. +func (buf *Buffer) Cap() int { + return cap(buf.B) +} + +// Truncate will reduce the length of the buffer by 'n'. +func (buf *Buffer) Truncate(n int) { + if n > len(buf.B) { + n = len(buf.B) + } + buf.B = buf.B[:buf.Len()-n] +} + +// Reset will reset the buffer length to 0 (retains capacity). +func (buf *Buffer) Reset() { + buf.B = buf.B[:0] +} + +// String returns the underlying byte slice as a string. Please note +// this value is tied directly to the underlying byte slice, if you +// write to the buffer then returned string values will also change. +func (buf *Buffer) String() string { + return *(*string)(unsafe.Pointer(&buf.B)) +} diff --git a/vendor/codeberg.org/gruf/go-format/format.go b/vendor/codeberg.org/gruf/go-format/format.go new file mode 100644 index 0000000000..856fe890ed --- /dev/null +++ b/vendor/codeberg.org/gruf/go-format/format.go @@ -0,0 +1,565 @@ +package format + +import ( + "reflect" + "strconv" + "unsafe" +) + +// Formattable defines a type capable of being formatted and appended to a byte buffer. +type Formattable interface { + AppendFormat([]byte) []byte +} + +// format is the object passed among the append___ formatting functions. +type format struct { + flags uint8 // 'isKey' and 'verbose' flags + drefs uint8 // current value deref count + curd uint8 // current depth + maxd uint8 // maximum depth + buf *Buffer // out buffer +} + +const ( + // flag bit constants. + isKeyBit = uint8(1) << 0 + isValBit = uint8(1) << 1 + vboseBit = uint8(1) << 2 + panicBit = uint8(1) << 3 +) + +// AtMaxDepth returns whether format is currently at max depth. +func (f format) AtMaxDepth() bool { + return f.curd > f.maxd +} + +// Derefs returns no. times current value has been dereferenced. +func (f format) Derefs() uint8 { + return f.drefs +} + +// IsKey returns whether the isKey flag is set. +func (f format) IsKey() bool { + return (f.flags & isKeyBit) != 0 +} + +// IsValue returns whether the isVal flag is set. +func (f format) IsValue() bool { + return (f.flags & isValBit) != 0 +} + +// Verbose returns whether the verbose flag is set. +func (f format) Verbose() bool { + return (f.flags & vboseBit) != 0 +} + +// Panic returns whether the panic flag is set. +func (f format) Panic() bool { + return (f.flags & panicBit) != 0 +} + +// SetIsKey returns format instance with the isKey bit set to value. +func (f format) SetIsKey() format { + return format{ + flags: f.flags & ^isValBit | isKeyBit, + curd: f.curd, + maxd: f.maxd, + buf: f.buf, + } +} + +// SetIsValue returns format instance with the isVal bit set to value. +func (f format) SetIsValue() format { + return format{ + flags: f.flags & ^isKeyBit | isValBit, + curd: f.curd, + maxd: f.maxd, + buf: f.buf, + } +} + +// SetPanic returns format instance with the panic bit set to value. +func (f format) SetPanic() format { + return format{ + flags: f.flags | panicBit /* handle panic as value */ | isValBit & ^isKeyBit, + curd: f.curd, + maxd: f.maxd, + buf: f.buf, + } +} + +// IncrDepth returns format instance with depth incremented. +func (f format) IncrDepth() format { + return format{ + flags: f.flags, + curd: f.curd + 1, + maxd: f.maxd, + buf: f.buf, + } +} + +// IncrDerefs returns format instance with dereference count incremented. +func (f format) IncrDerefs() format { + return format{ + flags: f.flags, + drefs: f.drefs + 1, + curd: f.curd, + maxd: f.maxd, + buf: f.buf, + } +} + +// appendType appends a type using supplied type str. +func appendType(fmt format, t string) { + for i := uint8(0); i < fmt.Derefs(); i++ { + fmt.buf.AppendByte('*') + } + fmt.buf.AppendString(t) +} + +// appendNilType Appends nil to buf, type included if verbose. +func appendNilType(fmt format, t string) { + if fmt.Verbose() { + fmt.buf.AppendByte('(') + appendType(fmt, t) + fmt.buf.AppendString(`)(nil)`) + } else { + fmt.buf.AppendString(`nil`) + } +} + +// appendByte Appends a single byte to buf. +func appendByte(fmt format, b byte) { + if fmt.IsValue() || fmt.Verbose() { + fmt.buf.AppendString(`'` + string(b) + `'`) + } else { + fmt.buf.AppendByte(b) + } +} + +// appendBytes Appends a quoted byte slice to buf. +func appendBytes(fmt format, b []byte) { + if b == nil { + // Bytes CAN be nil formatted + appendNilType(fmt, `[]byte`) + } else { + // Append bytes as slice + fmt.buf.AppendByte('[') + for _, b := range b { + fmt.buf.AppendByte(b) + fmt.buf.AppendByte(',') + } + if len(b) > 0 { + fmt.buf.Truncate(1) + } + fmt.buf.AppendByte(']') + } +} + +// appendString Appends an escaped, double-quoted string to buf. +func appendString(fmt format, s string) { + switch { + // Key in a key-value pair + case fmt.IsKey(): + if !strconv.CanBackquote(s) { + // Requires quoting AND escaping + fmt.buf.B = strconv.AppendQuote(fmt.buf.B, s) + } else if containsSpaceOrTab(s) { + // Contains space, needs quotes + fmt.buf.AppendString(`"` + s + `"`) + } else { + // All else write as-is + fmt.buf.AppendString(s) + } + + // Value in a key-value pair (always escape+quote) + case fmt.IsValue(): + fmt.buf.B = strconv.AppendQuote(fmt.buf.B, s) + + // Verbose but neither key nor value (always quote) + case fmt.Verbose(): + fmt.buf.AppendString(`"` + s + `"`) + + // All else + default: + fmt.buf.AppendString(s) + } +} + +// appendBool Appends a formatted bool to buf. +func appendBool(fmt format, b bool) { + fmt.buf.B = strconv.AppendBool(fmt.buf.B, b) +} + +// appendInt Appends a formatted int to buf. +func appendInt(fmt format, i int64) { + fmt.buf.B = strconv.AppendInt(fmt.buf.B, i, 10) +} + +// appendUint Appends a formatted uint to buf. +func appendUint(fmt format, u uint64) { + fmt.buf.B = strconv.AppendUint(fmt.buf.B, u, 10) +} + +// appendFloat Appends a formatted float to buf. +func appendFloat(fmt format, f float64) { + fmt.buf.B = strconv.AppendFloat(fmt.buf.B, f, 'G', -1, 64) +} + +// appendComplex Appends a formatted complex128 to buf. +func appendComplex(fmt format, c complex128) { + appendFloat(fmt, real(c)) + fmt.buf.AppendByte('+') + appendFloat(fmt, imag(c)) + fmt.buf.AppendByte('i') +} + +// isNil will safely check if 'v' is nil without dealing with weird Go interface nil bullshit. +func isNil(i interface{}) bool { + e := *(*struct { + _ unsafe.Pointer // type + v unsafe.Pointer // value + })(unsafe.Pointer(&i)) + return (e.v == nil) +} + +// appendIfaceOrReflectValue will attempt to append as interface, falling back to reflection. +func appendIfaceOrRValue(fmt format, i interface{}) { + if !appendIface(fmt, i) { + appendRValue(fmt, reflect.ValueOf(i)) + } +} + +// appendValueNext checks for interface methods before performing appendRValue, checking + incr depth. +func appendRValueOrIfaceNext(fmt format, v reflect.Value) { + // Check we haven't hit max + if fmt.AtMaxDepth() { + fmt.buf.AppendString("...") + return + } + + // Incr the depth + fmt = fmt.IncrDepth() + + // Make actual call + if !v.CanInterface() || !appendIface(fmt, v.Interface()) { + appendRValue(fmt, v) + } +} + +// appendIface parses and Appends a formatted interface value to buf. +func appendIface(fmt format, i interface{}) (ok bool) { + ok = true // default + catchPanic := func() { + if r := recover(); r != nil { + // DON'T recurse catchPanic() + if fmt.Panic() { + panic(r) + } + + // Attempt to decode panic into buf + fmt.buf.AppendString(`!{PANIC=`) + appendIfaceOrRValue(fmt.SetPanic(), r) + fmt.buf.AppendByte('}') + + // Ensure return + ok = true + } + } + + switch i := i.(type) { + // Nil type + case nil: + fmt.buf.AppendString(`nil`) + + // Reflect types + case reflect.Type: + if isNil(i) /* safer nil check */ { + appendNilType(fmt, `reflect.Type`) + } else { + appendType(fmt, `reflect.Type`) + fmt.buf.AppendString(`(` + i.String() + `)`) + } + case reflect.Value: + appendType(fmt, `reflect.Value`) + fmt.buf.AppendByte('(') + fmt.flags |= vboseBit + appendRValue(fmt, i) + fmt.buf.AppendByte(')') + + // Bytes and string types + case byte: + appendByte(fmt, i) + case []byte: + appendBytes(fmt, i) + case string: + appendString(fmt, i) + + // Int types + case int: + appendInt(fmt, int64(i)) + case int8: + appendInt(fmt, int64(i)) + case int16: + appendInt(fmt, int64(i)) + case int32: + appendInt(fmt, int64(i)) + case int64: + appendInt(fmt, i) + + // Uint types + case uint: + appendUint(fmt, uint64(i)) + // case uint8 :: this is 'byte' + case uint16: + appendUint(fmt, uint64(i)) + case uint32: + appendUint(fmt, uint64(i)) + case uint64: + appendUint(fmt, i) + + // Float types + case float32: + appendFloat(fmt, float64(i)) + case float64: + appendFloat(fmt, i) + + // Bool type + case bool: + appendBool(fmt, i) + + // Complex types + case complex64: + appendComplex(fmt, complex128(i)) + case complex128: + appendComplex(fmt, i) + + // Method types + case error: + switch { + case fmt.Verbose(): + ok = false + case isNil(i) /* use safer nil check */ : + appendNilType(fmt, reflect.TypeOf(i).String()) + default: + defer catchPanic() + appendString(fmt, i.Error()) + } + case Formattable: + switch { + case fmt.Verbose(): + ok = false + case isNil(i) /* use safer nil check */ : + appendNilType(fmt, reflect.TypeOf(i).String()) + default: + defer catchPanic() + fmt.buf.B = i.AppendFormat(fmt.buf.B) + } + case interface{ String() string }: + switch { + case fmt.Verbose(): + ok = false + case isNil(i) /* use safer nil check */ : + appendNilType(fmt, reflect.TypeOf(i).String()) + default: + defer catchPanic() + appendString(fmt, i.String()) + } + + // No quick handler + default: + ok = false + } + + return ok +} + +// appendReflectValue will safely append a reflected value. +func appendRValue(fmt format, v reflect.Value) { + switch v.Kind() { + // String and byte types + case reflect.Uint8: + appendByte(fmt, byte(v.Uint())) + case reflect.String: + appendString(fmt, v.String()) + + // Float tpyes + case reflect.Float32, reflect.Float64: + appendFloat(fmt, v.Float()) + + // Int types + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + appendInt(fmt, v.Int()) + + // Uint types + case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: + appendUint(fmt, v.Uint()) + + // Complex types + case reflect.Complex64, reflect.Complex128: + appendComplex(fmt, v.Complex()) + + // Bool type + case reflect.Bool: + appendBool(fmt, v.Bool()) + + // Slice and array types + case reflect.Array: + appendArrayType(fmt, v) + case reflect.Slice: + if v.IsNil() { + appendNilType(fmt, v.Type().String()) + } else { + appendArrayType(fmt, v) + } + + // Map types + case reflect.Map: + if v.IsNil() { + appendNilType(fmt, v.Type().String()) + } else { + appendMapType(fmt, v) + } + + // Struct types + case reflect.Struct: + appendStructType(fmt, v) + + // Deref'able ptr types + case reflect.Ptr, reflect.Interface: + if v.IsNil() { + appendNilType(fmt, v.Type().String()) + } else { + appendRValue(fmt.IncrDerefs(), v.Elem()) + } + + // 'raw' pointer types + case reflect.UnsafePointer: + appendType(fmt, `unsafe.Pointer`) + fmt.buf.AppendByte('(') + if u := v.Pointer(); u != 0 { + fmt.buf.AppendString("0x") + fmt.buf.B = strconv.AppendUint(fmt.buf.B, uint64(u), 16) + } else { + fmt.buf.AppendString(`nil`) + } + fmt.buf.AppendByte(')') + case reflect.Uintptr: + appendType(fmt, `uintptr`) + fmt.buf.AppendByte('(') + if u := v.Uint(); u != 0 { + fmt.buf.AppendString("0x") + fmt.buf.B = strconv.AppendUint(fmt.buf.B, u, 16) + } else { + fmt.buf.AppendString(`nil`) + } + fmt.buf.AppendByte(')') + + // Generic types we don't *exactly* handle + case reflect.Func, reflect.Chan: + if v.IsNil() { + appendNilType(fmt, v.Type().String()) + } else { + fmt.buf.AppendString(v.String()) + } + + // Unhandled kind + default: + fmt.buf.AppendString(v.String()) + } +} + +// appendArrayType Appends an array of unknown type (parsed by reflection) to buf, unlike appendSliceType does NOT catch nil slice. +func appendArrayType(fmt format, v reflect.Value) { + // get no. elements + n := v.Len() + + fmt.buf.AppendByte('[') + + // Append values + for i := 0; i < n; i++ { + appendRValueOrIfaceNext(fmt.SetIsValue(), v.Index(i)) + fmt.buf.AppendByte(',') + } + + // Drop last comma + if n > 0 { + fmt.buf.Truncate(1) + } + + fmt.buf.AppendByte(']') +} + +// appendMapType Appends a map of unknown types (parsed by reflection) to buf. +func appendMapType(fmt format, v reflect.Value) { + // Prepend type if verbose + if fmt.Verbose() { + appendType(fmt, v.Type().String()) + } + + // Get a map iterator + r := v.MapRange() + n := v.Len() + + fmt.buf.AppendByte('{') + + // Iterate pairs + for r.Next() { + appendRValueOrIfaceNext(fmt.SetIsKey(), r.Key()) + fmt.buf.AppendByte('=') + appendRValueOrIfaceNext(fmt.SetIsValue(), r.Value()) + fmt.buf.AppendByte(' ') + } + + // Drop last space + if n > 0 { + fmt.buf.Truncate(1) + } + + fmt.buf.AppendByte('}') +} + +// appendStructType Appends a struct (as a set of key-value fields) to buf. +func appendStructType(fmt format, v reflect.Value) { + // Get value type & no. fields + t := v.Type() + n := v.NumField() + + // Prepend type if verbose + if fmt.Verbose() { + appendType(fmt, v.Type().String()) + } + + fmt.buf.AppendByte('{') + + // Iterate fields + for i := 0; i < n; i++ { + vfield := v.Field(i) + tfield := t.Field(i) + + // Append field name + fmt.buf.AppendString(tfield.Name) + fmt.buf.AppendByte('=') + appendRValueOrIfaceNext(fmt.SetIsValue(), vfield) + + // Iter written count + fmt.buf.AppendByte(' ') + } + + // Drop last space + if n > 0 { + fmt.buf.Truncate(1) + } + + fmt.buf.AppendByte('}') +} + +// containsSpaceOrTab checks if "s" contains space or tabs. +func containsSpaceOrTab(s string) bool { + for _, r := range s { + if r == ' ' || r == '\t' { + return true + } + } + return false +} diff --git a/vendor/codeberg.org/gruf/go-format/formatter.go b/vendor/codeberg.org/gruf/go-format/formatter.go new file mode 100644 index 0000000000..640fa3f047 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-format/formatter.go @@ -0,0 +1,352 @@ +package format + +import ( + "strings" +) + +// Formatter allows configuring value and string formatting. +type Formatter struct { + // MaxDepth specifies the max depth of fields the formatter will iterate. + // Once max depth is reached, value will simply be formatted as "...". + // e.g. + // + // MaxDepth=1 + // type A struct{ + // Nested B + // } + // type B struct{ + // Nested C + // } + // type C struct{ + // Field string + // } + // + // Append(&buf, A{}) => {Nested={Nested={Field=...}}} + MaxDepth uint8 +} + +// Append will append formatted form of supplied values into 'buf'. +func (f Formatter) Append(buf *Buffer, v ...interface{}) { + for _, v := range v { + appendIfaceOrRValue(format{maxd: f.MaxDepth, buf: buf}, v) + buf.AppendByte(' ') + } + if len(v) > 0 { + buf.Truncate(1) + } +} + +// Appendf will append the formatted string with supplied values into 'buf'. +// Supported format directives: +// - '{}' => format supplied arg, in place +// - '{0}' => format arg at index 0 of supplied, in place +// - '{:?}' => format supplied arg verbosely, in place +// - '{:k}' => format supplied arg as key, in place +// - '{:v}' => format supplied arg as value, in place +// +// To escape either of '{}' simply append an additional brace e.g. +// - '{{' => '{' +// - '}}' => '}' +// - '{{}}' => '{}' +// - '{{:?}}' => '{:?}' +// +// More formatting directives might be included in the future. +func (f Formatter) Appendf(buf *Buffer, s string, a ...interface{}) { + const ( + // ground state + modeNone = uint8(0) + + // prev reached '{' + modeOpen = uint8(1) + + // prev reached '}' + modeClose = uint8(2) + + // parsing directive index + modeIdx = uint8(3) + + // parsing directive operands + modeOp = uint8(4) + ) + + var ( + // mode is current parsing mode + mode uint8 + + // arg is the current arg index + arg int + + // carg is current directive-set arg index + carg int + + // last is the trailing cursor to see slice windows + last int + + // idx is the current index in 's' + idx int + + // fmt is the base argument formatter + fmt = format{ + maxd: f.MaxDepth, + buf: buf, + } + + // NOTE: these functions are defined here as function + // locals as it turned out to be better for performance + // doing it this way, than encapsulating their logic in + // some kind of parsing structure. Maybe if the parser + // was pooled along with the buffers it might work out + // better, but then it makes more internal functions i.e. + // .Append() .Appendf() less accessible outside package. + // + // Currently, passing '-gcflags "-l=4"' causes a not + // insignificant decrease in ns/op, which is likely due + // to more aggressive function inlining, which this + // function can obviously stand to benefit from :) + + // Str returns current string window slice, and updates + // the trailing cursor 'last' to current 'idx' + Str = func() string { + str := s[last:idx] + last = idx + return str + } + + // MoveUp moves the trailing cursor 'last' just past 'idx' + MoveUp = func() { + last = idx + 1 + } + + // MoveUpTo moves the trailing cursor 'last' either up to + // closest '}', or current 'idx', whichever is furthest + MoveUpTo = func() { + if i := strings.IndexByte(s[idx:], '}'); i >= 0 { + idx += i + } + MoveUp() + } + + // ParseIndex parses an integer from the current string + // window, updating 'last' to 'idx'. The string window + // is ASSUMED to contain only valid ASCII numbers. This + // only returns false if number exceeds platform int size + ParseIndex = func() bool { + // Get current window + str := Str() + if len(str) < 1 { + return true + } + + // Index HAS to fit within platform int + if !can32bitInt(str) && !can64bitInt(str) { + return false + } + + // Build integer from string + carg = 0 + for _, c := range []byte(str) { + carg = carg*10 + int(c-'0') + } + + return true + } + + // ParseOp parses operands from the current string + // window, updating 'last' to 'idx'. The string window + // is ASSUMED to contain only valid operand ASCII. This + // returns success on parsing of operand logic + ParseOp = func() bool { + // Get current window + str := Str() + if len(str) < 1 { + return true + } + + // (for now) only + // accept length = 1 + if len(str) > 1 { + return false + } + + switch str[0] { + case 'k': + fmt.flags |= isKeyBit + case 'v': + fmt.flags |= isValBit + case '?': + fmt.flags |= vboseBit + } + + return true + } + + // AppendArg will take either the directive-set, or + // iterated arg index, check within bounds of 'a' and + // append the that argument formatted to the buffer. + // On failure, it will append an error string + AppendArg = func() { + // Look for idx + if carg < 0 { + carg = arg + } + + // Incr idx + arg++ + + if carg < len(a) { + // Append formatted argument value + appendIfaceOrRValue(fmt, a[carg]) + } else { + // No argument found for index + buf.AppendString(`!{MISSING_ARG}`) + } + } + + // Reset will reset the mode to ground, the flags + // to empty and parsed 'carg' to empty + Reset = func() { + mode = modeNone + fmt.flags = 0 + carg = -1 + } + ) + + for idx = 0; idx < len(s); idx++ { + // Get next char + c := s[idx] + + switch mode { + // Ground mode + case modeNone: + switch c { + case '{': + // Enter open mode + buf.AppendString(Str()) + mode = modeOpen + MoveUp() + case '}': + // Enter close mode + buf.AppendString(Str()) + mode = modeClose + MoveUp() + } + + // Encountered open '{' + case modeOpen: + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + // Starting index + mode = modeIdx + MoveUp() + case '{': + // Escaped bracket + buf.AppendByte('{') + mode = modeNone + MoveUp() + case '}': + // Format arg + AppendArg() + Reset() + MoveUp() + case ':': + // Starting operands + mode = modeOp + MoveUp() + default: + // Bad char, missing a close + buf.AppendString(`!{MISSING_CLOSE}`) + mode = modeNone + MoveUpTo() + } + + // Encountered close '}' + case modeClose: + switch c { + case '}': + // Escaped close bracket + buf.AppendByte('}') + mode = modeNone + MoveUp() + default: + // Missing an open bracket + buf.AppendString(`!{MISSING_OPEN}`) + mode = modeNone + MoveUp() + } + + // Preparing index + case modeIdx: + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + case ':': + if !ParseIndex() { + // Unable to parse an integer + buf.AppendString(`!{BAD_INDEX}`) + mode = modeNone + MoveUpTo() + } else { + // Starting operands + mode = modeOp + MoveUp() + } + case '}': + if !ParseIndex() { + // Unable to parse an integer + buf.AppendString(`!{BAD_INDEX}`) + } else { + // Format arg + AppendArg() + } + Reset() + MoveUp() + default: + // Not a valid index character + buf.AppendString(`!{BAD_INDEX}`) + mode = modeNone + MoveUpTo() + } + + // Preparing operands + case modeOp: + switch c { + case 'k', 'v', '?': + // TODO: set flags as received + case '}': + if !ParseOp() { + // Unable to parse operands + buf.AppendString(`!{BAD_OPERAND}`) + } else { + // Format arg + AppendArg() + } + Reset() + MoveUp() + default: + // Not a valid operand char + buf.AppendString(`!{BAD_OPERAND}`) + Reset() + MoveUpTo() + } + } + } + + // Append any remaining + buf.AppendString(s[last:]) +} + +// formatter is the default formatter instance. +var formatter = Formatter{ + MaxDepth: 10, +} + +// Append will append formatted form of supplied values into 'buf' using default formatter. +// See Formatter.Append() for more documentation. +func Append(buf *Buffer, v ...interface{}) { + formatter.Append(buf, v...) +} + +// Appendf will append the formatted string with supplied values into 'buf' using default formatter. +// See Formatter.Appendf() for more documentation. +func Appendf(buf *Buffer, s string, a ...interface{}) { + formatter.Appendf(buf, s, a...) +} diff --git a/vendor/codeberg.org/gruf/go-format/print.go b/vendor/codeberg.org/gruf/go-format/print.go new file mode 100644 index 0000000000..288e6af103 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-format/print.go @@ -0,0 +1,88 @@ +package format + +import ( + "io" + "os" + "sync" +) + +// pool is the global printer buffer pool. +var pool = sync.Pool{ + New: func() interface{} { + return &Buffer{} + }, +} + +// getBuf fetches a buffer from pool. +func getBuf() *Buffer { + return pool.Get().(*Buffer) +} + +// putBuf places a Buffer back in pool. +func putBuf(buf *Buffer) { + if buf.Cap() > 64<<10 { + return // drop large + } + buf.Reset() + pool.Put(buf) +} + +// Sprint will format supplied values, returning this string. +func Sprint(v ...interface{}) string { + buf := Buffer{} + Append(&buf, v...) + return buf.String() +} + +// Sprintf will format supplied format string and args, returning this string. +// See Formatter.Appendf() for more documentation. +func Sprintf(s string, a ...interface{}) string { + buf := Buffer{} + Appendf(&buf, s, a...) + return buf.String() +} + +// Print will format supplied values, print this to os.Stdout. +func Print(v ...interface{}) { + Fprint(os.Stdout, v...) //nolint +} + +// Printf will format supplied format string and args, printing this to os.Stdout. +// See Formatter.Appendf() for more documentation. +func Printf(s string, a ...interface{}) { + Fprintf(os.Stdout, s, a...) //nolint +} + +// Println will format supplied values, append a trailing newline and print this to os.Stdout. +func Println(v ...interface{}) { + Fprintln(os.Stdout, v...) //nolint +} + +// Fprint will format supplied values, writing this to an io.Writer. +func Fprint(w io.Writer, v ...interface{}) (int, error) { + buf := getBuf() + Append(buf, v...) + n, err := w.Write(buf.B) + putBuf(buf) + return n, err +} + +// Fprintf will format supplied format string and args, writing this to an io.Writer. +// See Formatter.Appendf() for more documentation. +func Fprintf(w io.Writer, s string, a ...interface{}) (int, error) { + buf := getBuf() + Appendf(buf, s, a...) + n, err := w.Write(buf.B) + putBuf(buf) + return n, err +} + +// Println will format supplied values, append a trailing newline and writer this to an io.Writer. +func Fprintln(w io.Writer, v ...interface{}) (int, error) { + buf := getBuf() + Append(buf, v...) + buf.AppendByte('\n') + n, err := w.Write(buf.B) + putBuf(buf) + return n, err +} diff --git a/vendor/codeberg.org/gruf/go-format/util.go b/vendor/codeberg.org/gruf/go-format/util.go new file mode 100644 index 0000000000..68a9e2de39 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-format/util.go @@ -0,0 +1,13 @@ +package format + +import "strconv" + +// can32bitInt returns whether it's possible for 's' to contain an int on 32bit platforms. +func can32bitInt(s string) bool { + return strconv.IntSize == 32 && (0 < len(s) && len(s) < 10) +} + +// can64bitInt returns whether it's possible for 's' to contain an int on 64bit platforms. +func can64bitInt(s string) bool { + return strconv.IntSize == 64 && (0 < len(s) && len(s) < 19) +} diff --git a/vendor/codeberg.org/gruf/go-logger/README.md b/vendor/codeberg.org/gruf/go-logger/README.md deleted file mode 100644 index 57410ea87c..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Fast levelled logging package with customizable formatting. - -Supports logging in 2 modes: -- no locks, fastest possible logging, no guarantees for io.Writer thread safety -- mutex locks during writes, still far faster than standard library logger - -Running without locks isn't likely to cause you any issues*, but if it does, you can wrap your `io.Writer` using `AddSafety()` when instantiating your new Logger. Even when running the benchmarks, this library has no printing issues without locks, so in most cases you'll be fine, but the safety is there if you need it. - -*most logging libraries advertising high speeds are likely not performing mutex locks, which is why with this library you have the option to opt-in/out of them. - -Note there are 2 uses of the unsafe package: -- safer interface nil value checks, uses similar logic to reflect package to check if the value in the internal fat pointer is nil -- casting a byte slice to string to allow sharing of similar byte and string methods, performs same logic as `strings.Builder{}.String()` \ No newline at end of file diff --git a/vendor/codeberg.org/gruf/go-logger/clock.go b/vendor/codeberg.org/gruf/go-logger/clock.go deleted file mode 100644 index cc7d7ed0c6..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/clock.go +++ /dev/null @@ -1,21 +0,0 @@ -package logger - -import ( - "sync" - "time" - - "codeberg.org/gruf/go-nowish" -) - -var ( - clock = nowish.Clock{} - clockOnce = sync.Once{} -) - -// startClock starts the global nowish clock. -func startClock() { - clockOnce.Do(func() { - clock.Start(time.Millisecond * 100) - clock.SetFormat("2006-01-02 15:04:05") - }) -} diff --git a/vendor/codeberg.org/gruf/go-logger/default.go b/vendor/codeberg.org/gruf/go-logger/default.go deleted file mode 100644 index 3fd65c6b10..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/default.go +++ /dev/null @@ -1,107 +0,0 @@ -package logger - -import ( - "os" - "sync" -) - -var ( - instance *Logger - instanceOnce = sync.Once{} -) - -// Default returns the default Logger instance. -func Default() *Logger { - instanceOnce.Do(func() { instance = New(os.Stdout) }) - return instance -} - -// Debug prints the provided arguments with the debug prefix to the global Logger instance. -func Debug(a ...interface{}) { - Default().Debug(a...) -} - -// Debugf prints the provided format string and arguments with the debug prefix to the global Logger instance. -func Debugf(s string, a ...interface{}) { - Default().Debugf(s, a...) -} - -// Info prints the provided arguments with the info prefix to the global Logger instance. -func Info(a ...interface{}) { - Default().Info(a...) -} - -// Infof prints the provided format string and arguments with the info prefix to the global Logger instance. -func Infof(s string, a ...interface{}) { - Default().Infof(s, a...) -} - -// Warn prints the provided arguments with the warn prefix to the global Logger instance. -func Warn(a ...interface{}) { - Default().Warn(a...) -} - -// Warnf prints the provided format string and arguments with the warn prefix to the global Logger instance. -func Warnf(s string, a ...interface{}) { - Default().Warnf(s, a...) -} - -// Error prints the provided arguments with the error prefix to the global Logger instance. -func Error(a ...interface{}) { - Default().Error(a...) -} - -// Errorf prints the provided format string and arguments with the error prefix to the global Logger instance. -func Errorf(s string, a ...interface{}) { - Default().Errorf(s, a...) -} - -// Fatal prints the provided arguments with the fatal prefix to the global Logger instance before exiting the program with os.Exit(1). -func Fatal(a ...interface{}) { - Default().Fatal(a...) -} - -// Fatalf prints the provided format string and arguments with the fatal prefix to the global Logger instance before exiting the program with os.Exit(1). -func Fatalf(s string, a ...interface{}) { - Default().Fatalf(s, a...) -} - -// Log prints the provided arguments with the supplied log level to the global Logger instance. -func Log(lvl LEVEL, a ...interface{}) { - Default().Log(lvl, a...) -} - -// Logf prints the provided format string and arguments with the supplied log level to the global Logger instance. -func Logf(lvl LEVEL, s string, a ...interface{}) { - Default().Logf(lvl, s, a...) -} - -// LogFields prints the provided fields formatted as key-value pairs at the supplied log level to the global Logger instance. -func LogFields(lvl LEVEL, fields map[string]interface{}) { - Default().LogFields(lvl, fields) -} - -// LogValues prints the provided values formatted as-so at the supplied log level to the global Logger instance. -func LogValues(lvl LEVEL, a ...interface{}) { - Default().LogValues(lvl, a...) -} - -// Print simply prints provided arguments to the global Logger instance. -func Print(a ...interface{}) { - Default().Print(a...) -} - -// Printf simply prints provided the provided format string and arguments to the global Logger instance. -func Printf(s string, a ...interface{}) { - Default().Printf(s, a...) -} - -// PrintFields prints the provided fields formatted as key-value pairs to the global Logger instance. -func PrintFields(fields map[string]interface{}) { - Default().PrintFields(fields) -} - -// PrintValues prints the provided values formatted as-so to the global Logger instance. -func PrintValues(a ...interface{}) { - Default().PrintValues(a...) -} diff --git a/vendor/codeberg.org/gruf/go-logger/entry.go b/vendor/codeberg.org/gruf/go-logger/entry.go deleted file mode 100644 index 11e3830865..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/entry.go +++ /dev/null @@ -1,385 +0,0 @@ -package logger - -import ( - "context" - "fmt" - "time" - - "codeberg.org/gruf/go-bytes" -) - -// Entry defines an entry in the log, it is NOT safe for concurrent use -type Entry struct { - ctx context.Context - lvl LEVEL - buf *bytes.Buffer - log *Logger -} - -// Context returns the current set Entry context.Context -func (e *Entry) Context() context.Context { - return e.ctx -} - -// WithContext updates Entry context value to the supplied -func (e *Entry) WithContext(ctx context.Context) *Entry { - e.ctx = ctx - return e -} - -// Level appends the supplied level to the log entry, and sets the entry level. -// Please note this CAN be called and append log levels multiple times -func (e *Entry) Level(lvl LEVEL) *Entry { - e.log.Format.AppendLevel(e.buf, lvl) - e.buf.WriteByte(' ') - e.lvl = lvl - return e -} - -// Timestamp appends the current timestamp to the log entry. Please note this -// CAN be called and append the timestamp multiple times -func (e *Entry) Timestamp() *Entry { - e.log.Format.AppendTimestamp(e.buf, clock.NowFormat()) - e.buf.WriteByte(' ') - return e -} - -// TimestampIf performs Entry.Timestamp() only IF timestamping is enabled for the Logger. -// Please note this CAN be called multiple times -func (e *Entry) TimestampIf() *Entry { - if e.log.Timestamp { - e.Timestamp() - } - return e -} - -// Hooks applies currently set Hooks to the Entry. Please note this CAN be -// called and perform the Hooks multiple times -func (e *Entry) Hooks() *Entry { - for _, hook := range e.log.Hooks { - hook.Do(e) - } - return e -} - -// Byte appends a byte value to the log entry -func (e *Entry) Byte(value byte) *Entry { - e.log.Format.AppendByte(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// ByteField appends a byte value as key-value pair to the log entry -func (e *Entry) ByteField(key string, value byte) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendByte(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Bytes appends a byte slice value as to the log entry -func (e *Entry) Bytes(value []byte) *Entry { - e.log.Format.AppendBytes(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// BytesField appends a byte slice value as key-value pair to the log entry -func (e *Entry) BytesField(key string, value []byte) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendBytes(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Str appends a string value to the log entry -func (e *Entry) Str(value string) *Entry { - e.log.Format.AppendString(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// StrField appends a string value as key-value pair to the log entry -func (e *Entry) StrField(key string, value string) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendString(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Strs appends a string slice value to the log entry -func (e *Entry) Strs(value []string) *Entry { - e.log.Format.AppendStrings(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// StrsField appends a string slice value as key-value pair to the log entry -func (e *Entry) StrsField(key string, value []string) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendStrings(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Int appends an int value to the log entry -func (e *Entry) Int(value int) *Entry { - e.log.Format.AppendInt(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// IntField appends an int value as key-value pair to the log entry -func (e *Entry) IntField(key string, value int) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendInt(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Ints appends an int slice value to the log entry -func (e *Entry) Ints(value []int) *Entry { - e.log.Format.AppendInts(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// IntsField appends an int slice value as key-value pair to the log entry -func (e *Entry) IntsField(key string, value []int) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendInts(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Uint appends a uint value to the log entry -func (e *Entry) Uint(value uint) *Entry { - e.log.Format.AppendUint(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// UintField appends a uint value as key-value pair to the log entry -func (e *Entry) UintField(key string, value uint) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendUint(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Uints appends a uint slice value to the log entry -func (e *Entry) Uints(value []uint) *Entry { - e.log.Format.AppendUints(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// UintsField appends a uint slice value as key-value pair to the log entry -func (e *Entry) UintsField(key string, value []uint) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendUints(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Float appends a float value to the log entry -func (e *Entry) Float(value float64) *Entry { - e.log.Format.AppendFloat(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// FloatField appends a float value as key-value pair to the log entry -func (e *Entry) FloatField(key string, value float64) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendFloat(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Floats appends a float slice value to the log entry -func (e *Entry) Floats(value []float64) *Entry { - e.log.Format.AppendFloats(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// FloatsField appends a float slice value as key-value pair to the log entry -func (e *Entry) FloatsField(key string, value []float64) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendFloats(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Bool appends a bool value to the log entry -func (e *Entry) Bool(value bool) *Entry { - e.log.Format.AppendBool(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// BoolField appends a bool value as key-value pair to the log entry -func (e *Entry) BoolField(key string, value bool) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendBool(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Bools appends a bool slice value to the log entry -func (e *Entry) Bools(value []bool) *Entry { - e.log.Format.AppendBools(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// BoolsField appends a bool slice value as key-value pair to the log entry -func (e *Entry) BoolsField(key string, value []bool) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendBools(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Time appends a time.Time value to the log entry -func (e *Entry) Time(value time.Time) *Entry { - e.log.Format.AppendTime(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// TimeField appends a time.Time value as key-value pair to the log entry -func (e *Entry) TimeField(key string, value time.Time) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendTime(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Times appends a time.Time slice value to the log entry -func (e *Entry) Times(value []time.Time) *Entry { - e.log.Format.AppendTimes(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// TimesField appends a time.Time slice value as key-value pair to the log entry -func (e *Entry) TimesField(key string, value []time.Time) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendTimes(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// DurationField appends a time.Duration value to the log entry -func (e *Entry) Duration(value time.Duration) *Entry { - e.log.Format.AppendDuration(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// DurationField appends a time.Duration value as key-value pair to the log entry -func (e *Entry) DurationField(key string, value time.Duration) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendDuration(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Durations appends a time.Duration slice value to the log entry -func (e *Entry) Durations(value []time.Duration) *Entry { - e.log.Format.AppendDurations(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// DurationsField appends a time.Duration slice value as key-value pair to the log entry -func (e *Entry) DurationsField(key string, value []time.Duration) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendDurations(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Field appends an interface value as key-value pair to the log entry -func (e *Entry) Field(key string, value interface{}) *Entry { - e.log.Format.AppendKey(e.buf, key) - e.log.Format.AppendValue(e.buf, value) - e.buf.WriteByte(' ') - return e -} - -// Fields appends a map of key-value pairs to the log entry -func (e *Entry) Fields(fields map[string]interface{}) *Entry { - for key, value := range fields { - e.Field(key, value) - } - return e -} - -// Values appends the given values to the log entry formatted as values, without a key. -func (e *Entry) Values(values ...interface{}) *Entry { - for _, value := range values { - e.log.Format.AppendValue(e.buf, value) - e.buf.WriteByte(' ') - } - return e -} - -// Append will append the given args formatted using fmt.Sprint(a...) to the Entry. -func (e *Entry) Append(a ...interface{}) *Entry { - fmt.Fprint(e.buf, a...) - e.buf.WriteByte(' ') - return e -} - -// Appendf will append the given format string and args using fmt.Sprintf(s, a...) to the Entry. -func (e *Entry) Appendf(s string, a ...interface{}) *Entry { - fmt.Fprintf(e.buf, s, a...) - e.buf.WriteByte(' ') - return e -} - -// Msg appends the fmt.Sprint() formatted final message to the log and calls .Send() -func (e *Entry) Msg(a ...interface{}) { - e.log.Format.AppendMsg(e.buf, a...) - e.Send() -} - -// Msgf appends the fmt.Sprintf() formatted final message to the log and calls .Send() -func (e *Entry) Msgf(s string, a ...interface{}) { - e.log.Format.AppendMsgf(e.buf, s, a...) - e.Send() -} - -// Send triggers write of the log entry, skipping if the entry's log LEVEL -// is below the currently set Logger level, and releases the Entry back to -// the Logger's Entry pool. So it is NOT safe to continue using this Entry -// object after calling .Send(), .Msg() or .Msgf() -func (e *Entry) Send() { - // If nothing to do, return - if e.lvl < e.log.Level || e.buf.Len() < 1 { - e.reset() - return - } - - // Ensure a final new line - if e.buf.B[e.buf.Len()-1] != '\n' { - e.buf.WriteByte('\n') - } - - // Write, reset and release - e.log.Output.Write(e.buf.B) - e.reset() -} - -func (e *Entry) reset() { - // Reset all - e.ctx = nil - e.buf.Reset() - e.lvl = unset - - // Release to pool - e.log.pool.Put(e) -} diff --git a/vendor/codeberg.org/gruf/go-logger/format.go b/vendor/codeberg.org/gruf/go-logger/format.go deleted file mode 100644 index 3901ea37f7..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/format.go +++ /dev/null @@ -1,87 +0,0 @@ -package logger - -import ( - "time" - - "codeberg.org/gruf/go-bytes" -) - -// Check our types impl LogFormat -var _ LogFormat = &TextFormat{} - -// Formattable defines a type capable of writing a string formatted form -// of itself to a supplied byte buffer, and returning the resulting byte -// buffer. Implementing this will greatly speed up formatting of custom -// types passed to LogFormat (assuming they implement checking for this). -type Formattable interface { - AppendFormat([]byte) []byte -} - -// LogFormat defines a method of formatting log entries -type LogFormat interface { - // AppendKey appends given key to the log buffer - AppendKey(buf *bytes.Buffer, key string) - - // AppendLevel appends given log level as key-value pair to the log buffer - AppendLevel(buf *bytes.Buffer, lvl LEVEL) - - // AppendTimestamp appends given timestamp string as key-value pair to the log buffer - AppendTimestamp(buf *bytes.Buffer, fmtNow string) - - // AppendValue appends given interface formatted as value to the log buffer - AppendValue(buf *bytes.Buffer, value interface{}) - - // AppendByte appends given byte value to the log buffer - AppendByte(buf *bytes.Buffer, value byte) - - // AppendBytes appends given byte slice value to the log buffer - AppendBytes(buf *bytes.Buffer, value []byte) - - // AppendString appends given string value to the log buffer - AppendString(buf *bytes.Buffer, value string) - - // AppendStrings appends given string slice value to the log buffer - AppendStrings(buf *bytes.Buffer, value []string) - - // AppendBool appends given bool value to the log buffer - AppendBool(buf *bytes.Buffer, value bool) - - // AppendBools appends given bool slice value to the log buffer - AppendBools(buf *bytes.Buffer, value []bool) - - // AppendInt appends given int value to the log buffer - AppendInt(buf *bytes.Buffer, value int) - - // AppendInts appends given int slice value to the log buffer - AppendInts(buf *bytes.Buffer, value []int) - - // AppendUint appends given uint value to the log buffer - AppendUint(buf *bytes.Buffer, value uint) - - // AppendUints appends given uint slice value to the log buffer - AppendUints(buf *bytes.Buffer, value []uint) - - // AppendFloat appends given float value to the log buffer - AppendFloat(buf *bytes.Buffer, value float64) - - // AppendFloats appends given float slice value to the log buffer - AppendFloats(buf *bytes.Buffer, value []float64) - - // AppendTime appends given time value to the log buffer - AppendTime(buf *bytes.Buffer, value time.Time) - - // AppendTimes appends given time slice value to the log buffer - AppendTimes(buf *bytes.Buffer, value []time.Time) - - // AppendDuration appends given duration value to the log buffer - AppendDuration(buf *bytes.Buffer, value time.Duration) - - // AppendDurations appends given duration slice value to the log buffer - AppendDurations(buf *bytes.Buffer, value []time.Duration) - - // AppendMsg appends given msg as key-value pair to the log buffer using fmt.Sprint(...) formatting - AppendMsg(buf *bytes.Buffer, a ...interface{}) - - // AppendMsgf appends given msg format string as key-value pair to the log buffer using fmt.Sprintf(...) formatting - AppendMsgf(buf *bytes.Buffer, s string, a ...interface{}) -} diff --git a/vendor/codeberg.org/gruf/go-logger/format_text.go b/vendor/codeberg.org/gruf/go-logger/format_text.go deleted file mode 100644 index f9c90f8873..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/format_text.go +++ /dev/null @@ -1,914 +0,0 @@ -package logger - -import ( - stdfmt "fmt" - "reflect" - "strconv" - "time" - "unsafe" - - "codeberg.org/gruf/go-bytes" -) - -// DefaultTextFormat is the default TextFormat instance -var DefaultTextFormat = TextFormat{ - Strict: false, - Verbose: false, - MaxDepth: 10, - Levels: DefaultLevels(), -} - -// TextFormat is the default LogFormat implementation, with very similar formatting to the -// standard "fmt" package's '%#v' operator. The main difference being that pointers are -// dereferenced as far as possible in order to reach a printable value. It is also *mildly* faster. -type TextFormat struct { - // Strict defines whether to use strict key-value pair formatting, i.e. should the level - // timestamp and msg be formatted as key-value pairs (with forced quoting for msg) - Strict bool - - // Verbose defines whether to increase output verbosity, i.e. include types with nil values - // and force values implementing .String() / .AppendFormat() to be printed as a struct etc. - Verbose bool - - // MaxDepth specifies the max depth of fields the formatter will iterate - MaxDepth uint8 - - // Levels defines the map of log LEVELs to level strings - Levels Levels -} - -// fmt returns a new format instance based on receiver TextFormat and given buffer -func (f TextFormat) fmt(buf *bytes.Buffer) format { - var flags uint8 - if f.Verbose { - flags |= vboseBit - } - return format{ - flags: flags, - curd: 0, - maxd: f.MaxDepth, - buf: buf, - } -} - -func (f TextFormat) AppendKey(buf *bytes.Buffer, key string) { - if len(key) > 0 { - // only append if key is non-zero length - appendString(f.fmt(buf).SetIsKey(true), key) - buf.WriteByte('=') - } -} - -func (f TextFormat) AppendLevel(buf *bytes.Buffer, lvl LEVEL) { - if f.Strict { - // Strict format, append level key - buf.WriteString(`level=`) - buf.WriteString(f.Levels.Get(lvl)) - return - } - - // Write level string - buf.WriteByte('[') - buf.WriteString(f.Levels.Get(lvl)) - buf.WriteByte(']') -} - -func (f TextFormat) AppendTimestamp(buf *bytes.Buffer, now string) { - if f.Strict { - // Strict format, use key and quote - buf.WriteString(`time=`) - appendString(f.fmt(buf), now) - return - } - - // Write time as-is - buf.WriteString(now) -} - -func (f TextFormat) AppendValue(buf *bytes.Buffer, value interface{}) { - appendIfaceOrRValue(f.fmt(buf).SetIsKey(false), value) -} - -func (f TextFormat) AppendByte(buf *bytes.Buffer, value byte) { - appendByte(f.fmt(buf), value) -} - -func (f TextFormat) AppendBytes(buf *bytes.Buffer, value []byte) { - appendBytes(f.fmt(buf), value) -} - -func (f TextFormat) AppendString(buf *bytes.Buffer, value string) { - appendString(f.fmt(buf), value) -} - -func (f TextFormat) AppendStrings(buf *bytes.Buffer, value []string) { - appendStringSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendBool(buf *bytes.Buffer, value bool) { - appendBool(f.fmt(buf), value) -} - -func (f TextFormat) AppendBools(buf *bytes.Buffer, value []bool) { - appendBoolSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendInt(buf *bytes.Buffer, value int) { - appendInt(f.fmt(buf), int64(value)) -} - -func (f TextFormat) AppendInts(buf *bytes.Buffer, value []int) { - appendIntSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendUint(buf *bytes.Buffer, value uint) { - appendUint(f.fmt(buf), uint64(value)) -} - -func (f TextFormat) AppendUints(buf *bytes.Buffer, value []uint) { - appendUintSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendFloat(buf *bytes.Buffer, value float64) { - appendFloat(f.fmt(buf), value) -} - -func (f TextFormat) AppendFloats(buf *bytes.Buffer, value []float64) { - appendFloatSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendTime(buf *bytes.Buffer, value time.Time) { - appendTime(f.fmt(buf), value) -} - -func (f TextFormat) AppendTimes(buf *bytes.Buffer, value []time.Time) { - appendTimeSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendDuration(buf *bytes.Buffer, value time.Duration) { - appendDuration(f.fmt(buf), value) -} - -func (f TextFormat) AppendDurations(buf *bytes.Buffer, value []time.Duration) { - appendDurationSlice(f.fmt(buf), value) -} - -func (f TextFormat) AppendMsg(buf *bytes.Buffer, a ...interface{}) { - if f.Strict { - // Strict format, use key and quote - buf.WriteString(`msg=`) - buf.B = strconv.AppendQuote(buf.B, stdfmt.Sprint(a...)) - return - } - - // Write message as-is - stdfmt.Fprint(buf, a...) -} - -func (f TextFormat) AppendMsgf(buf *bytes.Buffer, s string, a ...interface{}) { - if f.Strict { - // Strict format, use key and quote - buf.WriteString(`msg=`) - buf.B = strconv.AppendQuote(buf.B, stdfmt.Sprintf(s, a...)) - return - } - - // Write message as-is - stdfmt.Fprintf(buf, s, a...) -} - -// format is the object passed among the append___ formatting functions -type format struct { - flags uint8 // 'isKey' and 'verbose' flags - drefs uint8 // current value deref count - curd uint8 // current depth - maxd uint8 // maximum depth - buf *bytes.Buffer // out buffer -} - -const ( - // flag bit constants - isKeyBit = uint8(1) << 0 - vboseBit = uint8(1) << 1 -) - -// AtMaxDepth returns whether format is currently at max depth. -func (f format) AtMaxDepth() bool { - return f.curd >= f.maxd -} - -// Derefs returns no. times current value has been dereferenced. -func (f format) Derefs() uint8 { - return f.drefs -} - -// IsKey returns whether the isKey flag is set. -func (f format) IsKey() bool { - return (f.flags & isKeyBit) != 0 -} - -// Verbose returns whether the verbose flag is set. -func (f format) Verbose() bool { - return (f.flags & vboseBit) != 0 -} - -// SetIsKey returns format instance with the isKey bit set to value. -func (f format) SetIsKey(is bool) format { - flags := f.flags - if is { - flags |= isKeyBit - } else { - flags &= ^isKeyBit - } - return format{ - flags: flags, - drefs: f.drefs, - curd: f.curd, - maxd: f.maxd, - buf: f.buf, - } -} - -// IncrDepth returns format instance with depth incremented. -func (f format) IncrDepth() format { - return format{ - flags: f.flags, - drefs: f.drefs, - curd: f.curd + 1, - maxd: f.maxd, - buf: f.buf, - } -} - -// IncrDerefs returns format instance with dereference count incremented. -func (f format) IncrDerefs() format { - return format{ - flags: f.flags, - drefs: f.drefs + 1, - curd: f.curd, - maxd: f.maxd, - buf: f.buf, - } -} - -// appendType appends a type using supplied type str. -func appendType(fmt format, t string) { - for i := uint8(0); i < fmt.Derefs(); i++ { - fmt.buf.WriteByte('*') - } - fmt.buf.WriteString(t) -} - -// appendNilType writes nil to buf, type included if verbose. -func appendNilType(fmt format, t string) { - if fmt.Verbose() { - fmt.buf.WriteByte('(') - appendType(fmt, t) - fmt.buf.WriteString(`)(nil)`) - } else { - fmt.buf.WriteString(`nil`) - } -} - -// appendNilFace writes nil to buf, type included if verbose. -func appendNilIface(fmt format, i interface{}) { - if fmt.Verbose() { - fmt.buf.WriteByte('(') - appendType(fmt, reflect.TypeOf(i).String()) - fmt.buf.WriteString(`)(nil)`) - } else { - fmt.buf.WriteString(`nil`) - } -} - -// appendNilRValue writes nil to buf, type included if verbose. -func appendNilRValue(fmt format, v reflect.Value) { - if fmt.Verbose() { - fmt.buf.WriteByte('(') - appendType(fmt, v.Type().String()) - fmt.buf.WriteString(`)(nil)`) - } else { - fmt.buf.WriteString(`nil`) - } -} - -// appendByte writes a single byte to buf -func appendByte(fmt format, b byte) { - fmt.buf.WriteByte(b) -} - -// appendBytes writes a quoted byte slice to buf -func appendBytes(fmt format, b []byte) { - if !fmt.IsKey() && b == nil { - // Values CAN be nil formatted - appendNilType(fmt, `[]byte`) - } else { - // unsafe cast as string to prevent reallocation - appendString(fmt, *(*string)(unsafe.Pointer(&b))) - } -} - -// appendString writes an escaped, double-quoted string to buf -func appendString(fmt format, s string) { - if !fmt.IsKey() || !strconv.CanBackquote(s) { - // All non-keys and multiline keys get quoted + escaped - fmt.buf.B = strconv.AppendQuote(fmt.buf.B, s) - return - } else if containsSpaceOrTab(s) { - // Key containing spaces/tabs, quote this - fmt.buf.WriteByte('"') - fmt.buf.WriteString(s) - fmt.buf.WriteByte('"') - return - } - - // Safe to leave unquoted - fmt.buf.WriteString(s) -} - -// appendStringSlice writes a slice of strings to buf -func appendStringSlice(fmt format, s []string) { - // Check for nil slice - if s == nil { - appendNilType(fmt, `[]string`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, s := range s { - appendString(fmt.SetIsKey(false), s) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(s) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendBool writes a formatted bool to buf -func appendBool(fmt format, b bool) { - fmt.buf.B = strconv.AppendBool(fmt.buf.B, b) -} - -// appendBool writes a slice of formatted bools to buf -func appendBoolSlice(fmt format, b []bool) { - // Check for nil slice - if b == nil { - appendNilType(fmt, `[]bool`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, b := range b { - appendBool(fmt, b) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(b) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendInt writes a formatted int to buf -func appendInt(fmt format, i int64) { - fmt.buf.B = strconv.AppendInt(fmt.buf.B, i, 10) -} - -// appendIntSlice writes a slice of formatted int to buf -func appendIntSlice(fmt format, i []int) { - // Check for nil slice - if i == nil { - appendNilType(fmt, `[]int`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, i := range i { - appendInt(fmt, int64(i)) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(i) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendUint writes a formatted uint to buf -func appendUint(fmt format, u uint64) { - fmt.buf.B = strconv.AppendUint(fmt.buf.B, u, 10) -} - -// appendUintSlice writes a slice of formatted uint to buf -func appendUintSlice(fmt format, u []uint) { - // Check for nil slice - if u == nil { - appendNilType(fmt, `[]uint`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, u := range u { - appendUint(fmt, uint64(u)) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(u) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendFloat writes a formatted float to buf -func appendFloat(fmt format, f float64) { - fmt.buf.B = strconv.AppendFloat(fmt.buf.B, f, 'G', -1, 64) -} - -// appendFloatSlice writes a slice formatted floats to buf -func appendFloatSlice(fmt format, f []float64) { - // Check for nil slice - if f == nil { - appendNilType(fmt, `[]float64`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, f := range f { - appendFloat(fmt, f) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(f) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendTime writes a formatted, quoted time string to buf -func appendTime(fmt format, t time.Time) { - appendString(fmt.SetIsKey(true), t.Format(time.RFC1123)) -} - -// appendTimeSlice writes a slice of formatted time strings to buf -func appendTimeSlice(fmt format, t []time.Time) { - // Check for nil slice - if t == nil { - appendNilType(fmt, `[]time.Time`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, t := range t { - appendString(fmt.SetIsKey(true), t.Format(time.RFC1123)) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(t) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendDuration writes a formatted, quoted duration string to buf -func appendDuration(fmt format, d time.Duration) { - appendString(fmt.SetIsKey(true), d.String()) -} - -// appendDurationSlice writes a slice of formatted, quoted duration strings to buf -func appendDurationSlice(fmt format, d []time.Duration) { - // Check for nil slice - if d == nil { - appendNilType(fmt, `[]time.Duration`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, d := range d { - appendString(fmt.SetIsKey(true), d.String()) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(d) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendComplex writes a formatted complex128 to buf -func appendComplex(fmt format, c complex128) { - appendFloat(fmt, real(c)) - fmt.buf.WriteByte('+') - appendFloat(fmt, imag(c)) - fmt.buf.WriteByte('i') -} - -// appendComplexSlice writes a slice of formatted complex128s to buf -func appendComplexSlice(fmt format, c []complex128) { - // Check for nil slice - if c == nil { - appendNilType(fmt, `[]complex128`) - return - } - - fmt.buf.WriteByte('[') - - // Write elements - for _, c := range c { - appendComplex(fmt, c) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if len(c) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// notNil will safely check if 'v' is nil without dealing with weird Go interface nil bullshit. -func notNil(i interface{}) bool { - // cast to get fat pointer - e := *(*struct { - typeOf unsafe.Pointer // ignored - valueOf unsafe.Pointer - })(unsafe.Pointer(&i)) - - // check if value part is nil - return (e.valueOf != nil) -} - -// appendIfaceOrRValueNext performs appendIfaceOrRValue checking + incr depth -func appendIfaceOrRValueNext(fmt format, i interface{}) { - // Check we haven't hit max - if fmt.AtMaxDepth() { - fmt.buf.WriteString("...") - return - } - - // Incr the depth - fmt = fmt.IncrDepth() - - // Make actual call - appendIfaceOrRValue(fmt, i) -} - -// appendIfaceOrReflectValue will attempt to append as interface, falling back to reflection -func appendIfaceOrRValue(fmt format, i interface{}) { - if !appendIface(fmt, i) { - appendRValue(fmt, reflect.ValueOf(i)) - } -} - -// appendValueOrIfaceNext performs appendRValueOrIface checking + incr depth -func appendRValueOrIfaceNext(fmt format, v reflect.Value) { - // Check we haven't hit max - if fmt.AtMaxDepth() { - fmt.buf.WriteString("...") - return - } - - // Incr the depth - fmt = fmt.IncrDepth() - - // Make actual call - appendRValueOrIface(fmt, v) -} - -// appendRValueOrIface will attempt to interface the reflect.Value, falling back to using this directly -func appendRValueOrIface(fmt format, v reflect.Value) { - if !v.CanInterface() || !appendIface(fmt, v.Interface()) { - appendRValue(fmt, v) - } -} - -// appendIface parses and writes a formatted interface value to buf -func appendIface(fmt format, i interface{}) bool { - switch i := i.(type) { - case nil: - fmt.buf.WriteString(`nil`) - case byte: - appendByte(fmt, i) - case []byte: - appendBytes(fmt, i) - case string: - appendString(fmt, i) - case []string: - appendStringSlice(fmt, i) - case int: - appendInt(fmt, int64(i)) - case int8: - appendInt(fmt, int64(i)) - case int16: - appendInt(fmt, int64(i)) - case int32: - appendInt(fmt, int64(i)) - case int64: - appendInt(fmt, i) - case []int: - appendIntSlice(fmt, i) - case uint: - appendUint(fmt, uint64(i)) - case uint16: - appendUint(fmt, uint64(i)) - case uint32: - appendUint(fmt, uint64(i)) - case uint64: - appendUint(fmt, i) - case []uint: - appendUintSlice(fmt, i) - case float32: - appendFloat(fmt, float64(i)) - case float64: - appendFloat(fmt, i) - case []float64: - appendFloatSlice(fmt, i) - case bool: - appendBool(fmt, i) - case []bool: - appendBoolSlice(fmt, i) - case time.Time: - appendTime(fmt, i) - case []time.Time: - appendTimeSlice(fmt, i) - case time.Duration: - appendDuration(fmt, i) - case []time.Duration: - appendDurationSlice(fmt, i) - case complex64: - appendComplex(fmt, complex128(i)) - case complex128: - appendComplex(fmt, i) - case []complex128: - appendComplexSlice(fmt, i) - case map[string]interface{}: - appendIfaceMap(fmt, i) - case error: - if notNil(i) /* use safer nil check */ { - appendString(fmt, i.Error()) - } else { - appendNilIface(fmt, i) - } - case Formattable: - switch { - // catch nil case first - case !notNil(i): - appendNilIface(fmt, i) - - // not permitted - case fmt.Verbose(): - return false - - // use func - default: - fmt.buf.B = i.AppendFormat(fmt.buf.B) - } - case stdfmt.Stringer: - switch { - // catch nil case first - case !notNil(i): - appendNilIface(fmt, i) - - // not permitted - case fmt.Verbose(): - return false - - // use func - default: - appendString(fmt, i.String()) - } - default: - return false // could not handle - } - - return true -} - -// appendReflectValue will safely append a reflected value -func appendRValue(fmt format, v reflect.Value) { - switch v.Kind() { - case reflect.Float32, reflect.Float64: - appendFloat(fmt, v.Float()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - appendInt(fmt, v.Int()) - case reflect.Uint8: - appendByte(fmt, uint8(v.Uint())) - case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: - appendUint(fmt, v.Uint()) - case reflect.Bool: - appendBool(fmt, v.Bool()) - case reflect.Array: - appendArrayType(fmt, v) - case reflect.Slice: - appendSliceType(fmt, v) - case reflect.Map: - appendMapType(fmt, v) - case reflect.Struct: - appendStructType(fmt, v) - case reflect.Ptr: - if v.IsNil() { - appendNilRValue(fmt, v) - } else { - appendRValue(fmt.IncrDerefs(), v.Elem()) - } - case reflect.UnsafePointer: - fmt.buf.WriteString("(unsafe.Pointer)") - fmt.buf.WriteByte('(') - if u := v.Pointer(); u != 0 { - fmt.buf.WriteString("0x") - fmt.buf.B = strconv.AppendUint(fmt.buf.B, uint64(u), 16) - } else { - fmt.buf.WriteString(`nil`) - } - fmt.buf.WriteByte(')') - case reflect.Uintptr: - fmt.buf.WriteString("(uintptr)") - fmt.buf.WriteByte('(') - if u := v.Uint(); u != 0 { - fmt.buf.WriteString("0x") - fmt.buf.B = strconv.AppendUint(fmt.buf.B, u, 16) - } else { - fmt.buf.WriteString(`nil`) - } - fmt.buf.WriteByte(')') - case reflect.String: - appendString(fmt, v.String()) - case reflect.Complex64, reflect.Complex128: - appendComplex(fmt, v.Complex()) - case reflect.Func, reflect.Chan, reflect.Interface: - if v.IsNil() { - appendNilRValue(fmt, v) - } else { - fmt.buf.WriteString(v.String()) - } - default: - fmt.buf.WriteString(v.String()) - } -} - -// appendIfaceMap writes a map of key-value pairs (as a set of fields) to buf -func appendIfaceMap(fmt format, v map[string]interface{}) { - // Catch nil map - if v == nil { - appendNilType(fmt, `map[string]interface{}`) - return - } - - fmt.buf.WriteByte('{') - - // Write map pairs! - for key, value := range v { - appendString(fmt.SetIsKey(true), key) - fmt.buf.WriteByte('=') - appendIfaceOrRValueNext(fmt.SetIsKey(false), value) - fmt.buf.WriteByte(' ') - } - - // Drop last space - if len(v) > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte('}') -} - -// appendArrayType writes an array of unknown type (parsed by reflection) to buf, unlike appendSliceType does NOT catch nil slice -func appendArrayType(fmt format, v reflect.Value) { - // get no. elements - n := v.Len() - - fmt.buf.WriteByte('[') - - // Write values - for i := 0; i < n; i++ { - appendRValueOrIfaceNext(fmt.SetIsKey(false), v.Index(i)) - fmt.buf.WriteByte(',') - } - - // Drop last comma - if n > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte(']') -} - -// appendSliceType writes a slice of unknown type (parsed by reflection) to buf -func appendSliceType(fmt format, v reflect.Value) { - if v.IsNil() { - appendNilRValue(fmt, v) - } else { - appendArrayType(fmt, v) - } -} - -// appendMapType writes a map of unknown types (parsed by reflection) to buf -func appendMapType(fmt format, v reflect.Value) { - // Catch nil map - if v.IsNil() { - appendNilRValue(fmt, v) - return - } - - // Get a map iterator - r := v.MapRange() - n := v.Len() - - fmt.buf.WriteByte('{') - - // Iterate pairs - for r.Next() { - appendRValueOrIfaceNext(fmt.SetIsKey(true), r.Key()) - fmt.buf.WriteByte('=') - appendRValueOrIfaceNext(fmt.SetIsKey(false), r.Value()) - fmt.buf.WriteByte(' ') - } - - // Drop last space - if n > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte('}') -} - -// appendStructType writes a struct (as a set of key-value fields) to buf -func appendStructType(fmt format, v reflect.Value) { - // Get value type & no. fields - t := v.Type() - n := v.NumField() - w := 0 - - // If verbose, append the type - - fmt.buf.WriteByte('{') - - // Iterate fields - for i := 0; i < n; i++ { - vfield := v.Field(i) - name := t.Field(i).Name - - // Append field name - appendString(fmt.SetIsKey(true), name) - fmt.buf.WriteByte('=') - - if !vfield.CanInterface() { - // This is an unexported field - appendRValue(fmt.SetIsKey(false), vfield) - } else { - // This is an exported field! - appendRValueOrIfaceNext(fmt.SetIsKey(false), vfield) - } - - // Iter written count - fmt.buf.WriteByte(' ') - w++ - } - - // Drop last space - if w > 0 { - fmt.buf.Truncate(1) - } - - fmt.buf.WriteByte('}') -} - -// containsSpaceOrTab checks if "s" contains space or tabs -func containsSpaceOrTab(s string) bool { - for _, r := range s { - if r == ' ' || r == '\t' { - return true - } - } - return false -} diff --git a/vendor/codeberg.org/gruf/go-logger/hook.go b/vendor/codeberg.org/gruf/go-logger/hook.go deleted file mode 100644 index 2345ca93bf..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/hook.go +++ /dev/null @@ -1,13 +0,0 @@ -package logger - -// Hook defines a log Entry modifier -type Hook interface { - Do(*Entry) -} - -// HookFunc is a simple adapter to allow functions to satisfy the Hook interface -type HookFunc func(*Entry) - -func (hook HookFunc) Do(entry *Entry) { - hook(entry) -} diff --git a/vendor/codeberg.org/gruf/go-logger/level.go b/vendor/codeberg.org/gruf/go-logger/level.go deleted file mode 100644 index 0a076c246b..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/level.go +++ /dev/null @@ -1,38 +0,0 @@ -package logger - -// LEVEL defines a level of logging -type LEVEL uint8 - -// Available levels of logging. -const ( - unset LEVEL = ^LEVEL(0) - DEBUG LEVEL = 5 - INFO LEVEL = 10 - WARN LEVEL = 15 - ERROR LEVEL = 20 - FATAL LEVEL = 25 -) - -var unknownLevel = "unknown" - -// Levels defines a mapping of log LEVELs to formatted level strings -type Levels [^LEVEL(0)]string - -// DefaultLevels returns the default set of log levels -func DefaultLevels() Levels { - return Levels{ - DEBUG: "DEBUG", - INFO: "INFO", - WARN: "WARN", - ERROR: "ERROR", - FATAL: "FATAL", - } -} - -// Get fetches the level string for the provided value, or "unknown" -func (l Levels) Get(lvl LEVEL) string { - if str := l[int(lvl)]; str != "" { - return str - } - return unknownLevel -} diff --git a/vendor/codeberg.org/gruf/go-logger/logger.go b/vendor/codeberg.org/gruf/go-logger/logger.go deleted file mode 100644 index 94d3ab8ca7..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/logger.go +++ /dev/null @@ -1,187 +0,0 @@ -package logger - -import ( - "context" - "fmt" - "io" - "os" - "sync" - "sync/atomic" - - "codeberg.org/gruf/go-bytes" -) - -type Logger struct { - // Hooks defines a list of hooks which are called before an entry - // is written. This should NOT be modified while the Logger is in use - Hooks []Hook - - // Level is the current log LEVEL, entries at level below the - // currently set level will not be output. This should NOT - // be modified while the Logger is in use - Level LEVEL - - // Timestamp defines whether to automatically append timestamps - // to entries written via Logger convience methods and specifically - // Entry.TimestampIf(). This should NOT be modified while Logger in use - Timestamp bool - - // Format is the log entry LogFormat to use. This should NOT - // be modified while the Logger is in use - Format LogFormat - - // BufferSize is the Entry buffer size to use when allocating - // new Entry objects. This should be modified atomically - BufSize int64 - - // Output is the log's output writer. This should NOT be - // modified while the Logger is in use - Output io.Writer - - // entry pool - pool sync.Pool -} - -// New returns a new Logger instance with defaults -func New(out io.Writer) *Logger { - return NewWith(0 /* all */, true, DefaultTextFormat, 512, out) -} - -// NewWith returns a new Logger instance with supplied configuration -func NewWith(lvl LEVEL, timestamp bool, fmt LogFormat, bufsize int64, out io.Writer) *Logger { - // Create new logger object - log := &Logger{ - Level: lvl, - Timestamp: timestamp, - Format: fmt, - BufSize: bufsize, - Output: out, - } - - // Ensure clock running - startClock() - - // Set-up logger Entry pool - log.pool.New = func() interface{} { - return &Entry{ - lvl: unset, - buf: &bytes.Buffer{B: make([]byte, 0, atomic.LoadInt64(&log.BufSize))}, - log: log, - } - } - - return log -} - -// Entry returns a new Entry from the Logger's pool with background context -func (l *Logger) Entry() *Entry { - entry, _ := l.pool.Get().(*Entry) - entry.ctx = context.Background() - return entry -} - -// Debug prints the provided arguments with the debug prefix -func (l *Logger) Debug(a ...interface{}) { - l.Log(DEBUG, a...) -} - -// Debugf prints the provided format string and arguments with the debug prefix -func (l *Logger) Debugf(s string, a ...interface{}) { - l.Logf(DEBUG, s, a...) -} - -// Info prints the provided arguments with the info prefix -func (l *Logger) Info(a ...interface{}) { - l.Log(INFO, a...) -} - -// Infof prints the provided format string and arguments with the info prefix -func (l *Logger) Infof(s string, a ...interface{}) { - l.Logf(INFO, s, a...) -} - -// Warn prints the provided arguments with the warn prefix -func (l *Logger) Warn(a ...interface{}) { - l.Log(WARN, a...) -} - -// Warnf prints the provided format string and arguments with the warn prefix -func (l *Logger) Warnf(s string, a ...interface{}) { - l.Logf(WARN, s, a...) -} - -// Error prints the provided arguments with the error prefix -func (l *Logger) Error(a ...interface{}) { - l.Log(ERROR, a...) -} - -// Errorf prints the provided format string and arguments with the error prefix -func (l *Logger) Errorf(s string, a ...interface{}) { - l.Logf(ERROR, s, a...) -} - -// Fatal prints provided arguments with the fatal prefix before exiting the program -// with os.Exit(1) -func (l *Logger) Fatal(a ...interface{}) { - defer os.Exit(1) - l.Log(FATAL, a...) -} - -// Fatalf prints provided the provided format string and arguments with the fatal prefix -// before exiting the program with os.Exit(1) -func (l *Logger) Fatalf(s string, a ...interface{}) { - defer os.Exit(1) - l.Logf(FATAL, s, a...) -} - -// Log prints the provided arguments at the supplied log level -func (l *Logger) Log(lvl LEVEL, a ...interface{}) { - if lvl >= l.Level { - l.Entry().TimestampIf().Level(lvl).Hooks().Msg(a...) - } -} - -// Logf prints the provided format string and arguments at the supplied log level -func (l *Logger) Logf(lvl LEVEL, s string, a ...interface{}) { - if lvl >= l.Level { - l.Entry().TimestampIf().Level(lvl).Hooks().Msgf(s, a...) - } -} - -// LogFields prints the provided fields formatted as key-value pairs at the supplied log level -func (l *Logger) LogFields(lvl LEVEL, fields map[string]interface{}) { - if lvl >= l.Level { - l.Entry().TimestampIf().Level(lvl).Fields(fields).Hooks().Send() - } -} - -// LogValues prints the provided values formatted as-so at the supplied log level -func (l *Logger) LogValues(lvl LEVEL, a ...interface{}) { - if lvl >= l.Level { - l.Entry().TimestampIf().Level(lvl).Values(a...).Hooks().Send() - } -} - -// Print simply prints provided arguments -func (l *Logger) Print(a ...interface{}) { - e := l.Entry().TimestampIf() - fmt.Fprint(e.buf, a...) - e.Send() -} - -// Printf simply prints provided the provided format string and arguments -func (l *Logger) Printf(s string, a ...interface{}) { - e := l.Entry().TimestampIf() - fmt.Fprintf(e.buf, s, a...) - e.Send() -} - -// PrintFields prints the provided fields formatted as key-value pairs -func (l *Logger) PrintFields(fields map[string]interface{}) { - l.Entry().TimestampIf().Fields(fields).Send() -} - -// PrintValues prints the provided values formatted as-so -func (l *Logger) PrintValues(a ...interface{}) { - l.Entry().TimestampIf().Values(a...).Send() -} diff --git a/vendor/codeberg.org/gruf/go-logger/writer.go b/vendor/codeberg.org/gruf/go-logger/writer.go deleted file mode 100644 index 72321f5184..0000000000 --- a/vendor/codeberg.org/gruf/go-logger/writer.go +++ /dev/null @@ -1,29 +0,0 @@ -package logger - -import ( - "io" - "io/ioutil" - "sync" -) - -// AddSafety wraps an io.Writer to provide mutex locking protection -func AddSafety(w io.Writer) io.Writer { - if w == nil { - w = ioutil.Discard - } else if sw, ok := w.(*safeWriter); ok { - return sw - } - return &safeWriter{wr: w} -} - -// safeWriter wraps an io.Writer to provide mutex locking on write -type safeWriter struct { - wr io.Writer - mu sync.Mutex -} - -func (w *safeWriter) Write(b []byte) (int, error) { - w.mu.Lock() - defer w.mu.Unlock() - return w.wr.Write(b) -} diff --git a/vendor/codeberg.org/gruf/go-store/kv/iterator.go b/vendor/codeberg.org/gruf/go-store/kv/iterator.go index d3999273ff..ddaaf60cf8 100644 --- a/vendor/codeberg.org/gruf/go-store/kv/iterator.go +++ b/vendor/codeberg.org/gruf/go-store/kv/iterator.go @@ -60,5 +60,5 @@ func (i *KVIterator) Value() ([]byte, error) { } // Attempt to fetch from store - return i.store.get(i.key) + return i.store.get(i.store.mutexMap.RLock, i.key) } diff --git a/vendor/codeberg.org/gruf/go-store/kv/state.go b/vendor/codeberg.org/gruf/go-store/kv/state.go index 20a3e951d9..330928bce5 100644 --- a/vendor/codeberg.org/gruf/go-store/kv/state.go +++ b/vendor/codeberg.org/gruf/go-store/kv/state.go @@ -30,7 +30,7 @@ func (st *StateRO) Get(key string) ([]byte, error) { } // Pass request to store - return st.store.get(key) + return st.store.get(st.store.mutexMap.RLock, key) } func (st *StateRO) GetStream(key string) (io.ReadCloser, error) { @@ -44,7 +44,7 @@ func (st *StateRO) GetStream(key string) (io.ReadCloser, error) { } // Pass request to store - return st.store.getStream(key) + return st.store.getStream(st.store.mutexMap.RLock, key) } func (st *StateRO) Has(key string) (bool, error) { @@ -58,7 +58,7 @@ func (st *StateRO) Has(key string) (bool, error) { } // Pass request to store - return st.store.has(key) + return st.store.has(st.store.mutexMap.RLock, key) } func (st *StateRO) Release() { @@ -94,7 +94,7 @@ func (st *StateRW) Get(key string) ([]byte, error) { } // Pass request to store - return st.store.get(key) + return st.store.get(st.store.mutexMap.RLock, key) } func (st *StateRW) GetStream(key string) (io.ReadCloser, error) { @@ -108,7 +108,7 @@ func (st *StateRW) GetStream(key string) (io.ReadCloser, error) { } // Pass request to store - return st.store.getStream(key) + return st.store.getStream(st.store.mutexMap.RLock, key) } func (st *StateRW) Put(key string, value []byte) error { @@ -122,7 +122,7 @@ func (st *StateRW) Put(key string, value []byte) error { } // Pass request to store - return st.store.put(key, value) + return st.store.put(st.store.mutexMap.Lock, key, value) } func (st *StateRW) PutStream(key string, r io.Reader) error { @@ -136,7 +136,7 @@ func (st *StateRW) PutStream(key string, r io.Reader) error { } // Pass request to store - return st.store.putStream(key, r) + return st.store.putStream(st.store.mutexMap.Lock, key, r) } func (st *StateRW) Has(key string) (bool, error) { @@ -150,7 +150,7 @@ func (st *StateRW) Has(key string) (bool, error) { } // Pass request to store - return st.store.has(key) + return st.store.has(st.store.mutexMap.RLock, key) } func (st *StateRW) Delete(key string) error { @@ -164,7 +164,7 @@ func (st *StateRW) Delete(key string) error { } // Pass request to store - return st.store.delete(key) + return st.store.delete(st.store.mutexMap.Lock, key) } func (st *StateRW) Release() { diff --git a/vendor/codeberg.org/gruf/go-store/kv/store.go b/vendor/codeberg.org/gruf/go-store/kv/store.go index 34fe919875..4c3a311408 100644 --- a/vendor/codeberg.org/gruf/go-store/kv/store.go +++ b/vendor/codeberg.org/gruf/go-store/kv/store.go @@ -53,19 +53,30 @@ func OpenStorage(storage storage.Storage) (*KVStore, error) { }, nil } -// Get fetches the bytes for supplied key in the store -func (st *KVStore) Get(key string) ([]byte, error) { - // Acquire store read lock +// RLock acquires a read-lock on supplied key, returning unlock function. +func (st *KVStore) RLock(key string) (runlock func()) { st.mutex.RLock() - defer st.mutex.RUnlock() + runlock = st.mutexMap.RLock(key) + st.mutex.RUnlock() + return runlock +} - // Pass to unprotected fn - return st.get(key) +// Lock acquires a write-lock on supplied key, returning unlock function. +func (st *KVStore) Lock(key string) (unlock func()) { + st.mutex.Lock() + unlock = st.mutexMap.Lock(key) + st.mutex.Unlock() + return unlock } -func (st *KVStore) get(key string) ([]byte, error) { +// Get fetches the bytes for supplied key in the store +func (st *KVStore) Get(key string) ([]byte, error) { + return st.get(st.RLock, key) +} + +func (st *KVStore) get(rlock func(string) func(), key string) ([]byte, error) { // Acquire read lock for key - runlock := st.mutexMap.RLock(key) + runlock := rlock(key) defer runlock() // Read file bytes @@ -74,17 +85,12 @@ func (st *KVStore) get(key string) ([]byte, error) { // GetStream fetches a ReadCloser for the bytes at the supplied key location in the store func (st *KVStore) GetStream(key string) (io.ReadCloser, error) { - // Acquire store read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - - // Pass to unprotected fn - return st.getStream(key) + return st.getStream(st.RLock, key) } -func (st *KVStore) getStream(key string) (io.ReadCloser, error) { +func (st *KVStore) getStream(rlock func(string) func(), key string) (io.ReadCloser, error) { // Acquire read lock for key - runlock := st.mutexMap.RLock(key) + runlock := rlock(key) // Attempt to open stream for read rd, err := st.storage.ReadStream(key) @@ -99,17 +105,12 @@ func (st *KVStore) getStream(key string) (io.ReadCloser, error) { // Put places the bytes at the supplied key location in the store func (st *KVStore) Put(key string, value []byte) error { - // Acquire store write lock - st.mutex.Lock() - defer st.mutex.Unlock() - - // Pass to unprotected fn - return st.put(key, value) + return st.put(st.Lock, key, value) } -func (st *KVStore) put(key string, value []byte) error { +func (st *KVStore) put(lock func(string) func(), key string, value []byte) error { // Acquire write lock for key - unlock := st.mutexMap.Lock(key) + unlock := lock(key) defer unlock() // Write file bytes @@ -118,17 +119,12 @@ func (st *KVStore) put(key string, value []byte) error { // PutStream writes the bytes from the supplied Reader at the supplied key location in the store func (st *KVStore) PutStream(key string, r io.Reader) error { - // Acquire store write lock - st.mutex.Lock() - defer st.mutex.Unlock() - - // Pass to unprotected fn - return st.putStream(key, r) + return st.putStream(st.Lock, key, r) } -func (st *KVStore) putStream(key string, r io.Reader) error { +func (st *KVStore) putStream(lock func(string) func(), key string, r io.Reader) error { // Acquire write lock for key - unlock := st.mutexMap.Lock(key) + unlock := lock(key) defer unlock() // Write file stream @@ -137,17 +133,12 @@ func (st *KVStore) putStream(key string, r io.Reader) error { // Has checks whether the supplied key exists in the store func (st *KVStore) Has(key string) (bool, error) { - // Acquire store read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - - // Pass to unprotected fn - return st.has(key) + return st.has(st.RLock, key) } -func (st *KVStore) has(key string) (bool, error) { +func (st *KVStore) has(rlock func(string) func(), key string) (bool, error) { // Acquire read lock for key - runlock := st.mutexMap.RLock(key) + runlock := rlock(key) defer runlock() // Stat file on disk @@ -156,17 +147,12 @@ func (st *KVStore) has(key string) (bool, error) { // Delete removes the supplied key-value pair from the store func (st *KVStore) Delete(key string) error { - // Acquire store write lock - st.mutex.Lock() - defer st.mutex.Unlock() - - // Pass to unprotected fn - return st.delete(key) + return st.delete(st.Lock, key) } -func (st *KVStore) delete(key string) error { +func (st *KVStore) delete(lock func(string) func(), key string) error { // Acquire write lock for key - unlock := st.mutexMap.Lock(key) + unlock := lock(key) defer unlock() // Remove file from disk diff --git a/vendor/codeberg.org/gruf/go-store/storage/block.go b/vendor/codeberg.org/gruf/go-store/storage/block.go index 9a8c4dc7df..bc35b07acf 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/block.go +++ b/vendor/codeberg.org/gruf/go-store/storage/block.go @@ -1,7 +1,6 @@ package storage import ( - "crypto/sha256" "io" "io/fs" "os" @@ -14,6 +13,7 @@ import ( "codeberg.org/gruf/go-hashenc" "codeberg.org/gruf/go-pools" "codeberg.org/gruf/go-store/util" + "github.com/zeebo/blake3" ) var ( @@ -77,7 +77,7 @@ func getBlockConfig(cfg *BlockConfig) BlockConfig { // BlockStorage is a Storage implementation that stores input data as chunks on // a filesystem. Each value is chunked into blocks of configured size and these -// blocks are stored with name equal to their base64-encoded SHA256 hash-sum. A +// blocks are stored with name equal to their base64-encoded BLAKE3 hash-sum. A // "node" file is finally created containing an array of hashes contained within // this value type BlockStorage struct { @@ -87,6 +87,7 @@ type BlockStorage struct { config BlockConfig // cfg is the supplied configuration for this store hashPool sync.Pool // hashPool is this store's hashEncoder pool bufpool pools.BufferPool // bufpool is this store's bytes.Buffer pool + lock *LockableFile // lock is the opened lockfile for this storage instance // NOTE: // BlockStorage does not need to lock each of the underlying block files @@ -138,6 +139,14 @@ func OpenBlock(path string, cfg *BlockConfig) (*BlockStorage, error) { return nil, errPathIsFile } + // Open and acquire storage lock for path + lock, err := OpenLock(pb.Join(path, LockFile)) + if err != nil { + return nil, err + } else if err := lock.Lock(); err != nil { + return nil, err + } + // Figure out the largest size for bufpool slices bufSz := encodedHashLen if bufSz < config.BlockSize { @@ -159,6 +168,7 @@ func OpenBlock(path string, cfg *BlockConfig) (*BlockStorage, error) { }, }, bufpool: pools.NewBufferPool(bufSz), + lock: lock, }, nil } @@ -443,11 +453,16 @@ loop: continue loop } - // Write in separate goroutine + // Check if reached EOF + atEOF := (n < buf.Len()) + wg.Add(1) go func() { - // Defer buffer release + signal done + // Perform writes in goroutine + defer func() { + // Defer release + + // signal we're done st.bufpool.Put(buf) wg.Done() }() @@ -460,8 +475,8 @@ loop: } }() - // We reached EOF - if n < buf.Len() { + // Break at end + if atEOF { break loop } } @@ -568,6 +583,12 @@ func (st *BlockStorage) Remove(key string) error { return os.Remove(kpath) } +// Close implements Storage.Close() +func (st *BlockStorage) Close() error { + defer st.lock.Close() + return st.lock.Unlock() +} + // WalkKeys implements Storage.WalkKeys() func (st *BlockStorage) WalkKeys(opts WalkKeysOptions) error { // Acquire path builder @@ -610,7 +631,7 @@ func (st *BlockStorage) blockPathForKey(hash string) string { } // hashSeparator is the separating byte between block hashes -const hashSeparator = byte(':') +const hashSeparator = byte('\n') // node represents the contents of a node file in storage type node struct { @@ -773,24 +794,28 @@ func (r *blockReader) Read(b []byte) (int, error) { } } +var ( + // base64Encoding is our base64 encoding object. + base64Encoding = hashenc.Base64() + + // encodedHashLen is the once-calculated encoded hash-sum length + encodedHashLen = base64Encoding.EncodedLen( + blake3.New().Size(), + ) +) + // hashEncoder is a HashEncoder with built-in encode buffer type hashEncoder struct { henc hashenc.HashEncoder ebuf []byte } -// encodedHashLen is the once-calculated encoded hash-sum length -var encodedHashLen = hashenc.Base64().EncodedLen( - sha256.New().Size(), -) - // newHashEncoder returns a new hashEncoder instance func newHashEncoder() *hashEncoder { - hash := sha256.New() - enc := hashenc.Base64() + hash := blake3.New() return &hashEncoder{ - henc: hashenc.New(hash, enc), - ebuf: make([]byte, enc.EncodedLen(hash.Size())), + henc: hashenc.New(hash, base64Encoding), + ebuf: make([]byte, encodedHashLen), } } diff --git a/vendor/codeberg.org/gruf/go-store/storage/disk.go b/vendor/codeberg.org/gruf/go-store/storage/disk.go index 060d56688c..9b5430437c 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/disk.go +++ b/vendor/codeberg.org/gruf/go-store/storage/disk.go @@ -71,6 +71,7 @@ type DiskStorage struct { path string // path is the root path of this store bufp pools.BufferPool // bufp is the buffer pool for this DiskStorage config DiskConfig // cfg is the supplied configuration for this store + lock *LockableFile // lock is the opened lockfile for this storage instance } // OpenFile opens a DiskStorage instance for given folder path and configuration @@ -81,13 +82,13 @@ func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { // Clean provided path, ensure ends in '/' (should // be dir, this helps with file path trimming later) - path = pb.Clean(path) + "/" + storePath := pb.Join(path, "store") + "/" // Get checked config config := getDiskConfig(cfg) // Attempt to open dir path - file, err := os.OpenFile(path, defaultFileROFlags, defaultDirPerms) + file, err := os.OpenFile(storePath, defaultFileROFlags, defaultDirPerms) if err != nil { // If not a not-exist error, return if !os.IsNotExist(err) { @@ -95,13 +96,13 @@ func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { } // Attempt to make store path dirs - err = os.MkdirAll(path, defaultDirPerms) + err = os.MkdirAll(storePath, defaultDirPerms) if err != nil { return nil, err } // Reopen dir now it's been created - file, err = os.OpenFile(path, defaultFileROFlags, defaultDirPerms) + file, err = os.OpenFile(storePath, defaultFileROFlags, defaultDirPerms) if err != nil { return nil, err } @@ -116,11 +117,20 @@ func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { return nil, errPathIsFile } + // Open and acquire storage lock for path + lock, err := OpenLock(pb.Join(path, LockFile)) + if err != nil { + return nil, err + } else if err := lock.Lock(); err != nil { + return nil, err + } + // Return new DiskStorage return &DiskStorage{ - path: path, + path: storePath, bufp: pools.NewBufferPool(config.WriteBufSize), config: config, + lock: lock, }, nil } @@ -248,6 +258,12 @@ func (st *DiskStorage) Remove(key string) error { return os.Remove(kpath) } +// Close implements Storage.Close() +func (st *DiskStorage) Close() error { + defer st.lock.Close() + return st.lock.Unlock() +} + // WalkKeys implements Storage.WalkKeys() func (st *DiskStorage) WalkKeys(opts WalkKeysOptions) error { // Acquire path builder @@ -256,8 +272,9 @@ func (st *DiskStorage) WalkKeys(opts WalkKeysOptions) error { // Walk dir for entries return util.WalkDir(pb, st.path, func(kpath string, fsentry fs.DirEntry) { - // Only deal with regular files if fsentry.Type().IsRegular() { + // Only deal with regular files + // Get full item path (without root) kpath = pb.Join(kpath, fsentry.Name())[len(st.path):] diff --git a/vendor/codeberg.org/gruf/go-store/storage/fs.go b/vendor/codeberg.org/gruf/go-store/storage/fs.go index 444cee4b02..ff4c857c31 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/fs.go +++ b/vendor/codeberg.org/gruf/go-store/storage/fs.go @@ -39,7 +39,7 @@ func stat(path string) (bool, error) { return syscall.Stat(path, &stat) }) if err != nil { - if err == syscall.ENOENT { + if err == syscall.ENOENT { //nolint err = nil } return false, err diff --git a/vendor/codeberg.org/gruf/go-store/storage/lock.go b/vendor/codeberg.org/gruf/go-store/storage/lock.go index 3d794cda97..a757830cc3 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/lock.go +++ b/vendor/codeberg.org/gruf/go-store/storage/lock.go @@ -7,27 +7,31 @@ import ( "codeberg.org/gruf/go-store/util" ) -type lockableFile struct { +// LockFile is our standard lockfile name. +const LockFile = "store.lock" + +type LockableFile struct { *os.File } -func openLock(path string) (*lockableFile, error) { +// OpenLock opens a lockfile at path. +func OpenLock(path string) (*LockableFile, error) { file, err := open(path, defaultFileLockFlags) if err != nil { return nil, err } - return &lockableFile{file}, nil + return &LockableFile{file}, nil } -func (f *lockableFile) lock() error { +func (f *LockableFile) Lock() error { return f.flock(syscall.LOCK_EX | syscall.LOCK_NB) } -func (f *lockableFile) unlock() error { +func (f *LockableFile) Unlock() error { return f.flock(syscall.LOCK_UN | syscall.LOCK_NB) } -func (f *lockableFile) flock(how int) error { +func (f *LockableFile) flock(how int) error { return util.RetryOnEINTR(func() error { return syscall.Flock(int(f.Fd()), how) }) diff --git a/vendor/codeberg.org/gruf/go-store/storage/memory.go b/vendor/codeberg.org/gruf/go-store/storage/memory.go index be60fa4649..7daa4a4833 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/memory.go +++ b/vendor/codeberg.org/gruf/go-store/storage/memory.go @@ -2,6 +2,7 @@ package storage import ( "io" + "sync" "codeberg.org/gruf/go-bytes" "codeberg.org/gruf/go-store/util" @@ -10,13 +11,17 @@ import ( // MemoryStorage is a storage implementation that simply stores key-value // pairs in a Go map in-memory. The map is protected by a mutex. type MemoryStorage struct { + ow bool // overwrites fs map[string][]byte + mu sync.Mutex } // OpenMemory opens a new MemoryStorage instance with internal map of 'size'. -func OpenMemory(size int) *MemoryStorage { +func OpenMemory(size int, overwrites bool) *MemoryStorage { return &MemoryStorage{ fs: make(map[string][]byte, size), + mu: sync.Mutex{}, + ow: overwrites, } } @@ -27,19 +32,33 @@ func (st *MemoryStorage) Clean() error { // ReadBytes implements Storage.ReadBytes(). func (st *MemoryStorage) ReadBytes(key string) ([]byte, error) { + // Safely check store + st.mu.Lock() b, ok := st.fs[key] + st.mu.Unlock() + + // Return early if not exist if !ok { return nil, ErrNotFound } + + // Create return copy return bytes.Copy(b), nil } // ReadStream implements Storage.ReadStream(). func (st *MemoryStorage) ReadStream(key string) (io.ReadCloser, error) { + // Safely check store + st.mu.Lock() b, ok := st.fs[key] + st.mu.Unlock() + + // Return early if not exist if !ok { return nil, ErrNotFound } + + // Create io.ReadCloser from 'b' copy b = bytes.Copy(b) r := bytes.NewReader(b) return util.NopReadCloser(r), nil @@ -47,43 +66,73 @@ func (st *MemoryStorage) ReadStream(key string) (io.ReadCloser, error) { // WriteBytes implements Storage.WriteBytes(). func (st *MemoryStorage) WriteBytes(key string, b []byte) error { + // Safely check store + st.mu.Lock() _, ok := st.fs[key] - if ok { + + // Check for already exist + if ok && !st.ow { + st.mu.Unlock() return ErrAlreadyExists } + + // Write + unlock st.fs[key] = bytes.Copy(b) + st.mu.Unlock() return nil } // WriteStream implements Storage.WriteStream(). func (st *MemoryStorage) WriteStream(key string, r io.Reader) error { + // Read all from reader b, err := io.ReadAll(r) if err != nil { return err } + + // Write to storage return st.WriteBytes(key, b) } // Stat implements Storage.Stat(). func (st *MemoryStorage) Stat(key string) (bool, error) { + st.mu.Lock() _, ok := st.fs[key] + st.mu.Unlock() return ok, nil } // Remove implements Storage.Remove(). func (st *MemoryStorage) Remove(key string) error { + // Safely check store + st.mu.Lock() _, ok := st.fs[key] + + // Check in store if !ok { + st.mu.Unlock() return ErrNotFound } + + // Delete + unlock delete(st.fs, key) + st.mu.Unlock() + return nil +} + +// Close implements Storage.Close(). +func (st *MemoryStorage) Close() error { return nil } // WalkKeys implements Storage.WalkKeys(). func (st *MemoryStorage) WalkKeys(opts WalkKeysOptions) error { + // Safely walk storage keys + st.mu.Lock() for key := range st.fs { opts.WalkFn(entry(key)) } + st.mu.Unlock() + return nil } diff --git a/vendor/codeberg.org/gruf/go-store/storage/storage.go b/vendor/codeberg.org/gruf/go-store/storage/storage.go index b160267a4a..346aff097c 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/storage.go +++ b/vendor/codeberg.org/gruf/go-store/storage/storage.go @@ -19,9 +19,6 @@ func (e entry) Key() string { // Storage defines a means of storing and accessing key value pairs type Storage interface { - // Clean removes unused values and unclutters the storage (e.g. removing empty folders) - Clean() error - // ReadBytes returns the byte value for key in storage ReadBytes(key string) ([]byte, error) @@ -40,6 +37,12 @@ type Storage interface { // Remove attempts to remove the supplied key-value pair from storage Remove(key string) error + // Close will close the storage, releasing any file locks + Close() error + + // Clean removes unused values and unclutters the storage (e.g. removing empty folders) + Clean() error + // WalkKeys walks the keys in the storage WalkKeys(opts WalkKeysOptions) error } diff --git a/vendor/github.com/zeebo/blake3/.gitignore b/vendor/github.com/zeebo/blake3/.gitignore new file mode 100644 index 0000000000..c6bfdf2c36 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/.gitignore @@ -0,0 +1,6 @@ +*.pprof +*.test +*.txt +*.out + +/upstream diff --git a/vendor/github.com/zeebo/blake3/LICENSE b/vendor/github.com/zeebo/blake3/LICENSE new file mode 100644 index 0000000000..3a63575d3a --- /dev/null +++ b/vendor/github.com/zeebo/blake3/LICENSE @@ -0,0 +1,125 @@ +This work is released into the public domain with CC0 1.0. + +------------------------------------------------------------------------------- + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/vendor/github.com/zeebo/blake3/Makefile b/vendor/github.com/zeebo/blake3/Makefile new file mode 100644 index 0000000000..f98f0f093b --- /dev/null +++ b/vendor/github.com/zeebo/blake3/Makefile @@ -0,0 +1,11 @@ +asm: internal/alg/hash/hash_avx2/impl_amd64.s internal/alg/compress/compress_sse41/impl_amd64.s + +internal/alg/hash/hash_avx2/impl_amd64.s: avo/avx2/*.go + ( cd avo; go run ./avx2 ) > internal/alg/hash/hash_avx2/impl_amd64.s + +internal/alg/compress/compress_sse41/impl_amd64.s: avo/sse41/*.go + ( cd avo; go run ./sse41 ) > internal/alg/compress/compress_sse41/impl_amd64.s + +.PHONY: test +test: + go test -race -bench=. -benchtime=1x diff --git a/vendor/github.com/zeebo/blake3/README.md b/vendor/github.com/zeebo/blake3/README.md new file mode 100644 index 0000000000..0a0f2e1865 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/README.md @@ -0,0 +1,77 @@ +# BLAKE3 + +

+ go.dev + Go Report Card + SourceGraph +

+ +Pure Go implementation of [BLAKE3](https://blake3.io) with AVX2 and SSE4.1 acceleration. + +Special thanks to the excellent [avo](https://github.com/mmcloughlin/avo) making writing vectorized version much easier. + +# Benchmarks + +## Caveats + +This library makes some different design decisions than the upstream Rust crate around internal buffering. Specifically, because it does not target the embedded system space, nor does it support multithreading, it elects to do its own internal buffering. This means that a user does not have to worry about providing large enough buffers to get the best possible performance, but it does worse on smaller input sizes. So some notes: + +- The Rust benchmarks below are all single-threaded to match this Go implementation. +- I make no attempt to get precise measurements (cpu throttling, noisy environment, etc.) so please benchmark on your own systems. +- These benchmarks are run on an i7-6700K which does not support AVX-512, so Rust is limited to use AVX2 at sizes above 8 kib. +- I tried my best to make them benchmark the same thing, but who knows? :smile: + +## Charts + +In this case, both libraries are able to avoid a lot of data copying and will use vectorized instructions to hash as fast as possible, and perform similarly. + +![Large Full Buffer](/assets/large-full-buffer.svg) + +For incremental writes, you must provide the Rust version large enough buffers so that it can use vectorized instructions. This Go library performs consistently regardless of the size being sent into the update function. + +![Incremental](/assets/incremental.svg) + +The downside of internal buffering is most apparent with small sizes as most time is spent initializing the hasher state. In terms of hashing rate, the difference is 3-4x, but in an absolute sense it's ~100ns (see tables below). If you wish to hash a large number of very small strings and you care about those nanoseconds, be sure to use the Reset method to avoid re-initializing the state. + +![Small Full Buffer](/assets/small-full-buffer.svg) + +## Timing Tables + +### Small + +| Size | Full Buffer | Reset | | Full Buffer Rate | Reset Rate | +|--------|-------------|------------|-|------------------|--------------| +| 64 b | `205ns` | `86.5ns` | | `312MB/s` | `740MB/s` | +| 256 b | `364ns` | `250ns` | | `703MB/s` | `1.03GB/s` | +| 512 b | `575ns` | `468ns` | | `892MB/s` | `1.10GB/s` | +| 768 b | `795ns` | `682ns` | | `967MB/s` | `1.13GB/s` | + +### Large + +| Size | Incremental | Full Buffer | Reset | | Incremental Rate | Full Buffer Rate | Reset Rate | +|----------|-------------|-------------|------------|-|------------------|------------------|--------------| +| 1 kib | `1.02µs` | `1.01µs` | `891ns` | | `1.00GB/s` | `1.01GB/s` | `1.15GB/s` | +| 2 kib | `2.11µs` | `2.07µs` | `1.95µs` | | `968MB/s` | `990MB/s` | `1.05GB/s` | +| 4 kib | `2.28µs` | `2.15µs` | `2.05µs` | | `1.80GB/s` | `1.90GB/s` | `2.00GB/s` | +| 8 kib | `2.64µs` | `2.52µs` | `2.44µs` | | `3.11GB/s` | `3.25GB/s` | `3.36GB/s` | +| 16 kib | `4.93µs` | `4.54µs` | `4.48µs` | | `3.33GB/s` | `3.61GB/s` | `3.66GB/s` | +| 32 kib | `9.41µs` | `8.62µs` | `8.54µs` | | `3.48GB/s` | `3.80GB/s` | `3.84GB/s` | +| 64 kib | `18.2µs` | `16.7µs` | `16.6µs` | | `3.59GB/s` | `3.91GB/s` | `3.94GB/s` | +| 128 kib | `36.3µs` | `32.9µs` | `33.1µs` | | `3.61GB/s` | `3.99GB/s` | `3.96GB/s` | +| 256 kib | `72.5µs` | `65.7µs` | `66.0µs` | | `3.62GB/s` | `3.99GB/s` | `3.97GB/s` | +| 512 kib | `145µs` | `131µs` | `132µs` | | `3.60GB/s` | `4.00GB/s` | `3.97GB/s` | +| 1024 kib | `290µs` | `262µs` | `262µs` | | `3.62GB/s` | `4.00GB/s` | `4.00GB/s` | + +### No ASM + +| Size | Incremental | Full Buffer | Reset | | Incremental Rate | Full Buffer Rate | Reset Rate | +|----------|-------------|-------------|------------|-|------------------|------------------|-------------| +| 64 b | `253ns` | `254ns` | `134ns` | | `253MB/s` | `252MB/s` | `478MB/s` | +| 256 b | `553ns` | `557ns` | `441ns` | | `463MB/s` | `459MB/s` | `580MB/s` | +| 512 b | `948ns` | `953ns` | `841ns` | | `540MB/s` | `538MB/s` | `609MB/s` | +| 768 b | `1.38µs` | `1.40µs` | `1.35µs` | | `558MB/s` | `547MB/s` | `570MB/s` | +| 1 kib | `1.77µs` | `1.77µs` | `1.70µs` | | `577MB/s` | `580MB/s` | `602MB/s` | +| | | | | | | | | +| 1024 kib | `880µs` | `883µs` | `878µs` | | `596MB/s` | `595MB/s` | `598MB/s` | + +The speed caps out at around 1 kib, so most rows have been elided from the presentation. diff --git a/vendor/github.com/zeebo/blake3/api.go b/vendor/github.com/zeebo/blake3/api.go new file mode 100644 index 0000000000..5de263f08d --- /dev/null +++ b/vendor/github.com/zeebo/blake3/api.go @@ -0,0 +1,166 @@ +// Package blake3 provides an SSE4.1/AVX2 accelerated BLAKE3 implementation. +package blake3 + +import ( + "errors" + + "github.com/zeebo/blake3/internal/consts" + "github.com/zeebo/blake3/internal/utils" +) + +// Hasher is a hash.Hash for BLAKE3. +type Hasher struct { + size int + h hasher +} + +// New returns a new Hasher that has a digest size of 32 bytes. +// +// If you need more or less output bytes than that, use Digest method. +func New() *Hasher { + return &Hasher{ + size: 32, + h: hasher{ + key: consts.IV, + }, + } +} + +// NewKeyed returns a new Hasher that uses the 32 byte input key and has +// a digest size of 32 bytes. +// +// If you need more or less output bytes than that, use the Digest method. +func NewKeyed(key []byte) (*Hasher, error) { + if len(key) != 32 { + return nil, errors.New("invalid key size") + } + + h := &Hasher{ + size: 32, + h: hasher{ + flags: consts.Flag_Keyed, + }, + } + utils.KeyFromBytes(key, &h.h.key) + + return h, nil +} + +// DeriveKey derives a key based on reusable key material of any +// length, in the given context. The key will be stored in out, using +// all of its current length. +// +// Context strings must be hardcoded constants, and the recommended +// format is "[application] [commit timestamp] [purpose]", e.g., +// "example.com 2019-12-25 16:18:03 session tokens v1". +func DeriveKey(context string, material []byte, out []byte) { + h := NewDeriveKey(context) + _, _ = h.Write(material) + _, _ = h.Digest().Read(out) +} + +// NewDeriveKey returns a Hasher that is initialized with the context +// string. See DeriveKey for details. It has a digest size of 32 bytes. +// +// If you need more or less output bytes than that, use the Digest method. +func NewDeriveKey(context string) *Hasher { + // hash the context string and use that instead of IV + h := &Hasher{ + size: 32, + h: hasher{ + key: consts.IV, + flags: consts.Flag_DeriveKeyContext, + }, + } + + var buf [32]byte + _, _ = h.WriteString(context) + _, _ = h.Digest().Read(buf[:]) + + h.Reset() + utils.KeyFromBytes(buf[:], &h.h.key) + h.h.flags = consts.Flag_DeriveKeyMaterial + + return h +} + +// Write implements part of the hash.Hash interface. It never returns an error. +func (h *Hasher) Write(p []byte) (int, error) { + h.h.update(p) + return len(p), nil +} + +// WriteString is like Write but specialized to strings to avoid allocations. +func (h *Hasher) WriteString(p string) (int, error) { + h.h.updateString(p) + return len(p), nil +} + +// Reset implements part of the hash.Hash interface. It causes the Hasher to +// act as if it was newly created. +func (h *Hasher) Reset() { + h.h.reset() +} + +// Clone returns a new Hasher with the same internal state. +// +// Modifying the resulting Hasher will not modify the original Hasher, and vice versa. +func (h *Hasher) Clone() *Hasher { + return &Hasher{size: h.size, h: h.h} +} + +// Size implements part of the hash.Hash interface. It returns the number of +// bytes the hash will output in Sum. +func (h *Hasher) Size() int { + return h.size +} + +// BlockSize implements part of the hash.Hash interface. It returns the most +// natural size to write to the Hasher. +func (h *Hasher) BlockSize() int { + // TODO: is there a downside to picking this large size? + return 8192 +} + +// Sum implements part of the hash.Hash interface. It appends the digest of +// the Hasher to the provided buffer and returns it. +func (h *Hasher) Sum(b []byte) []byte { + if top := len(b) + h.size; top <= cap(b) && top >= len(b) { + h.h.finalize(b[len(b):top]) + return b[:top] + } + + tmp := make([]byte, h.size) + h.h.finalize(tmp) + return append(b, tmp...) +} + +// Digest takes a snapshot of the hash state and returns an object that can +// be used to read and seek through 2^64 bytes of digest output. +func (h *Hasher) Digest() *Digest { + var d Digest + h.h.finalizeDigest(&d) + return &d +} + +// Sum256 returns the first 256 bits of the unkeyed digest of the data. +func Sum256(data []byte) (sum [32]byte) { + out := Sum512(data) + copy(sum[:], out[:32]) + return sum +} + +// Sum512 returns the first 512 bits of the unkeyed digest of the data. +func Sum512(data []byte) (sum [64]byte) { + if len(data) <= consts.ChunkLen { + var d Digest + compressAll(&d, data, 0, consts.IV) + _, _ = d.Read(sum[:]) + return sum + } else { + h := hasher{key: consts.IV} + h.update(data) + h.finalize(sum[:]) + return sum + } +} diff --git a/vendor/github.com/zeebo/blake3/blake3.go b/vendor/github.com/zeebo/blake3/blake3.go new file mode 100644 index 0000000000..98dedcabe9 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/blake3.go @@ -0,0 +1,285 @@ +package blake3 + +import ( + "math/bits" + "unsafe" + + "github.com/zeebo/blake3/internal/alg" + "github.com/zeebo/blake3/internal/consts" + "github.com/zeebo/blake3/internal/utils" +) + +// +// hasher contains state for a blake3 hash +// + +type hasher struct { + len uint64 + chunks uint64 + flags uint32 + key [8]uint32 + stack cvstack + buf [8192]byte +} + +func (a *hasher) reset() { + a.len = 0 + a.chunks = 0 + a.stack.occ = 0 + a.stack.lvls = [8]uint8{} + a.stack.bufn = 0 +} + +func (a *hasher) update(buf []byte) { + // relies on the first two words of a string being the same as a slice + a.updateString(*(*string)(unsafe.Pointer(&buf))) +} + +func (a *hasher) updateString(buf string) { + var input *[8192]byte + + for len(buf) > 0 { + if a.len == 0 && len(buf) > 8192 { + // relies on the data pointer being the first word in the string header + input = (*[8192]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&buf))) + buf = buf[8192:] + } else if a.len < 8192 { + n := copy(a.buf[a.len:], buf) + a.len += uint64(n) + buf = buf[n:] + continue + } else { + input = &a.buf + } + + a.consume(input) + a.len = 0 + a.chunks += 8 + } +} + +func (a *hasher) consume(input *[8192]byte) { + var out chainVector + var chain [8]uint32 + alg.HashF(input, 8192, a.chunks, a.flags, &a.key, &out, &chain) + a.stack.pushN(0, &out, 8, a.flags, &a.key) +} + +func (a *hasher) finalize(p []byte) { + var d Digest + a.finalizeDigest(&d) + _, _ = d.Read(p) +} + +func (a *hasher) finalizeDigest(d *Digest) { + if a.chunks == 0 && a.len <= consts.ChunkLen { + compressAll(d, a.buf[:a.len], a.flags, a.key) + return + } + + d.chain = a.key + d.flags = a.flags | consts.Flag_ChunkEnd + + if a.len > 64 { + var buf chainVector + alg.HashF(&a.buf, a.len, a.chunks, a.flags, &a.key, &buf, &d.chain) + + if a.len > consts.ChunkLen { + complete := (a.len - 1) / consts.ChunkLen + a.stack.pushN(0, &buf, int(complete), a.flags, &a.key) + a.chunks += complete + a.len = uint64(copy(a.buf[:], a.buf[complete*consts.ChunkLen:a.len])) + } + } + + if a.len <= 64 { + d.flags |= consts.Flag_ChunkStart + } + + d.counter = a.chunks + d.blen = uint32(a.len) % 64 + + base := a.len / 64 * 64 + if a.len > 0 && d.blen == 0 { + d.blen = 64 + base -= 64 + } + + if consts.IsLittleEndian { + copy((*[64]byte)(unsafe.Pointer(&d.block[0]))[:], a.buf[base:a.len]) + } else { + var tmp [64]byte + copy(tmp[:], a.buf[base:a.len]) + utils.BytesToWords(&tmp, &d.block) + } + + for a.stack.bufn > 0 { + a.stack.flush(a.flags, &a.key) + } + + var tmp [16]uint32 + for occ := a.stack.occ; occ != 0; occ &= occ - 1 { + col := uint(bits.TrailingZeros64(occ)) % 64 + + alg.Compress(&d.chain, &d.block, d.counter, d.blen, d.flags, &tmp) + + *(*[8]uint32)(unsafe.Pointer(&d.block[0])) = a.stack.stack[col] + *(*[8]uint32)(unsafe.Pointer(&d.block[8])) = *(*[8]uint32)(unsafe.Pointer(&tmp[0])) + + if occ == a.stack.occ { + d.chain = a.key + d.counter = 0 + d.blen = consts.BlockLen + d.flags = a.flags | consts.Flag_Parent + } + } + + d.flags |= consts.Flag_Root +} + +// +// chain value stack +// + +type chainVector = [64]uint32 + +type cvstack struct { + occ uint64 // which levels in stack are occupied + lvls [8]uint8 // what level the buf input was in + bufn int // how many pairs are loaded into buf + buf [2]chainVector + stack [64][8]uint32 +} + +func (a *cvstack) pushN(l uint8, cv *chainVector, n int, flags uint32, key *[8]uint32) { + for i := 0; i < n; i++ { + a.pushL(l, cv, i) + for a.bufn == 8 { + a.flush(flags, key) + } + } +} + +func (a *cvstack) pushL(l uint8, cv *chainVector, n int) { + bit := uint64(1) << (l & 63) + if a.occ&bit == 0 { + readChain(cv, n, &a.stack[l&63]) + a.occ ^= bit + return + } + + a.lvls[a.bufn&7] = l + writeChain(&a.stack[l&63], &a.buf[0], a.bufn) + copyChain(cv, n, &a.buf[1], a.bufn) + a.bufn++ + a.occ ^= bit +} + +func (a *cvstack) flush(flags uint32, key *[8]uint32) { + var out chainVector + alg.HashP(&a.buf[0], &a.buf[1], flags|consts.Flag_Parent, key, &out, a.bufn) + + bufn, lvls := a.bufn, a.lvls + a.bufn, a.lvls = 0, [8]uint8{} + + for i := 0; i < bufn; i++ { + a.pushL(lvls[i]+1, &out, i) + } +} + +// +// helpers to deal with reading/writing transposed values +// + +func copyChain(in *chainVector, icol int, out *chainVector, ocol int) { + type u = uintptr + type p = unsafe.Pointer + type a = *uint32 + + i := p(u(p(in)) + u(icol*4)) + o := p(u(p(out)) + u(ocol*4)) + + *a(p(u(o) + 0*32)) = *a(p(u(i) + 0*32)) + *a(p(u(o) + 1*32)) = *a(p(u(i) + 1*32)) + *a(p(u(o) + 2*32)) = *a(p(u(i) + 2*32)) + *a(p(u(o) + 3*32)) = *a(p(u(i) + 3*32)) + *a(p(u(o) + 4*32)) = *a(p(u(i) + 4*32)) + *a(p(u(o) + 5*32)) = *a(p(u(i) + 5*32)) + *a(p(u(o) + 6*32)) = *a(p(u(i) + 6*32)) + *a(p(u(o) + 7*32)) = *a(p(u(i) + 7*32)) +} + +func readChain(in *chainVector, col int, out *[8]uint32) { + type u = uintptr + type p = unsafe.Pointer + type a = *uint32 + + i := p(u(p(in)) + u(col*4)) + + out[0] = *a(p(u(i) + 0*32)) + out[1] = *a(p(u(i) + 1*32)) + out[2] = *a(p(u(i) + 2*32)) + out[3] = *a(p(u(i) + 3*32)) + out[4] = *a(p(u(i) + 4*32)) + out[5] = *a(p(u(i) + 5*32)) + out[6] = *a(p(u(i) + 6*32)) + out[7] = *a(p(u(i) + 7*32)) +} + +func writeChain(in *[8]uint32, out *chainVector, col int) { + type u = uintptr + type p = unsafe.Pointer + type a = *uint32 + + o := p(u(p(out)) + u(col*4)) + + *a(p(u(o) + 0*32)) = in[0] + *a(p(u(o) + 1*32)) = in[1] + *a(p(u(o) + 2*32)) = in[2] + *a(p(u(o) + 3*32)) = in[3] + *a(p(u(o) + 4*32)) = in[4] + *a(p(u(o) + 5*32)) = in[5] + *a(p(u(o) + 6*32)) = in[6] + *a(p(u(o) + 7*32)) = in[7] +} + +// +// compress <= chunkLen bytes in one shot +// + +func compressAll(d *Digest, in []byte, flags uint32, key [8]uint32) { + var compressed [16]uint32 + + d.chain = key + d.flags = flags | consts.Flag_ChunkStart + + for len(in) > 64 { + buf := (*[64]byte)(unsafe.Pointer(&in[0])) + + var block *[16]uint32 + if consts.IsLittleEndian { + block = (*[16]uint32)(unsafe.Pointer(buf)) + } else { + block = &d.block + utils.BytesToWords(buf, block) + } + + alg.Compress(&d.chain, block, 0, consts.BlockLen, d.flags, &compressed) + + d.chain = *(*[8]uint32)(unsafe.Pointer(&compressed[0])) + d.flags &^= consts.Flag_ChunkStart + + in = in[64:] + } + + if consts.IsLittleEndian { + copy((*[64]byte)(unsafe.Pointer(&d.block[0]))[:], in) + } else { + var tmp [64]byte + copy(tmp[:], in) + utils.BytesToWords(&tmp, &d.block) + } + + d.blen = uint32(len(in)) + d.flags |= consts.Flag_ChunkEnd | consts.Flag_Root +} diff --git a/vendor/github.com/zeebo/blake3/digest.go b/vendor/github.com/zeebo/blake3/digest.go new file mode 100644 index 0000000000..58365d5abd --- /dev/null +++ b/vendor/github.com/zeebo/blake3/digest.go @@ -0,0 +1,100 @@ +package blake3 + +import ( + "fmt" + "io" + "unsafe" + + "github.com/zeebo/blake3/internal/alg" + "github.com/zeebo/blake3/internal/consts" + "github.com/zeebo/blake3/internal/utils" +) + +// Digest captures the state of a Hasher allowing reading and seeking through +// the output stream. +type Digest struct { + counter uint64 + chain [8]uint32 + block [16]uint32 + blen uint32 + flags uint32 + buf [16]uint32 + bufn int +} + +// Read reads data frm the hasher into out. It always fills the entire buffer and +// never errors. The stream will wrap around when reading past 2^64 bytes. +func (d *Digest) Read(p []byte) (n int, err error) { + n = len(p) + + if d.bufn > 0 { + n := d.slowCopy(p) + p = p[n:] + d.bufn -= n + } + + for len(p) >= 64 { + d.fillBuf() + + if consts.IsLittleEndian { + *(*[64]byte)(unsafe.Pointer(&p[0])) = *(*[64]byte)(unsafe.Pointer(&d.buf[0])) + } else { + utils.WordsToBytes(&d.buf, p) + } + + p = p[64:] + d.bufn = 0 + } + + if len(p) == 0 { + return n, nil + } + + d.fillBuf() + d.bufn -= d.slowCopy(p) + + return n, nil +} + +// Seek sets the position to the provided location. Only SeekStart and +// SeekCurrent are allowed. +func (d *Digest) Seek(offset int64, whence int) (int64, error) { + switch whence { + case io.SeekStart: + case io.SeekEnd: + return 0, fmt.Errorf("seek from end not supported") + case io.SeekCurrent: + offset += int64(consts.BlockLen*d.counter) - int64(d.bufn) + default: + return 0, fmt.Errorf("invalid whence: %d", whence) + } + if offset < 0 { + return 0, fmt.Errorf("seek before start") + } + d.setPosition(uint64(offset)) + return offset, nil +} + +func (d *Digest) setPosition(pos uint64) { + d.counter = pos / consts.BlockLen + d.fillBuf() + d.bufn -= int(pos % consts.BlockLen) +} + +func (d *Digest) slowCopy(p []byte) (n int) { + off := uint(consts.BlockLen-d.bufn) % consts.BlockLen + if consts.IsLittleEndian { + n = copy(p, (*[consts.BlockLen]byte)(unsafe.Pointer(&d.buf[0]))[off:]) + } else { + var tmp [consts.BlockLen]byte + utils.WordsToBytes(&d.buf, tmp[:]) + n = copy(p, tmp[off:]) + } + return n +} + +func (d *Digest) fillBuf() { + alg.Compress(&d.chain, &d.block, d.counter, d.blen, d.flags, &d.buf) + d.counter++ + d.bufn = consts.BlockLen +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/alg.go b/vendor/github.com/zeebo/blake3/internal/alg/alg.go new file mode 100644 index 0000000000..239fdec5b2 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/alg.go @@ -0,0 +1,18 @@ +package alg + +import ( + "github.com/zeebo/blake3/internal/alg/compress" + "github.com/zeebo/blake3/internal/alg/hash" +) + +func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { + hash.HashF(input, length, counter, flags, key, out, chain) +} + +func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { + hash.HashP(left, right, flags, key, out, n) +} + +func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) { + compress.Compress(chain, block, counter, blen, flags, out) +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go new file mode 100644 index 0000000000..0b26854081 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go @@ -0,0 +1,15 @@ +package compress + +import ( + "github.com/zeebo/blake3/internal/alg/compress/compress_pure" + "github.com/zeebo/blake3/internal/alg/compress/compress_sse41" + "github.com/zeebo/blake3/internal/consts" +) + +func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) { + if consts.HasSSE41 { + compress_sse41.Compress(chain, block, counter, blen, flags, out) + } else { + compress_pure.Compress(chain, block, counter, blen, flags, out) + } +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go new file mode 100644 index 0000000000..66ea1fb751 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go @@ -0,0 +1,135 @@ +package compress_pure + +import ( + "math/bits" + + "github.com/zeebo/blake3/internal/consts" +) + +func Compress( + chain *[8]uint32, + block *[16]uint32, + counter uint64, + blen uint32, + flags uint32, + out *[16]uint32, +) { + + *out = [16]uint32{ + chain[0], chain[1], chain[2], chain[3], + chain[4], chain[5], chain[6], chain[7], + consts.IV0, consts.IV1, consts.IV2, consts.IV3, + uint32(counter), uint32(counter >> 32), blen, flags, + } + + rcompress(out, block) +} + +func g(a, b, c, d, mx, my uint32) (uint32, uint32, uint32, uint32) { + a += b + mx + d = bits.RotateLeft32(d^a, -16) + c += d + b = bits.RotateLeft32(b^c, -12) + a += b + my + d = bits.RotateLeft32(d^a, -8) + c += d + b = bits.RotateLeft32(b^c, -7) + return a, b, c, d +} + +func rcompress(s *[16]uint32, m *[16]uint32) { + const ( + a = 10 + b = 11 + c = 12 + d = 13 + e = 14 + f = 15 + ) + + s0, s1, s2, s3 := s[0+0], s[0+1], s[0+2], s[0+3] + s4, s5, s6, s7 := s[0+4], s[0+5], s[0+6], s[0+7] + s8, s9, sa, sb := s[8+0], s[8+1], s[8+2], s[8+3] + sc, sd, se, sf := s[8+4], s[8+5], s[8+6], s[8+7] + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[0], m[1]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[2], m[3]) + s2, s6, sa, se = g(s2, s6, sa, se, m[4], m[5]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[6], m[7]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[8], m[9]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[a], m[b]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[c], m[d]) + s3, s4, s9, se = g(s3, s4, s9, se, m[e], m[f]) + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[2], m[6]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[3], m[a]) + s2, s6, sa, se = g(s2, s6, sa, se, m[7], m[0]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[4], m[d]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[1], m[b]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[c], m[5]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[9], m[e]) + s3, s4, s9, se = g(s3, s4, s9, se, m[f], m[8]) + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[3], m[4]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[a], m[c]) + s2, s6, sa, se = g(s2, s6, sa, se, m[d], m[2]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[7], m[e]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[6], m[5]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[9], m[0]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[b], m[f]) + s3, s4, s9, se = g(s3, s4, s9, se, m[8], m[1]) + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[a], m[7]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[c], m[9]) + s2, s6, sa, se = g(s2, s6, sa, se, m[e], m[3]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[d], m[f]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[4], m[0]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[b], m[2]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[5], m[8]) + s3, s4, s9, se = g(s3, s4, s9, se, m[1], m[6]) + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[c], m[d]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[9], m[b]) + s2, s6, sa, se = g(s2, s6, sa, se, m[f], m[a]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[e], m[8]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[7], m[2]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[5], m[3]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[0], m[1]) + s3, s4, s9, se = g(s3, s4, s9, se, m[6], m[4]) + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[9], m[e]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[b], m[5]) + s2, s6, sa, se = g(s2, s6, sa, se, m[8], m[c]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[f], m[1]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[d], m[3]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[0], m[a]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[2], m[6]) + s3, s4, s9, se = g(s3, s4, s9, se, m[4], m[7]) + + s0, s4, s8, sc = g(s0, s4, s8, sc, m[b], m[f]) + s1, s5, s9, sd = g(s1, s5, s9, sd, m[5], m[0]) + s2, s6, sa, se = g(s2, s6, sa, se, m[1], m[9]) + s3, s7, sb, sf = g(s3, s7, sb, sf, m[8], m[6]) + s0, s5, sa, sf = g(s0, s5, sa, sf, m[e], m[a]) + s1, s6, sb, sc = g(s1, s6, sb, sc, m[2], m[c]) + s2, s7, s8, sd = g(s2, s7, s8, sd, m[3], m[4]) + s3, s4, s9, se = g(s3, s4, s9, se, m[7], m[d]) + + s[8+0] = s8 ^ s[0] + s[8+1] = s9 ^ s[1] + s[8+2] = sa ^ s[2] + s[8+3] = sb ^ s[3] + s[8+4] = sc ^ s[4] + s[8+5] = sd ^ s[5] + s[8+6] = se ^ s[6] + s[8+7] = sf ^ s[7] + + s[0] = s0 ^ s8 + s[1] = s1 ^ s9 + s[2] = s2 ^ sa + s[3] = s3 ^ sb + s[4] = s4 ^ sc + s[5] = s5 ^ sd + s[6] = s6 ^ se + s[7] = s7 ^ sf +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s new file mode 100644 index 0000000000..0fedf0b3ad --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s @@ -0,0 +1,560 @@ +// Code generated by command: go run compress.go. DO NOT EDIT. + +#include "textflag.h" + +DATA iv<>+0(SB)/4, $0x6a09e667 +DATA iv<>+4(SB)/4, $0xbb67ae85 +DATA iv<>+8(SB)/4, $0x3c6ef372 +DATA iv<>+12(SB)/4, $0xa54ff53a +DATA iv<>+16(SB)/4, $0x510e527f +DATA iv<>+20(SB)/4, $0x9b05688c +DATA iv<>+24(SB)/4, $0x1f83d9ab +DATA iv<>+28(SB)/4, $0x5be0cd19 +GLOBL iv<>(SB), RODATA|NOPTR, $32 + +DATA rot16_shuf<>+0(SB)/1, $0x02 +DATA rot16_shuf<>+1(SB)/1, $0x03 +DATA rot16_shuf<>+2(SB)/1, $0x00 +DATA rot16_shuf<>+3(SB)/1, $0x01 +DATA rot16_shuf<>+4(SB)/1, $0x06 +DATA rot16_shuf<>+5(SB)/1, $0x07 +DATA rot16_shuf<>+6(SB)/1, $0x04 +DATA rot16_shuf<>+7(SB)/1, $0x05 +DATA rot16_shuf<>+8(SB)/1, $0x0a +DATA rot16_shuf<>+9(SB)/1, $0x0b +DATA rot16_shuf<>+10(SB)/1, $0x08 +DATA rot16_shuf<>+11(SB)/1, $0x09 +DATA rot16_shuf<>+12(SB)/1, $0x0e +DATA rot16_shuf<>+13(SB)/1, $0x0f +DATA rot16_shuf<>+14(SB)/1, $0x0c +DATA rot16_shuf<>+15(SB)/1, $0x0d +DATA rot16_shuf<>+16(SB)/1, $0x12 +DATA rot16_shuf<>+17(SB)/1, $0x13 +DATA rot16_shuf<>+18(SB)/1, $0x10 +DATA rot16_shuf<>+19(SB)/1, $0x11 +DATA rot16_shuf<>+20(SB)/1, $0x16 +DATA rot16_shuf<>+21(SB)/1, $0x17 +DATA rot16_shuf<>+22(SB)/1, $0x14 +DATA rot16_shuf<>+23(SB)/1, $0x15 +DATA rot16_shuf<>+24(SB)/1, $0x1a +DATA rot16_shuf<>+25(SB)/1, $0x1b +DATA rot16_shuf<>+26(SB)/1, $0x18 +DATA rot16_shuf<>+27(SB)/1, $0x19 +DATA rot16_shuf<>+28(SB)/1, $0x1e +DATA rot16_shuf<>+29(SB)/1, $0x1f +DATA rot16_shuf<>+30(SB)/1, $0x1c +DATA rot16_shuf<>+31(SB)/1, $0x1d +GLOBL rot16_shuf<>(SB), RODATA|NOPTR, $32 + +DATA rot8_shuf<>+0(SB)/1, $0x01 +DATA rot8_shuf<>+1(SB)/1, $0x02 +DATA rot8_shuf<>+2(SB)/1, $0x03 +DATA rot8_shuf<>+3(SB)/1, $0x00 +DATA rot8_shuf<>+4(SB)/1, $0x05 +DATA rot8_shuf<>+5(SB)/1, $0x06 +DATA rot8_shuf<>+6(SB)/1, $0x07 +DATA rot8_shuf<>+7(SB)/1, $0x04 +DATA rot8_shuf<>+8(SB)/1, $0x09 +DATA rot8_shuf<>+9(SB)/1, $0x0a +DATA rot8_shuf<>+10(SB)/1, $0x0b +DATA rot8_shuf<>+11(SB)/1, $0x08 +DATA rot8_shuf<>+12(SB)/1, $0x0d +DATA rot8_shuf<>+13(SB)/1, $0x0e +DATA rot8_shuf<>+14(SB)/1, $0x0f +DATA rot8_shuf<>+15(SB)/1, $0x0c +DATA rot8_shuf<>+16(SB)/1, $0x11 +DATA rot8_shuf<>+17(SB)/1, $0x12 +DATA rot8_shuf<>+18(SB)/1, $0x13 +DATA rot8_shuf<>+19(SB)/1, $0x10 +DATA rot8_shuf<>+20(SB)/1, $0x15 +DATA rot8_shuf<>+21(SB)/1, $0x16 +DATA rot8_shuf<>+22(SB)/1, $0x17 +DATA rot8_shuf<>+23(SB)/1, $0x14 +DATA rot8_shuf<>+24(SB)/1, $0x19 +DATA rot8_shuf<>+25(SB)/1, $0x1a +DATA rot8_shuf<>+26(SB)/1, $0x1b +DATA rot8_shuf<>+27(SB)/1, $0x18 +DATA rot8_shuf<>+28(SB)/1, $0x1d +DATA rot8_shuf<>+29(SB)/1, $0x1e +DATA rot8_shuf<>+30(SB)/1, $0x1f +DATA rot8_shuf<>+31(SB)/1, $0x1c +GLOBL rot8_shuf<>(SB), RODATA|NOPTR, $32 + +// func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) +// Requires: SSE, SSE2, SSE4.1, SSSE3 +TEXT ·Compress(SB), NOSPLIT, $0-40 + MOVQ chain+0(FP), AX + MOVQ block+8(FP), CX + MOVQ counter+16(FP), DX + MOVL blen+24(FP), BX + MOVL flags+28(FP), BP + MOVQ out+32(FP), SI + MOVUPS (AX), X0 + MOVUPS 16(AX), X1 + MOVUPS iv<>+0(SB), X2 + PINSRD $0x00, DX, X3 + SHRQ $0x20, DX + PINSRD $0x01, DX, X3 + PINSRD $0x02, BX, X3 + PINSRD $0x03, BP, X3 + MOVUPS (CX), X4 + MOVUPS 16(CX), X5 + MOVUPS 32(CX), X6 + MOVUPS 48(CX), X7 + MOVUPS rot16_shuf<>+0(SB), X8 + MOVUPS rot8_shuf<>+0(SB), X9 + + // round 1 + MOVAPS X4, X10 + SHUFPS $0x88, X5, X10 + PADDD X10, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X11 + PSRLL $0x0c, X1 + PSLLL $0x14, X11 + POR X11, X1 + MOVAPS X4, X4 + SHUFPS $0xdd, X5, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X6, X5 + SHUFPS $0x88, X7, X5 + SHUFPS $0x93, X5, X5 + PADDD X5, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X11 + PSRLL $0x0c, X1 + PSLLL $0x14, X11 + POR X11, X1 + MOVAPS X6, X6 + SHUFPS $0xdd, X7, X6 + SHUFPS $0x93, X6, X6 + PADDD X6, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x07, X1 + PSLLL $0x19, X7 + POR X7, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // round 2 + MOVAPS X10, X7 + SHUFPS $0xd6, X4, X7 + SHUFPS $0x39, X7, X7 + PADDD X7, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X11 + PSRLL $0x0c, X1 + PSLLL $0x14, X11 + POR X11, X1 + MOVAPS X5, X11 + SHUFPS $0xfa, X6, X11 + PSHUFD $0x0f, X10, X10 + PBLENDW $0x33, X10, X11 + PADDD X11, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X10 + PSRLL $0x07, X1 + PSLLL $0x19, X10 + POR X10, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X6, X12 + PUNPCKLLQ X4, X12 + PBLENDW $0xc0, X5, X12 + SHUFPS $0xb4, X12, X12 + PADDD X12, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X10 + PSRLL $0x0c, X1 + PSLLL $0x14, X10 + POR X10, X1 + MOVAPS X4, X10 + PUNPCKHLQ X6, X10 + MOVAPS X5, X4 + PUNPCKLLQ X10, X4 + SHUFPS $0x1e, X4, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // round 3 + MOVAPS X7, X5 + SHUFPS $0xd6, X11, X5 + SHUFPS $0x39, X5, X5 + PADDD X5, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X6 + PSRLL $0x0c, X1 + PSLLL $0x14, X6 + POR X6, X1 + MOVAPS X12, X6 + SHUFPS $0xfa, X4, X6 + PSHUFD $0x0f, X7, X7 + PBLENDW $0x33, X7, X6 + PADDD X6, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x07, X1 + PSLLL $0x19, X7 + POR X7, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X4, X10 + PUNPCKLLQ X11, X10 + PBLENDW $0xc0, X12, X10 + SHUFPS $0xb4, X10, X10 + PADDD X10, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x0c, X1 + PSLLL $0x14, X7 + POR X7, X1 + MOVAPS X11, X7 + PUNPCKHLQ X4, X7 + MOVAPS X12, X4 + PUNPCKLLQ X7, X4 + SHUFPS $0x1e, X4, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x07, X1 + PSLLL $0x19, X7 + POR X7, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // round 4 + MOVAPS X5, X7 + SHUFPS $0xd6, X6, X7 + SHUFPS $0x39, X7, X7 + PADDD X7, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X11 + PSRLL $0x0c, X1 + PSLLL $0x14, X11 + POR X11, X1 + MOVAPS X10, X11 + SHUFPS $0xfa, X4, X11 + PSHUFD $0x0f, X5, X5 + PBLENDW $0x33, X5, X11 + PADDD X11, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X4, X12 + PUNPCKLLQ X6, X12 + PBLENDW $0xc0, X10, X12 + SHUFPS $0xb4, X12, X12 + PADDD X12, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x0c, X1 + PSLLL $0x14, X5 + POR X5, X1 + MOVAPS X6, X5 + PUNPCKHLQ X4, X5 + MOVAPS X10, X4 + PUNPCKLLQ X5, X4 + SHUFPS $0x1e, X4, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // round 5 + MOVAPS X7, X5 + SHUFPS $0xd6, X11, X5 + SHUFPS $0x39, X5, X5 + PADDD X5, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X6 + PSRLL $0x0c, X1 + PSLLL $0x14, X6 + POR X6, X1 + MOVAPS X12, X6 + SHUFPS $0xfa, X4, X6 + PSHUFD $0x0f, X7, X7 + PBLENDW $0x33, X7, X6 + PADDD X6, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x07, X1 + PSLLL $0x19, X7 + POR X7, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X4, X10 + PUNPCKLLQ X11, X10 + PBLENDW $0xc0, X12, X10 + SHUFPS $0xb4, X10, X10 + PADDD X10, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x0c, X1 + PSLLL $0x14, X7 + POR X7, X1 + MOVAPS X11, X7 + PUNPCKHLQ X4, X7 + MOVAPS X12, X4 + PUNPCKLLQ X7, X4 + SHUFPS $0x1e, X4, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X7 + PSRLL $0x07, X1 + PSLLL $0x19, X7 + POR X7, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // round 6 + MOVAPS X5, X7 + SHUFPS $0xd6, X6, X7 + SHUFPS $0x39, X7, X7 + PADDD X7, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X11 + PSRLL $0x0c, X1 + PSLLL $0x14, X11 + POR X11, X1 + MOVAPS X10, X11 + SHUFPS $0xfa, X4, X11 + PSHUFD $0x0f, X5, X5 + PBLENDW $0x33, X5, X11 + PADDD X11, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X4, X12 + PUNPCKLLQ X6, X12 + PBLENDW $0xc0, X10, X12 + SHUFPS $0xb4, X12, X12 + PADDD X12, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x0c, X1 + PSLLL $0x14, X5 + POR X5, X1 + MOVAPS X6, X5 + PUNPCKHLQ X4, X5 + MOVAPS X10, X4 + PUNPCKLLQ X5, X4 + SHUFPS $0x1e, X4, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // round 7 + MOVAPS X7, X5 + SHUFPS $0xd6, X11, X5 + SHUFPS $0x39, X5, X5 + PADDD X5, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x0c, X1 + PSLLL $0x14, X5 + POR X5, X1 + MOVAPS X12, X5 + SHUFPS $0xfa, X4, X5 + PSHUFD $0x0f, X7, X6 + PBLENDW $0x33, X6, X5 + PADDD X5, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x07, X1 + PSLLL $0x19, X5 + POR X5, X1 + PSHUFD $0x93, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x39, X2, X2 + MOVAPS X4, X5 + PUNPCKLLQ X11, X5 + PBLENDW $0xc0, X12, X5 + SHUFPS $0xb4, X5, X5 + PADDD X5, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X8, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X5 + PSRLL $0x0c, X1 + PSLLL $0x14, X5 + POR X5, X1 + MOVAPS X11, X6 + PUNPCKHLQ X4, X6 + MOVAPS X12, X4 + PUNPCKLLQ X6, X4 + SHUFPS $0x1e, X4, X4 + PADDD X4, X0 + PADDD X1, X0 + PXOR X0, X3 + PSHUFB X9, X3 + PADDD X3, X2 + PXOR X2, X1 + MOVAPS X1, X4 + PSRLL $0x07, X1 + PSLLL $0x19, X4 + POR X4, X1 + PSHUFD $0x39, X0, X0 + PSHUFD $0x4e, X3, X3 + PSHUFD $0x93, X2, X2 + + // finalize + PXOR X2, X0 + PXOR X3, X1 + MOVUPS (AX), X4 + PXOR X4, X2 + MOVUPS 16(AX), X4 + PXOR X4, X3 + MOVUPS X0, (SI) + MOVUPS X1, 16(SI) + MOVUPS X2, 32(SI) + MOVUPS X3, 48(SI) + RET diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go new file mode 100644 index 0000000000..cd63e97400 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go @@ -0,0 +1,9 @@ +// +build !amd64 + +package compress_sse41 + +import "github.com/zeebo/blake3/internal/alg/compress/compress_pure" + +func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) { + compress_pure.Compress(chain, block, counter, blen, flags, out) +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go new file mode 100644 index 0000000000..ffd932d3c9 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go @@ -0,0 +1,6 @@ +// +build amd64 + +package compress_sse41 + +//go:noescape +func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go new file mode 100644 index 0000000000..ac43abb695 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go @@ -0,0 +1,23 @@ +package hash + +import ( + "github.com/zeebo/blake3/internal/alg/hash/hash_avx2" + "github.com/zeebo/blake3/internal/alg/hash/hash_pure" + "github.com/zeebo/blake3/internal/consts" +) + +func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { + if consts.HasAVX2 && length > 2*consts.ChunkLen { + hash_avx2.HashF(input, length, counter, flags, key, out, chain) + } else { + hash_pure.HashF(input, length, counter, flags, key, out, chain) + } +} + +func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { + if consts.HasAVX2 && n >= 2 { + hash_avx2.HashP(left, right, flags, key, out, n) + } else { + hash_pure.HashP(left, right, flags, key, out, n) + } +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s new file mode 100644 index 0000000000..d7531664b2 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s @@ -0,0 +1,2561 @@ +// Code generated by command: go run main.go. DO NOT EDIT. + +#include "textflag.h" + +DATA iv<>+0(SB)/4, $0x6a09e667 +DATA iv<>+4(SB)/4, $0xbb67ae85 +DATA iv<>+8(SB)/4, $0x3c6ef372 +DATA iv<>+12(SB)/4, $0xa54ff53a +DATA iv<>+16(SB)/4, $0x510e527f +DATA iv<>+20(SB)/4, $0x9b05688c +DATA iv<>+24(SB)/4, $0x1f83d9ab +DATA iv<>+28(SB)/4, $0x5be0cd19 +GLOBL iv<>(SB), RODATA|NOPTR, $32 + +DATA rot16_shuf<>+0(SB)/1, $0x02 +DATA rot16_shuf<>+1(SB)/1, $0x03 +DATA rot16_shuf<>+2(SB)/1, $0x00 +DATA rot16_shuf<>+3(SB)/1, $0x01 +DATA rot16_shuf<>+4(SB)/1, $0x06 +DATA rot16_shuf<>+5(SB)/1, $0x07 +DATA rot16_shuf<>+6(SB)/1, $0x04 +DATA rot16_shuf<>+7(SB)/1, $0x05 +DATA rot16_shuf<>+8(SB)/1, $0x0a +DATA rot16_shuf<>+9(SB)/1, $0x0b +DATA rot16_shuf<>+10(SB)/1, $0x08 +DATA rot16_shuf<>+11(SB)/1, $0x09 +DATA rot16_shuf<>+12(SB)/1, $0x0e +DATA rot16_shuf<>+13(SB)/1, $0x0f +DATA rot16_shuf<>+14(SB)/1, $0x0c +DATA rot16_shuf<>+15(SB)/1, $0x0d +DATA rot16_shuf<>+16(SB)/1, $0x12 +DATA rot16_shuf<>+17(SB)/1, $0x13 +DATA rot16_shuf<>+18(SB)/1, $0x10 +DATA rot16_shuf<>+19(SB)/1, $0x11 +DATA rot16_shuf<>+20(SB)/1, $0x16 +DATA rot16_shuf<>+21(SB)/1, $0x17 +DATA rot16_shuf<>+22(SB)/1, $0x14 +DATA rot16_shuf<>+23(SB)/1, $0x15 +DATA rot16_shuf<>+24(SB)/1, $0x1a +DATA rot16_shuf<>+25(SB)/1, $0x1b +DATA rot16_shuf<>+26(SB)/1, $0x18 +DATA rot16_shuf<>+27(SB)/1, $0x19 +DATA rot16_shuf<>+28(SB)/1, $0x1e +DATA rot16_shuf<>+29(SB)/1, $0x1f +DATA rot16_shuf<>+30(SB)/1, $0x1c +DATA rot16_shuf<>+31(SB)/1, $0x1d +GLOBL rot16_shuf<>(SB), RODATA|NOPTR, $32 + +DATA rot8_shuf<>+0(SB)/1, $0x01 +DATA rot8_shuf<>+1(SB)/1, $0x02 +DATA rot8_shuf<>+2(SB)/1, $0x03 +DATA rot8_shuf<>+3(SB)/1, $0x00 +DATA rot8_shuf<>+4(SB)/1, $0x05 +DATA rot8_shuf<>+5(SB)/1, $0x06 +DATA rot8_shuf<>+6(SB)/1, $0x07 +DATA rot8_shuf<>+7(SB)/1, $0x04 +DATA rot8_shuf<>+8(SB)/1, $0x09 +DATA rot8_shuf<>+9(SB)/1, $0x0a +DATA rot8_shuf<>+10(SB)/1, $0x0b +DATA rot8_shuf<>+11(SB)/1, $0x08 +DATA rot8_shuf<>+12(SB)/1, $0x0d +DATA rot8_shuf<>+13(SB)/1, $0x0e +DATA rot8_shuf<>+14(SB)/1, $0x0f +DATA rot8_shuf<>+15(SB)/1, $0x0c +DATA rot8_shuf<>+16(SB)/1, $0x11 +DATA rot8_shuf<>+17(SB)/1, $0x12 +DATA rot8_shuf<>+18(SB)/1, $0x13 +DATA rot8_shuf<>+19(SB)/1, $0x10 +DATA rot8_shuf<>+20(SB)/1, $0x15 +DATA rot8_shuf<>+21(SB)/1, $0x16 +DATA rot8_shuf<>+22(SB)/1, $0x17 +DATA rot8_shuf<>+23(SB)/1, $0x14 +DATA rot8_shuf<>+24(SB)/1, $0x19 +DATA rot8_shuf<>+25(SB)/1, $0x1a +DATA rot8_shuf<>+26(SB)/1, $0x1b +DATA rot8_shuf<>+27(SB)/1, $0x18 +DATA rot8_shuf<>+28(SB)/1, $0x1d +DATA rot8_shuf<>+29(SB)/1, $0x1e +DATA rot8_shuf<>+30(SB)/1, $0x1f +DATA rot8_shuf<>+31(SB)/1, $0x1c +GLOBL rot8_shuf<>(SB), RODATA|NOPTR, $32 + +DATA block_len<>+0(SB)/4, $0x00000040 +DATA block_len<>+4(SB)/4, $0x00000040 +DATA block_len<>+8(SB)/4, $0x00000040 +DATA block_len<>+12(SB)/4, $0x00000040 +DATA block_len<>+16(SB)/4, $0x00000040 +DATA block_len<>+20(SB)/4, $0x00000040 +DATA block_len<>+24(SB)/4, $0x00000040 +DATA block_len<>+28(SB)/4, $0x00000040 +GLOBL block_len<>(SB), RODATA|NOPTR, $32 + +DATA zero<>+0(SB)/4, $0x00000000 +DATA zero<>+4(SB)/4, $0x00000000 +DATA zero<>+8(SB)/4, $0x00000000 +DATA zero<>+12(SB)/4, $0x00000000 +DATA zero<>+16(SB)/4, $0x00000000 +DATA zero<>+20(SB)/4, $0x00000000 +DATA zero<>+24(SB)/4, $0x00000000 +DATA zero<>+28(SB)/4, $0x00000000 +GLOBL zero<>(SB), RODATA|NOPTR, $32 + +DATA counter<>+0(SB)/8, $0x0000000000000000 +DATA counter<>+8(SB)/8, $0x0000000000000001 +DATA counter<>+16(SB)/8, $0x0000000000000002 +DATA counter<>+24(SB)/8, $0x0000000000000003 +DATA counter<>+32(SB)/8, $0x0000000000000004 +DATA counter<>+40(SB)/8, $0x0000000000000005 +DATA counter<>+48(SB)/8, $0x0000000000000006 +DATA counter<>+56(SB)/8, $0x0000000000000007 +GLOBL counter<>(SB), RODATA|NOPTR, $64 + +// func HashF(input *[8192]byte, length uint64, counter uint64, flags uint32, key *[8]uint32, out *[32]uint32, chain *[8]uint32) +// Requires: AVX, AVX2 +TEXT ·HashF(SB), $688-56 + MOVQ input+0(FP), AX + MOVQ length+8(FP), CX + MOVQ counter+16(FP), DX + MOVL flags+24(FP), BX + MOVQ key+32(FP), BP + MOVQ out+40(FP), SI + MOVQ chain+48(FP), DI + + // Allocate local space and align it + LEAQ 31(SP), R10 + MOVQ $0x000000000000001f, R8 + NOTQ R8 + ANDQ R8, R10 + + // Skip if the length is zero + XORQ R8, R8 + XORQ R9, R9 + TESTQ CX, CX + JZ skip_compute + + // Compute complete chunks and blocks + SUBQ $0x01, CX + MOVQ CX, R8 + SHRQ $0x0a, R8 + MOVQ CX, R9 + ANDQ $0x000003c0, R9 + +skip_compute: + // Load some params into the stack (avo improvment?) + MOVL BX, 64(SP) + MOVQ DX, 72(SP) + + // Load IV into vectors + VPBROADCASTD (BP), Y0 + VPBROADCASTD 4(BP), Y1 + VPBROADCASTD 8(BP), Y2 + VPBROADCASTD 12(BP), Y3 + VPBROADCASTD 16(BP), Y4 + VPBROADCASTD 20(BP), Y5 + VPBROADCASTD 24(BP), Y6 + VPBROADCASTD 28(BP), Y7 + + // Build and store counter data on the stack + VPBROADCASTQ 72(SP), Y8 + VPADDQ counter<>+0(SB), Y8, Y8 + VPBROADCASTQ 72(SP), Y9 + VPADDQ counter<>+32(SB), Y9, Y9 + VPUNPCKLDQ Y9, Y8, Y10 + VPUNPCKHDQ Y9, Y8, Y8 + VPUNPCKLDQ Y8, Y10, Y9 + VPUNPCKHDQ Y8, Y10, Y8 + VPERMQ $0xd8, Y9, Y9 + VPERMQ $0xd8, Y8, Y8 + VMOVDQU Y9, 112(SP) + VMOVDQU Y8, 144(SP) + + // Set up block flags and variables for iteration + XORQ CX, CX + ORL $0x01, 64(SP) + +loop: + // Include end flags if last block + CMPQ CX, $0x000003c0 + JNE round_setup + ORL $0x02, 64(SP) + +round_setup: + // Load and transpose message vectors + VMOVDQU (AX)(CX*1), Y8 + VMOVDQU 1024(AX)(CX*1), Y9 + VMOVDQU 2048(AX)(CX*1), Y10 + VMOVDQU 3072(AX)(CX*1), Y11 + VMOVDQU 4096(AX)(CX*1), Y12 + VMOVDQU 5120(AX)(CX*1), Y13 + VMOVDQU 6144(AX)(CX*1), Y14 + VMOVDQU 7168(AX)(CX*1), Y15 + VMOVDQA Y0, (R10) + VPUNPCKLDQ Y9, Y8, Y0 + VPUNPCKHDQ Y9, Y8, Y8 + VPUNPCKLDQ Y11, Y10, Y9 + VPUNPCKHDQ Y11, Y10, Y10 + VPUNPCKLDQ Y13, Y12, Y11 + VPUNPCKHDQ Y13, Y12, Y12 + VPUNPCKLDQ Y15, Y14, Y13 + VPUNPCKHDQ Y15, Y14, Y14 + VPUNPCKLQDQ Y9, Y0, Y15 + VPUNPCKHQDQ Y9, Y0, Y0 + VPUNPCKLQDQ Y10, Y8, Y9 + VPUNPCKHQDQ Y10, Y8, Y8 + VPUNPCKLQDQ Y13, Y11, Y10 + VPUNPCKHQDQ Y13, Y11, Y11 + VPUNPCKLQDQ Y14, Y12, Y13 + VPUNPCKHQDQ Y14, Y12, Y12 + VINSERTI128 $0x01, X10, Y15, Y14 + VPERM2I128 $0x31, Y10, Y15, Y10 + VINSERTI128 $0x01, X11, Y0, Y15 + VPERM2I128 $0x31, Y11, Y0, Y0 + VINSERTI128 $0x01, X13, Y9, Y11 + VPERM2I128 $0x31, Y13, Y9, Y9 + VINSERTI128 $0x01, X12, Y8, Y13 + VPERM2I128 $0x31, Y12, Y8, Y8 + VMOVDQU Y14, 176(SP) + VMOVDQU Y15, 208(SP) + VMOVDQU Y11, 240(SP) + VMOVDQU Y13, 272(SP) + VMOVDQU Y10, 304(SP) + VMOVDQU Y0, 336(SP) + VMOVDQU Y9, 368(SP) + VMOVDQU Y8, 400(SP) + VMOVDQU 32(AX)(CX*1), Y0 + VMOVDQU 1056(AX)(CX*1), Y8 + VMOVDQU 2080(AX)(CX*1), Y9 + VMOVDQU 3104(AX)(CX*1), Y10 + VMOVDQU 4128(AX)(CX*1), Y11 + VMOVDQU 5152(AX)(CX*1), Y12 + VMOVDQU 6176(AX)(CX*1), Y13 + VMOVDQU 7200(AX)(CX*1), Y14 + VPUNPCKLDQ Y8, Y0, Y15 + VPUNPCKHDQ Y8, Y0, Y0 + VPUNPCKLDQ Y10, Y9, Y8 + VPUNPCKHDQ Y10, Y9, Y9 + VPUNPCKLDQ Y12, Y11, Y10 + VPUNPCKHDQ Y12, Y11, Y11 + VPUNPCKLDQ Y14, Y13, Y12 + VPUNPCKHDQ Y14, Y13, Y13 + VPUNPCKLQDQ Y8, Y15, Y14 + VPUNPCKHQDQ Y8, Y15, Y8 + VPUNPCKLQDQ Y9, Y0, Y15 + VPUNPCKHQDQ Y9, Y0, Y0 + VPUNPCKLQDQ Y12, Y10, Y9 + VPUNPCKHQDQ Y12, Y10, Y10 + VPUNPCKLQDQ Y13, Y11, Y12 + VPUNPCKHQDQ Y13, Y11, Y11 + VINSERTI128 $0x01, X9, Y14, Y13 + VPERM2I128 $0x31, Y9, Y14, Y9 + VINSERTI128 $0x01, X10, Y8, Y14 + VPERM2I128 $0x31, Y10, Y8, Y8 + VINSERTI128 $0x01, X12, Y15, Y10 + VPERM2I128 $0x31, Y12, Y15, Y12 + VINSERTI128 $0x01, X11, Y0, Y15 + VPERM2I128 $0x31, Y11, Y0, Y0 + VMOVDQU Y13, 432(SP) + VMOVDQU Y14, 464(SP) + VMOVDQU Y10, 496(SP) + VMOVDQU Y15, 528(SP) + VMOVDQU Y9, 560(SP) + VMOVDQU Y8, 592(SP) + VMOVDQU Y12, 624(SP) + VMOVDQU Y0, 656(SP) + + // Load constants for the round + VMOVDQA (R10), Y0 + VMOVDQU block_len<>+0(SB), Y8 + VPBROADCASTD 64(SP), Y9 + VPBROADCASTD iv<>+0(SB), Y10 + VPBROADCASTD iv<>+4(SB), Y11 + VPBROADCASTD iv<>+8(SB), Y12 + VPBROADCASTD iv<>+12(SB), Y13 + VMOVDQU 112(SP), Y14 + VMOVDQU 144(SP), Y15 + + // Save state for partial chunk if necessary + CMPQ CX, R9 + JNE begin_rounds + VMOVDQU Y0, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, (DI) + VMOVDQU Y1, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 4(DI) + VMOVDQU Y2, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 8(DI) + VMOVDQU Y3, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 12(DI) + VMOVDQU Y4, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 16(DI) + VMOVDQU Y5, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 20(DI) + VMOVDQU Y6, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 24(DI) + VMOVDQU Y7, 80(SP) + MOVL 80(SP)(R8*4), DX + MOVL DX, 28(DI) + +begin_rounds: + // Perform the rounds + // Round 1 + VPADDD 176(SP), Y0, Y0 + VPADDD 240(SP), Y1, Y1 + VPADDD 304(SP), Y2, Y2 + VPADDD 368(SP), Y3, Y3 + VPADDD Y4, Y0, Y0 + VPXOR Y0, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y7, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y4, Y4 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y5, Y5 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y6, Y6 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y7, Y7 + VMOVDQA Y0, (R10) + VPSRLD $0x0c, Y4, Y0 + VPSLLD $0x14, Y4, Y4 + VPOR Y0, Y4, Y0 + VPSRLD $0x0c, Y5, Y4 + VPSLLD $0x14, Y5, Y5 + VPOR Y4, Y5, Y4 + VPSRLD $0x0c, Y6, Y5 + VPSLLD $0x14, Y6, Y6 + VPOR Y5, Y6, Y5 + VPSRLD $0x0c, Y7, Y6 + VPSLLD $0x14, Y7, Y7 + VPOR Y6, Y7, Y6 + VMOVDQA (R10), Y7 + VPADDD 208(SP), Y7, Y7 + VPADDD 272(SP), Y1, Y1 + VPADDD 336(SP), Y2, Y2 + VPADDD 400(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 432(SP), Y7, Y7 + VPADDD 496(SP), Y1, Y1 + VPADDD 560(SP), Y2, Y2 + VPADDD 624(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 464(SP), Y7, Y7 + VPADDD 528(SP), Y1, Y1 + VPADDD 592(SP), Y2, Y2 + VPADDD 656(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Round 2 + VMOVDQA (R10), Y7 + VPADDD 240(SP), Y7, Y7 + VPADDD 272(SP), Y1, Y1 + VPADDD 400(SP), Y2, Y2 + VPADDD 304(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 368(SP), Y7, Y7 + VPADDD 496(SP), Y1, Y1 + VPADDD 176(SP), Y2, Y2 + VPADDD 592(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 208(SP), Y7, Y7 + VPADDD 560(SP), Y1, Y1 + VPADDD 464(SP), Y2, Y2 + VPADDD 656(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 528(SP), Y7, Y7 + VPADDD 336(SP), Y1, Y1 + VPADDD 624(SP), Y2, Y2 + VPADDD 432(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Round 3 + VMOVDQA (R10), Y7 + VPADDD 272(SP), Y7, Y7 + VPADDD 496(SP), Y1, Y1 + VPADDD 592(SP), Y2, Y2 + VPADDD 400(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 304(SP), Y7, Y7 + VPADDD 560(SP), Y1, Y1 + VPADDD 240(SP), Y2, Y2 + VPADDD 624(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 368(SP), Y7, Y7 + VPADDD 464(SP), Y1, Y1 + VPADDD 528(SP), Y2, Y2 + VPADDD 432(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 336(SP), Y7, Y7 + VPADDD 176(SP), Y1, Y1 + VPADDD 656(SP), Y2, Y2 + VPADDD 208(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Round 4 + VMOVDQA (R10), Y7 + VPADDD 496(SP), Y7, Y7 + VPADDD 560(SP), Y1, Y1 + VPADDD 624(SP), Y2, Y2 + VPADDD 592(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 400(SP), Y7, Y7 + VPADDD 464(SP), Y1, Y1 + VPADDD 272(SP), Y2, Y2 + VPADDD 656(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 304(SP), Y7, Y7 + VPADDD 528(SP), Y1, Y1 + VPADDD 336(SP), Y2, Y2 + VPADDD 208(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 176(SP), Y7, Y7 + VPADDD 240(SP), Y1, Y1 + VPADDD 432(SP), Y2, Y2 + VPADDD 368(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Round 5 + VMOVDQA (R10), Y7 + VPADDD 560(SP), Y7, Y7 + VPADDD 464(SP), Y1, Y1 + VPADDD 656(SP), Y2, Y2 + VPADDD 624(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 592(SP), Y7, Y7 + VPADDD 528(SP), Y1, Y1 + VPADDD 496(SP), Y2, Y2 + VPADDD 432(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 400(SP), Y7, Y7 + VPADDD 336(SP), Y1, Y1 + VPADDD 176(SP), Y2, Y2 + VPADDD 368(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 240(SP), Y7, Y7 + VPADDD 272(SP), Y1, Y1 + VPADDD 208(SP), Y2, Y2 + VPADDD 304(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Round 6 + VMOVDQA (R10), Y7 + VPADDD 464(SP), Y7, Y7 + VPADDD 528(SP), Y1, Y1 + VPADDD 432(SP), Y2, Y2 + VPADDD 656(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 624(SP), Y7, Y7 + VPADDD 336(SP), Y1, Y1 + VPADDD 560(SP), Y2, Y2 + VPADDD 208(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 592(SP), Y7, Y7 + VPADDD 176(SP), Y1, Y1 + VPADDD 240(SP), Y2, Y2 + VPADDD 304(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 272(SP), Y7, Y7 + VPADDD 496(SP), Y1, Y1 + VPADDD 368(SP), Y2, Y2 + VPADDD 400(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Round 7 + VMOVDQA (R10), Y7 + VPADDD 528(SP), Y7, Y7 + VPADDD 336(SP), Y1, Y1 + VPADDD 208(SP), Y2, Y2 + VPADDD 432(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 656(SP), Y7, Y7 + VPADDD 176(SP), Y1, Y1 + VPADDD 464(SP), Y2, Y2 + VPADDD 368(SP), Y3, Y3 + VPADDD Y0, Y7, Y7 + VPXOR Y7, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y5, Y2, Y2 + VPXOR Y2, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y6, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y14, Y10, Y10 + VPXOR Y10, Y0, Y0 + VPADDD Y15, Y11, Y11 + VPXOR Y11, Y4, Y4 + VPADDD Y8, Y12, Y12 + VPXOR Y12, Y5, Y5 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y6, Y6 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VMOVDQA (R10), Y7 + VPADDD 624(SP), Y7, Y7 + VPADDD 240(SP), Y1, Y1 + VPADDD 272(SP), Y2, Y2 + VPADDD 400(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x0c, Y4, Y7 + VPSLLD $0x14, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x0c, Y5, Y7 + VPSLLD $0x14, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x0c, Y6, Y7 + VPSLLD $0x14, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x0c, Y0, Y7 + VPSLLD $0x14, Y0, Y0 + VPOR Y7, Y0, Y0 + VMOVDQA (R10), Y7 + VPADDD 496(SP), Y7, Y7 + VPADDD 560(SP), Y1, Y1 + VPADDD 304(SP), Y2, Y2 + VPADDD 592(SP), Y3, Y3 + VPADDD Y4, Y7, Y7 + VPXOR Y7, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y5, Y1, Y1 + VPXOR Y1, Y14, Y14 + VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y15, Y15 + VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y8, Y8 + VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 + VPADDD Y9, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPADDD Y14, Y13, Y13 + VPXOR Y13, Y5, Y5 + VPADDD Y15, Y10, Y10 + VPXOR Y10, Y6, Y6 + VPADDD Y8, Y11, Y11 + VPXOR Y11, Y0, Y0 + VMOVDQA Y7, (R10) + VPSRLD $0x07, Y4, Y7 + VPSLLD $0x19, Y4, Y4 + VPOR Y7, Y4, Y4 + VPSRLD $0x07, Y5, Y7 + VPSLLD $0x19, Y5, Y5 + VPOR Y7, Y5, Y5 + VPSRLD $0x07, Y6, Y7 + VPSLLD $0x19, Y6, Y6 + VPOR Y7, Y6, Y6 + VPSRLD $0x07, Y0, Y7 + VPSLLD $0x19, Y0, Y0 + VPOR Y7, Y0, Y0 + + // Finalize rounds + VPXOR Y9, Y6, Y6 + VPXOR (R10), Y10, Y7 + VPXOR Y11, Y1, Y1 + VPXOR Y12, Y2, Y2 + VPXOR Y13, Y3, Y3 + VPXOR Y14, Y0, Y0 + VPXOR Y15, Y4, Y4 + VPXOR Y8, Y5, Y5 + + // Fix up registers for next iteration + VMOVDQU Y7, Y8 + VMOVDQU Y6, Y7 + VMOVDQU Y5, Y6 + VMOVDQU Y4, Y5 + VMOVDQU Y0, Y4 + VMOVDQU Y8, Y0 + + // If we have zero complete chunks, we're done + CMPQ R8, $0x00 + JNE loop_trailer + CMPQ R9, CX + JEQ finalize + +loop_trailer: + // Increment, reset flags, and loop + CMPQ CX, $0x000003c0 + JEQ finalize + ADDQ $0x40, CX + MOVL BX, 64(SP) + JMP loop + +finalize: + // Store result into out + VMOVDQU Y0, (SI) + VMOVDQU Y1, 32(SI) + VMOVDQU Y2, 64(SI) + VMOVDQU Y3, 96(SI) + VMOVDQU Y4, 128(SI) + VMOVDQU Y5, 160(SI) + VMOVDQU Y6, 192(SI) + VMOVDQU Y7, 224(SI) + VZEROUPPER + RET + +// func HashP(left *[32]uint32, right *[32]uint32, flags uint8, key *[8]uint32, out *[32]uint32, n int) +// Requires: AVX, AVX2 +TEXT ·HashP(SB), NOSPLIT, $72-48 + MOVQ left+0(FP), AX + MOVQ right+8(FP), CX + MOVBLZX flags+16(FP), DX + MOVQ key+24(FP), BX + MOVQ out+32(FP), BP + + // Allocate local space and align it + LEAQ 31(SP), SI + MOVQ $0x000000000000001f, DI + NOTQ DI + ANDQ DI, SI + + // Set up flags value + MOVL DX, 64(SP) + + // Perform the rounds + // Round 1 + VPBROADCASTD (BX), Y0 + VPADDD (AX), Y0, Y0 + VPBROADCASTD 4(BX), Y1 + VPADDD 64(AX), Y1, Y1 + VPBROADCASTD 8(BX), Y2 + VPADDD 128(AX), Y2, Y2 + VPBROADCASTD 12(BX), Y3 + VPADDD 192(AX), Y3, Y3 + VPBROADCASTD 16(BX), Y4 + VPADDD Y4, Y0, Y0 + VMOVDQU zero<>+0(SB), Y5 + VPXOR Y0, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPBROADCASTD 20(BX), Y6 + VPADDD Y6, Y1, Y1 + VMOVDQU zero<>+0(SB), Y7 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPBROADCASTD 24(BX), Y8 + VPADDD Y8, Y2, Y2 + VMOVDQU block_len<>+0(SB), Y9 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPBROADCASTD 28(BX), Y10 + VPADDD Y10, Y3, Y3 + VPBROADCASTD 64(SP), Y11 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPBROADCASTD iv<>+0(SB), Y12 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y4, Y4 + VPBROADCASTD iv<>+4(SB), Y13 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y6, Y6 + VPBROADCASTD iv<>+8(SB), Y14 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y8, Y8 + VPBROADCASTD iv<>+12(SB), Y15 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y10, Y10 + VMOVDQA Y0, (SI) + VPSRLD $0x0c, Y4, Y0 + VPSLLD $0x14, Y4, Y4 + VPOR Y0, Y4, Y0 + VPSRLD $0x0c, Y6, Y4 + VPSLLD $0x14, Y6, Y6 + VPOR Y4, Y6, Y4 + VPSRLD $0x0c, Y8, Y6 + VPSLLD $0x14, Y8, Y8 + VPOR Y6, Y8, Y6 + VPSRLD $0x0c, Y10, Y8 + VPSLLD $0x14, Y10, Y10 + VPOR Y8, Y10, Y8 + VMOVDQA (SI), Y10 + VPADDD 32(AX), Y10, Y10 + VPADDD 96(AX), Y1, Y1 + VPADDD 160(AX), Y2, Y2 + VPADDD 224(AX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD (CX), Y10, Y10 + VPADDD 64(CX), Y1, Y1 + VPADDD 128(CX), Y2, Y2 + VPADDD 192(CX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD 32(CX), Y10, Y10 + VPADDD 96(CX), Y1, Y1 + VPADDD 160(CX), Y2, Y2 + VPADDD 224(CX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Round 2 + VMOVDQA (SI), Y10 + VPADDD 64(AX), Y10, Y10 + VPADDD 96(AX), Y1, Y1 + VPADDD 224(AX), Y2, Y2 + VPADDD 128(AX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 192(AX), Y10, Y10 + VPADDD 64(CX), Y1, Y1 + VPADDD (AX), Y2, Y2 + VPADDD 160(CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 32(AX), Y10, Y10 + VPADDD 128(CX), Y1, Y1 + VPADDD 32(CX), Y2, Y2 + VPADDD 224(CX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD 96(CX), Y10, Y10 + VPADDD 160(AX), Y1, Y1 + VPADDD 192(CX), Y2, Y2 + VPADDD (CX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Round 3 + VMOVDQA (SI), Y10 + VPADDD 96(AX), Y10, Y10 + VPADDD 64(CX), Y1, Y1 + VPADDD 160(CX), Y2, Y2 + VPADDD 224(AX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 128(AX), Y10, Y10 + VPADDD 128(CX), Y1, Y1 + VPADDD 64(AX), Y2, Y2 + VPADDD 192(CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 192(AX), Y10, Y10 + VPADDD 32(CX), Y1, Y1 + VPADDD 96(CX), Y2, Y2 + VPADDD (CX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD 160(AX), Y10, Y10 + VPADDD (AX), Y1, Y1 + VPADDD 224(CX), Y2, Y2 + VPADDD 32(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Round 4 + VMOVDQA (SI), Y10 + VPADDD 64(CX), Y10, Y10 + VPADDD 128(CX), Y1, Y1 + VPADDD 192(CX), Y2, Y2 + VPADDD 160(CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 224(AX), Y10, Y10 + VPADDD 32(CX), Y1, Y1 + VPADDD 96(AX), Y2, Y2 + VPADDD 224(CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 128(AX), Y10, Y10 + VPADDD 96(CX), Y1, Y1 + VPADDD 160(AX), Y2, Y2 + VPADDD 32(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD (AX), Y10, Y10 + VPADDD 64(AX), Y1, Y1 + VPADDD (CX), Y2, Y2 + VPADDD 192(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Round 5 + VMOVDQA (SI), Y10 + VPADDD 128(CX), Y10, Y10 + VPADDD 32(CX), Y1, Y1 + VPADDD 224(CX), Y2, Y2 + VPADDD 192(CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 160(CX), Y10, Y10 + VPADDD 96(CX), Y1, Y1 + VPADDD 64(CX), Y2, Y2 + VPADDD (CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 224(AX), Y10, Y10 + VPADDD 160(AX), Y1, Y1 + VPADDD (AX), Y2, Y2 + VPADDD 192(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD 64(AX), Y10, Y10 + VPADDD 96(AX), Y1, Y1 + VPADDD 32(AX), Y2, Y2 + VPADDD 128(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Round 6 + VMOVDQA (SI), Y10 + VPADDD 32(CX), Y10, Y10 + VPADDD 96(CX), Y1, Y1 + VPADDD (CX), Y2, Y2 + VPADDD 224(CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 192(CX), Y10, Y10 + VPADDD 160(AX), Y1, Y1 + VPADDD 128(CX), Y2, Y2 + VPADDD 32(AX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 160(CX), Y10, Y10 + VPADDD (AX), Y1, Y1 + VPADDD 64(AX), Y2, Y2 + VPADDD 128(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD 96(AX), Y10, Y10 + VPADDD 64(CX), Y1, Y1 + VPADDD 192(AX), Y2, Y2 + VPADDD 224(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Round 7 + VMOVDQA (SI), Y10 + VPADDD 96(CX), Y10, Y10 + VPADDD 160(AX), Y1, Y1 + VPADDD 32(AX), Y2, Y2 + VPADDD (CX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 224(CX), Y10, Y10 + VPADDD (AX), Y1, Y1 + VPADDD 32(CX), Y2, Y2 + VPADDD 192(AX), Y3, Y3 + VPADDD Y0, Y10, Y10 + VPXOR Y10, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y4, Y1, Y1 + VPXOR Y1, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y6, Y2, Y2 + VPXOR Y2, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y8, Y3, Y3 + VPXOR Y3, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y5, Y12, Y12 + VPXOR Y12, Y0, Y0 + VPADDD Y7, Y13, Y13 + VPXOR Y13, Y4, Y4 + VPADDD Y9, Y14, Y14 + VPXOR Y14, Y6, Y6 + VPADDD Y11, Y15, Y15 + VPXOR Y15, Y8, Y8 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VMOVDQA (SI), Y10 + VPADDD 192(CX), Y10, Y10 + VPADDD 64(AX), Y1, Y1 + VPADDD 96(AX), Y2, Y2 + VPADDD 224(AX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x0c, Y4, Y10 + VPSLLD $0x14, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x0c, Y6, Y10 + VPSLLD $0x14, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x0c, Y8, Y10 + VPSLLD $0x14, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x0c, Y0, Y10 + VPSLLD $0x14, Y0, Y0 + VPOR Y10, Y0, Y0 + VMOVDQA (SI), Y10 + VPADDD 64(CX), Y10, Y10 + VPADDD 128(CX), Y1, Y1 + VPADDD 128(AX), Y2, Y2 + VPADDD 160(CX), Y3, Y3 + VPADDD Y4, Y10, Y10 + VPXOR Y10, Y11, Y11 + VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 + VPADDD Y6, Y1, Y1 + VPXOR Y1, Y5, Y5 + VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 + VPADDD Y8, Y2, Y2 + VPXOR Y2, Y7, Y7 + VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 + VPADDD Y0, Y3, Y3 + VPXOR Y3, Y9, Y9 + VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 + VPADDD Y11, Y14, Y14 + VPXOR Y14, Y4, Y4 + VPADDD Y5, Y15, Y15 + VPXOR Y15, Y6, Y6 + VPADDD Y7, Y12, Y12 + VPXOR Y12, Y8, Y8 + VPADDD Y9, Y13, Y13 + VPXOR Y13, Y0, Y0 + VMOVDQA Y10, (SI) + VPSRLD $0x07, Y4, Y10 + VPSLLD $0x19, Y4, Y4 + VPOR Y10, Y4, Y4 + VPSRLD $0x07, Y6, Y10 + VPSLLD $0x19, Y6, Y6 + VPOR Y10, Y6, Y6 + VPSRLD $0x07, Y8, Y10 + VPSLLD $0x19, Y8, Y8 + VPOR Y10, Y8, Y8 + VPSRLD $0x07, Y0, Y10 + VPSLLD $0x19, Y0, Y0 + VPOR Y10, Y0, Y0 + + // Finalize + VPXOR (SI), Y12, Y10 + VPXOR Y13, Y1, Y1 + VPXOR Y14, Y2, Y2 + VPXOR Y15, Y3, Y3 + VPXOR Y5, Y0, Y0 + VPXOR Y7, Y4, Y4 + VPXOR Y9, Y6, Y5 + VPXOR Y11, Y8, Y6 + + // Store result into out + VMOVDQU Y10, (BP) + VMOVDQU Y1, 32(BP) + VMOVDQU Y2, 64(BP) + VMOVDQU Y3, 96(BP) + VMOVDQU Y0, 128(BP) + VMOVDQU Y4, 160(BP) + VMOVDQU Y5, 192(BP) + VMOVDQU Y6, 224(BP) + VZEROUPPER + RET diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go new file mode 100644 index 0000000000..6139728147 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go @@ -0,0 +1,13 @@ +// +build !amd64 + +package hash_avx2 + +import "github.com/zeebo/blake3/internal/alg/hash/hash_pure" + +func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { + hash_pure.HashF(input, length, counter, flags, key, out, chain) +} + +func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { + hash_pure.HashP(left, right, flags, key, out, n) +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go new file mode 100644 index 0000000000..10e949550f --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go @@ -0,0 +1,9 @@ +// +build amd64 + +package hash_avx2 + +//go:noescape +func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) + +//go:noescape +func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go new file mode 100644 index 0000000000..0c6fd63cd5 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go @@ -0,0 +1,56 @@ +package hash_pure + +import ( + "unsafe" + + "github.com/zeebo/blake3/internal/alg/compress" + "github.com/zeebo/blake3/internal/consts" + "github.com/zeebo/blake3/internal/utils" +) + +func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { + var tmp [16]uint32 + + for i := uint64(0); consts.ChunkLen*i < length && i < 8; i++ { + bchain := *key + bflags := flags | consts.Flag_ChunkStart + start := consts.ChunkLen * i + + for n := uint64(0); n < 16; n++ { + if n == 15 { + bflags |= consts.Flag_ChunkEnd + } + if start+64*n >= length { + break + } + if start+64+64*n >= length { + *chain = bchain + } + + var blockPtr *[16]uint32 + if consts.IsLittleEndian { + blockPtr = (*[16]uint32)(unsafe.Pointer(&input[consts.ChunkLen*i+consts.BlockLen*n])) + } else { + var block [16]uint32 + utils.BytesToWords((*[64]uint8)(unsafe.Pointer(&input[consts.ChunkLen*i+consts.BlockLen*n])), &block) + blockPtr = &block + } + + compress.Compress(&bchain, blockPtr, counter, consts.BlockLen, bflags, &tmp) + + bchain = *(*[8]uint32)(unsafe.Pointer(&tmp[0])) + bflags = flags + } + + out[i+0] = bchain[0] + out[i+8] = bchain[1] + out[i+16] = bchain[2] + out[i+24] = bchain[3] + out[i+32] = bchain[4] + out[i+40] = bchain[5] + out[i+48] = bchain[6] + out[i+56] = bchain[7] + + counter++ + } +} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go new file mode 100644 index 0000000000..bee5d8dd05 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go @@ -0,0 +1,38 @@ +package hash_pure + +import "github.com/zeebo/blake3/internal/alg/compress" + +func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { + var tmp [16]uint32 + var block [16]uint32 + + for i := 0; i < n && i < 8; i++ { + block[0] = left[i+0] + block[1] = left[i+8] + block[2] = left[i+16] + block[3] = left[i+24] + block[4] = left[i+32] + block[5] = left[i+40] + block[6] = left[i+48] + block[7] = left[i+56] + block[8] = right[i+0] + block[9] = right[i+8] + block[10] = right[i+16] + block[11] = right[i+24] + block[12] = right[i+32] + block[13] = right[i+40] + block[14] = right[i+48] + block[15] = right[i+56] + + compress.Compress(key, &block, 0, 64, flags, &tmp) + + out[i+0] = tmp[0] + out[i+8] = tmp[1] + out[i+16] = tmp[2] + out[i+24] = tmp[3] + out[i+32] = tmp[4] + out[i+40] = tmp[5] + out[i+48] = tmp[6] + out[i+56] = tmp[7] + } +} diff --git a/vendor/github.com/zeebo/blake3/internal/consts/consts.go b/vendor/github.com/zeebo/blake3/internal/consts/consts.go new file mode 100644 index 0000000000..89f08fe109 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/consts/consts.go @@ -0,0 +1,29 @@ +package consts + +var IV = [...]uint32{IV0, IV1, IV2, IV3, IV4, IV5, IV6, IV7} + +const ( + IV0 = 0x6A09E667 + IV1 = 0xBB67AE85 + IV2 = 0x3C6EF372 + IV3 = 0xA54FF53A + IV4 = 0x510E527F + IV5 = 0x9B05688C + IV6 = 0x1F83D9AB + IV7 = 0x5BE0CD19 +) + +const ( + Flag_ChunkStart uint32 = 1 << 0 + Flag_ChunkEnd uint32 = 1 << 1 + Flag_Parent uint32 = 1 << 2 + Flag_Root uint32 = 1 << 3 + Flag_Keyed uint32 = 1 << 4 + Flag_DeriveKeyContext uint32 = 1 << 5 + Flag_DeriveKeyMaterial uint32 = 1 << 6 +) + +const ( + BlockLen = 64 + ChunkLen = 1024 +) diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu.go new file mode 100644 index 0000000000..1eebff9439 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/consts/cpu.go @@ -0,0 +1,17 @@ +package consts + +import ( + "os" + + "golang.org/x/sys/cpu" +) + +var ( + HasAVX2 = cpu.X86.HasAVX2 && + os.Getenv("BLAKE3_DISABLE_AVX2") == "" && + os.Getenv("BLAKE3_PUREGO") == "" + + HasSSE41 = cpu.X86.HasSSE41 && + os.Getenv("BLAKE3_DISABLE_SSE41") == "" && + os.Getenv("BLAKE3_PUREGO") == "" +) diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go new file mode 100644 index 0000000000..fb730464f2 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go @@ -0,0 +1,5 @@ +// +build mips mips64 ppc64 s390x + +package consts + +const IsLittleEndian = false diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go new file mode 100644 index 0000000000..1bae02a74c --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go @@ -0,0 +1,5 @@ +// +build amd64 386 arm arm64 mipsle mips64le ppc64le riscv64 wasm + +package consts + +const IsLittleEndian = true diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go new file mode 100644 index 0000000000..5f7407a6a2 --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go @@ -0,0 +1,7 @@ +// +build !mips,!mips64,!ppc64,!s390x,!amd64,!386,!arm,!arm64,!mipsle,!mips64le,!ppc64le,!riscv64,!wasm + +package consts + +import "unsafe" + +var IsLittleEndian = *(*uint16)(unsafe.Pointer(&[2]byte{0, 1})) != 1 diff --git a/vendor/github.com/zeebo/blake3/internal/utils/utils.go b/vendor/github.com/zeebo/blake3/internal/utils/utils.go new file mode 100644 index 0000000000..0b36f0f0ff --- /dev/null +++ b/vendor/github.com/zeebo/blake3/internal/utils/utils.go @@ -0,0 +1,60 @@ +package utils + +import ( + "encoding/binary" + "unsafe" +) + +func SliceToArray32(bytes []byte) *[32]uint8 { return (*[32]uint8)(unsafe.Pointer(&bytes[0])) } +func SliceToArray64(bytes []byte) *[64]uint8 { return (*[64]uint8)(unsafe.Pointer(&bytes[0])) } + +func BytesToWords(bytes *[64]uint8, words *[16]uint32) { + words[0] = binary.LittleEndian.Uint32(bytes[0*4:]) + words[1] = binary.LittleEndian.Uint32(bytes[1*4:]) + words[2] = binary.LittleEndian.Uint32(bytes[2*4:]) + words[3] = binary.LittleEndian.Uint32(bytes[3*4:]) + words[4] = binary.LittleEndian.Uint32(bytes[4*4:]) + words[5] = binary.LittleEndian.Uint32(bytes[5*4:]) + words[6] = binary.LittleEndian.Uint32(bytes[6*4:]) + words[7] = binary.LittleEndian.Uint32(bytes[7*4:]) + words[8] = binary.LittleEndian.Uint32(bytes[8*4:]) + words[9] = binary.LittleEndian.Uint32(bytes[9*4:]) + words[10] = binary.LittleEndian.Uint32(bytes[10*4:]) + words[11] = binary.LittleEndian.Uint32(bytes[11*4:]) + words[12] = binary.LittleEndian.Uint32(bytes[12*4:]) + words[13] = binary.LittleEndian.Uint32(bytes[13*4:]) + words[14] = binary.LittleEndian.Uint32(bytes[14*4:]) + words[15] = binary.LittleEndian.Uint32(bytes[15*4:]) +} + +func WordsToBytes(words *[16]uint32, bytes []byte) { + bytes = bytes[:64] + binary.LittleEndian.PutUint32(bytes[0*4:1*4], words[0]) + binary.LittleEndian.PutUint32(bytes[1*4:2*4], words[1]) + binary.LittleEndian.PutUint32(bytes[2*4:3*4], words[2]) + binary.LittleEndian.PutUint32(bytes[3*4:4*4], words[3]) + binary.LittleEndian.PutUint32(bytes[4*4:5*4], words[4]) + binary.LittleEndian.PutUint32(bytes[5*4:6*4], words[5]) + binary.LittleEndian.PutUint32(bytes[6*4:7*4], words[6]) + binary.LittleEndian.PutUint32(bytes[7*4:8*4], words[7]) + binary.LittleEndian.PutUint32(bytes[8*4:9*4], words[8]) + binary.LittleEndian.PutUint32(bytes[9*4:10*4], words[9]) + binary.LittleEndian.PutUint32(bytes[10*4:11*4], words[10]) + binary.LittleEndian.PutUint32(bytes[11*4:12*4], words[11]) + binary.LittleEndian.PutUint32(bytes[12*4:13*4], words[12]) + binary.LittleEndian.PutUint32(bytes[13*4:14*4], words[13]) + binary.LittleEndian.PutUint32(bytes[14*4:15*4], words[14]) + binary.LittleEndian.PutUint32(bytes[15*4:16*4], words[15]) +} + +func KeyFromBytes(key []byte, out *[8]uint32) { + key = key[:32] + out[0] = binary.LittleEndian.Uint32(key[0:]) + out[1] = binary.LittleEndian.Uint32(key[4:]) + out[2] = binary.LittleEndian.Uint32(key[8:]) + out[3] = binary.LittleEndian.Uint32(key[12:]) + out[4] = binary.LittleEndian.Uint32(key[16:]) + out[5] = binary.LittleEndian.Uint32(key[20:]) + out[6] = binary.LittleEndian.Uint32(key[24:]) + out[7] = binary.LittleEndian.Uint32(key[28:]) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index c403b7d2d7..8637feaec5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,18 +1,20 @@ # codeberg.org/gruf/go-bytes v1.0.2 ## explicit; go 1.14 codeberg.org/gruf/go-bytes -# codeberg.org/gruf/go-errors v1.0.4 +# codeberg.org/gruf/go-errors v1.0.5 ## explicit; go 1.15 codeberg.org/gruf/go-errors # codeberg.org/gruf/go-fastpath v1.0.2 ## explicit; go 1.14 codeberg.org/gruf/go-fastpath +# codeberg.org/gruf/go-format v1.0.3 +## explicit; go 1.17 +codeberg.org/gruf/go-format # codeberg.org/gruf/go-hashenc v1.0.1 ## explicit; go 1.16 codeberg.org/gruf/go-hashenc # codeberg.org/gruf/go-logger v1.3.2 ## explicit; go 1.14 -codeberg.org/gruf/go-logger # codeberg.org/gruf/go-mutexes v1.0.1 ## explicit; go 1.14 codeberg.org/gruf/go-mutexes @@ -25,7 +27,7 @@ codeberg.org/gruf/go-pools # codeberg.org/gruf/go-runners v1.2.0 ## explicit; go 1.14 codeberg.org/gruf/go-runners -# codeberg.org/gruf/go-store v1.1.5 +# codeberg.org/gruf/go-store v1.2.2 ## explicit; go 1.14 codeberg.org/gruf/go-store/kv codeberg.org/gruf/go-store/storage @@ -524,6 +526,18 @@ github.com/vmihailenco/tagparser/v2/internal/parser # github.com/wagslane/go-password-validator v0.3.0 ## explicit; go 1.16 github.com/wagslane/go-password-validator +# github.com/zeebo/blake3 v0.2.1 +## explicit; go 1.13 +github.com/zeebo/blake3 +github.com/zeebo/blake3/internal/alg +github.com/zeebo/blake3/internal/alg/compress +github.com/zeebo/blake3/internal/alg/compress/compress_pure +github.com/zeebo/blake3/internal/alg/compress/compress_sse41 +github.com/zeebo/blake3/internal/alg/hash +github.com/zeebo/blake3/internal/alg/hash/hash_avx2 +github.com/zeebo/blake3/internal/alg/hash/hash_pure +github.com/zeebo/blake3/internal/consts +github.com/zeebo/blake3/internal/utils # golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b ## explicit; go 1.17 golang.org/x/crypto/acme From 589bb9df0275457b5f9c3790e67517ec1be1745d Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 16 Jan 2022 18:52:55 +0100 Subject: [PATCH 19/43] pass reader around instead of []byte --- internal/federation/dereferencing/account.go | 5 +- internal/federation/dereferencing/media.go | 3 +- internal/media/image.go | 46 +++-- internal/media/manager_test.go | 32 ++-- internal/media/processingemoji.go | 168 ++++++++--------- internal/media/processingmedia.go | 179 ++++++++++--------- internal/media/types.go | 5 +- internal/media/util.go | 11 +- internal/processing/account/update.go | 42 +---- internal/processing/admin/emoji.go | 20 +-- internal/processing/media/create.go | 19 +- internal/transport/derefmedia.go | 7 +- internal/transport/transport.go | 5 +- testrig/storage.go | 82 +-------- 14 files changed, 238 insertions(+), 386 deletions(-) diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index b9efbfa450..6ea8256d5a 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -23,6 +23,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net/url" "strings" @@ -251,7 +252,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - data := func(innerCtx context.Context) ([]byte, error) { + data := func(innerCtx context.Context) (io.Reader, error) { return t.DereferenceMedia(innerCtx, avatarIRI) } @@ -273,7 +274,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - data := func(innerCtx context.Context) ([]byte, error) { + data := func(innerCtx context.Context) (io.Reader, error) { return t.DereferenceMedia(innerCtx, headerIRI) } diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go index 46cb4a5f4f..c427f25073 100644 --- a/internal/federation/dereferencing/media.go +++ b/internal/federation/dereferencing/media.go @@ -21,6 +21,7 @@ package dereferencing import ( "context" "fmt" + "io" "net/url" "github.com/superseriousbusiness/gotosocial/internal/media" @@ -41,7 +42,7 @@ func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, a return nil, fmt.Errorf("GetRemoteMedia: error parsing url: %s", err) } - dataFunc := func(innerCtx context.Context) ([]byte, error) { + dataFunc := func(innerCtx context.Context) (io.Reader, error) { return t.DereferenceMedia(innerCtx, derefURI) } diff --git a/internal/media/image.go b/internal/media/image.go index de4b71210e..b8f00024fe 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -26,6 +26,7 @@ import ( "image/gif" "image/jpeg" "image/png" + "io" "github.com/buckket/go-blurhash" "github.com/nfnt/resize" @@ -37,17 +38,17 @@ const ( thumbnailMaxHeight = 512 ) -type ImageMeta struct { - image []byte +type imageMeta struct { width int height int size int aspect float64 - blurhash string + blurhash string // defined only for calls to deriveThumbnail if createBlurhash is true + small []byte // defined only for calls to deriveStaticEmoji or deriveThumbnail } -func decodeGif(b []byte) (*ImageMeta, error) { - gif, err := gif.DecodeAll(bytes.NewReader(b)) +func decodeGif(r io.Reader) (*imageMeta, error) { + gif, err := gif.DecodeAll(r) if err != nil { return nil, err } @@ -58,8 +59,7 @@ func decodeGif(b []byte) (*ImageMeta, error) { size := width * height aspect := float64(width) / float64(height) - return &ImageMeta{ - image: b, + return &imageMeta{ width: width, height: height, size: size, @@ -67,15 +67,15 @@ func decodeGif(b []byte) (*ImageMeta, error) { }, nil } -func decodeImage(b []byte, contentType string) (*ImageMeta, error) { +func decodeImage(r io.Reader, contentType string) (*imageMeta, error) { var i image.Image var err error switch contentType { case mimeImageJpeg: - i, err = jpeg.Decode(bytes.NewReader(b)) + i, err = jpeg.Decode(r) case mimeImagePng: - i, err = png.Decode(bytes.NewReader(b)) + i, err = png.Decode(r) default: err = fmt.Errorf("content type %s not recognised", contentType) } @@ -93,8 +93,7 @@ func decodeImage(b []byte, contentType string) (*ImageMeta, error) { size := width * height aspect := float64(width) / float64(height) - return &ImageMeta{ - image: b, + return &imageMeta{ width: width, height: height, size: size, @@ -111,17 +110,17 @@ func decodeImage(b []byte, contentType string) (*ImageMeta, error) { // // If createBlurhash is false, then the blurhash field on the returned ImageAndMeta // will be an empty string. -func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageMeta, error) { +func deriveThumbnail(r io.Reader, contentType string, createBlurhash bool) (*imageMeta, error) { var i image.Image var err error switch contentType { case mimeImageJpeg: - i, err = jpeg.Decode(bytes.NewReader(b)) + i, err = jpeg.Decode(r) case mimeImagePng: - i, err = png.Decode(bytes.NewReader(b)) + i, err = png.Decode(r) case mimeImageGif: - i, err = gif.Decode(bytes.NewReader(b)) + i, err = gif.Decode(r) default: err = fmt.Errorf("content type %s can't be thumbnailed", contentType) } @@ -140,7 +139,7 @@ func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageM size := width * height aspect := float64(width) / float64(height) - im := &ImageMeta{ + im := &imageMeta{ width: width, height: height, size: size, @@ -165,25 +164,24 @@ func deriveThumbnail(b []byte, contentType string, createBlurhash bool) (*ImageM }); err != nil { return nil, err } - - im.image = out.Bytes() + im.small = out.Bytes() return im, nil } // deriveStaticEmojji takes a given gif or png of an emoji, decodes it, and re-encodes it as a static png. -func deriveStaticEmoji(b []byte, contentType string) (*ImageMeta, error) { +func deriveStaticEmoji(r io.Reader, contentType string) (*imageMeta, error) { var i image.Image var err error switch contentType { case mimeImagePng: - i, err = png.Decode(bytes.NewReader(b)) + i, err = png.Decode(r) if err != nil { return nil, err } case mimeImageGif: - i, err = gif.Decode(bytes.NewReader(b)) + i, err = gif.Decode(r) if err != nil { return nil, err } @@ -195,8 +193,8 @@ func deriveStaticEmoji(b []byte, contentType string) (*ImageMeta, error) { if err := png.Encode(out, i); err != nil { return nil, err } - return &ImageMeta{ - image: out.Bytes(), + return &imageMeta{ + small: out.Bytes(), }, nil } diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 0fadceb37e..5380b83b1c 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -19,8 +19,10 @@ package media_test import ( + "bytes" "context" "fmt" + "io" "os" "testing" "time" @@ -37,9 +39,13 @@ type ManagerTestSuite struct { func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { ctx := context.Background() - data := func(_ context.Context) ([]byte, error) { + data := func(_ context.Context) (io.Reader, error) { // load bytes from a test image - return os.ReadFile("./test/test-jpeg.jpg") + b, err := os.ReadFile("./test/test-jpeg.jpg") + if err != nil { + panic(err) + } + return bytes.NewBuffer(b), nil } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" @@ -103,9 +109,13 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { func (suite *ManagerTestSuite) TestSimpleJpegProcessAsync() { ctx := context.Background() - data := func(_ context.Context) ([]byte, error) { + data := func(_ context.Context) (io.Reader, error) { // load bytes from a test image - return os.ReadFile("./test/test-jpeg.jpg") + b, err := os.ReadFile("./test/test-jpeg.jpg") + if err != nil { + panic(err) + } + return bytes.NewBuffer(b), nil } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" @@ -175,16 +185,16 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessAsync() { func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { // in this test, we spam the manager queue with 50 new media requests, just to see how it holds up - ctx := context.Background() - // load bytes from a test image - testBytes, err := os.ReadFile("./test/test-jpeg.jpg") - suite.NoError(err) - suite.NotEmpty(testBytes) + b, err := os.ReadFile("./test/test-jpeg.jpg") + if err != nil { + panic(err) + } - data := func(_ context.Context) ([]byte, error) { - return testBytes, nil + data := func(_ context.Context) (io.Reader, error) { + // load bytes from a test image + return bytes.NewReader(b), nil } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index 467b500fc6..147b6b5b3d 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -19,8 +19,10 @@ package media import ( + "bytes" "context" "fmt" + "io" "strings" "sync" "time" @@ -46,22 +48,14 @@ type ProcessingEmoji struct { emoji *gtsmodel.Emoji data DataFunc - - rawData []byte // will be set once the fetchRawData function has been called + read bool // bool indicating that data function has been triggered already /* - below fields represent the processing state of the static version of the emoji - */ - - staticState processState - static *ImageMeta - - /* - below fields represent the processing state of the emoji image + below fields represent the processing state of the static of the emoji */ + staticState processState fullSizeState processState - fullSize *ImageMeta /* below pointers to database and storage are maintained so that @@ -85,21 +79,18 @@ func (p *ProcessingEmoji) EmojiID() string { // LoadEmoji blocks until the static and fullsize image // has been processed, and then returns the completed emoji. func (p *ProcessingEmoji) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error) { - if err := p.fetchRawData(ctx); err != nil { - return nil, err - } + p.mu.Lock() + defer p.mu.Unlock() - if _, err := p.loadStatic(ctx); err != nil { + if err := p.store(ctx); err != nil { return nil, err } - if _, err := p.loadFullSize(ctx); err != nil { + if err := p.loadStatic(ctx); err != nil { return nil, err } // store the result in the database before returning it - p.mu.Lock() - defer p.mu.Unlock() if !p.insertedInDB { if err := p.database.Put(ctx, p.emoji); err != nil { return nil, err @@ -116,118 +107,85 @@ func (p *ProcessingEmoji) Finished() bool { return p.staticState == complete && p.fullSizeState == complete } -func (p *ProcessingEmoji) loadStatic(ctx context.Context) (*ImageMeta, error) { - p.mu.Lock() - defer p.mu.Unlock() - +func (p *ProcessingEmoji) loadStatic(ctx context.Context) error { switch p.staticState { case received: - // we haven't processed a static version of this emoji yet so do it now - static, err := deriveStaticEmoji(p.rawData, p.emoji.ImageContentType) + // stream the original file out of storage... + stored, err := p.storage.GetStream(p.emoji.ImagePath) if err != nil { - p.err = fmt.Errorf("error deriving static: %s", err) + p.err = fmt.Errorf("loadStatic: error fetching file from storage: %s", err) p.staticState = errored - return nil, p.err + return p.err } - // put the static in storage - if err := p.storage.Put(p.emoji.ImageStaticPath, static.image); err != nil { - p.err = fmt.Errorf("error storing static: %s", err) + // we haven't processed a static version of this emoji yet so do it now + static, err := deriveStaticEmoji(stored, p.emoji.ImageContentType) + if err != nil { + p.err = fmt.Errorf("loadStatic: error deriving static: %s", err) p.staticState = errored - return nil, p.err + return p.err } - // set appropriate fields on the emoji based on the static version we derived - p.emoji.ImageStaticFileSize = len(static.image) - - // set the static on the processing emoji - p.static = static - - // we're done processing the static version of the emoji! - p.staticState = complete - fallthrough - case complete: - return p.static, nil - case errored: - return nil, p.err - } - - return nil, fmt.Errorf("static processing status %d unknown", p.staticState) -} - -func (p *ProcessingEmoji) loadFullSize(ctx context.Context) (*ImageMeta, error) { - p.mu.Lock() - defer p.mu.Unlock() - - switch p.fullSizeState { - case received: - var err error - var decoded *ImageMeta - - ct := p.emoji.ImageContentType - switch ct { - case mimeImagePng: - decoded, err = decodeImage(p.rawData, ct) - case mimeImageGif: - decoded, err = decodeGif(p.rawData) - default: - err = fmt.Errorf("content type %s not a processible emoji type", ct) - } - - if err != nil { - p.err = err - p.fullSizeState = errored - return nil, err + if err := stored.Close(); err != nil { + p.err = fmt.Errorf("loadStatic: error closing stored full size: %s", err) + p.staticState = errored + return p.err } - // put the full size emoji in storage - if err := p.storage.Put(p.emoji.ImagePath, decoded.image); err != nil { - p.err = fmt.Errorf("error storing full size emoji: %s", err) - p.fullSizeState = errored - return nil, p.err + // put the static in storage + if err := p.storage.Put(p.emoji.ImageStaticPath, static.small); err != nil { + p.err = fmt.Errorf("loadStatic: error storing static: %s", err) + p.staticState = errored + return p.err } - // set the fullsize of this media - p.fullSize = decoded + p.emoji.ImageStaticFileSize = len(static.small) - // we're done processing the full-size emoji - p.fullSizeState = complete + // we're done processing the static version of the emoji! + p.staticState = complete fallthrough case complete: - return p.fullSize, nil + return nil case errored: - return nil, p.err + return p.err } - return nil, fmt.Errorf("full size processing status %d unknown", p.fullSizeState) + return fmt.Errorf("static processing status %d unknown", p.staticState) } -// fetchRawData calls the data function attached to p if it hasn't been called yet, -// and updates the underlying emoji fields as necessary. -// It should only be called from within a function that already has a lock on p! -func (p *ProcessingEmoji) fetchRawData(ctx context.Context) error { +// store calls the data function attached to p if it hasn't been called yet, +// and updates the underlying attachment fields as necessary. It will then stream +// bytes from p's reader directly into storage so that it can be retrieved later. +func (p *ProcessingEmoji) store(ctx context.Context) error { // check if we've already done this and bail early if we have - if p.rawData != nil { + if p.read { return nil } - // execute the data function and pin the raw bytes for further processing - b, err := p.data(ctx) + // execute the data function to get the reader out of it + reader, err := p.data(ctx) if err != nil { - return fmt.Errorf("fetchRawData: error executing data function: %s", err) + return fmt.Errorf("store: error executing data function: %s", err) + } + + // extract no more than 261 bytes from the beginning of the file -- this is the header + firstBytes := make([]byte, maxFileHeaderBytes) + if _, err := reader.Read(firstBytes); err != nil { + return fmt.Errorf("store: error reading initial %d bytes: %s", maxFileHeaderBytes, err) } - p.rawData = b - // now we have the data we can work out the content type - contentType, err := parseContentType(p.rawData) + // now we have the file header we can work out the content type from it + contentType, err := parseContentType(firstBytes) if err != nil { - return fmt.Errorf("fetchRawData: error parsing content type: %s", err) + return fmt.Errorf("store: error parsing content type: %s", err) } + // bail if this is a type we can't process if !supportedEmoji(contentType) { - return fmt.Errorf("fetchRawData: content type %s was not valid for an emoji", contentType) + return fmt.Errorf("store: content type %s was not valid for an emoji", contentType) } + // extract the file extension split := strings.Split(contentType, "/") extension := split[1] // something like 'gif' @@ -236,8 +194,24 @@ func (p *ProcessingEmoji) fetchRawData(ctx context.Context) error { p.emoji.ImageURL = uris.GenerateURIForAttachment(p.instanceAccountID, string(TypeEmoji), string(SizeOriginal), p.emoji.ID, extension) p.emoji.ImagePath = fmt.Sprintf("%s/%s/%s/%s.%s", p.instanceAccountID, TypeEmoji, SizeOriginal, p.emoji.ID, extension) p.emoji.ImageContentType = contentType - p.emoji.ImageFileSize = len(p.rawData) + // concatenate the first bytes with the existing bytes still in the reader (thanks Mara) + multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader) + + // store this for now -- other processes can pull it out of storage as they please + if err := p.storage.PutStream(p.emoji.ImagePath, multiReader); err != nil { + return fmt.Errorf("store: error storing stream: %s", err) + } + p.emoji.ImageFileSize = 36702 // TODO: set this based on the result of PutStream + + // if the original reader is a readcloser, close it since we're done with it now + if rc, ok := reader.(io.ReadCloser); ok { + if err := rc.Close(); err != nil { + return fmt.Errorf("store: error closing readcloser: %s", err) + } + } + + p.read = true return nil } diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 082c586077..82db863e0e 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -19,8 +19,10 @@ package media import ( + "bytes" "context" "fmt" + "io" "strings" "sync" "time" @@ -44,22 +46,10 @@ type ProcessingMedia struct { attachment *gtsmodel.MediaAttachment data DataFunc + read bool // bool indicating that data function has been triggered already - rawData []byte // will be set once the fetchRawData function has been called - - /* - below fields represent the processing state of the media thumbnail - */ - - thumbstate processState - thumb *ImageMeta - - /* - below fields represent the processing state of the full-sized media - */ - - fullSizeState processState - fullSize *ImageMeta + thumbstate processState // the processing state of the media thumbnail + fullSizeState processState // the processing state of the full-sized media /* below pointers to database and storage are maintained so that @@ -83,21 +73,22 @@ func (p *ProcessingMedia) AttachmentID() string { // LoadAttachment blocks until the thumbnail and fullsize content // has been processed, and then returns the completed attachment. func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAttachment, error) { - if err := p.fetchRawData(ctx); err != nil { + p.mu.Lock() + defer p.mu.Unlock() + + if err := p.store(ctx); err != nil { return nil, err } - if _, err := p.loadThumb(ctx); err != nil { + if err := p.loadThumb(ctx); err != nil { return nil, err } - if _, err := p.loadFullSize(ctx); err != nil { + if err := p.loadFullSize(ctx); err != nil { return nil, err } // store the result in the database before returning it - p.mu.Lock() - defer p.mu.Unlock() if !p.insertedInDB { if err := p.database.Put(ctx, p.attachment); err != nil { return nil, err @@ -114,10 +105,7 @@ func (p *ProcessingMedia) Finished() bool { return p.thumbstate == complete && p.fullSizeState == complete } -func (p *ProcessingMedia) loadThumb(ctx context.Context) (*ImageMeta, error) { - p.mu.Lock() - defer p.mu.Unlock() - +func (p *ProcessingMedia) loadThumb(ctx context.Context) error { switch p.thumbstate { case received: // we haven't processed a thumbnail for this media yet so do it now @@ -129,87 +117,94 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) (*ImageMeta, error) { createBlurhash = true } - thumb, err := deriveThumbnail(p.rawData, p.attachment.File.ContentType, createBlurhash) + // stream the original file out of storage... + stored, err := p.storage.GetStream(p.attachment.File.Path) + if err != nil { + p.err = fmt.Errorf("loadThumb: error fetching file from storage: %s", err) + p.thumbstate = errored + return p.err + } + + // ... and into the derive thumbnail function + thumb, err := deriveThumbnail(stored, p.attachment.File.ContentType, createBlurhash) if err != nil { - p.err = fmt.Errorf("error deriving thumbnail: %s", err) + p.err = fmt.Errorf("loadThumb: error deriving thumbnail: %s", err) + p.thumbstate = errored + return p.err + } + + if err := stored.Close(); err != nil { + p.err = fmt.Errorf("loadThumb: error closing stored full size: %s", err) p.thumbstate = errored - return nil, p.err + return p.err } // put the thumbnail in storage - if err := p.storage.Put(p.attachment.Thumbnail.Path, thumb.image); err != nil { - p.err = fmt.Errorf("error storing thumbnail: %s", err) + if err := p.storage.Put(p.attachment.Thumbnail.Path, thumb.small); err != nil { + p.err = fmt.Errorf("loadThumb: error storing thumbnail: %s", err) p.thumbstate = errored - return nil, p.err + return p.err } // set appropriate fields on the attachment based on the thumbnail we derived if createBlurhash { p.attachment.Blurhash = thumb.blurhash } - p.attachment.FileMeta.Small = gtsmodel.Small{ Width: thumb.width, Height: thumb.height, Size: thumb.size, Aspect: thumb.aspect, } - p.attachment.Thumbnail.FileSize = len(thumb.image) - - // set the thumbnail of this media - p.thumb = thumb + p.attachment.Thumbnail.FileSize = len(thumb.small) // we're done processing the thumbnail! p.thumbstate = complete fallthrough case complete: - return p.thumb, nil + return nil case errored: - return nil, p.err + return p.err } - return nil, fmt.Errorf("thumbnail processing status %d unknown", p.thumbstate) + return fmt.Errorf("loadThumb: thumbnail processing status %d unknown", p.thumbstate) } -func (p *ProcessingMedia) loadFullSize(ctx context.Context) (*ImageMeta, error) { - p.mu.Lock() - defer p.mu.Unlock() - +func (p *ProcessingMedia) loadFullSize(ctx context.Context) error { switch p.fullSizeState { case received: - var clean []byte var err error - var decoded *ImageMeta + var decoded *imageMeta + + // stream the original file out of storage... + stored, err := p.storage.GetStream(p.attachment.File.Path) + if err != nil { + p.err = fmt.Errorf("loadFullSize: error fetching file from storage: %s", err) + p.fullSizeState = errored + return p.err + } + // decode the image ct := p.attachment.File.ContentType switch ct { case mimeImageJpeg, mimeImagePng: - // first 'clean' image by purging exif data from it - var exifErr error - if clean, exifErr = purgeExif(p.rawData); exifErr != nil { - err = exifErr - break - } - decoded, err = decodeImage(clean, ct) + decoded, err = decodeImage(stored, ct) case mimeImageGif: - // gifs are already clean - no exif data to remove - clean = p.rawData - decoded, err = decodeGif(clean) + decoded, err = decodeGif(stored) default: - err = fmt.Errorf("content type %s not a processible image type", ct) + err = fmt.Errorf("loadFullSize: content type %s not a processible image type", ct) } if err != nil { p.err = err p.fullSizeState = errored - return nil, err + return p.err } - // put the full size in storage - if err := p.storage.Put(p.attachment.File.Path, decoded.image); err != nil { - p.err = fmt.Errorf("error storing full size image: %s", err) - p.fullSizeState = errored - return nil, p.err + if err := stored.Close(); err != nil { + p.err = fmt.Errorf("loadFullSize: error closing stored full size: %s", err) + p.thumbstate = errored + return p.err } // set appropriate fields on the attachment based on the image we derived @@ -219,56 +214,58 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) (*ImageMeta, error) Size: decoded.size, Aspect: decoded.aspect, } - p.attachment.File.FileSize = len(decoded.image) p.attachment.File.UpdatedAt = time.Now() p.attachment.Processing = gtsmodel.ProcessingStatusProcessed - // set the fullsize of this media - p.fullSize = decoded - // we're done processing the full-size image p.fullSizeState = complete fallthrough case complete: - return p.fullSize, nil + return nil case errored: - return nil, p.err + return p.err } - return nil, fmt.Errorf("full size processing status %d unknown", p.fullSizeState) + return fmt.Errorf("loadFullSize: full size processing status %d unknown", p.fullSizeState) } -// fetchRawData calls the data function attached to p if it hasn't been called yet, -// and updates the underlying attachment fields as necessary. -// It should only be called from within a function that already has a lock on p! -func (p *ProcessingMedia) fetchRawData(ctx context.Context) error { +// store calls the data function attached to p if it hasn't been called yet, +// and updates the underlying attachment fields as necessary. It will then stream +// bytes from p's reader directly into storage so that it can be retrieved later. +func (p *ProcessingMedia) store(ctx context.Context) error { // check if we've already done this and bail early if we have - if p.rawData != nil { + if p.read { return nil } - // execute the data function and pin the raw bytes for further processing - b, err := p.data(ctx) + // execute the data function to get the reader out of it + reader, err := p.data(ctx) if err != nil { - return fmt.Errorf("fetchRawData: error executing data function: %s", err) + return fmt.Errorf("store: error executing data function: %s", err) + } + + // extract no more than 261 bytes from the beginning of the file -- this is the header + firstBytes := make([]byte, maxFileHeaderBytes) + if _, err := reader.Read(firstBytes); err != nil { + return fmt.Errorf("store: error reading initial %d bytes: %s", maxFileHeaderBytes, err) } - p.rawData = b - // now we have the data we can work out the content type - contentType, err := parseContentType(p.rawData) + // now we have the file header we can work out the content type from it + contentType, err := parseContentType(firstBytes) if err != nil { - return fmt.Errorf("fetchRawData: error parsing content type: %s", err) + return fmt.Errorf("store: error parsing content type: %s", err) } + // bail if this is a type we can't process if !supportedImage(contentType) { - return fmt.Errorf("fetchRawData: media type %s not (yet) supported", contentType) + return fmt.Errorf("store: media type %s not (yet) supported", contentType) } + // extract the file extension split := strings.Split(contentType, "/") if len(split) != 2 { - return fmt.Errorf("fetchRawData: content type %s was not valid", contentType) + return fmt.Errorf("store: content type %s was not valid", contentType) } - extension := split[1] // something like 'jpeg' // set some additional fields on the attachment now that @@ -282,6 +279,22 @@ func (p *ProcessingMedia) fetchRawData(ctx context.Context) error { p.attachment.File.Path = fmt.Sprintf("%s/%s/%s/%s.%s", p.attachment.AccountID, TypeAttachment, SizeOriginal, p.attachment.ID, extension) p.attachment.File.ContentType = contentType + // concatenate the first bytes with the existing bytes still in the reader (thanks Mara) + multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader) + + // store this for now -- other processes can pull it out of storage as they please + if err := p.storage.PutStream(p.attachment.File.Path, multiReader); err != nil { + return fmt.Errorf("store: error storing stream: %s", err) + } + + // if the original reader is a readcloser, close it since we're done with it now + if rc, ok := reader.(io.ReadCloser); ok { + if err := rc.Close(); err != nil { + return fmt.Errorf("store: error closing readcloser: %s", err) + } + } + + p.read = true return nil } diff --git a/internal/media/types.go b/internal/media/types.go index 5b3fe4a41a..0a7f60d66a 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -20,6 +20,7 @@ package media import ( "context" + "io" "time" ) @@ -28,7 +29,7 @@ import ( // // See: https://en.wikipedia.org/wiki/File_format#File_header // and https://github.com/h2non/filetype -const maxFileHeaderBytes = 262 +const maxFileHeaderBytes = 261 // mime consts const ( @@ -117,4 +118,4 @@ type AdditionalEmojiInfo struct { } // DataFunc represents a function used to retrieve the raw bytes of a piece of media. -type DataFunc func(ctx context.Context) ([]byte, error) +type DataFunc func(ctx context.Context) (io.Reader, error) diff --git a/internal/media/util.go b/internal/media/util.go index 7a3d81c0f0..248d5fb197 100644 --- a/internal/media/util.go +++ b/internal/media/util.go @@ -19,7 +19,6 @@ package media import ( - "bytes" "errors" "fmt" @@ -28,11 +27,11 @@ import ( // parseContentType parses the MIME content type from a file, returning it as a string in the form (eg., "image/jpeg"). // Returns an error if the content type is not something we can process. -func parseContentType(content []byte) (string, error) { - // read in the first bytes of the file - fileHeader := make([]byte, maxFileHeaderBytes) - if _, err := bytes.NewReader(content).Read(fileHeader); err != nil { - return "", fmt.Errorf("could not read first magic bytes of file: %s", err) +// +// Fileheader should be no longer than 262 bytes; anything more than this is inefficient. +func parseContentType(fileHeader []byte) (string, error) { + if fhLength := len(fileHeader); fhLength > maxFileHeaderBytes { + return "", fmt.Errorf("parseContentType requires %d bytes max, we got %d", maxFileHeaderBytes, fhLength) } kind, err := filetype.Match(fileHeader) diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 7b305dc957..5a0a3e5a11 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -19,9 +19,7 @@ package account import ( - "bytes" "context" - "errors" "fmt" "io" "mime/multipart" @@ -142,24 +140,8 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead return nil, fmt.Errorf("UpdateAvatar: avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) } - dataFunc := func(ctx context.Context) ([]byte, error) { - // pop open the fileheader - f, err := avatar.Open() - if err != nil { - return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) - } - - // extract the bytes - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("UpdateAvatar: could not read provided avatar: %s", err) - } - if size == 0 { - return nil, errors.New("UpdateAvatar: could not read provided avatar: size 0 bytes") - } - - return buf.Bytes(), f.Close() + dataFunc := func(ctx context.Context) (io.Reader, error) { + return avatar.Open() } isAvatar := true @@ -184,24 +166,8 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead return nil, fmt.Errorf("UpdateHeader: header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) } - dataFunc := func(ctx context.Context) ([]byte, error) { - // pop open the fileheader - f, err := header.Open() - if err != nil { - return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) - } - - // extract the bytes - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("UpdateHeader: could not read provided header: %s", err) - } - if size == 0 { - return nil, errors.New("UpdateHeader: could not read provided header: size 0 bytes") - } - - return buf.Bytes(), f.Close() + dataFunc := func(ctx context.Context) (io.Reader, error) { + return header.Open() } isHeader := true diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index fcc17c4be1..e0068858bc 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -19,9 +19,7 @@ package admin import ( - "bytes" "context" - "errors" "fmt" "io" @@ -38,22 +36,8 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return nil, gtserror.NewErrorNotAuthorized(fmt.Errorf("user %s not an admin", user.ID), "user is not an admin") } - data := func(innerCtx context.Context) ([]byte, error) { - // open the emoji and extract the bytes from it - f, err := form.Image.Open() - if err != nil { - return nil, fmt.Errorf("error opening emoji: %s", err) - } - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("error reading emoji: %s", err) - } - if size == 0 { - return nil, errors.New("could not read provided emoji: size 0 bytes") - } - - return buf.Bytes(), f.Close() + data := func(innerCtx context.Context) (io.Reader, error) { + return form.Image.Open() } emojiID, err := id.NewRandomULID() diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index 0896315b11..0fda4c27b5 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -19,9 +19,7 @@ package media import ( - "bytes" "context" - "errors" "fmt" "io" @@ -31,21 +29,8 @@ import ( ) func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form *apimodel.AttachmentRequest) (*apimodel.Attachment, error) { - data := func(innerCtx context.Context) ([]byte, error) { - // open the attachment and extract the bytes from it - f, err := form.File.Open() - if err != nil { - return nil, fmt.Errorf("error opening attachment: %s", err) - } - buf := new(bytes.Buffer) - size, err := io.Copy(buf, f) - if err != nil { - return nil, fmt.Errorf("error reading attachment: %s", err) - } - if size == 0 { - return nil, errors.New("could not read provided attachment: size 0 bytes") - } - return buf.Bytes(), f.Close() + data := func(innerCtx context.Context) (io.Reader, error) { + return form.File.Open() } focusX, focusY, err := parseFocus(form.Focus) diff --git a/internal/transport/derefmedia.go b/internal/transport/derefmedia.go index 3fa4a89e45..ed32f20c6f 100644 --- a/internal/transport/derefmedia.go +++ b/internal/transport/derefmedia.go @@ -21,14 +21,14 @@ package transport import ( "context" "fmt" - "io/ioutil" + "io" "net/http" "net/url" "github.com/sirupsen/logrus" ) -func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) ([]byte, error) { +func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) (io.ReadCloser, error) { l := logrus.WithField("func", "DereferenceMedia") l.Debugf("performing GET to %s", iri.String()) req, err := http.NewRequestWithContext(ctx, "GET", iri.String(), nil) @@ -50,9 +50,8 @@ func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) ([]byte, if err != nil { return nil, err } - defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("GET request to %s failed (%d): %s", iri.String(), resp.StatusCode, resp.Status) } - return ioutil.ReadAll(resp.Body) + return resp.Body, nil } diff --git a/internal/transport/transport.go b/internal/transport/transport.go index c43515a42f..d9650d9526 100644 --- a/internal/transport/transport.go +++ b/internal/transport/transport.go @@ -21,6 +21,7 @@ package transport import ( "context" "crypto" + "io" "net/url" "sync" @@ -33,8 +34,8 @@ import ( // functionality for fetching remote media. type Transport interface { pub.Transport - // DereferenceMedia fetches the bytes of the given media attachment IRI. - DereferenceMedia(ctx context.Context, iri *url.URL) ([]byte, error) + // DereferenceMedia fetches the given media attachment IRI. + DereferenceMedia(ctx context.Context, iri *url.URL) (io.ReadCloser, error) // DereferenceInstance dereferences remote instance information, first by checking /api/v1/instance, and then by checking /.well-known/nodeinfo. DereferenceInstance(ctx context.Context, iri *url.URL) (*gtsmodel.Instance, error) // Finger performs a webfinger request with the given username and domain, and returns the bytes from the response body. diff --git a/testrig/storage.go b/testrig/storage.go index a8cf0d8381..0e91d7dbef 100644 --- a/testrig/storage.go +++ b/testrig/storage.go @@ -19,20 +19,16 @@ package testrig import ( - "bytes" - "errors" "fmt" - "io" "os" "codeberg.org/gruf/go-store/kv" "codeberg.org/gruf/go-store/storage" - "codeberg.org/gruf/go-store/util" ) // NewTestStorage returns a new in memory storage with the default test config func NewTestStorage() *kv.KVStore { - storage, err := kv.OpenStorage(&inMemStorage{storage: map[string][]byte{}, overwrite: false}) + storage, err := kv.OpenStorage(storage.OpenMemory(200, false)) if err != nil { panic(err) } @@ -113,79 +109,3 @@ func StandardStorageTeardown(s *kv.KVStore) { } } } - -type inMemStorage struct { - storage map[string][]byte - overwrite bool -} - -func (s *inMemStorage) Clean() error { - return nil -} - -func (s *inMemStorage) ReadBytes(key string) ([]byte, error) { - b, ok := s.storage[key] - if !ok { - return nil, errors.New("key not found") - } - return b, nil -} - -func (s *inMemStorage) ReadStream(key string) (io.ReadCloser, error) { - b, err := s.ReadBytes(key) - if err != nil { - return nil, err - } - return util.NopReadCloser(bytes.NewReader(b)), nil -} - -func (s *inMemStorage) WriteBytes(key string, value []byte) error { - if _, ok := s.storage[key]; ok && !s.overwrite { - return errors.New("key already in storage") - } - s.storage[key] = copyBytes(value) - return nil -} - -func (s *inMemStorage) WriteStream(key string, r io.Reader) error { - b, err := io.ReadAll(r) - if err != nil { - return err - } - return s.WriteBytes(key, b) -} - -func (s *inMemStorage) Stat(key string) (bool, error) { - _, ok := s.storage[key] - return ok, nil -} - -func (s *inMemStorage) Remove(key string) error { - if _, ok := s.storage[key]; !ok { - return errors.New("key not found") - } - delete(s.storage, key) - return nil -} - -func (s *inMemStorage) WalkKeys(opts storage.WalkKeysOptions) error { - if opts.WalkFn == nil { - return errors.New("invalid walkfn") - } - for key := range s.storage { - opts.WalkFn(entry(key)) - } - return nil -} - -type entry string - -func (e entry) Key() string { - return string(e) -} - -func copyBytes(b []byte) []byte { - p := make([]byte, len(b)) - copy(p, b) - return p -} From 7d024ce74d29a14bc8db60495751e674bdb24463 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 23 Jan 2022 14:41:31 +0100 Subject: [PATCH 20/43] use exif-terminator --- README.md | 2 +- go.mod | 12 +- go.sum | 40 +- vendor/github.com/dsoprea/go-exif/.travis.yml | 24 - vendor/github.com/dsoprea/go-exif/README.md | 206 --- vendor/github.com/dsoprea/go-exif/error.go | 10 - vendor/github.com/dsoprea/go-exif/exif.go | 247 --- vendor/github.com/dsoprea/go-exif/gps.go | 56 - vendor/github.com/dsoprea/go-exif/ifd.go | 407 ----- .../github.com/dsoprea/go-exif/ifd_builder.go | 1265 --------------- .../dsoprea/go-exif/ifd_builder_encode.go | 530 ------- .../dsoprea/go-exif/ifd_enumerate.go | 1356 ----------------- .../dsoprea/go-exif/ifd_tag_entry.go | 233 --- vendor/github.com/dsoprea/go-exif/package.go | 4 - vendor/github.com/dsoprea/go-exif/parser.go | 190 --- vendor/github.com/dsoprea/go-exif/tag_type.go | 397 ----- vendor/github.com/dsoprea/go-exif/tags.go | 229 --- .../github.com/dsoprea/go-exif/tags_data.go | 951 ------------ .../dsoprea/go-exif/tags_undefined.go | 417 ----- vendor/github.com/dsoprea/go-exif/type.go | 310 ---- .../github.com/dsoprea/go-exif/type_encode.go | 262 ---- vendor/github.com/dsoprea/go-exif/v2/LICENSE | 9 - vendor/github.com/dsoprea/go-exif/v2/ifd.go | 34 - .../dsoprea/go-exif/{v2 => v3}/.MODULE_ROOT | 0 .../dsoprea/go-exif/{ => v3}/LICENSE | 0 .../dsoprea/go-exif/{v2 => v3}/common/ifd.go | 16 +- .../go-exif/{v2 => v3}/common/parser.go | 63 +- .../{v2 => v3}/common/testing_common.go | 0 .../dsoprea/go-exif/{v2 => v3}/common/type.go | 122 +- .../go-exif/{ => v3/common}/utility.go | 128 +- .../{v2 => v3}/common/value_context.go | 76 +- .../{v2 => v3}/common/value_encoder.go | 62 +- .../dsoprea/go-exif/v3/data_layer.go | 50 + .../dsoprea/go-exif/{v2 => v3}/error.go | 0 .../dsoprea/go-exif/{v2 => v3}/exif.go | 97 +- .../dsoprea/go-exif/{v2 => v3}/gps.go | 2 +- .../dsoprea/go-exif/{v2 => v3}/ifd_builder.go | 26 +- .../go-exif/{v2 => v3}/ifd_builder_encode.go | 2 +- .../go-exif/{v2 => v3}/ifd_enumerate.go | 449 ++++-- .../go-exif/{v2 => v3}/ifd_tag_entry.go | 31 +- .../dsoprea/go-exif/{v2 => v3}/package.go | 0 .../dsoprea/go-exif/{v2 => v3}/tags.go | 76 +- .../dsoprea/go-exif/{v2 => v3}/tags_data.go | 39 + .../go-exif/{v2 => v3}/testing_common.go | 34 +- .../go-exif/{v2 => v3}/undefined/README.md | 0 .../go-exif/{v2 => v3}/undefined/accessor.go | 2 +- .../{v2 => v3}/undefined/exif_8828_oecf.go | 2 +- .../undefined/exif_9000_exif_version.go | 2 +- .../exif_9101_components_configuration.go | 2 +- .../undefined/exif_927C_maker_note.go | 2 +- .../undefined/exif_9286_user_comment.go | 2 +- .../undefined/exif_A000_flashpix_version.go | 2 +- .../exif_A20C_spatial_frequency_response.go | 2 +- .../undefined/exif_A300_file_source.go | 2 +- .../undefined/exif_A301_scene_type.go | 2 +- .../undefined/exif_A302_cfa_pattern.go | 2 +- .../exif_iop_0002_interop_version.go | 2 +- .../gps_001B_gps_processing_method.go | 2 +- .../gps_001C_gps_area_information.go | 2 +- .../{v2 => v3}/undefined/registration.go | 0 .../go-exif/{v2 => v3}/undefined/type.go | 2 +- .../dsoprea/go-exif/{v2 => v3}/utility.go | 170 ++- .../dsoprea/go-exif/value_context.go | 367 ----- .../go-jpeg-image-structure/.travis.yml | 21 - .../{ => v2}/.MODULE_ROOT | 0 .../go-jpeg-image-structure/{ => v2}/LICENSE | 0 .../{ => v2}/README.md | 4 +- .../{ => v2}/markers.go | 0 .../{ => v2}/media_parser.go | 13 +- .../{ => v2}/segment.go | 11 +- .../{ => v2}/segment_list.go | 29 +- .../{ => v2}/splitter.go | 0 .../{ => v2}/testing_common.go | 0 .../{ => v2}/utility.go | 0 .../go-png-image-structure/.travis.yml | 21 - .../dsoprea/go-png-image-structure/README.md | 8 - .../go-png-image-structure/chunk_decoder.go | 89 -- .../go-png-image-structure/media_parser.go | 106 -- .../go-png-image-structure/testing_common.go | 64 - .../dsoprea/go-png-image-structure/utility.go | 65 - .../{ => v2}/.MODULE_ROOT | 0 .../go-png-image-structure/{ => v2}/LICENSE | 0 .../v2/chunk_decoder.go | 87 ++ .../go-png-image-structure/v2/media_parser.go | 118 ++ .../go-png-image-structure/{ => v2}/png.go | 14 +- .../v2/testing_common.go | 64 + .../v2}/utility.go | 16 +- .../dsoprea/go-utility/{ => v2}/LICENSE | 0 .../go-utility/v2/filesystem/README.md | 64 + .../go-utility/v2/filesystem/bounceback.go | 273 ++++ .../filesystem/boundedreadwriteseekcloser.go | 95 ++ .../v2/filesystem/boundedreadwriteseeker.go | 156 ++ .../v2/filesystem/calculate_seek.go | 52 + .../go-utility/v2/filesystem/common.go | 15 + .../copy_bytes_between_positions.go | 40 + .../go-utility/v2/filesystem/does_exist.go | 19 + .../go-utility/v2/filesystem/graceful_copy.go | 54 + .../go-utility/v2/filesystem/list_files.go | 143 ++ .../v2/filesystem/progress_wrapper.go | 93 ++ .../go-utility/v2/filesystem/read_counter.go | 36 + .../v2/filesystem/readseeker_to_readerat.go | 63 + .../v2/filesystem/readwriteseekcloser.go | 29 + .../v2/filesystem/seekable_buffer.go | 146 ++ .../v2/filesystem/simplefileinfo.go | 69 + .../go-utility/v2/filesystem/utility.go | 17 + .../go-utility/v2/filesystem/write_counter.go | 36 + .../go-utility/{ => v2}/image/README.md | 0 .../{ => v2}/image/media_parser_type.go | 2 +- .../exif-terminator/LICENSE | 661 ++++++++ .../exif-terminator/README.md | 116 ++ .../exif-terminator/jpeg.go | 138 ++ .../exif-terminator/png.go | 93 ++ .../exif-terminator/terminator.go | 116 ++ .../superseriousbusiness/exifremove/LICENSE | 21 - .../exifremove/pkg/exifremove/exifremove.go | 140 -- .../exifremove/pkg/exifremove/png_crc_fix.go | 104 -- vendor/modules.txt | 38 +- 117 files changed, 3869 insertions(+), 8721 deletions(-) delete mode 100644 vendor/github.com/dsoprea/go-exif/.travis.yml delete mode 100644 vendor/github.com/dsoprea/go-exif/README.md delete mode 100644 vendor/github.com/dsoprea/go-exif/error.go delete mode 100644 vendor/github.com/dsoprea/go-exif/exif.go delete mode 100644 vendor/github.com/dsoprea/go-exif/gps.go delete mode 100644 vendor/github.com/dsoprea/go-exif/ifd.go delete mode 100644 vendor/github.com/dsoprea/go-exif/ifd_builder.go delete mode 100644 vendor/github.com/dsoprea/go-exif/ifd_builder_encode.go delete mode 100644 vendor/github.com/dsoprea/go-exif/ifd_enumerate.go delete mode 100644 vendor/github.com/dsoprea/go-exif/ifd_tag_entry.go delete mode 100644 vendor/github.com/dsoprea/go-exif/package.go delete mode 100644 vendor/github.com/dsoprea/go-exif/parser.go delete mode 100644 vendor/github.com/dsoprea/go-exif/tag_type.go delete mode 100644 vendor/github.com/dsoprea/go-exif/tags.go delete mode 100644 vendor/github.com/dsoprea/go-exif/tags_data.go delete mode 100644 vendor/github.com/dsoprea/go-exif/tags_undefined.go delete mode 100644 vendor/github.com/dsoprea/go-exif/type.go delete mode 100644 vendor/github.com/dsoprea/go-exif/type_encode.go delete mode 100644 vendor/github.com/dsoprea/go-exif/v2/LICENSE delete mode 100644 vendor/github.com/dsoprea/go-exif/v2/ifd.go rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/.MODULE_ROOT (100%) rename vendor/github.com/dsoprea/go-exif/{ => v3}/LICENSE (100%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/common/ifd.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/common/parser.go (77%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/common/testing_common.go (100%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/common/type.go (85%) rename vendor/github.com/dsoprea/go-exif/{ => v3/common}/utility.go (52%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/common/value_context.go (85%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/common/value_encoder.go (80%) create mode 100644 vendor/github.com/dsoprea/go-exif/v3/data_layer.go rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/error.go (100%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/exif.go (70%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/gps.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/ifd_builder.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/ifd_builder_encode.go (99%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/ifd_enumerate.go (77%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/ifd_tag_entry.go (93%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/package.go (100%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/tags.go (88%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/tags_data.go (91%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/testing_common.go (84%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/README.md (100%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/accessor.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_8828_oecf.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_9000_exif_version.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_9101_components_configuration.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_927C_maker_note.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_9286_user_comment.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_A000_flashpix_version.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_A20C_spatial_frequency_response.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_A300_file_source.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_A301_scene_type.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_A302_cfa_pattern.go (98%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/exif_iop_0002_interop_version.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/gps_001B_gps_processing_method.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/gps_001C_gps_area_information.go (97%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/registration.go (100%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/undefined/type.go (96%) rename vendor/github.com/dsoprea/go-exif/{v2 => v3}/utility.go (55%) delete mode 100644 vendor/github.com/dsoprea/go-exif/value_context.go delete mode 100644 vendor/github.com/dsoprea/go-jpeg-image-structure/.travis.yml rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/.MODULE_ROOT (100%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/LICENSE (100%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/README.md (80%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/markers.go (100%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/media_parser.go (90%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/segment.go (96%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/segment_list.go (93%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/splitter.go (100%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/testing_common.go (100%) rename vendor/github.com/dsoprea/go-jpeg-image-structure/{ => v2}/utility.go (100%) delete mode 100644 vendor/github.com/dsoprea/go-png-image-structure/.travis.yml delete mode 100644 vendor/github.com/dsoprea/go-png-image-structure/README.md delete mode 100644 vendor/github.com/dsoprea/go-png-image-structure/chunk_decoder.go delete mode 100644 vendor/github.com/dsoprea/go-png-image-structure/media_parser.go delete mode 100644 vendor/github.com/dsoprea/go-png-image-structure/testing_common.go delete mode 100644 vendor/github.com/dsoprea/go-png-image-structure/utility.go rename vendor/github.com/dsoprea/go-png-image-structure/{ => v2}/.MODULE_ROOT (100%) rename vendor/github.com/dsoprea/go-png-image-structure/{ => v2}/LICENSE (100%) create mode 100644 vendor/github.com/dsoprea/go-png-image-structure/v2/chunk_decoder.go create mode 100644 vendor/github.com/dsoprea/go-png-image-structure/v2/media_parser.go rename vendor/github.com/dsoprea/go-png-image-structure/{ => v2}/png.go (97%) create mode 100644 vendor/github.com/dsoprea/go-png-image-structure/v2/testing_common.go rename vendor/github.com/dsoprea/{go-exif/v2/common => go-png-image-structure/v2}/utility.go (58%) rename vendor/github.com/dsoprea/go-utility/{ => v2}/LICENSE (100%) create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/README.md create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/bounceback.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseekcloser.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseeker.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/calculate_seek.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/common.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/copy_bytes_between_positions.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/does_exist.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/list_files.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/progress_wrapper.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/read_counter.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/readseeker_to_readerat.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/readwriteseekcloser.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/seekable_buffer.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/simplefileinfo.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/utility.go create mode 100644 vendor/github.com/dsoprea/go-utility/v2/filesystem/write_counter.go rename vendor/github.com/dsoprea/go-utility/{ => v2}/image/README.md (100%) rename vendor/github.com/dsoprea/go-utility/{ => v2}/image/media_parser_type.go (96%) create mode 100644 vendor/github.com/superseriousbusiness/exif-terminator/LICENSE create mode 100644 vendor/github.com/superseriousbusiness/exif-terminator/README.md create mode 100644 vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go create mode 100644 vendor/github.com/superseriousbusiness/exif-terminator/png.go create mode 100644 vendor/github.com/superseriousbusiness/exif-terminator/terminator.go delete mode 100644 vendor/github.com/superseriousbusiness/exifremove/LICENSE delete mode 100644 vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/exifremove.go delete mode 100644 vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/png_crc_fix.go diff --git a/README.md b/README.md index 1d5e5fb191..14aa6ecd2d 100644 --- a/README.md +++ b/README.md @@ -202,7 +202,7 @@ The following libraries and frameworks are used by GoToSocial, with gratitude - [spf13/pflag](https://github.com/spf13/pflag); command-line flag utilities. [Apache-2.0 License](https://spdx.org/licenses/Apache-2.0.html). - [spf13/viper](https://github.com/spf13/viper); configuration management. [Apache-2.0 License](https://spdx.org/licenses/Apache-2.0.html). - [stretchr/testify](https://github.com/stretchr/testify); test framework. [MIT License](https://spdx.org/licenses/MIT.html). -- [superseriousbusiness/exifremove](https://github.com/superseriousbusiness/exifremove) forked from [scottleedavis/go-exif-remove](https://github.com/scottleedavis/go-exif-remove); EXIF data removal. [MIT License](https://spdx.org/licenses/MIT.html). +- [superseriousbusiness/exif-terminator](https://github.com/superseriousbusiness/exif-terminator); EXIF data removal. [GNU AGPL v3 LICENSE](https://spdx.org/licenses/AGPL-3.0-or-later.html). - [superseriousbusiness/activity](https://github.com/superseriousbusiness/activity) forked from [go-fed/activity](https://github.com/go-fed/activity); Golang ActivityPub/ActivityStreams library. [BSD-3-Clause License](https://spdx.org/licenses/BSD-3-Clause.html). - [superseriousbusiness/oauth2](https://github.com/superseriousbusiness/oauth2) forked from [go-oauth2/oauth2](https://github.com/go-oauth2/oauth2); oauth server framework and token handling. [MIT License](https://spdx.org/licenses/MIT.html). - [go-swagger/go-swagger](https://github.com/go-swagger/go-swagger); Swagger OpenAPI spec generation. [Apache-2.0 License](https://spdx.org/licenses/Apache-2.0.html). diff --git a/go.mod b/go.mod index 75956c7d6f..b2ceb76aa3 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/spf13/viper v1.10.0 github.com/stretchr/testify v1.7.0 github.com/superseriousbusiness/activity v1.0.1-0.20211113133524-56560b73ace8 - github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203 + github.com/superseriousbusiness/exif-terminator v0.1.0 github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB github.com/tdewolff/minify/v2 v2.9.22 github.com/uptrace/bun v1.0.19 @@ -50,20 +50,18 @@ require ( codeberg.org/gruf/go-fastpath v1.0.2 // indirect codeberg.org/gruf/go-format v1.0.3 // indirect codeberg.org/gruf/go-hashenc v1.0.1 // indirect - codeberg.org/gruf/go-logger v1.3.2 // indirect codeberg.org/gruf/go-mutexes v1.0.1 // indirect codeberg.org/gruf/go-nowish v1.1.0 // indirect codeberg.org/gruf/go-pools v1.0.2 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dsoprea/go-exif v0.0.0-20210625224831-a6301f85c82b // indirect - github.com/dsoprea/go-exif/v2 v2.0.0-20210625224831-a6301f85c82b // indirect + github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b // indirect github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 // indirect - github.com/dsoprea/go-jpeg-image-structure v0.0.0-20210512043942-b434301c6836 // indirect + github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 // indirect github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d // indirect - github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d // indirect - github.com/dsoprea/go-utility v0.0.0-20200717064901-2fccff4aa15e // indirect + github.com/dsoprea/go-png-image-structure/v2 v2.0.0-20210512210324-29b889a6093d // indirect + github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-errors/errors v1.4.1 // indirect diff --git a/go.sum b/go.sum index 082158f63a..cc773bbfba 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,6 @@ codeberg.org/gruf/go-bytes v1.0.1/go.mod h1:1v/ibfaosfXSZtRdW2rWaVrDXMc9E3bsi/M9 codeberg.org/gruf/go-bytes v1.0.2 h1:malqE42Ni+h1nnYWBUAJaDDtEzF4aeN4uPN8DfMNNvo= codeberg.org/gruf/go-bytes v1.0.2/go.mod h1:1v/ibfaosfXSZtRdW2rWaVrDXMc9E3bsi/M9Ekx39cg= codeberg.org/gruf/go-cache v1.1.2/go.mod h1:/Dbc+xU72Op3hMn6x2PXF3NE9uIDFeS+sXPF00hN/7o= -codeberg.org/gruf/go-errors v1.0.4 h1:jOJCn/GMb6ELLRVlnmpimGRC2CbTreH5/CBZNWh9GZA= -codeberg.org/gruf/go-errors v1.0.4/go.mod h1:rJ08LdIE79Jg8vZ2TGylz/I+tZ1UuMJkGK5mNambIfQ= codeberg.org/gruf/go-errors v1.0.5 h1:rxV70oQkfasUdggLHxOX2QAoJOMFM7XWxHQR45Zx/Fg= codeberg.org/gruf/go-errors v1.0.5/go.mod h1:n03EpmvcmfzU3/xJKC0XXtleXXJUNFpT2fgISODvZ1Y= codeberg.org/gruf/go-fastpath v1.0.1/go.mod h1:edveE/Kp3Eqi0JJm0lXYdkVrB28cNUkcb/bRGFTPqeI= @@ -62,13 +60,9 @@ codeberg.org/gruf/go-format v1.0.3 h1:WoUGzTwZe6SIhILNvtr0qNIA7BOOCgdBlk5bUrfeii codeberg.org/gruf/go-format v1.0.3/go.mod h1:k3TLXp1dqAXdDqxlon0yEM+3FFHdNn0D6BVJTwTy5As= codeberg.org/gruf/go-hashenc v1.0.1 h1:EBvNe2wW8IPMUqT1XihB6/IM6KMJDLMFBxIUvmsy1f8= codeberg.org/gruf/go-hashenc v1.0.1/go.mod h1:IfHhPCVScOiYmJLqdCQT9bYVS1nxNTV4ewMUvFWDPtc= -codeberg.org/gruf/go-logger v1.3.1/go.mod h1:tBduUc+Yb9vqGRxY9/FB0ZlYznSteLy/KmIANo7zFjA= -codeberg.org/gruf/go-logger v1.3.2 h1:/2Cg8Tmu6H10lljq/BvHE+76O2d4tDNUDwitN6YUxxk= -codeberg.org/gruf/go-logger v1.3.2/go.mod h1:q4xmTSdaxPzfndSXVF1X2xcyCVk7Nd/PIWCDs/4biMg= codeberg.org/gruf/go-mutexes v1.0.1 h1:X9bZW74YSEplWWdCrVXAvue5ztw3w5hh+INdXTENu88= codeberg.org/gruf/go-mutexes v1.0.1/go.mod h1:y2hbGLkWVHhNyxBOIVsA3/y2QMm6RSrYsC3sLVZ4EXM= codeberg.org/gruf/go-nowish v1.0.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= -codeberg.org/gruf/go-nowish v1.0.2/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= codeberg.org/gruf/go-nowish v1.1.0 h1:rj1z0AXDhLvnxs/DazWFxYAugs6rv5vhgWJkRCgrESg= codeberg.org/gruf/go-nowish v1.1.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= codeberg.org/gruf/go-pools v1.0.2 h1:B0X6yoCL9FVmnvyoizb1SYRwMYPWwEJBjPnBMM5ILos= @@ -76,8 +70,6 @@ codeberg.org/gruf/go-pools v1.0.2/go.mod h1:MjUV3H6IASyBeBPCyCr7wjPpSNu8E2N87LG4 codeberg.org/gruf/go-runners v1.1.1/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBsH4= codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= -codeberg.org/gruf/go-store v1.1.5 h1:fp28vzGD15OsAF51CCwi7woH+Y3vb0aMl4OFh9JSjA0= -codeberg.org/gruf/go-store v1.1.5/go.mod h1:Q6ev500ddKghDQ8KS4IstL/W9fptDKa2T9oeHP+tXsI= codeberg.org/gruf/go-store v1.2.2 h1:YJPzJpZv/D3t9hQC00/u76eQDScQw4++OWjfobnjHAA= codeberg.org/gruf/go-store v1.2.2/go.mod h1:Xjw1U098th0yXF2CCx6jThQ+9FIPWAX9OGjYslO+UtE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -154,21 +146,16 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= -github.com/dsoprea/go-exif v0.0.0-20210131231135-d154f10435cc/go.mod h1:lOaOt7+UEppOgyvRy749v3do836U/hw0YVJNjoyPaEs= -github.com/dsoprea/go-exif v0.0.0-20210625224831-a6301f85c82b h1:hoVHc4m/v8Al8mbWyvKJWr4Z37yM4QUSVh/NY6A5Sbc= -github.com/dsoprea/go-exif v0.0.0-20210625224831-a6301f85c82b/go.mod h1:lOaOt7+UEppOgyvRy749v3do836U/hw0YVJNjoyPaEs= github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E= -github.com/dsoprea/go-exif/v2 v2.0.0-20200604193436-ca8584a0e1c4/go.mod h1:9EXlPeHfblFFnwu5UOqmP2eoZfJyAZ2Ri/Vki33ajO0= -github.com/dsoprea/go-exif/v2 v2.0.0-20210625224831-a6301f85c82b h1:8lVRnnni9zebcpjkrEXrEyxFpRWG/oTpWc2Y3giKomE= -github.com/dsoprea/go-exif/v2 v2.0.0-20210625224831-a6301f85c82b/go.mod h1:oKrjk2kb3rAR5NbtSTLUMvMSbc+k8ZosI3MaVH47noc= github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8= -github.com/dsoprea/go-exif/v3 v3.0.0-20210512043655-120bcdb2a55e/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= +github.com/dsoprea/go-exif/v3 v3.0.0-20210428042052-dca55bf8ca15/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= +github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b h1:NgNuLvW/gAFKU30ULWW0gtkCt56JfB7FrZ2zyo0wT8I= +github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 h1:YDRiMEm32T60Kpm35YzOK9ZHgjsS1Qrid+XskNcsdp8= github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= -github.com/dsoprea/go-jpeg-image-structure v0.0.0-20210128210355-86b1014917f2/go.mod h1:ZoOP3yUG0HD1T4IUjIFsz/2OAB2yB4YX6NSm4K+uJRg= -github.com/dsoprea/go-jpeg-image-structure v0.0.0-20210512043942-b434301c6836 h1:OHRfKIVRz2XrhZ6A7fJKHLoKky1giN+VUgU2npF0BvE= -github.com/dsoprea/go-jpeg-image-structure v0.0.0-20210512043942-b434301c6836/go.mod h1:6+tQXZ+I62x13UZ+hemLVoZIuq/usVzvau7bqwUo9P0= +github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 h1:KGCiMMWxODEMmI3+9Ms04l73efoqFVNKKKPbVyOvKrU= +github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836/go.mod h1:WaARaUjQuSuDCDFAiU/GwzfxMTJBulfEhqEA2Tx6B4Y= github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA= github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg= @@ -176,13 +163,11 @@ github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3P github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E= github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d h1:dg6UMHa50VI01WuPWXPbNJpO8QSyvIF5T5n2IZiqX3A= github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E= -github.com/dsoprea/go-png-image-structure v0.0.0-20200807080309-a98d4e94ac82/go.mod h1:aDYQkL/5gfRNZkoxiLTSWU4Y8/gV/4MVsy/MU9uwTak= -github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d h1:8+qI8ant/vZkNSsbwSjIR6XJfWcDVTg/qx/3pRUUZNA= -github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d/go.mod h1:yTR3tKgyk20phAFg6IE9ulMA5NjEDD2wyx+okRFLVtw= -github.com/dsoprea/go-utility v0.0.0-20200512094054-1abbbc781176/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8= +github.com/dsoprea/go-png-image-structure/v2 v2.0.0-20210512210324-29b889a6093d h1:2zNIgrJTspLxUKoJGl0Ln24+hufPKSjP3cu4++5MeSE= +github.com/dsoprea/go-png-image-structure/v2 v2.0.0-20210512210324-29b889a6093d/go.mod h1:scnx0wQSM7UiCMK66dSdiPZvL2hl6iF5DvpZ7uT59MY= +github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf h1:/w4QxepU4AHh3AuO6/g8y/YIIHH5+aKP3Bj8sg5cqhU= github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8= -github.com/dsoprea/go-utility v0.0.0-20200717064901-2fccff4aa15e h1:ojqYA1mU6LuRm8XzrVOvyfb000y59cbUcu6Wt8sFSAs= -github.com/dsoprea/go-utility v0.0.0-20200717064901-2fccff4aa15e/go.mod h1:KVK+/Hul09ujXAGq+42UBgCTnXkiJZRnLYdURGjQUwo= +github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e h1:IxIbA7VbCNrwumIYjDoMOdf4KOSkMC6NJE4s8oRbE7E= github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -367,7 +352,6 @@ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/z github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -666,8 +650,8 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/superseriousbusiness/activity v1.0.1-0.20211113133524-56560b73ace8 h1:8Bwy6CSsT33/sF5FhjND4vr7jiJCaq4elNTAW4rUzVc= github.com/superseriousbusiness/activity v1.0.1-0.20211113133524-56560b73ace8/go.mod h1:ZY9xwFDucvp6zTvM6FQZGl8PSOofPBFIAy6gSc85XkY= -github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203 h1:1SWXcTphBQjYGWRRxLFIAR1LVtQEj4eR7xPtyeOVM/c= -github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203/go.mod h1:0Xw5cYMOYpgaWs+OOSx41ugycl2qvKTi9tlMMcZhFyY= +github.com/superseriousbusiness/exif-terminator v0.1.0 h1:ePzfV0vcw+tm/haSOGzKbBTKkHAvyQLbCzfsdVkb3hM= +github.com/superseriousbusiness/exif-terminator v0.1.0/go.mod h1:pmlOKzkFZWmqaucLAtrRbZG0R5F3dbrcLWOcd7gAOLI= github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB h1:PtW2w6budTvRV2J5QAoSvThTHBuvh8t/+BXIZFAaBSc= github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB/go.mod h1:uYC/W92oVRJ49Vh1GcvTqpeFqHi+Ovrl2sMllQWRAEo= github.com/tdewolff/minify/v2 v2.9.22 h1:PlmaAakaJHdMMdTTwjjsuSwIxKqWPTlvjTj6a/g/ILU= @@ -740,9 +724,11 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.1 h1:O+N0Y8Re2XAYjp0adlZDA2juyRguhMfPCgh8YIf7vyE= github.com/zeebo/blake3 v0.2.1/go.mod h1:TSQ0KjMH+pht+bRyvVooJ1rBpvvngSGaPISafq9MxJk= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= diff --git a/vendor/github.com/dsoprea/go-exif/.travis.yml b/vendor/github.com/dsoprea/go-exif/.travis.yml deleted file mode 100644 index 162896e303..0000000000 --- a/vendor/github.com/dsoprea/go-exif/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: go -go: - - master - - stable - - "1.14" - - "1.13" - - "1.12" -env: - - GO111MODULE=on -install: - - go get -t ./... -script: -# v1 - - go test -v . - - go test -v ./exif-read-tool -# v2 - - cd v2 - - go test -v ./... - - cd .. -# v3. Coverage reports comes from this. - - cd v3 - - go test -v ./... -coverprofile=coverage.txt -covermode=atomic -after_success: - - curl -s https://codecov.io/bash | bash diff --git a/vendor/github.com/dsoprea/go-exif/README.md b/vendor/github.com/dsoprea/go-exif/README.md deleted file mode 100644 index 972d58493a..0000000000 --- a/vendor/github.com/dsoprea/go-exif/README.md +++ /dev/null @@ -1,206 +0,0 @@ -[![Build Status](https://travis-ci.org/dsoprea/go-exif.svg?branch=master)](https://travis-ci.org/dsoprea/go-exif) -[![codecov](https://codecov.io/gh/dsoprea/go-exif/branch/master/graph/badge.svg)](https://codecov.io/gh/dsoprea/go-exif) -[![Go Report Card](https://goreportcard.com/badge/github.com/dsoprea/go-exif/v3)](https://goreportcard.com/report/github.com/dsoprea/go-exif/v3) -[![GoDoc](https://godoc.org/github.com/dsoprea/go-exif/v3?status.svg)](https://godoc.org/github.com/dsoprea/go-exif/v3) - -# Overview - -This package provides native Go functionality to parse an existing EXIF block, update an existing EXIF block, or add a new EXIF block. - - -# Getting - -To get the project and dependencies: - -``` -$ go get -t github.com/dsoprea/go-exif/v3 -``` - - -# Scope - -This project is concerned only with parsing and encoding raw EXIF data. It does -not understand specific file-formats. This package assumes you know how to -extract the raw EXIF data from a file, such as a JPEG, and, if you want to -update it, know how to write it back. File-specific formats are not the concern -of *go-exif*, though we provide -[exif.SearchAndExtractExif][search-and-extract-exif] and -[exif.SearchFileAndExtractExif][search-file-and-extract-exif] as brute-force -search mechanisms that will help you explore the EXIF information for newer -formats that you might not yet have any way to parse. - -That said, the author also provides the following projects to support the -efficient processing of the corresponding image formats: - -- [go-jpeg-image-structure](https://github.com/dsoprea/go-jpeg-image-structure) -- [go-png-image-structure](https://github.com/dsoprea/go-png-image-structure) -- [go-tiff-image-structure](https://github.com/dsoprea/go-tiff-image-structure) -- [go-heic-exif-extractor](https://github.com/dsoprea/go-heic-exif-extractor) - -See the [SetExif example in go-jpeg-image-structure][jpeg-set-exif] for -practical information on getting started with JPEG files. - - -# Usage - -The package provides a set of [working examples][examples] and is covered by -unit-tests. Please look to these for getting familiar with how to read and write -EXIF. - -Create an instance of the `Exif` type and call `Scan()` with a byte-slice, where -the first byte is the beginning of the raw EXIF data. You may pass a callback -that will be invoked for every tag or `nil` if you do not want one. If no -callback is given, you are effectively just validating the structure or parsing -of the image. - -Obviously, it is most efficient to properly parse the media file and then -provide the specific EXIF data to be parsed, but there is also a heuristic for -finding the EXIF data within the media blob, directly. This means that, at least -for testing or curiosity, **you do not have to parse or even understand the -format of image or audio file in order to find and decode the EXIF information -inside of it.** See the usage of the `SearchAndExtractExif` method in the -example. - -The library often refers to an IFD with an "IFD path" (e.g. IFD/Exif, -IFD/GPSInfo). A "fully-qualified" IFD-path is one that includes an index -describing which specific sibling IFD is being referred to if not the first one -(e.g. IFD1, the IFD where the thumbnail is expressed per the TIFF standard). - -There is an "IFD mapping" and a "tag index" that must be created and passed to -the library from the top. These contain all of the knowledge of the IFD -hierarchies and their tag-IDs (the IFD mapping) and the tags that they are -allowed to host (the tag index). There are convenience functions to load them -with the standard TIFF information, but you, alternatively, may choose -something totally different (to support parsing any kind of EXIF data that does -not follow or is not relevant to TIFF at all). - - -# Standards and Customization - -This project is configuration driven. By default, it has no knowledge of tags -and IDs until you load them prior to using (which is incorporated in the -examples). You are just as easily able to add additional custom IFDs and custom -tags for them. If desired, you could completely ignore the standard information -and load *totally* non-standard IFDs and tags. - -This would be useful for divergent implementations that add non-standard -information to images. It would also be useful if there is some need to just -store a flat list of tags in an image for simplified, proprietary usage. - - -# Reader Tool - -There is a runnable reading/dumping tool included: - -``` -$ go get github.com/dsoprea/go-exif/v3/command/exif-read-tool -$ exif-read-tool --filepath "" -``` - -Example output: - -``` -IFD-PATH=[IFD] ID=(0x010f) NAME=[Make] COUNT=(6) TYPE=[ASCII] VALUE=[Canon] -IFD-PATH=[IFD] ID=(0x0110) NAME=[Model] COUNT=(22) TYPE=[ASCII] VALUE=[Canon EOS 5D Mark III] -IFD-PATH=[IFD] ID=(0x0112) NAME=[Orientation] COUNT=(1) TYPE=[SHORT] VALUE=[1] -IFD-PATH=[IFD] ID=(0x011a) NAME=[XResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1] -IFD-PATH=[IFD] ID=(0x011b) NAME=[YResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1] -IFD-PATH=[IFD] ID=(0x0128) NAME=[ResolutionUnit] COUNT=(1) TYPE=[SHORT] VALUE=[2] -IFD-PATH=[IFD] ID=(0x0132) NAME=[DateTime] COUNT=(20) TYPE=[ASCII] VALUE=[2017:12:02 08:18:50] -... -``` - -You can also print the raw, parsed data as JSON: - -``` -$ exif-read-tool --filepath "" -json -``` - -Example output: - -``` -[ - { - "ifd_path": "IFD", - "fq_ifd_path": "IFD", - "ifd_index": 0, - "tag_id": 271, - "tag_name": "Make", - "tag_type_id": 2, - "tag_type_name": "ASCII", - "unit_count": 6, - "value": "Canon", - "value_string": "Canon" - }, - { - "ifd_path": "IFD", -... -``` - - -# Testing - -The traditional method: - -``` -$ go test github.com/dsoprea/go-exif/v3/... -``` - - -# Release Notes - -## v3 Release - -This release primarily introduces an interchangeable data-layer, where any -`io.ReadSeeker` can be used to read EXIF data rather than necessarily loading -the EXIF blob into memory first. - -Several backwards-incompatible clean-ups were also included in this release. See -[releases][releases] for more information. - -## v2 Release - -Features a heavily reflowed interface that makes usage much simpler. The -undefined-type tag-processing (which affects most photographic images) has also -been overhauled and streamlined. It is now complete and stable. Adoption is -strongly encouraged. - - -# *Contributing* - -EXIF has an excellently-documented structure but there are a lot of devices and -manufacturers out there. There are only so many files that we can personally -find to test against, and most of these are images that have been generated only -in the past few years. JPEG, being the largest implementor of EXIF, has been -around for even longer (but not much). Therefore, there is a lot of -compatibility to test for. - -**If you are able to help by running the included reader-tool against all of the -EXIF-compatible files you have, it would be deeply appreciated. This is mostly -going to be JPEG files (but not all variations). If you are able to test a large -number of files (thousands or millions) then please post an issue mentioning how -many files you have processed. If you had failures, then please share them and -try to support efforts to understand them.** - -If you are able to test 100K+ files, I will give you credit on the project. The -further back in time your images reach, the higher in the list your name/company -will go. - - -# Contributors/Testing - -Thank you to the following users for solving non-trivial issues, supporting the -project with solving edge-case problems in specific images, or otherwise -providing their non-trivial time or image corpus to test go-exif: - -- [philip-firstorder](https://github.com/philip-firstorder) (200K images) -- [matchstick](https://github.com/matchstick) (102K images) - -In addition to these, it has been tested on my own collection, north of 478K -images. - -[search-and-extract-exif]: https://godoc.org/github.com/dsoprea/go-exif/v3#SearchAndExtractExif -[search-file-and-extract-exif]: https://godoc.org/github.com/dsoprea/go-exif/v3#SearchFileAndExtractExif -[jpeg-set-exif]: https://godoc.org/github.com/dsoprea/go-jpeg-image-structure#example-SegmentList-SetExif -[examples]: https://godoc.org/github.com/dsoprea/go-exif/v3#pkg-examples -[releases]: https://github.com/dsoprea/go-exif/releases diff --git a/vendor/github.com/dsoprea/go-exif/error.go b/vendor/github.com/dsoprea/go-exif/error.go deleted file mode 100644 index 0e6e138cb6..0000000000 --- a/vendor/github.com/dsoprea/go-exif/error.go +++ /dev/null @@ -1,10 +0,0 @@ -package exif - -import ( - "errors" -) - -var ( - ErrTagNotFound = errors.New("tag not found") - ErrTagNotStandard = errors.New("tag not a standard tag") -) diff --git a/vendor/github.com/dsoprea/go-exif/exif.go b/vendor/github.com/dsoprea/go-exif/exif.go deleted file mode 100644 index 8d1b848f09..0000000000 --- a/vendor/github.com/dsoprea/go-exif/exif.go +++ /dev/null @@ -1,247 +0,0 @@ -package exif - -import ( - "bytes" - "errors" - "fmt" - "os" - - "encoding/binary" - "io/ioutil" - - "github.com/dsoprea/go-logging" -) - -const ( - // ExifAddressableAreaStart is the absolute offset in the file that all - // offsets are relative to. - ExifAddressableAreaStart = uint32(0x0) - - // ExifDefaultFirstIfdOffset is essentially the number of bytes in addition - // to `ExifAddressableAreaStart` that you have to move in order to escape - // the rest of the header and get to the earliest point where we can put - // stuff (which has to be the first IFD). This is the size of the header - // sequence containing the two-character byte-order, two-character fixed- - // bytes, and the four bytes describing the first-IFD offset. - ExifDefaultFirstIfdOffset = uint32(2 + 2 + 4) -) - -var ( - exifLogger = log.NewLogger("exif.exif") - - // EncodeDefaultByteOrder is the default byte-order for encoding operations. - EncodeDefaultByteOrder = binary.BigEndian - - // Default byte order for tests. - TestDefaultByteOrder = binary.BigEndian - - BigEndianBoBytes = [2]byte{'M', 'M'} - LittleEndianBoBytes = [2]byte{'I', 'I'} - - ByteOrderLookup = map[[2]byte]binary.ByteOrder{ - BigEndianBoBytes: binary.BigEndian, - LittleEndianBoBytes: binary.LittleEndian, - } - - ByteOrderLookupR = map[binary.ByteOrder][2]byte{ - binary.BigEndian: BigEndianBoBytes, - binary.LittleEndian: LittleEndianBoBytes, - } - - ExifFixedBytesLookup = map[binary.ByteOrder][2]byte{ - binary.LittleEndian: {0x2a, 0x00}, - binary.BigEndian: {0x00, 0x2a}, - } -) - -var ( - ErrNoExif = errors.New("no exif data") - ErrExifHeaderError = errors.New("exif header error") -) - -// SearchAndExtractExif returns a slice from the beginning of the EXIF data to -// end of the file (it's not practical to try and calculate where the data -// actually ends; it needs to be formally parsed). -func SearchAndExtractExif(data []byte) (rawExif []byte, err error) { - defer func() { - if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) - } - }() - - // Search for the beginning of the EXIF information. The EXIF is near the - // beginning of our/most JPEGs, so this has a very low cost. - - foundAt := -1 - for i := 0; i < len(data); i++ { - if _, err := ParseExifHeader(data[i:]); err == nil { - foundAt = i - break - } else if log.Is(err, ErrNoExif) == false { - return nil, err - } - } - - if foundAt == -1 { - return nil, ErrNoExif - } - - return data[foundAt:], nil -} - -// SearchFileAndExtractExif returns a slice from the beginning of the EXIF data -// to the end of the file (it's not practical to try and calculate where the -// data actually ends). -func SearchFileAndExtractExif(filepath string) (rawExif []byte, err error) { - defer func() { - if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) - } - }() - - // Open the file. - - f, err := os.Open(filepath) - log.PanicIf(err) - - defer f.Close() - - data, err := ioutil.ReadAll(f) - log.PanicIf(err) - - rawExif, err = SearchAndExtractExif(data) - log.PanicIf(err) - - return rawExif, nil -} - -type ExifHeader struct { - ByteOrder binary.ByteOrder - FirstIfdOffset uint32 -} - -func (eh ExifHeader) String() string { - return fmt.Sprintf("ExifHeader", eh.ByteOrder, eh.FirstIfdOffset) -} - -// ParseExifHeader parses the bytes at the very top of the header. -// -// This will panic with ErrNoExif on any data errors so that we can double as -// an EXIF-detection routine. -func ParseExifHeader(data []byte) (eh ExifHeader, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // Good reference: - // - // CIPA DC-008-2016; JEITA CP-3451D - // -> http://www.cipa.jp/std/documents/e/DC-008-Translation-2016-E.pdf - - if len(data) < 2 { - exifLogger.Warningf(nil, "Not enough data for EXIF header (1): (%d)", len(data)) - return eh, ErrNoExif - } - - byteOrderBytes := [2]byte{data[0], data[1]} - - byteOrder, found := ByteOrderLookup[byteOrderBytes] - if found == false { - // exifLogger.Warningf(nil, "EXIF byte-order not recognized: [%v]", byteOrderBytes) - return eh, ErrNoExif - } - - if len(data) < 4 { - exifLogger.Warningf(nil, "Not enough data for EXIF header (2): (%d)", len(data)) - return eh, ErrNoExif - } - - fixedBytes := [2]byte{data[2], data[3]} - expectedFixedBytes := ExifFixedBytesLookup[byteOrder] - if fixedBytes != expectedFixedBytes { - // exifLogger.Warningf(nil, "EXIF header fixed-bytes should be [%v] but are: [%v]", expectedFixedBytes, fixedBytes) - return eh, ErrNoExif - } - - if len(data) < 2 { - exifLogger.Warningf(nil, "Not enough data for EXIF header (3): (%d)", len(data)) - return eh, ErrNoExif - } - - firstIfdOffset := byteOrder.Uint32(data[4:8]) - - eh = ExifHeader{ - ByteOrder: byteOrder, - FirstIfdOffset: firstIfdOffset, - } - - return eh, nil -} - -// Visit recursively invokes a callback for every tag. -func Visit(rootIfdName string, ifdMapping *IfdMapping, tagIndex *TagIndex, exifData []byte, visitor RawTagVisitor) (eh ExifHeader, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - eh, err = ParseExifHeader(exifData) - log.PanicIf(err) - - ie := NewIfdEnumerate(ifdMapping, tagIndex, exifData, eh.ByteOrder) - - err = ie.Scan(rootIfdName, eh.FirstIfdOffset, visitor, true) - log.PanicIf(err) - - return eh, nil -} - -// Collect recursively builds a static structure of all IFDs and tags. -func Collect(ifdMapping *IfdMapping, tagIndex *TagIndex, exifData []byte) (eh ExifHeader, index IfdIndex, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - eh, err = ParseExifHeader(exifData) - log.PanicIf(err) - - ie := NewIfdEnumerate(ifdMapping, tagIndex, exifData, eh.ByteOrder) - - index, err = ie.Collect(eh.FirstIfdOffset, true) - log.PanicIf(err) - - return eh, index, nil -} - -// BuildExifHeader constructs the bytes that go in the very beginning. -func BuildExifHeader(byteOrder binary.ByteOrder, firstIfdOffset uint32) (headerBytes []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - b := new(bytes.Buffer) - - // This is the point in the data that all offsets are relative to. - boBytes := ByteOrderLookupR[byteOrder] - _, err = b.WriteString(string(boBytes[:])) - log.PanicIf(err) - - fixedBytes := ExifFixedBytesLookup[byteOrder] - - _, err = b.Write(fixedBytes[:]) - log.PanicIf(err) - - err = binary.Write(b, byteOrder, firstIfdOffset) - log.PanicIf(err) - - return b.Bytes(), nil -} diff --git a/vendor/github.com/dsoprea/go-exif/gps.go b/vendor/github.com/dsoprea/go-exif/gps.go deleted file mode 100644 index 7d74f22d34..0000000000 --- a/vendor/github.com/dsoprea/go-exif/gps.go +++ /dev/null @@ -1,56 +0,0 @@ -package exif - -import ( - "errors" - "fmt" - "time" - - "github.com/golang/geo/s2" -) - -var ( - ErrGpsCoordinatesNotValid = errors.New("GPS coordinates not valid") -) - -type GpsDegrees struct { - Orientation byte - Degrees, Minutes, Seconds float64 -} - -func (d GpsDegrees) String() string { - return fmt.Sprintf("Degrees", string([]byte{d.Orientation}), d.Degrees, d.Minutes, d.Seconds) -} - -func (d GpsDegrees) Decimal() float64 { - decimal := float64(d.Degrees) + float64(d.Minutes)/60.0 + float64(d.Seconds)/3600.0 - - if d.Orientation == 'S' || d.Orientation == 'W' { - return -decimal - } else { - return decimal - } -} - -type GpsInfo struct { - Latitude, Longitude GpsDegrees - Altitude int - Timestamp time.Time -} - -func (gi *GpsInfo) String() string { - return fmt.Sprintf("GpsInfo", gi.Latitude.Decimal(), gi.Longitude.Decimal(), gi.Altitude, gi.Timestamp) -} - -func (gi *GpsInfo) S2CellId() s2.CellID { - latitude := gi.Latitude.Decimal() - longitude := gi.Longitude.Decimal() - - ll := s2.LatLngFromDegrees(latitude, longitude) - cellId := s2.CellIDFromLatLng(ll) - - if cellId.IsValid() == false { - panic(ErrGpsCoordinatesNotValid) - } - - return cellId -} diff --git a/vendor/github.com/dsoprea/go-exif/ifd.go b/vendor/github.com/dsoprea/go-exif/ifd.go deleted file mode 100644 index e75404ddc6..0000000000 --- a/vendor/github.com/dsoprea/go-exif/ifd.go +++ /dev/null @@ -1,407 +0,0 @@ -package exif - -import ( - "errors" - "fmt" - "strings" - - "github.com/dsoprea/go-logging" -) - -const ( - // IFD names. The paths that we referred to the IFDs with are comprised of - // these. - - IfdStandard = "IFD" - IfdExif = "Exif" - IfdGps = "GPSInfo" - IfdIop = "Iop" - - // Tag IDs for child IFDs. - - IfdExifId = 0x8769 - IfdGpsId = 0x8825 - IfdIopId = 0xA005 - - // Just a placeholder. - - IfdRootId = 0x0000 - - // The paths of the standard IFDs expressed in the standard IFD-mappings - // and as the group-names in the tag data. - - IfdPathStandard = "IFD" - IfdPathStandardExif = "IFD/Exif" - IfdPathStandardExifIop = "IFD/Exif/Iop" - IfdPathStandardGps = "IFD/GPSInfo" -) - -var ( - ifdLogger = log.NewLogger("exif.ifd") -) - -var ( - ErrChildIfdNotMapped = errors.New("no child-IFD for that tag-ID under parent") -) - -// type IfdIdentity struct { -// ParentIfdName string -// IfdName string -// } - -// func (ii IfdIdentity) String() string { -// return fmt.Sprintf("IfdIdentity", ii.ParentIfdName, ii.IfdName) -// } - -type MappedIfd struct { - ParentTagId uint16 - Placement []uint16 - Path []string - - Name string - TagId uint16 - Children map[uint16]*MappedIfd -} - -func (mi *MappedIfd) String() string { - pathPhrase := mi.PathPhrase() - return fmt.Sprintf("MappedIfd<(0x%04X) [%s] PATH=[%s]>", mi.TagId, mi.Name, pathPhrase) -} - -func (mi *MappedIfd) PathPhrase() string { - return strings.Join(mi.Path, "/") -} - -// IfdMapping describes all of the IFDs that we currently recognize. -type IfdMapping struct { - rootNode *MappedIfd -} - -func NewIfdMapping() (ifdMapping *IfdMapping) { - rootNode := &MappedIfd{ - Path: make([]string, 0), - Children: make(map[uint16]*MappedIfd), - } - - return &IfdMapping{ - rootNode: rootNode, - } -} - -func NewIfdMappingWithStandard() (ifdMapping *IfdMapping) { - defer func() { - if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) - } - }() - - im := NewIfdMapping() - - err := LoadStandardIfds(im) - log.PanicIf(err) - - return im -} - -func (im *IfdMapping) Get(parentPlacement []uint16) (childIfd *MappedIfd, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ptr := im.rootNode - for _, tagId := range parentPlacement { - if descendantPtr, found := ptr.Children[tagId]; found == false { - log.Panicf("ifd child with tag-ID (%04x) not registered: [%s]", tagId, ptr.PathPhrase()) - } else { - ptr = descendantPtr - } - } - - return ptr, nil -} - -func (im *IfdMapping) GetWithPath(pathPhrase string) (mi *MappedIfd, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if pathPhrase == "" { - log.Panicf("path-phrase is empty") - } - - path := strings.Split(pathPhrase, "/") - ptr := im.rootNode - - for _, name := range path { - var hit *MappedIfd - for _, mi := range ptr.Children { - if mi.Name == name { - hit = mi - break - } - } - - if hit == nil { - log.Panicf("ifd child with name [%s] not registered: [%s]", name, ptr.PathPhrase()) - } - - ptr = hit - } - - return ptr, nil -} - -// GetChild is a convenience function to get the child path for a given parent -// placement and child tag-ID. -func (im *IfdMapping) GetChild(parentPathPhrase string, tagId uint16) (mi *MappedIfd, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - mi, err = im.GetWithPath(parentPathPhrase) - log.PanicIf(err) - - for _, childMi := range mi.Children { - if childMi.TagId == tagId { - return childMi, nil - } - } - - // Whether or not an IFD is defined in data, such an IFD is not registered - // and would be unknown. - log.Panic(ErrChildIfdNotMapped) - return nil, nil -} - -type IfdTagIdAndIndex struct { - Name string - TagId uint16 - Index int -} - -func (itii IfdTagIdAndIndex) String() string { - return fmt.Sprintf("IfdTagIdAndIndex", itii.Name, itii.TagId, itii.Index) -} - -// ResolvePath takes a list of names, which can also be suffixed with indices -// (to identify the second, third, etc.. sibling IFD) and returns a list of -// tag-IDs and those indices. -// -// Example: -// -// - IFD/Exif/Iop -// - IFD0/Exif/Iop -// -// This is the only call that supports adding the numeric indices. -func (im *IfdMapping) ResolvePath(pathPhrase string) (lineage []IfdTagIdAndIndex, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - pathPhrase = strings.TrimSpace(pathPhrase) - - if pathPhrase == "" { - log.Panicf("can not resolve empty path-phrase") - } - - path := strings.Split(pathPhrase, "/") - lineage = make([]IfdTagIdAndIndex, len(path)) - - ptr := im.rootNode - empty := IfdTagIdAndIndex{} - for i, name := range path { - indexByte := name[len(name)-1] - index := 0 - if indexByte >= '0' && indexByte <= '9' { - index = int(indexByte - '0') - name = name[:len(name)-1] - } - - itii := IfdTagIdAndIndex{} - for _, mi := range ptr.Children { - if mi.Name != name { - continue - } - - itii.Name = name - itii.TagId = mi.TagId - itii.Index = index - - ptr = mi - - break - } - - if itii == empty { - log.Panicf("ifd child with name [%s] not registered: [%s]", name, pathPhrase) - } - - lineage[i] = itii - } - - return lineage, nil -} - -func (im *IfdMapping) FqPathPhraseFromLineage(lineage []IfdTagIdAndIndex) (fqPathPhrase string) { - fqPathParts := make([]string, len(lineage)) - for i, itii := range lineage { - if itii.Index > 0 { - fqPathParts[i] = fmt.Sprintf("%s%d", itii.Name, itii.Index) - } else { - fqPathParts[i] = itii.Name - } - } - - return strings.Join(fqPathParts, "/") -} - -func (im *IfdMapping) PathPhraseFromLineage(lineage []IfdTagIdAndIndex) (pathPhrase string) { - pathParts := make([]string, len(lineage)) - for i, itii := range lineage { - pathParts[i] = itii.Name - } - - return strings.Join(pathParts, "/") -} - -// StripPathPhraseIndices returns a non-fully-qualified path-phrase (no -// indices). -func (im *IfdMapping) StripPathPhraseIndices(pathPhrase string) (strippedPathPhrase string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - lineage, err := im.ResolvePath(pathPhrase) - log.PanicIf(err) - - strippedPathPhrase = im.PathPhraseFromLineage(lineage) - return strippedPathPhrase, nil -} - -// Add puts the given IFD at the given position of the tree. The position of the -// tree is referred to as the placement and is represented by a set of tag-IDs, -// where the leftmost is the root tag and the tags going to the right are -// progressive descendants. -func (im *IfdMapping) Add(parentPlacement []uint16, tagId uint16, name string) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! It would be nicer to provide a list of names in the placement rather than tag-IDs. - - ptr, err := im.Get(parentPlacement) - log.PanicIf(err) - - path := make([]string, len(parentPlacement)+1) - if len(parentPlacement) > 0 { - copy(path, ptr.Path) - } - - path[len(path)-1] = name - - placement := make([]uint16, len(parentPlacement)+1) - if len(placement) > 0 { - copy(placement, ptr.Placement) - } - - placement[len(placement)-1] = tagId - - childIfd := &MappedIfd{ - ParentTagId: ptr.TagId, - Path: path, - Placement: placement, - Name: name, - TagId: tagId, - Children: make(map[uint16]*MappedIfd), - } - - if _, found := ptr.Children[tagId]; found == true { - log.Panicf("child IFD with tag-ID (%04x) already registered under IFD [%s] with tag-ID (%04x)", tagId, ptr.Name, ptr.TagId) - } - - ptr.Children[tagId] = childIfd - - return nil -} - -func (im *IfdMapping) dumpLineages(stack []*MappedIfd, input []string) (output []string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - currentIfd := stack[len(stack)-1] - - output = input - for _, childIfd := range currentIfd.Children { - stackCopy := make([]*MappedIfd, len(stack)+1) - - copy(stackCopy, stack) - stackCopy[len(stack)] = childIfd - - // Add to output, but don't include the obligatory root node. - parts := make([]string, len(stackCopy)-1) - for i, mi := range stackCopy[1:] { - parts[i] = mi.Name - } - - output = append(output, strings.Join(parts, "/")) - - output, err = im.dumpLineages(stackCopy, output) - log.PanicIf(err) - } - - return output, nil -} - -func (im *IfdMapping) DumpLineages() (output []string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - stack := []*MappedIfd{im.rootNode} - output = make([]string, 0) - - output, err = im.dumpLineages(stack, output) - log.PanicIf(err) - - return output, nil -} - -func LoadStandardIfds(im *IfdMapping) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = im.Add([]uint16{}, IfdRootId, IfdStandard) - log.PanicIf(err) - - err = im.Add([]uint16{IfdRootId}, IfdExifId, IfdExif) - log.PanicIf(err) - - err = im.Add([]uint16{IfdRootId, IfdExifId}, IfdIopId, IfdIop) - log.PanicIf(err) - - err = im.Add([]uint16{IfdRootId}, IfdGpsId, IfdGps) - log.PanicIf(err) - - return nil -} diff --git a/vendor/github.com/dsoprea/go-exif/ifd_builder.go b/vendor/github.com/dsoprea/go-exif/ifd_builder.go deleted file mode 100644 index 40ef4dc4f3..0000000000 --- a/vendor/github.com/dsoprea/go-exif/ifd_builder.go +++ /dev/null @@ -1,1265 +0,0 @@ -package exif - -// NOTES: -// -// The thumbnail offset and length tags shouldn't be set directly. Use the -// (*IfdBuilder).SetThumbnail() method instead. - -import ( - "errors" - "fmt" - "strings" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -var ( - ifdBuilderLogger = log.NewLogger("exif.ifd_builder") -) - -var ( - ErrTagEntryNotFound = errors.New("tag entry not found") - ErrChildIbNotFound = errors.New("child IB not found") -) - -type IfdBuilderTagValue struct { - valueBytes []byte - ib *IfdBuilder -} - -func (ibtv IfdBuilderTagValue) String() string { - if ibtv.IsBytes() == true { - var valuePhrase string - if len(ibtv.valueBytes) <= 8 { - valuePhrase = fmt.Sprintf("%v", ibtv.valueBytes) - } else { - valuePhrase = fmt.Sprintf("%v...", ibtv.valueBytes[:8]) - } - - return fmt.Sprintf("IfdBuilderTagValue", valuePhrase, len(ibtv.valueBytes)) - } else if ibtv.IsIb() == true { - return fmt.Sprintf("IfdBuilderTagValue", ibtv.ib) - } else { - log.Panicf("IBTV state undefined") - return "" - } -} - -func NewIfdBuilderTagValueFromBytes(valueBytes []byte) *IfdBuilderTagValue { - return &IfdBuilderTagValue{ - valueBytes: valueBytes, - } -} - -func NewIfdBuilderTagValueFromIfdBuilder(ib *IfdBuilder) *IfdBuilderTagValue { - return &IfdBuilderTagValue{ - ib: ib, - } -} - -// IsBytes returns true if the bytes are populated. This is always the case -// when we're loaded from a tag in an existing IFD. -func (ibtv IfdBuilderTagValue) IsBytes() bool { - return ibtv.valueBytes != nil -} - -func (ibtv IfdBuilderTagValue) Bytes() []byte { - if ibtv.IsBytes() == false { - log.Panicf("this tag is not a byte-slice value") - } else if ibtv.IsIb() == true { - log.Panicf("this tag is an IFD-builder value not a byte-slice") - } - - return ibtv.valueBytes -} - -func (ibtv IfdBuilderTagValue) IsIb() bool { - return ibtv.ib != nil -} - -func (ibtv IfdBuilderTagValue) Ib() *IfdBuilder { - if ibtv.IsIb() == false { - log.Panicf("this tag is not an IFD-builder value") - } else if ibtv.IsBytes() == true { - log.Panicf("this tag is a byte-slice, not a IFD-builder") - } - - return ibtv.ib -} - -type BuilderTag struct { - // ifdPath is the path of the IFD that hosts this tag. - ifdPath string - - tagId uint16 - typeId TagTypePrimitive - - // value is either a value that can be encoded, an IfdBuilder instance (for - // child IFDs), or an IfdTagEntry instance representing an existing, - // previously-stored tag. - value *IfdBuilderTagValue - - // byteOrder is the byte order. It's chiefly/originally here to support - // printing the value. - byteOrder binary.ByteOrder -} - -func NewBuilderTag(ifdPath string, tagId uint16, typeId TagTypePrimitive, value *IfdBuilderTagValue, byteOrder binary.ByteOrder) *BuilderTag { - return &BuilderTag{ - ifdPath: ifdPath, - tagId: tagId, - typeId: typeId, - value: value, - byteOrder: byteOrder, - } -} - -func NewChildIfdBuilderTag(ifdPath string, tagId uint16, value *IfdBuilderTagValue) *BuilderTag { - return &BuilderTag{ - ifdPath: ifdPath, - tagId: tagId, - typeId: TypeLong, - value: value, - } -} - -func (bt *BuilderTag) Value() (value *IfdBuilderTagValue) { - return bt.value -} - -func (bt *BuilderTag) String() string { - var valueString string - - if bt.value.IsBytes() == true { - var err error - - valueString, err = Format(bt.value.Bytes(), bt.typeId, false, bt.byteOrder) - log.PanicIf(err) - } else { - valueString = fmt.Sprintf("%v", bt.value) - } - - return fmt.Sprintf("BuilderTag", bt.ifdPath, bt.tagId, TypeNames[bt.typeId], valueString) -} - -func (bt *BuilderTag) SetValue(byteOrder binary.ByteOrder, value interface{}) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Add test. - - tt := NewTagType(bt.typeId, byteOrder) - ve := NewValueEncoder(byteOrder) - - var ed EncodedData - if bt.typeId == TypeUndefined { - var err error - - ed, err = EncodeUndefined(bt.ifdPath, bt.tagId, value) - log.PanicIf(err) - } else { - var err error - - ed, err = ve.EncodeWithType(tt, value) - log.PanicIf(err) - } - - bt.value = NewIfdBuilderTagValueFromBytes(ed.Encoded) - - return nil -} - -// NewStandardBuilderTag constructs a `BuilderTag` instance. The type is looked -// up. `ii` is the type of IFD that owns this tag. -func NewStandardBuilderTag(ifdPath string, it *IndexedTag, byteOrder binary.ByteOrder, value interface{}) *BuilderTag { - typeId := it.Type - tt := NewTagType(typeId, byteOrder) - - ve := NewValueEncoder(byteOrder) - - var ed EncodedData - if it.Type == TypeUndefined { - var err error - - ed, err = EncodeUndefined(ifdPath, it.Id, value) - log.PanicIf(err) - } else { - var err error - - ed, err = ve.EncodeWithType(tt, value) - log.PanicIf(err) - } - - tagValue := NewIfdBuilderTagValueFromBytes(ed.Encoded) - - return NewBuilderTag( - ifdPath, - it.Id, - typeId, - tagValue, - byteOrder) -} - -type IfdBuilder struct { - // ifdName is the name of the IFD represented by this instance. - name string - - // ifdPath is the path of the IFD represented by this instance. - ifdPath string - - // fqIfdPath is the fully-qualified path of the IFD represented by this - // instance. - fqIfdPath string - - // ifdTagId will be non-zero if we're a child IFD. - ifdTagId uint16 - - byteOrder binary.ByteOrder - - // Includes both normal tags and IFD tags (which point to child IFDs). - // TODO(dustin): Keep a separate list of children like with `Ifd`. - // TODO(dustin): Either rename this or `Entries` in `Ifd` to be the same thing. - tags []*BuilderTag - - // existingOffset will be the offset that this IFD is currently found at if - // it represents an IFD that has previously been stored (or 0 if not). - existingOffset uint32 - - // nextIb represents the next link if we're chaining to another. - nextIb *IfdBuilder - - // thumbnailData is populated with thumbnail data if there was thumbnail - // data. Otherwise, it's nil. - thumbnailData []byte - - ifdMapping *IfdMapping - tagIndex *TagIndex -} - -func NewIfdBuilder(ifdMapping *IfdMapping, tagIndex *TagIndex, fqIfdPath string, byteOrder binary.ByteOrder) (ib *IfdBuilder) { - ifdPath, err := ifdMapping.StripPathPhraseIndices(fqIfdPath) - log.PanicIf(err) - - var ifdTagId uint16 - - mi, err := ifdMapping.GetWithPath(ifdPath) - if err == nil { - ifdTagId = mi.TagId - } else if log.Is(err, ErrChildIfdNotMapped) == false { - log.Panic(err) - } - - ib = &IfdBuilder{ - // The right-most part of the IFD-path. - name: mi.Name, - - // ifdPath describes the current IFD placement within the IFD tree. - ifdPath: ifdPath, - - // fqIfdPath describes the current IFD placement within the IFD tree as - // well as being qualified with non-zero indices. - fqIfdPath: fqIfdPath, - - // ifdTagId is empty unless it's a child-IFD. - ifdTagId: ifdTagId, - - byteOrder: byteOrder, - tags: make([]*BuilderTag, 0), - - ifdMapping: ifdMapping, - tagIndex: tagIndex, - } - - return ib -} - -// NewIfdBuilderWithExistingIfd creates a new IB using the same header type -// information as the given IFD. -func NewIfdBuilderWithExistingIfd(ifd *Ifd) (ib *IfdBuilder) { - name := ifd.Name - ifdPath := ifd.IfdPath - fqIfdPath := ifd.FqIfdPath - - var ifdTagId uint16 - - // There is no tag-ID for the root IFD. It will never be a child IFD. - if ifdPath != IfdPathStandard { - mi, err := ifd.ifdMapping.GetWithPath(ifdPath) - log.PanicIf(err) - - ifdTagId = mi.TagId - } - - ib = &IfdBuilder{ - name: name, - ifdPath: ifdPath, - fqIfdPath: fqIfdPath, - ifdTagId: ifdTagId, - byteOrder: ifd.ByteOrder, - existingOffset: ifd.Offset, - ifdMapping: ifd.ifdMapping, - tagIndex: ifd.tagIndex, - } - - return ib -} - -// NewIfdBuilderFromExistingChain creates a chain of IB instances from an -// IFD chain generated from real data. -func NewIfdBuilderFromExistingChain(rootIfd *Ifd, itevr *IfdTagEntryValueResolver) (firstIb *IfdBuilder) { - // OBSOLETE(dustin): Support for `itevr` is now obsolete. This parameter will be removed in the future. - - var lastIb *IfdBuilder - i := 0 - for thisExistingIfd := rootIfd; thisExistingIfd != nil; thisExistingIfd = thisExistingIfd.NextIfd { - newIb := NewIfdBuilder(rootIfd.ifdMapping, rootIfd.tagIndex, rootIfd.FqIfdPath, thisExistingIfd.ByteOrder) - if firstIb == nil { - firstIb = newIb - } else { - lastIb.SetNextIb(newIb) - } - - err := newIb.AddTagsFromExisting(thisExistingIfd, nil, nil, nil) - log.PanicIf(err) - - lastIb = newIb - i++ - } - - return firstIb -} - -func (ib *IfdBuilder) NextIb() (nextIb *IfdBuilder, err error) { - return ib.nextIb, nil -} - -func (ib *IfdBuilder) ChildWithTagId(childIfdTagId uint16) (childIb *IfdBuilder, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - for _, bt := range ib.tags { - if bt.value.IsIb() == false { - continue - } - - childIbThis := bt.value.Ib() - - if childIbThis.ifdTagId == childIfdTagId { - return childIbThis, nil - } - } - - log.Panic(ErrChildIbNotFound) - - // Never reached. - return nil, nil -} - -func getOrCreateIbFromRootIbInner(rootIb *IfdBuilder, parentIb *IfdBuilder, currentLineage []IfdTagIdAndIndex) (ib *IfdBuilder, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Add test. - - thisIb := rootIb - - // Since we're calling ourselves recursively with incrementally different - // paths, the FQ IFD-path of the parent that called us needs to be passed - // in, in order for us to know it. - var parentLineage []IfdTagIdAndIndex - if parentIb != nil { - var err error - - parentLineage, err = thisIb.ifdMapping.ResolvePath(parentIb.fqIfdPath) - log.PanicIf(err) - } - - // Process the current path part. - currentItii := currentLineage[0] - - // Make sure the leftmost part of the FQ IFD-path agrees with the IB we - // were given. - - expectedFqRootIfdPath := "" - if parentLineage != nil { - expectedLineage := append(parentLineage, currentItii) - expectedFqRootIfdPath = thisIb.ifdMapping.PathPhraseFromLineage(expectedLineage) - } else { - expectedFqRootIfdPath = thisIb.ifdMapping.PathPhraseFromLineage(currentLineage[:1]) - } - - if expectedFqRootIfdPath != thisIb.fqIfdPath { - log.Panicf("the FQ IFD-path [%s] we were given does not match the builder's FQ IFD-path [%s]", expectedFqRootIfdPath, thisIb.fqIfdPath) - } - - // If we actually wanted a sibling (currentItii.Index > 0) then seek to it, - // appending new siblings, as required, until we get there. - for i := 0; i < currentItii.Index; i++ { - if thisIb.nextIb == nil { - // Generate an FQ IFD-path for the sibling. It'll use the same - // non-FQ IFD-path as the current IB. - - siblingFqIfdPath := "" - if parentLineage != nil { - siblingFqIfdPath = fmt.Sprintf("%s/%s%d", parentIb.fqIfdPath, currentItii.Name, i+1) - } else { - siblingFqIfdPath = fmt.Sprintf("%s%d", currentItii.Name, i+1) - } - - thisIb.nextIb = NewIfdBuilder(thisIb.ifdMapping, thisIb.tagIndex, siblingFqIfdPath, thisIb.byteOrder) - } - - thisIb = thisIb.nextIb - } - - // There is no child IFD to process. We're done. - if len(currentLineage) == 1 { - return thisIb, nil - } - - // Establish the next child to be processed. - - childItii := currentLineage[1] - - var foundChild *IfdBuilder - for _, bt := range thisIb.tags { - if bt.value.IsIb() == false { - continue - } - - childIb := bt.value.Ib() - - if childIb.ifdTagId == childItii.TagId { - foundChild = childIb - break - } - } - - // If we didn't find the child, add it. - if foundChild == nil { - thisIbLineage, err := thisIb.ifdMapping.ResolvePath(thisIb.fqIfdPath) - log.PanicIf(err) - - childLineage := make([]IfdTagIdAndIndex, len(thisIbLineage)+1) - copy(childLineage, thisIbLineage) - - childLineage[len(childLineage)-1] = childItii - - fqIfdChildPath := thisIb.ifdMapping.FqPathPhraseFromLineage(childLineage) - - foundChild = NewIfdBuilder(thisIb.ifdMapping, thisIb.tagIndex, fqIfdChildPath, thisIb.byteOrder) - - err = thisIb.AddChildIb(foundChild) - log.PanicIf(err) - } - - finalIb, err := getOrCreateIbFromRootIbInner(foundChild, thisIb, currentLineage[1:]) - log.PanicIf(err) - - return finalIb, nil -} - -// GetOrCreateIbFromRootIb returns an IB representing the requested IFD, even if -// an IB doesn't already exist for it. This function may call itself -// recursively. -func GetOrCreateIbFromRootIb(rootIb *IfdBuilder, fqIfdPath string) (ib *IfdBuilder, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // lineage is a necessity of our recursion process. It doesn't include any - // parent IFDs on its left-side; it starts with the current IB only. - lineage, err := rootIb.ifdMapping.ResolvePath(fqIfdPath) - log.PanicIf(err) - - ib, err = getOrCreateIbFromRootIbInner(rootIb, nil, lineage) - log.PanicIf(err) - - return ib, nil -} - -func (ib *IfdBuilder) String() string { - nextIfdPhrase := "" - if ib.nextIb != nil { - // TODO(dustin): We were setting this to ii.String(), but we were getting hex-data when printing this after building from an existing chain. - nextIfdPhrase = ib.nextIb.ifdPath - } - - return fmt.Sprintf("IfdBuilder", ib.ifdPath, ib.ifdTagId, len(ib.tags), ib.existingOffset, nextIfdPhrase) -} - -func (ib *IfdBuilder) Tags() (tags []*BuilderTag) { - return ib.tags -} - -// SetThumbnail sets thumbnail data. -// -// NOTES: -// -// - We don't manage any facet of the thumbnail data. This is the -// responsibility of the user/developer. -// - This method will fail unless the thumbnail is set on a the root IFD. -// However, in order to be valid, it must be set on the second one, linked to -// by the first, as per the EXIF/TIFF specification. -// - We set the offset to (0) now but will allocate the data and properly assign -// the offset when the IB is encoded (later). -func (ib *IfdBuilder) SetThumbnail(data []byte) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if ib.ifdPath != IfdPathStandard { - log.Panicf("thumbnails can only go into a root Ifd (and only the second one)") - } - - // TODO(dustin): !! Add a test for this function. - - if data == nil || len(data) == 0 { - log.Panic("thumbnail is empty") - } - - ib.thumbnailData = data - - ibtvfb := NewIfdBuilderTagValueFromBytes(ib.thumbnailData) - offsetBt := - NewBuilderTag( - ib.ifdPath, - ThumbnailOffsetTagId, - TypeLong, - ibtvfb, - ib.byteOrder) - - err = ib.Set(offsetBt) - log.PanicIf(err) - - thumbnailSizeIt, err := ib.tagIndex.Get(ib.ifdPath, ThumbnailSizeTagId) - log.PanicIf(err) - - sizeBt := NewStandardBuilderTag(ib.ifdPath, thumbnailSizeIt, ib.byteOrder, []uint32{uint32(len(ib.thumbnailData))}) - - err = ib.Set(sizeBt) - log.PanicIf(err) - - return nil -} - -func (ib *IfdBuilder) Thumbnail() []byte { - return ib.thumbnailData -} - -func (ib *IfdBuilder) printTagTree(levels int) { - indent := strings.Repeat(" ", levels*2) - - i := 0 - for currentIb := ib; currentIb != nil; currentIb = currentIb.nextIb { - prefix := " " - if i > 0 { - prefix = ">" - } - - if levels == 0 { - fmt.Printf("%s%sIFD: %s INDEX=(%d)\n", indent, prefix, currentIb, i) - } else { - fmt.Printf("%s%sChild IFD: %s\n", indent, prefix, currentIb) - } - - if len(currentIb.tags) > 0 { - fmt.Printf("\n") - - for i, tag := range currentIb.tags { - isChildIb := false - _, err := ib.ifdMapping.GetChild(currentIb.ifdPath, tag.tagId) - if err == nil { - isChildIb = true - } else if log.Is(err, ErrChildIfdNotMapped) == false { - log.Panic(err) - } - - tagName := "" - - // If a normal tag (not a child IFD) get the name. - if isChildIb == true { - tagName = "" - } else { - it, err := ib.tagIndex.Get(tag.ifdPath, tag.tagId) - if log.Is(err, ErrTagNotFound) == true { - tagName = "" - } else if err != nil { - log.Panic(err) - } else { - tagName = it.Name - } - } - - value := tag.Value() - - if value.IsIb() == true { - fmt.Printf("%s (%d): [%s] %s\n", indent, i, tagName, value.Ib()) - } else { - fmt.Printf("%s (%d): [%s] %s\n", indent, i, tagName, tag) - } - - if isChildIb == true { - if tag.value.IsIb() == false { - log.Panicf("tag-ID (0x%04x) is an IFD but the tag value is not an IB instance: %v", tag.tagId, tag) - } - - fmt.Printf("\n") - - childIb := tag.value.Ib() - childIb.printTagTree(levels + 1) - } - } - - fmt.Printf("\n") - } - - i++ - } -} - -func (ib *IfdBuilder) PrintTagTree() { - ib.printTagTree(0) -} - -func (ib *IfdBuilder) printIfdTree(levels int) { - indent := strings.Repeat(" ", levels*2) - - i := 0 - for currentIb := ib; currentIb != nil; currentIb = currentIb.nextIb { - prefix := " " - if i > 0 { - prefix = ">" - } - - fmt.Printf("%s%s%s\n", indent, prefix, currentIb) - - if len(currentIb.tags) > 0 { - for _, tag := range currentIb.tags { - isChildIb := false - _, err := ib.ifdMapping.GetChild(currentIb.ifdPath, tag.tagId) - if err == nil { - isChildIb = true - } else if log.Is(err, ErrChildIfdNotMapped) == false { - log.Panic(err) - } - - if isChildIb == true { - if tag.value.IsIb() == false { - log.Panicf("tag-ID (0x%04x) is an IFD but the tag value is not an IB instance: %v", tag.tagId, tag) - } - - childIb := tag.value.Ib() - childIb.printIfdTree(levels + 1) - } - } - } - - i++ - } -} - -func (ib *IfdBuilder) PrintIfdTree() { - ib.printIfdTree(0) -} - -func (ib *IfdBuilder) dumpToStrings(thisIb *IfdBuilder, prefix string, tagId uint16, lines []string) (linesOutput []string) { - if lines == nil { - linesOutput = make([]string, 0) - } else { - linesOutput = lines - } - - siblingIfdIndex := 0 - for ; thisIb != nil; thisIb = thisIb.nextIb { - line := fmt.Sprintf("IFD", prefix, thisIb.fqIfdPath, siblingIfdIndex, thisIb.ifdTagId, tagId) - linesOutput = append(linesOutput, line) - - for i, tag := range thisIb.tags { - var childIb *IfdBuilder - childIfdName := "" - if tag.value.IsIb() == true { - childIb = tag.value.Ib() - childIfdName = childIb.ifdPath - } - - line := fmt.Sprintf("TAG", prefix, thisIb.fqIfdPath, thisIb.ifdTagId, childIfdName, i, tag.tagId) - linesOutput = append(linesOutput, line) - - if childIb == nil { - continue - } - - childPrefix := "" - if prefix == "" { - childPrefix = fmt.Sprintf("%s", thisIb.ifdPath) - } else { - childPrefix = fmt.Sprintf("%s->%s", prefix, thisIb.ifdPath) - } - - linesOutput = thisIb.dumpToStrings(childIb, childPrefix, tag.tagId, linesOutput) - } - - siblingIfdIndex++ - } - - return linesOutput -} - -func (ib *IfdBuilder) DumpToStrings() (lines []string) { - return ib.dumpToStrings(ib, "", 0, lines) -} - -func (ib *IfdBuilder) SetNextIb(nextIb *IfdBuilder) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ib.nextIb = nextIb - - return nil -} - -func (ib *IfdBuilder) DeleteN(tagId uint16, n int) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if n < 1 { - log.Panicf("N must be at least 1: (%d)", n) - } - - for n > 0 { - j := -1 - for i, bt := range ib.tags { - if bt.tagId == tagId { - j = i - break - } - } - - if j == -1 { - log.Panic(ErrTagEntryNotFound) - } - - ib.tags = append(ib.tags[:j], ib.tags[j+1:]...) - n-- - } - - return nil -} - -func (ib *IfdBuilder) DeleteFirst(tagId uint16) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = ib.DeleteN(tagId, 1) - log.PanicIf(err) - - return nil -} - -func (ib *IfdBuilder) DeleteAll(tagId uint16) (n int, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - for { - err = ib.DeleteN(tagId, 1) - if log.Is(err, ErrTagEntryNotFound) == true { - break - } else if err != nil { - log.Panic(err) - } - - n++ - } - - return n, nil -} - -func (ib *IfdBuilder) ReplaceAt(position int, bt *BuilderTag) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if position < 0 { - log.Panicf("replacement position must be 0 or greater") - } else if position >= len(ib.tags) { - log.Panicf("replacement position does not exist") - } - - ib.tags[position] = bt - - return nil -} - -func (ib *IfdBuilder) Replace(tagId uint16, bt *BuilderTag) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - position, err := ib.Find(tagId) - log.PanicIf(err) - - ib.tags[position] = bt - - return nil -} - -// Set will add a new entry or update an existing entry. -func (ib *IfdBuilder) Set(bt *BuilderTag) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - position, err := ib.Find(bt.tagId) - if err == nil { - ib.tags[position] = bt - } else if log.Is(err, ErrTagEntryNotFound) == true { - err = ib.add(bt) - log.PanicIf(err) - } else { - log.Panic(err) - } - - return nil -} - -func (ib *IfdBuilder) FindN(tagId uint16, maxFound int) (found []int, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - found = make([]int, 0) - - for i, bt := range ib.tags { - if bt.tagId == tagId { - found = append(found, i) - if maxFound == 0 || len(found) >= maxFound { - break - } - } - } - - return found, nil -} - -func (ib *IfdBuilder) Find(tagId uint16) (position int, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - found, err := ib.FindN(tagId, 1) - log.PanicIf(err) - - if len(found) == 0 { - log.Panic(ErrTagEntryNotFound) - } - - return found[0], nil -} - -func (ib *IfdBuilder) FindTag(tagId uint16) (bt *BuilderTag, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - found, err := ib.FindN(tagId, 1) - log.PanicIf(err) - - if len(found) == 0 { - log.Panic(ErrTagEntryNotFound) - } - - position := found[0] - - return ib.tags[position], nil -} - -func (ib *IfdBuilder) FindTagWithName(tagName string) (bt *BuilderTag, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - it, err := ib.tagIndex.GetWithName(ib.ifdPath, tagName) - log.PanicIf(err) - - found, err := ib.FindN(it.Id, 1) - log.PanicIf(err) - - if len(found) == 0 { - log.Panic(ErrTagEntryNotFound) - } - - position := found[0] - - return ib.tags[position], nil -} - -func (ib *IfdBuilder) add(bt *BuilderTag) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if bt.ifdPath == "" { - log.Panicf("BuilderTag ifdPath is not set: %s", bt) - } else if bt.typeId == 0x0 { - log.Panicf("BuilderTag type-ID is not set: %s", bt) - } else if bt.value == nil { - log.Panicf("BuilderTag value is not set: %s", bt) - } - - ib.tags = append(ib.tags, bt) - return nil -} - -func (ib *IfdBuilder) Add(bt *BuilderTag) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if bt.value.IsIb() == true { - log.Panicf("child IfdBuilders must be added via AddChildIb() or AddTagsFromExisting(), not Add()") - } - - err = ib.add(bt) - log.PanicIf(err) - - return nil -} - -// AddChildIb adds a tag that branches to a new IFD. -func (ib *IfdBuilder) AddChildIb(childIb *IfdBuilder) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if childIb.ifdTagId == 0 { - log.Panicf("IFD can not be used as a child IFD (not associated with a tag-ID): %v", childIb) - } else if childIb.byteOrder != ib.byteOrder { - log.Panicf("Child IFD does not have the same byte-order: [%s] != [%s]", childIb.byteOrder, ib.byteOrder) - } - - // Since no standard IFDs supports occuring more than once, check that a - // tag of this type has not been previously added. Note that we just search - // the current IFD and *not every* IFD. - for _, bt := range childIb.tags { - if bt.tagId == childIb.ifdTagId { - log.Panicf("child-IFD already added: %v", childIb.ifdPath) - } - } - - bt := ib.NewBuilderTagFromBuilder(childIb) - ib.tags = append(ib.tags, bt) - - return nil -} - -func (ib *IfdBuilder) NewBuilderTagFromBuilder(childIb *IfdBuilder) (bt *BuilderTag) { - defer func() { - if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) - } - }() - - value := NewIfdBuilderTagValueFromIfdBuilder(childIb) - - bt = NewChildIfdBuilderTag( - ib.ifdPath, - childIb.ifdTagId, - value) - - return bt -} - -// AddTagsFromExisting does a verbatim copy of the entries in `ifd` to this -// builder. It excludes child IFDs. These must be added explicitly via -// `AddChildIb()`. -func (ib *IfdBuilder) AddTagsFromExisting(ifd *Ifd, itevr *IfdTagEntryValueResolver, includeTagIds []uint16, excludeTagIds []uint16) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // OBSOLETE(dustin): Support for `itevr` is now obsolete. This parameter will be removed in the future. - - thumbnailData, err := ifd.Thumbnail() - if err == nil { - err = ib.SetThumbnail(thumbnailData) - log.PanicIf(err) - } else if log.Is(err, ErrNoThumbnail) == false { - log.Panic(err) - } - - for i, ite := range ifd.Entries { - if ite.TagId == ThumbnailOffsetTagId || ite.TagId == ThumbnailSizeTagId { - // These will be added on-the-fly when we encode. - continue - } - - if excludeTagIds != nil && len(excludeTagIds) > 0 { - found := false - for _, excludedTagId := range excludeTagIds { - if excludedTagId == ite.TagId { - found = true - } - } - - if found == true { - continue - } - } - - if includeTagIds != nil && len(includeTagIds) > 0 { - // Whether or not there was a list of excludes, if there is a list - // of includes than the current tag has to be in it. - - found := false - for _, includedTagId := range includeTagIds { - if includedTagId == ite.TagId { - found = true - break - } - } - - if found == false { - continue - } - } - - var bt *BuilderTag - - if ite.ChildIfdPath != "" { - // If we want to add an IFD tag, we'll have to build it first and - // *then* add it via a different method. - - // Figure out which of the child-IFDs that are associated with - // this IFD represents this specific child IFD. - - var childIfd *Ifd - for _, thisChildIfd := range ifd.Children { - if thisChildIfd.ParentTagIndex != i { - continue - } else if thisChildIfd.TagId != 0xffff && thisChildIfd.TagId != ite.TagId { - log.Panicf("child-IFD tag is not correct: TAG-POSITION=(%d) ITE=%s CHILD-IFD=%s", thisChildIfd.ParentTagIndex, ite, thisChildIfd) - } - - childIfd = thisChildIfd - break - } - - if childIfd == nil { - childTagIds := make([]string, len(ifd.Children)) - for j, childIfd := range ifd.Children { - childTagIds[j] = fmt.Sprintf("0x%04x (parent tag-position %d)", childIfd.TagId, childIfd.ParentTagIndex) - } - - log.Panicf("could not find child IFD for child ITE: IFD-PATH=[%s] TAG-ID=(0x%04x) CURRENT-TAG-POSITION=(%d) CHILDREN=%v", ite.IfdPath, ite.TagId, i, childTagIds) - } - - childIb := NewIfdBuilderFromExistingChain(childIfd, nil) - bt = ib.NewBuilderTagFromBuilder(childIb) - } else { - // Non-IFD tag. - - valueContext := ifd.GetValueContext(ite) - - var rawBytes []byte - - if ite.TagType == TypeUndefined { - // It's an undefined-type value. Try to process, or skip if - // we don't know how to. - - undefinedInterface, err := valueContext.Undefined() - if err != nil { - if err == ErrUnhandledUnknownTypedTag { - // It's an undefined-type tag that we don't handle. If - // we don't know how to handle it, we can't know how - // many bytes it is and we must skip it. - continue - } - - log.Panic(err) - } - - undefined, ok := undefinedInterface.(UnknownTagValue) - if ok != true { - log.Panicf("unexpected value returned from undefined-value processor") - } - - rawBytes, err = undefined.ValueBytes() - log.PanicIf(err) - } else { - // It's a value with a standard type. - - var err error - - rawBytes, err = valueContext.readRawEncoded() - log.PanicIf(err) - } - - value := NewIfdBuilderTagValueFromBytes(rawBytes) - - bt = NewBuilderTag( - ifd.IfdPath, - ite.TagId, - ite.TagType, - value, - ib.byteOrder) - } - - err := ib.add(bt) - log.PanicIf(err) - } - - return nil -} - -// AddStandard quickly and easily composes and adds the tag using the -// information already known about a tag. Only works with standard tags. -func (ib *IfdBuilder) AddStandard(tagId uint16, value interface{}) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - it, err := ib.tagIndex.Get(ib.ifdPath, tagId) - log.PanicIf(err) - - bt := NewStandardBuilderTag(ib.ifdPath, it, ib.byteOrder, value) - - err = ib.add(bt) - log.PanicIf(err) - - return nil -} - -// AddStandardWithName quickly and easily composes and adds the tag using the -// information already known about a tag (using the name). Only works with -// standard tags. -func (ib *IfdBuilder) AddStandardWithName(tagName string, value interface{}) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - it, err := ib.tagIndex.GetWithName(ib.ifdPath, tagName) - log.PanicIf(err) - - bt := NewStandardBuilderTag(ib.ifdPath, it, ib.byteOrder, value) - - err = ib.add(bt) - log.PanicIf(err) - - return nil -} - -// SetStandard quickly and easily composes and adds or replaces the tag using -// the information already known about a tag. Only works with standard tags. -func (ib *IfdBuilder) SetStandard(tagId uint16, value interface{}) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Add test for this function. - - it, err := ib.tagIndex.Get(ib.ifdPath, tagId) - log.PanicIf(err) - - bt := NewStandardBuilderTag(ib.ifdPath, it, ib.byteOrder, value) - - i, err := ib.Find(tagId) - if err != nil { - if log.Is(err, ErrTagEntryNotFound) == false { - log.Panic(err) - } - - ib.tags = append(ib.tags, bt) - } else { - ib.tags[i] = bt - } - - return nil -} - -// SetStandardWithName quickly and easily composes and adds or replaces the -// tag using the information already known about a tag (using the name). Only -// works with standard tags. -func (ib *IfdBuilder) SetStandardWithName(tagName string, value interface{}) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Add test for this function. - - it, err := ib.tagIndex.GetWithName(ib.ifdPath, tagName) - log.PanicIf(err) - - bt := NewStandardBuilderTag(ib.ifdPath, it, ib.byteOrder, value) - - i, err := ib.Find(bt.tagId) - if err != nil { - if log.Is(err, ErrTagEntryNotFound) == false { - log.Panic(err) - } - - ib.tags = append(ib.tags, bt) - } else { - ib.tags[i] = bt - } - - return nil -} diff --git a/vendor/github.com/dsoprea/go-exif/ifd_builder_encode.go b/vendor/github.com/dsoprea/go-exif/ifd_builder_encode.go deleted file mode 100644 index 90fb2ddbfa..0000000000 --- a/vendor/github.com/dsoprea/go-exif/ifd_builder_encode.go +++ /dev/null @@ -1,530 +0,0 @@ -package exif - -import ( - "bytes" - "fmt" - "strings" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -const ( - // Tag-ID + Tag-Type + Unit-Count + Value/Offset. - IfdTagEntrySize = uint32(2 + 2 + 4 + 4) -) - -type ByteWriter struct { - b *bytes.Buffer - byteOrder binary.ByteOrder -} - -func NewByteWriter(b *bytes.Buffer, byteOrder binary.ByteOrder) (bw *ByteWriter) { - return &ByteWriter{ - b: b, - byteOrder: byteOrder, - } -} - -func (bw ByteWriter) writeAsBytes(value interface{}) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = binary.Write(bw.b, bw.byteOrder, value) - log.PanicIf(err) - - return nil -} - -func (bw ByteWriter) WriteUint32(value uint32) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = bw.writeAsBytes(value) - log.PanicIf(err) - - return nil -} - -func (bw ByteWriter) WriteUint16(value uint16) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = bw.writeAsBytes(value) - log.PanicIf(err) - - return nil -} - -func (bw ByteWriter) WriteFourBytes(value []byte) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - len_ := len(value) - if len_ != 4 { - log.Panicf("value is not four-bytes: (%d)", len_) - } - - _, err = bw.b.Write(value) - log.PanicIf(err) - - return nil -} - -// ifdOffsetIterator keeps track of where the next IFD should be written by -// keeping track of where the offsets start, the data that has been added, and -// bumping the offset *when* the data is added. -type ifdDataAllocator struct { - offset uint32 - b bytes.Buffer -} - -func newIfdDataAllocator(ifdDataAddressableOffset uint32) *ifdDataAllocator { - return &ifdDataAllocator{ - offset: ifdDataAddressableOffset, - } -} - -func (ida *ifdDataAllocator) Allocate(value []byte) (offset uint32, err error) { - _, err = ida.b.Write(value) - log.PanicIf(err) - - offset = ida.offset - ida.offset += uint32(len(value)) - - return offset, nil -} - -func (ida *ifdDataAllocator) NextOffset() uint32 { - return ida.offset -} - -func (ida *ifdDataAllocator) Bytes() []byte { - return ida.b.Bytes() -} - -// IfdByteEncoder converts an IB to raw bytes (for writing) while also figuring -// out all of the allocations and indirection that is required for extended -// data. -type IfdByteEncoder struct { - // journal holds a list of actions taken while encoding. - journal [][3]string -} - -func NewIfdByteEncoder() (ibe *IfdByteEncoder) { - return &IfdByteEncoder{ - journal: make([][3]string, 0), - } -} - -func (ibe *IfdByteEncoder) Journal() [][3]string { - return ibe.journal -} - -func (ibe *IfdByteEncoder) TableSize(entryCount int) uint32 { - // Tag-Count + (Entry-Size * Entry-Count) + Next-IFD-Offset. - return uint32(2) + (IfdTagEntrySize * uint32(entryCount)) + uint32(4) -} - -func (ibe *IfdByteEncoder) pushToJournal(where, direction, format string, args ...interface{}) { - event := [3]string{ - direction, - where, - fmt.Sprintf(format, args...), - } - - ibe.journal = append(ibe.journal, event) -} - -// PrintJournal prints a hierarchical representation of the steps taken during -// encoding. -func (ibe *IfdByteEncoder) PrintJournal() { - maxWhereLength := 0 - for _, event := range ibe.journal { - where := event[1] - - len_ := len(where) - if len_ > maxWhereLength { - maxWhereLength = len_ - } - } - - level := 0 - for i, event := range ibe.journal { - direction := event[0] - where := event[1] - message := event[2] - - if direction != ">" && direction != "<" && direction != "-" { - log.Panicf("journal operation not valid: [%s]", direction) - } - - if direction == "<" { - if level <= 0 { - log.Panicf("journal operations unbalanced (too many closes)") - } - - level-- - } - - indent := strings.Repeat(" ", level) - - fmt.Printf("%3d %s%s %s: %s\n", i, indent, direction, where, message) - - if direction == ">" { - level++ - } - } - - if level != 0 { - log.Panicf("journal operations unbalanced (too many opens)") - } -} - -// encodeTagToBytes encodes the given tag to a byte stream. If -// `nextIfdOffsetToWrite` is more than (0), recurse into child IFDs -// (`nextIfdOffsetToWrite` is required in order for them to know where the its -// IFD data will be written, in order for them to know the offset of where -// their allocated-data block will start, which follows right behind). -func (ibe *IfdByteEncoder) encodeTagToBytes(ib *IfdBuilder, bt *BuilderTag, bw *ByteWriter, ida *ifdDataAllocator, nextIfdOffsetToWrite uint32) (childIfdBlock []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // Write tag-ID. - err = bw.WriteUint16(bt.tagId) - log.PanicIf(err) - - // Works for both values and child IFDs (which have an official size of - // LONG). - err = bw.WriteUint16(uint16(bt.typeId)) - log.PanicIf(err) - - // Write unit-count. - - if bt.value.IsBytes() == true { - effectiveType := bt.typeId - if bt.typeId == TypeUndefined { - effectiveType = TypeByte - } - - // It's a non-unknown value.Calculate the count of values of - // the type that we're writing and the raw bytes for the whole list. - - typeSize := uint32(effectiveType.Size()) - - valueBytes := bt.value.Bytes() - - len_ := len(valueBytes) - unitCount := uint32(len_) / typeSize - - if _, found := tagsWithoutAlignment[bt.tagId]; found == false { - remainder := uint32(len_) % typeSize - - if remainder > 0 { - log.Panicf("tag (0x%04x) value of (%d) bytes not evenly divisible by type-size (%d)", bt.tagId, len_, typeSize) - } - } - - err = bw.WriteUint32(unitCount) - log.PanicIf(err) - - // Write four-byte value/offset. - - if len_ > 4 { - offset, err := ida.Allocate(valueBytes) - log.PanicIf(err) - - err = bw.WriteUint32(offset) - log.PanicIf(err) - } else { - fourBytes := make([]byte, 4) - copy(fourBytes, valueBytes) - - err = bw.WriteFourBytes(fourBytes) - log.PanicIf(err) - } - } else { - if bt.value.IsIb() == false { - log.Panicf("tag value is not a byte-slice but also not a child IB: %v", bt) - } - - // Write unit-count (one LONG representing one offset). - err = bw.WriteUint32(1) - log.PanicIf(err) - - if nextIfdOffsetToWrite > 0 { - var err error - - ibe.pushToJournal("encodeTagToBytes", ">", "[%s]->[%s]", ib.ifdPath, bt.value.Ib().ifdPath) - - // Create the block of IFD data and everything it requires. - childIfdBlock, err = ibe.encodeAndAttachIfd(bt.value.Ib(), nextIfdOffsetToWrite) - log.PanicIf(err) - - ibe.pushToJournal("encodeTagToBytes", "<", "[%s]->[%s]", bt.value.Ib().ifdPath, ib.ifdPath) - - // Use the next-IFD offset for it. The IFD will actually get - // attached after we return. - err = bw.WriteUint32(nextIfdOffsetToWrite) - log.PanicIf(err) - - } else { - // No child-IFDs are to be allocated. Finish the entry with a NULL - // pointer. - - ibe.pushToJournal("encodeTagToBytes", "-", "*Not* descending to child: [%s]", bt.value.Ib().ifdPath) - - err = bw.WriteUint32(0) - log.PanicIf(err) - } - } - - return childIfdBlock, nil -} - -// encodeIfdToBytes encodes the given IB to a byte-slice. We are given the -// offset at which this IFD will be written. This method is used called both to -// pre-determine how big the table is going to be (so that we can calculate the -// address to allocate data at) as well as to write the final table. -// -// It is necessary to fully realize the table in order to predetermine its size -// because it is not enough to know the size of the table: If there are child -// IFDs, we will not be able to allocate them without first knowing how much -// data we need to allocate for the current IFD. -func (ibe *IfdByteEncoder) encodeIfdToBytes(ib *IfdBuilder, ifdAddressableOffset uint32, nextIfdOffsetToWrite uint32, setNextIb bool) (data []byte, tableSize uint32, dataSize uint32, childIfdSizes []uint32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ibe.pushToJournal("encodeIfdToBytes", ">", "%s", ib) - - tableSize = ibe.TableSize(len(ib.tags)) - - b := new(bytes.Buffer) - bw := NewByteWriter(b, ib.byteOrder) - - // Write tag count. - err = bw.WriteUint16(uint16(len(ib.tags))) - log.PanicIf(err) - - ida := newIfdDataAllocator(ifdAddressableOffset) - - childIfdBlocks := make([][]byte, 0) - - // Write raw bytes for each tag entry. Allocate larger data to be referred - // to in the follow-up data-block as required. Any "unknown"-byte tags that - // we can't parse will not be present here (using AddTagsFromExisting(), at - // least). - for _, bt := range ib.tags { - childIfdBlock, err := ibe.encodeTagToBytes(ib, bt, bw, ida, nextIfdOffsetToWrite) - log.PanicIf(err) - - if childIfdBlock != nil { - // We aren't allowed to have non-nil child IFDs if we're just - // sizing things up. - if nextIfdOffsetToWrite == 0 { - log.Panicf("no IFD offset provided for child-IFDs; no new child-IFDs permitted") - } - - nextIfdOffsetToWrite += uint32(len(childIfdBlock)) - childIfdBlocks = append(childIfdBlocks, childIfdBlock) - } - } - - dataBytes := ida.Bytes() - dataSize = uint32(len(dataBytes)) - - childIfdSizes = make([]uint32, len(childIfdBlocks)) - childIfdsTotalSize := uint32(0) - for i, childIfdBlock := range childIfdBlocks { - len_ := uint32(len(childIfdBlock)) - childIfdSizes[i] = len_ - childIfdsTotalSize += len_ - } - - // N the link from this IFD to the next IFD that will be written in the - // next cycle. - if setNextIb == true { - // Write address of next IFD in chain. This will be the original - // allocation offset plus the size of everything we have allocated for - // this IFD and its child-IFDs. - // - // It is critical that this number is stepped properly. We experienced - // an issue whereby it first looked like we were duplicating the IFD and - // then that we were duplicating the tags in the wrong IFD, and then - // finally we determined that the next-IFD offset for the first IFD was - // accidentally pointing back to the EXIF IFD, so we were visiting it - // twice when visiting through the tags after decoding. It was an - // expensive bug to find. - - ibe.pushToJournal("encodeIfdToBytes", "-", "Setting 'next' IFD to (0x%08x).", nextIfdOffsetToWrite) - - err := bw.WriteUint32(nextIfdOffsetToWrite) - log.PanicIf(err) - } else { - err := bw.WriteUint32(0) - log.PanicIf(err) - } - - _, err = b.Write(dataBytes) - log.PanicIf(err) - - // Append any child IFD blocks after our table and data blocks. These IFDs - // were equipped with the appropriate offset information so it's expected - // that all offsets referred to by these will be correct. - // - // Note that child-IFDs are append after the current IFD and before the - // next IFD, as opposed to the root IFDs, which are chained together but - // will be interrupted by these child-IFDs (which is expected, per the - // standard). - - for _, childIfdBlock := range childIfdBlocks { - _, err = b.Write(childIfdBlock) - log.PanicIf(err) - } - - ibe.pushToJournal("encodeIfdToBytes", "<", "%s", ib) - - return b.Bytes(), tableSize, dataSize, childIfdSizes, nil -} - -// encodeAndAttachIfd is a reentrant function that processes the IFD chain. -func (ibe *IfdByteEncoder) encodeAndAttachIfd(ib *IfdBuilder, ifdAddressableOffset uint32) (data []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ibe.pushToJournal("encodeAndAttachIfd", ">", "%s", ib) - - b := new(bytes.Buffer) - - i := 0 - - for thisIb := ib; thisIb != nil; thisIb = thisIb.nextIb { - - // Do a dry-run in order to pre-determine its size requirement. - - ibe.pushToJournal("encodeAndAttachIfd", ">", "Beginning encoding process: (%d) [%s]", i, thisIb.ifdPath) - - ibe.pushToJournal("encodeAndAttachIfd", ">", "Calculating size: (%d) [%s]", i, thisIb.ifdPath) - - _, tableSize, allocatedDataSize, _, err := ibe.encodeIfdToBytes(thisIb, ifdAddressableOffset, 0, false) - log.PanicIf(err) - - ibe.pushToJournal("encodeAndAttachIfd", "<", "Finished calculating size: (%d) [%s]", i, thisIb.ifdPath) - - ifdAddressableOffset += tableSize - nextIfdOffsetToWrite := ifdAddressableOffset + allocatedDataSize - - ibe.pushToJournal("encodeAndAttachIfd", ">", "Next IFD will be written at offset (0x%08x)", nextIfdOffsetToWrite) - - // Write our IFD as well as any child-IFDs (now that we know the offset - // where new IFDs and their data will be allocated). - - setNextIb := thisIb.nextIb != nil - - ibe.pushToJournal("encodeAndAttachIfd", ">", "Encoding starting: (%d) [%s] NEXT-IFD-OFFSET-TO-WRITE=(0x%08x)", i, thisIb.ifdPath, nextIfdOffsetToWrite) - - tableAndAllocated, effectiveTableSize, effectiveAllocatedDataSize, childIfdSizes, err := - ibe.encodeIfdToBytes(thisIb, ifdAddressableOffset, nextIfdOffsetToWrite, setNextIb) - - log.PanicIf(err) - - if effectiveTableSize != tableSize { - log.Panicf("written table size does not match the pre-calculated table size: (%d) != (%d) %s", effectiveTableSize, tableSize, ib) - } else if effectiveAllocatedDataSize != allocatedDataSize { - log.Panicf("written allocated-data size does not match the pre-calculated allocated-data size: (%d) != (%d) %s", effectiveAllocatedDataSize, allocatedDataSize, ib) - } - - ibe.pushToJournal("encodeAndAttachIfd", "<", "Encoding done: (%d) [%s]", i, thisIb.ifdPath) - - totalChildIfdSize := uint32(0) - for _, childIfdSize := range childIfdSizes { - totalChildIfdSize += childIfdSize - } - - if len(tableAndAllocated) != int(tableSize+allocatedDataSize+totalChildIfdSize) { - log.Panicf("IFD table and data is not a consistent size: (%d) != (%d)", len(tableAndAllocated), tableSize+allocatedDataSize+totalChildIfdSize) - } - - // TODO(dustin): We might want to verify the original tableAndAllocated length, too. - - _, err = b.Write(tableAndAllocated) - log.PanicIf(err) - - // Advance past what we've allocated, thus far. - - ifdAddressableOffset += allocatedDataSize + totalChildIfdSize - - ibe.pushToJournal("encodeAndAttachIfd", "<", "Finishing encoding process: (%d) [%s] [FINAL:] NEXT-IFD-OFFSET-TO-WRITE=(0x%08x)", i, ib.ifdPath, nextIfdOffsetToWrite) - - i++ - } - - ibe.pushToJournal("encodeAndAttachIfd", "<", "%s", ib) - - return b.Bytes(), nil -} - -// EncodeToExifPayload is the base encoding step that transcribes the entire IB -// structure to its on-disk layout. -func (ibe *IfdByteEncoder) EncodeToExifPayload(ib *IfdBuilder) (data []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - data, err = ibe.encodeAndAttachIfd(ib, ExifDefaultFirstIfdOffset) - log.PanicIf(err) - - return data, nil -} - -// EncodeToExif calls EncodeToExifPayload and then packages the result into a -// complete EXIF block. -func (ibe *IfdByteEncoder) EncodeToExif(ib *IfdBuilder) (data []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - encodedIfds, err := ibe.EncodeToExifPayload(ib) - log.PanicIf(err) - - // Wrap the IFD in a formal EXIF block. - - b := new(bytes.Buffer) - - headerBytes, err := BuildExifHeader(ib.byteOrder, ExifDefaultFirstIfdOffset) - log.PanicIf(err) - - _, err = b.Write(headerBytes) - log.PanicIf(err) - - _, err = b.Write(encodedIfds) - log.PanicIf(err) - - return b.Bytes(), nil -} diff --git a/vendor/github.com/dsoprea/go-exif/ifd_enumerate.go b/vendor/github.com/dsoprea/go-exif/ifd_enumerate.go deleted file mode 100644 index 317e847a94..0000000000 --- a/vendor/github.com/dsoprea/go-exif/ifd_enumerate.go +++ /dev/null @@ -1,1356 +0,0 @@ -package exif - -import ( - "bytes" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "time" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -var ( - ifdEnumerateLogger = log.NewLogger("exifjpeg.ifd") -) - -var ( - ErrNoThumbnail = errors.New("no thumbnail") - ErrNoGpsTags = errors.New("no gps tags") - ErrTagTypeNotValid = errors.New("tag type invalid") -) - -var ( - ValidGpsVersions = [][4]byte{ - {2, 2, 0, 0}, - - // Suddenly appeared at the default in 2.31: https://home.jeita.or.jp/tsc/std-pdf/CP-3451D.pdf - // - // Note that the presence of 2.3.0.0 doesn't seem to guarantee - // coordinates. In some cases, we seen just the following: - // - // GPS Tag Version |2.3.0.0 - // GPS Receiver Status |V - // Geodetic Survey Data|WGS-84 - // GPS Differential Cor|0 - // - {2, 3, 0, 0}, - } -) - -// IfdTagEnumerator knows how to decode an IFD and all of the tags it -// describes. -// -// The IFDs and the actual values can float throughout the EXIF block, but the -// IFD itself is just a minor header followed by a set of repeating, -// statically-sized records. So, the tags (though notnecessarily their values) -// are fairly simple to enumerate. -type IfdTagEnumerator struct { - byteOrder binary.ByteOrder - addressableData []byte - ifdOffset uint32 - buffer *bytes.Buffer -} - -func NewIfdTagEnumerator(addressableData []byte, byteOrder binary.ByteOrder, ifdOffset uint32) (ite *IfdTagEnumerator) { - ite = &IfdTagEnumerator{ - addressableData: addressableData, - byteOrder: byteOrder, - buffer: bytes.NewBuffer(addressableData[ifdOffset:]), - } - - return ite -} - -// getUint16 reads a uint16 and advances both our current and our current -// accumulator (which allows us to know how far to seek to the beginning of the -// next IFD when it's time to jump). -func (ife *IfdTagEnumerator) getUint16() (value uint16, raw []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - needBytes := 2 - offset := 0 - raw = make([]byte, needBytes) - - for offset < needBytes { - n, err := ife.buffer.Read(raw[offset:]) - log.PanicIf(err) - - offset += n - } - - value = ife.byteOrder.Uint16(raw) - - return value, raw, nil -} - -// getUint32 reads a uint32 and advances both our current and our current -// accumulator (which allows us to know how far to seek to the beginning of the -// next IFD when it's time to jump). -func (ife *IfdTagEnumerator) getUint32() (value uint32, raw []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - needBytes := 4 - offset := 0 - raw = make([]byte, needBytes) - - for offset < needBytes { - n, err := ife.buffer.Read(raw[offset:]) - log.PanicIf(err) - - offset += n - } - - value = ife.byteOrder.Uint32(raw) - - return value, raw, nil -} - -type IfdEnumerate struct { - exifData []byte - buffer *bytes.Buffer - byteOrder binary.ByteOrder - currentOffset uint32 - tagIndex *TagIndex - ifdMapping *IfdMapping -} - -func NewIfdEnumerate(ifdMapping *IfdMapping, tagIndex *TagIndex, exifData []byte, byteOrder binary.ByteOrder) *IfdEnumerate { - return &IfdEnumerate{ - exifData: exifData, - buffer: bytes.NewBuffer(exifData), - byteOrder: byteOrder, - ifdMapping: ifdMapping, - tagIndex: tagIndex, - } -} - -func (ie *IfdEnumerate) getTagEnumerator(ifdOffset uint32) (ite *IfdTagEnumerator) { - ite = NewIfdTagEnumerator( - ie.exifData[ExifAddressableAreaStart:], - ie.byteOrder, - ifdOffset) - - return ite -} - -func (ie *IfdEnumerate) parseTag(fqIfdPath string, tagPosition int, ite *IfdTagEnumerator, resolveValue bool) (tag *IfdTagEntry, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - tagId, _, err := ite.getUint16() - log.PanicIf(err) - - tagTypeRaw, _, err := ite.getUint16() - log.PanicIf(err) - - tagType := TagTypePrimitive(tagTypeRaw) - - unitCount, _, err := ite.getUint32() - log.PanicIf(err) - - valueOffset, rawValueOffset, err := ite.getUint32() - log.PanicIf(err) - - if _, found := TypeNames[tagType]; found == false { - log.Panic(ErrTagTypeNotValid) - } - - ifdPath, err := ie.ifdMapping.StripPathPhraseIndices(fqIfdPath) - log.PanicIf(err) - - tag = &IfdTagEntry{ - IfdPath: ifdPath, - TagId: tagId, - TagIndex: tagPosition, - TagType: tagType, - UnitCount: unitCount, - ValueOffset: valueOffset, - RawValueOffset: rawValueOffset, - } - - if resolveValue == true { - value, isUnhandledUnknown, err := ie.resolveTagValue(tag) - log.PanicIf(err) - - tag.value = value - tag.isUnhandledUnknown = isUnhandledUnknown - } - - // If it's an IFD but not a standard one, it'll just be seen as a LONG - // (the standard IFD tag type), later, unless we skip it because it's - // [likely] not even in the standard list of known tags. - mi, err := ie.ifdMapping.GetChild(ifdPath, tagId) - if err == nil { - tag.ChildIfdName = mi.Name - tag.ChildIfdPath = mi.PathPhrase() - tag.ChildFqIfdPath = fmt.Sprintf("%s/%s", fqIfdPath, mi.Name) - - // We also need to set `tag.ChildFqIfdPath` but can't do it here - // because we don't have the IFD index. - } else if log.Is(err, ErrChildIfdNotMapped) == false { - log.Panic(err) - } - - return tag, nil -} - -func (ie *IfdEnumerate) GetValueContext(ite *IfdTagEntry) *ValueContext { - - // TODO(dustin): Add test - - addressableData := ie.exifData[ExifAddressableAreaStart:] - - return newValueContextFromTag( - ite, - addressableData, - ie.byteOrder) -} - -func (ie *IfdEnumerate) resolveTagValue(ite *IfdTagEntry) (valueBytes []byte, isUnhandledUnknown bool, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - addressableData := ie.exifData[ExifAddressableAreaStart:] - - // Return the exact bytes of the unknown-type value. Returning a string - // (`ValueString`) is easy because we can just pass everything to - // `Sprintf()`. Returning the raw, typed value (`Value`) is easy - // (obviously). However, here, in order to produce the list of bytes, we - // need to coerce whatever `Undefined()` returns. - if ite.TagType == TypeUndefined { - valueContext := ie.GetValueContext(ite) - - value, err := valueContext.Undefined() - if err != nil { - if err == ErrUnhandledUnknownTypedTag { - valueBytes = []byte(UnparseableUnknownTagValuePlaceholder) - return valueBytes, true, nil - } - - log.Panic(err) - } else { - switch value.(type) { - case []byte: - return value.([]byte), false, nil - case TagUnknownType_UnknownValue: - b := []byte(value.(TagUnknownType_UnknownValue)) - return b, false, nil - case string: - return []byte(value.(string)), false, nil - case UnknownTagValue: - valueBytes, err := value.(UnknownTagValue).ValueBytes() - log.PanicIf(err) - - return valueBytes, false, nil - default: - // TODO(dustin): !! Finish translating the rest of the types (make reusable and replace into other similar implementations?) - log.Panicf("can not produce bytes for unknown-type tag (0x%04x) (1): [%s]", ite.TagId, reflect.TypeOf(value)) - } - } - } else { - originalType := NewTagType(ite.TagType, ie.byteOrder) - byteCount := uint32(originalType.Type().Size()) * ite.UnitCount - - tt := NewTagType(TypeByte, ie.byteOrder) - - if tt.valueIsEmbedded(byteCount) == true { - iteLogger.Debugf(nil, "Reading BYTE value (ITE; embedded).") - - // In this case, the bytes normally used for the offset are actually - // data. - valueBytes, err = tt.ParseBytes(ite.RawValueOffset, byteCount) - log.PanicIf(err) - } else { - iteLogger.Debugf(nil, "Reading BYTE value (ITE; at offset).") - - valueBytes, err = tt.ParseBytes(addressableData[ite.ValueOffset:], byteCount) - log.PanicIf(err) - } - } - - return valueBytes, false, nil -} - -// RawTagVisitorPtr is an optional callback that can get hit for every tag we parse -// through. `addressableData` is the byte array startign after the EXIF header -// (where the offsets of all IFDs and values are calculated from). -// -// This was reimplemented as an interface to allow for simpler change management -// in the future. -type RawTagWalk interface { - Visit(fqIfdPath string, ifdIndex int, tagId uint16, tagType TagType, valueContext *ValueContext) (err error) -} - -type RawTagWalkLegacyWrapper struct { - legacyVisitor RawTagVisitor -} - -func (rtwlw RawTagWalkLegacyWrapper) Visit(fqIfdPath string, ifdIndex int, tagId uint16, tagType TagType, valueContext *ValueContext) (err error) { - return rtwlw.legacyVisitor(fqIfdPath, ifdIndex, tagId, tagType, *valueContext) -} - -// RawTagVisitor is an optional callback that can get hit for every tag we parse -// through. `addressableData` is the byte array startign after the EXIF header -// (where the offsets of all IFDs and values are calculated from). -// -// DEPRECATED(dustin): Use a RawTagWalk instead. -type RawTagVisitor func(fqIfdPath string, ifdIndex int, tagId uint16, tagType TagType, valueContext ValueContext) (err error) - -// ParseIfd decodes the IFD block that we're currently sitting on the first -// byte of. -func (ie *IfdEnumerate) ParseIfd(fqIfdPath string, ifdIndex int, ite *IfdTagEnumerator, visitor interface{}, doDescend bool, resolveValues bool) (nextIfdOffset uint32, entries []*IfdTagEntry, thumbnailData []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - var visitorWrapper RawTagWalk - - if visitor != nil { - var ok bool - - visitorWrapper, ok = visitor.(RawTagWalk) - if ok == false { - // Legacy usage. - - // `ok` can be `true` but `legacyVisitor` can still be `nil` (when - // passed as nil). - if legacyVisitor, ok := visitor.(RawTagVisitor); ok == true && legacyVisitor != nil { - visitorWrapper = RawTagWalkLegacyWrapper{ - legacyVisitor: legacyVisitor, - } - } - } - } - - tagCount, _, err := ite.getUint16() - log.PanicIf(err) - - ifdEnumerateLogger.Debugf(nil, "Current IFD tag-count: (%d)", tagCount) - - entries = make([]*IfdTagEntry, 0) - - var iteThumbnailOffset *IfdTagEntry - var iteThumbnailSize *IfdTagEntry - - for i := 0; i < int(tagCount); i++ { - tag, err := ie.parseTag(fqIfdPath, i, ite, resolveValues) - if err != nil { - if log.Is(err, ErrTagTypeNotValid) == true { - ifdEnumerateLogger.Warningf(nil, "Tag in IFD [%s] at position (%d) has invalid type and will be skipped.", fqIfdPath, i) - continue - } - - log.Panic(err) - } - - if tag.TagId == ThumbnailOffsetTagId { - iteThumbnailOffset = tag - - continue - } else if tag.TagId == ThumbnailSizeTagId { - iteThumbnailSize = tag - continue - } - - if visitorWrapper != nil { - tt := NewTagType(tag.TagType, ie.byteOrder) - - valueContext := ie.GetValueContext(tag) - - err := visitorWrapper.Visit(fqIfdPath, ifdIndex, tag.TagId, tt, valueContext) - log.PanicIf(err) - } - - // If it's an IFD but not a standard one, it'll just be seen as a LONG - // (the standard IFD tag type), later, unless we skip it because it's - // [likely] not even in the standard list of known tags. - if tag.ChildIfdPath != "" { - if doDescend == true { - ifdEnumerateLogger.Debugf(nil, "Descending to IFD [%s].", tag.ChildIfdPath) - - err := ie.scan(tag.ChildFqIfdPath, tag.ValueOffset, visitor, resolveValues) - log.PanicIf(err) - } - } - - entries = append(entries, tag) - } - - if iteThumbnailOffset != nil && iteThumbnailSize != nil { - thumbnailData, err = ie.parseThumbnail(iteThumbnailOffset, iteThumbnailSize) - log.PanicIf(err) - } - - nextIfdOffset, _, err = ite.getUint32() - log.PanicIf(err) - - ifdEnumerateLogger.Debugf(nil, "Next IFD at offset: (%08x)", nextIfdOffset) - - return nextIfdOffset, entries, thumbnailData, nil -} - -func (ie *IfdEnumerate) parseThumbnail(offsetIte, lengthIte *IfdTagEntry) (thumbnailData []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - addressableData := ie.exifData[ExifAddressableAreaStart:] - - vRaw, err := lengthIte.Value(addressableData, ie.byteOrder) - log.PanicIf(err) - - vList := vRaw.([]uint32) - if len(vList) != 1 { - log.Panicf("not exactly one long: (%d)", len(vList)) - } - - length := vList[0] - - // The tag is official a LONG type, but it's actually an offset to a blob of bytes. - offsetIte.TagType = TypeByte - offsetIte.UnitCount = length - - thumbnailData, err = offsetIte.ValueBytes(addressableData, ie.byteOrder) - log.PanicIf(err) - - return thumbnailData, nil -} - -// Scan enumerates the different EXIF's IFD blocks. -func (ie *IfdEnumerate) scan(fqIfdName string, ifdOffset uint32, visitor interface{}, resolveValues bool) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - for ifdIndex := 0; ; ifdIndex++ { - ifdEnumerateLogger.Debugf(nil, "Parsing IFD [%s] (%d) at offset (%04x).", fqIfdName, ifdIndex, ifdOffset) - ite := ie.getTagEnumerator(ifdOffset) - - nextIfdOffset, _, _, err := ie.ParseIfd(fqIfdName, ifdIndex, ite, visitor, true, resolveValues) - log.PanicIf(err) - - if nextIfdOffset == 0 { - break - } - - ifdOffset = nextIfdOffset - } - - return nil -} - -// Scan enumerates the different EXIF blocks (called IFDs). `rootIfdName` will -// be "IFD" in the TIFF standard. -func (ie *IfdEnumerate) Scan(rootIfdName string, ifdOffset uint32, visitor RawTagVisitor, resolveValue bool) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = ie.scan(rootIfdName, ifdOffset, visitor, resolveValue) - log.PanicIf(err) - - return nil -} - -// Ifd represents a single parsed IFD. -type Ifd struct { - - // TODO(dustin): !! Why are all of these public? Privatize them and then add NextIfd(). - - // This is just for convenience, just so that we can easily get the values - // and not involve other projects in semantics that they won't otherwise - // need to know. - addressableData []byte - - ByteOrder binary.ByteOrder - - // Name is the name of the IFD (the rightmost name in the path, sans any - // indices). - Name string - - // IfdPath is a simple IFD path (e.g. IFD/GPSInfo). No indices. - IfdPath string - - // FqIfdPath is a fully-qualified IFD path (e.g. IFD0/GPSInfo0). With - // indices. - FqIfdPath string - - TagId uint16 - - Id int - - ParentIfd *Ifd - - // ParentTagIndex is our tag position in the parent IFD, if we had a parent - // (if `ParentIfd` is not nil and we weren't an IFD referenced as a sibling - // instead of as a child). - ParentTagIndex int - - // Name string - Index int - Offset uint32 - - Entries []*IfdTagEntry - EntriesByTagId map[uint16][]*IfdTagEntry - - Children []*Ifd - - ChildIfdIndex map[string]*Ifd - - NextIfdOffset uint32 - NextIfd *Ifd - - thumbnailData []byte - - ifdMapping *IfdMapping - tagIndex *TagIndex -} - -func (ifd *Ifd) ChildWithIfdPath(ifdPath string) (childIfd *Ifd, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - for _, childIfd := range ifd.Children { - if childIfd.IfdPath == ifdPath { - return childIfd, nil - } - } - - log.Panic(ErrTagNotFound) - return nil, nil -} - -func (ifd *Ifd) TagValue(ite *IfdTagEntry) (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - value, err = ite.Value(ifd.addressableData, ifd.ByteOrder) - log.PanicIf(err) - - return value, nil -} - -func (ifd *Ifd) TagValueBytes(ite *IfdTagEntry) (value []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - value, err = ite.ValueBytes(ifd.addressableData, ifd.ByteOrder) - log.PanicIf(err) - - return value, nil -} - -// FindTagWithId returns a list of tags (usually just zero or one) that match -// the given tag ID. This is efficient. -func (ifd *Ifd) FindTagWithId(tagId uint16) (results []*IfdTagEntry, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - results, found := ifd.EntriesByTagId[tagId] - if found != true { - log.Panic(ErrTagNotFound) - } - - return results, nil -} - -// FindTagWithName returns a list of tags (usually just zero or one) that match -// the given tag name. This is not efficient (though the labor is trivial). -func (ifd *Ifd) FindTagWithName(tagName string) (results []*IfdTagEntry, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - it, err := ifd.tagIndex.GetWithName(ifd.IfdPath, tagName) - if log.Is(err, ErrTagNotFound) == true { - log.Panic(ErrTagNotStandard) - } else if err != nil { - log.Panic(err) - } - - results = make([]*IfdTagEntry, 0) - for _, ite := range ifd.Entries { - if ite.TagId == it.Id { - results = append(results, ite) - } - } - - if len(results) == 0 { - log.Panic(ErrTagNotFound) - } - - return results, nil -} - -func (ifd Ifd) String() string { - parentOffset := uint32(0) - if ifd.ParentIfd != nil { - parentOffset = ifd.ParentIfd.Offset - } - - return fmt.Sprintf("Ifd", ifd.Id, ifd.IfdPath, ifd.Index, len(ifd.Entries), ifd.Offset, len(ifd.Children), parentOffset, ifd.NextIfdOffset) -} - -func (ifd *Ifd) Thumbnail() (data []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if ifd.thumbnailData == nil { - log.Panic(ErrNoThumbnail) - } - - return ifd.thumbnailData, nil -} - -func (ifd *Ifd) dumpTags(tags []*IfdTagEntry) []*IfdTagEntry { - if tags == nil { - tags = make([]*IfdTagEntry, 0) - } - - // Now, print the tags while also descending to child-IFDS as we encounter them. - - ifdsFoundCount := 0 - - for _, tag := range ifd.Entries { - tags = append(tags, tag) - - if tag.ChildIfdPath != "" { - ifdsFoundCount++ - - childIfd, found := ifd.ChildIfdIndex[tag.ChildIfdPath] - if found != true { - log.Panicf("alien child IFD referenced by a tag: [%s]", tag.ChildIfdPath) - } - - tags = childIfd.dumpTags(tags) - } - } - - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) - } - - if ifd.NextIfd != nil { - tags = ifd.NextIfd.dumpTags(tags) - } - - return tags -} - -// DumpTags prints the IFD hierarchy. -func (ifd *Ifd) DumpTags() []*IfdTagEntry { - return ifd.dumpTags(nil) -} - -func (ifd *Ifd) printTagTree(populateValues bool, index, level int, nextLink bool) { - indent := strings.Repeat(" ", level*2) - - prefix := " " - if nextLink { - prefix = ">" - } - - fmt.Printf("%s%sIFD: %s\n", indent, prefix, ifd) - - // Now, print the tags while also descending to child-IFDS as we encounter them. - - ifdsFoundCount := 0 - - for _, tag := range ifd.Entries { - if tag.ChildIfdPath != "" { - fmt.Printf("%s - TAG: %s\n", indent, tag) - } else { - it, err := ifd.tagIndex.Get(ifd.IfdPath, tag.TagId) - - tagName := "" - if err == nil { - tagName = it.Name - } - - var value interface{} - if populateValues == true { - var err error - - value, err = ifd.TagValue(tag) - if err != nil { - if err == ErrUnhandledUnknownTypedTag { - value = UnparseableUnknownTagValuePlaceholder - } else { - log.Panic(err) - } - } - } - - fmt.Printf("%s - TAG: %s NAME=[%s] VALUE=[%v]\n", indent, tag, tagName, value) - } - - if tag.ChildIfdPath != "" { - ifdsFoundCount++ - - childIfd, found := ifd.ChildIfdIndex[tag.ChildIfdPath] - if found != true { - log.Panicf("alien child IFD referenced by a tag: [%s]", tag.ChildIfdPath) - } - - childIfd.printTagTree(populateValues, 0, level+1, false) - } - } - - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) - } - - if ifd.NextIfd != nil { - ifd.NextIfd.printTagTree(populateValues, index+1, level, true) - } -} - -// PrintTagTree prints the IFD hierarchy. -func (ifd *Ifd) PrintTagTree(populateValues bool) { - ifd.printTagTree(populateValues, 0, 0, false) -} - -func (ifd *Ifd) printIfdTree(level int, nextLink bool) { - indent := strings.Repeat(" ", level*2) - - prefix := " " - if nextLink { - prefix = ">" - } - - fmt.Printf("%s%s%s\n", indent, prefix, ifd) - - // Now, print the tags while also descending to child-IFDS as we encounter them. - - ifdsFoundCount := 0 - - for _, tag := range ifd.Entries { - if tag.ChildIfdPath != "" { - ifdsFoundCount++ - - childIfd, found := ifd.ChildIfdIndex[tag.ChildIfdPath] - if found != true { - log.Panicf("alien child IFD referenced by a tag: [%s]", tag.ChildIfdPath) - } - - childIfd.printIfdTree(level+1, false) - } - } - - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) - } - - if ifd.NextIfd != nil { - ifd.NextIfd.printIfdTree(level, true) - } -} - -// PrintIfdTree prints the IFD hierarchy. -func (ifd *Ifd) PrintIfdTree() { - ifd.printIfdTree(0, false) -} - -func (ifd *Ifd) dumpTree(tagsDump []string, level int) []string { - if tagsDump == nil { - tagsDump = make([]string, 0) - } - - indent := strings.Repeat(" ", level*2) - - var ifdPhrase string - if ifd.ParentIfd != nil { - ifdPhrase = fmt.Sprintf("[%s]->[%s]:(%d)", ifd.ParentIfd.IfdPath, ifd.IfdPath, ifd.Index) - } else { - ifdPhrase = fmt.Sprintf("[ROOT]->[%s]:(%d)", ifd.IfdPath, ifd.Index) - } - - startBlurb := fmt.Sprintf("%s> IFD %s TOP", indent, ifdPhrase) - tagsDump = append(tagsDump, startBlurb) - - ifdsFoundCount := 0 - for _, tag := range ifd.Entries { - tagsDump = append(tagsDump, fmt.Sprintf("%s - (0x%04x)", indent, tag.TagId)) - - if tag.ChildIfdPath != "" { - ifdsFoundCount++ - - childIfd, found := ifd.ChildIfdIndex[tag.ChildIfdPath] - if found != true { - log.Panicf("alien child IFD referenced by a tag: [%s]", tag.ChildIfdPath) - } - - tagsDump = childIfd.dumpTree(tagsDump, level+1) - } - } - - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) - } - - finishBlurb := fmt.Sprintf("%s< IFD %s BOTTOM", indent, ifdPhrase) - tagsDump = append(tagsDump, finishBlurb) - - if ifd.NextIfd != nil { - siblingBlurb := fmt.Sprintf("%s* LINKING TO SIBLING IFD [%s]:(%d)", indent, ifd.NextIfd.IfdPath, ifd.NextIfd.Index) - tagsDump = append(tagsDump, siblingBlurb) - - tagsDump = ifd.NextIfd.dumpTree(tagsDump, level) - } - - return tagsDump -} - -// DumpTree returns a list of strings describing the IFD hierarchy. -func (ifd *Ifd) DumpTree() []string { - return ifd.dumpTree(nil, 0) -} - -// GpsInfo parses and consolidates the GPS info. This can only be called on the -// GPS IFD. -func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Also add functionality to update the GPS info. - - gi = new(GpsInfo) - - if ifd.IfdPath != IfdPathStandardGps { - log.Panicf("GPS can only be read on GPS IFD: [%s] != [%s]", ifd.IfdPath, IfdPathStandardGps) - } - - if tags, found := ifd.EntriesByTagId[TagVersionId]; found == false { - // We've seen this. We'll just have to default to assuming we're in a - // 2.2.0.0 format. - ifdEnumerateLogger.Warningf(nil, "No GPS version tag (0x%04x) found.", TagVersionId) - } else { - hit := false - for _, acceptedGpsVersion := range ValidGpsVersions { - if bytes.Compare(tags[0].value, acceptedGpsVersion[:]) == 0 { - hit = true - break - } - } - - if hit != true { - ifdEnumerateLogger.Warningf(nil, "GPS version not supported: %v", tags[0].value) - log.Panic(ErrNoGpsTags) - } - } - - tags, found := ifd.EntriesByTagId[TagLatitudeId] - if found == false { - ifdEnumerateLogger.Warningf(nil, "latitude not found") - log.Panic(ErrNoGpsTags) - } - - latitudeValue, err := ifd.TagValue(tags[0]) - log.PanicIf(err) - - // Look for whether North or South. - tags, found = ifd.EntriesByTagId[TagLatitudeRefId] - if found == false { - ifdEnumerateLogger.Warningf(nil, "latitude-ref not found") - log.Panic(ErrNoGpsTags) - } - - latitudeRefValue, err := ifd.TagValue(tags[0]) - log.PanicIf(err) - - tags, found = ifd.EntriesByTagId[TagLongitudeId] - if found == false { - ifdEnumerateLogger.Warningf(nil, "longitude not found") - log.Panic(ErrNoGpsTags) - } - - longitudeValue, err := ifd.TagValue(tags[0]) - log.PanicIf(err) - - // Look for whether West or East. - tags, found = ifd.EntriesByTagId[TagLongitudeRefId] - if found == false { - ifdEnumerateLogger.Warningf(nil, "longitude-ref not found") - log.Panic(ErrNoGpsTags) - } - - longitudeRefValue, err := ifd.TagValue(tags[0]) - log.PanicIf(err) - - // Parse location. - - latitudeRaw := latitudeValue.([]Rational) - - gi.Latitude = GpsDegrees{ - Orientation: latitudeRefValue.(string)[0], - Degrees: float64(latitudeRaw[0].Numerator) / float64(latitudeRaw[0].Denominator), - Minutes: float64(latitudeRaw[1].Numerator) / float64(latitudeRaw[1].Denominator), - Seconds: float64(latitudeRaw[2].Numerator) / float64(latitudeRaw[2].Denominator), - } - - longitudeRaw := longitudeValue.([]Rational) - - gi.Longitude = GpsDegrees{ - Orientation: longitudeRefValue.(string)[0], - Degrees: float64(longitudeRaw[0].Numerator) / float64(longitudeRaw[0].Denominator), - Minutes: float64(longitudeRaw[1].Numerator) / float64(longitudeRaw[1].Denominator), - Seconds: float64(longitudeRaw[2].Numerator) / float64(longitudeRaw[2].Denominator), - } - - // Parse altitude. - - altitudeTags, foundAltitude := ifd.EntriesByTagId[TagAltitudeId] - altitudeRefTags, foundAltitudeRef := ifd.EntriesByTagId[TagAltitudeRefId] - - if foundAltitude == true && foundAltitudeRef == true { - altitudeValue, err := ifd.TagValue(altitudeTags[0]) - log.PanicIf(err) - - altitudeRefValue, err := ifd.TagValue(altitudeRefTags[0]) - log.PanicIf(err) - - altitudeRaw := altitudeValue.([]Rational) - altitude := int(altitudeRaw[0].Numerator / altitudeRaw[0].Denominator) - if altitudeRefValue.([]byte)[0] == 1 { - altitude *= -1 - } - - gi.Altitude = altitude - } - - // Parse time. - - timestampTags, foundTimestamp := ifd.EntriesByTagId[TagTimestampId] - datestampTags, foundDatestamp := ifd.EntriesByTagId[TagDatestampId] - - if foundTimestamp == true && foundDatestamp == true { - datestampValue, err := ifd.TagValue(datestampTags[0]) - log.PanicIf(err) - - dateParts := strings.Split(datestampValue.(string), ":") - - year, err1 := strconv.ParseUint(dateParts[0], 10, 16) - month, err2 := strconv.ParseUint(dateParts[1], 10, 8) - day, err3 := strconv.ParseUint(dateParts[2], 10, 8) - - if err1 == nil && err2 == nil && err3 == nil { - timestampValue, err := ifd.TagValue(timestampTags[0]) - log.PanicIf(err) - - timestampRaw := timestampValue.([]Rational) - - hour := int(timestampRaw[0].Numerator / timestampRaw[0].Denominator) - minute := int(timestampRaw[1].Numerator / timestampRaw[1].Denominator) - second := int(timestampRaw[2].Numerator / timestampRaw[2].Denominator) - - gi.Timestamp = time.Date(int(year), time.Month(month), int(day), hour, minute, second, 0, time.UTC) - } - } - - return gi, nil -} - -type ParsedTagVisitor func(*Ifd, *IfdTagEntry) error - -func (ifd *Ifd) EnumerateTagsRecursively(visitor ParsedTagVisitor) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - for ptr := ifd; ptr != nil; ptr = ptr.NextIfd { - for _, ite := range ifd.Entries { - if ite.ChildIfdPath != "" { - childIfd := ifd.ChildIfdIndex[ite.ChildIfdPath] - - err := childIfd.EnumerateTagsRecursively(visitor) - log.PanicIf(err) - } else { - err := visitor(ifd, ite) - log.PanicIf(err) - } - } - } - - return nil -} - -func (ifd *Ifd) GetValueContext(ite *IfdTagEntry) *ValueContext { - return newValueContextFromTag( - ite, - ifd.addressableData, - ifd.ByteOrder) -} - -type QueuedIfd struct { - Name string - IfdPath string - FqIfdPath string - - TagId uint16 - - Index int - Offset uint32 - Parent *Ifd - - // ParentTagIndex is our tag position in the parent IFD, if we had a parent - // (if `ParentIfd` is not nil and we weren't an IFD referenced as a sibling - // instead of as a child). - ParentTagIndex int -} - -type IfdIndex struct { - RootIfd *Ifd - Ifds []*Ifd - Tree map[int]*Ifd - Lookup map[string][]*Ifd -} - -// Scan enumerates the different EXIF blocks (called IFDs). -func (ie *IfdEnumerate) Collect(rootIfdOffset uint32, resolveValues bool) (index IfdIndex, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - tree := make(map[int]*Ifd) - ifds := make([]*Ifd, 0) - lookup := make(map[string][]*Ifd) - - queue := []QueuedIfd{ - { - Name: IfdStandard, - IfdPath: IfdStandard, - FqIfdPath: IfdStandard, - - TagId: 0xffff, - - Index: 0, - Offset: rootIfdOffset, - }, - } - - edges := make(map[uint32]*Ifd) - - for { - if len(queue) == 0 { - break - } - - qi := queue[0] - - name := qi.Name - ifdPath := qi.IfdPath - fqIfdPath := qi.FqIfdPath - - index := qi.Index - offset := qi.Offset - parentIfd := qi.Parent - - queue = queue[1:] - - ifdEnumerateLogger.Debugf(nil, "Parsing IFD [%s] (%d) at offset (%04x).", ifdPath, index, offset) - ite := ie.getTagEnumerator(offset) - - nextIfdOffset, entries, thumbnailData, err := ie.ParseIfd(fqIfdPath, index, ite, nil, false, resolveValues) - log.PanicIf(err) - - id := len(ifds) - - entriesByTagId := make(map[uint16][]*IfdTagEntry) - for _, tag := range entries { - tags, found := entriesByTagId[tag.TagId] - if found == false { - tags = make([]*IfdTagEntry, 0) - } - - entriesByTagId[tag.TagId] = append(tags, tag) - } - - ifd := &Ifd{ - addressableData: ie.exifData[ExifAddressableAreaStart:], - - ByteOrder: ie.byteOrder, - - Name: name, - IfdPath: ifdPath, - FqIfdPath: fqIfdPath, - - TagId: qi.TagId, - - Id: id, - - ParentIfd: parentIfd, - ParentTagIndex: qi.ParentTagIndex, - - Index: index, - Offset: offset, - Entries: entries, - EntriesByTagId: entriesByTagId, - - // This is populated as each child is processed. - Children: make([]*Ifd, 0), - - NextIfdOffset: nextIfdOffset, - thumbnailData: thumbnailData, - - ifdMapping: ie.ifdMapping, - tagIndex: ie.tagIndex, - } - - // Add ourselves to a big list of IFDs. - ifds = append(ifds, ifd) - - // Install ourselves into a by-id lookup table (keys are unique). - tree[id] = ifd - - // Install into by-name buckets. - - if list_, found := lookup[ifdPath]; found == true { - lookup[ifdPath] = append(list_, ifd) - } else { - list_ = make([]*Ifd, 1) - list_[0] = ifd - - lookup[ifdPath] = list_ - } - - // Add a link from the previous IFD in the chain to us. - if previousIfd, found := edges[offset]; found == true { - previousIfd.NextIfd = ifd - } - - // Attach as a child to our parent (where we appeared as a tag in - // that IFD). - if parentIfd != nil { - parentIfd.Children = append(parentIfd.Children, ifd) - } - - // Determine if any of our entries is a child IFD and queue it. - for i, entry := range entries { - if entry.ChildIfdPath == "" { - continue - } - - qi := QueuedIfd{ - Name: entry.ChildIfdName, - IfdPath: entry.ChildIfdPath, - FqIfdPath: entry.ChildFqIfdPath, - TagId: entry.TagId, - - Index: 0, - Offset: entry.ValueOffset, - Parent: ifd, - ParentTagIndex: i, - } - - queue = append(queue, qi) - } - - // If there's another IFD in the chain. - if nextIfdOffset != 0 { - // Allow the next link to know what the previous link was. - edges[nextIfdOffset] = ifd - - siblingIndex := index + 1 - - var fqIfdPath string - if parentIfd != nil { - fqIfdPath = fmt.Sprintf("%s/%s%d", parentIfd.FqIfdPath, name, siblingIndex) - } else { - fqIfdPath = fmt.Sprintf("%s%d", name, siblingIndex) - } - - qi := QueuedIfd{ - Name: name, - IfdPath: ifdPath, - FqIfdPath: fqIfdPath, - TagId: 0xffff, - Index: siblingIndex, - Offset: nextIfdOffset, - } - - queue = append(queue, qi) - } - } - - index.RootIfd = tree[0] - index.Ifds = ifds - index.Tree = tree - index.Lookup = lookup - - err = ie.setChildrenIndex(index.RootIfd) - log.PanicIf(err) - - return index, nil -} - -func (ie *IfdEnumerate) setChildrenIndex(ifd *Ifd) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - childIfdIndex := make(map[string]*Ifd) - for _, childIfd := range ifd.Children { - childIfdIndex[childIfd.IfdPath] = childIfd - } - - ifd.ChildIfdIndex = childIfdIndex - - for _, childIfd := range ifd.Children { - err := ie.setChildrenIndex(childIfd) - log.PanicIf(err) - } - - return nil -} - -// ParseOneIfd is a hack to use an IE to parse a raw IFD block. Can be used for -// testing. -func ParseOneIfd(ifdMapping *IfdMapping, tagIndex *TagIndex, fqIfdPath, ifdPath string, byteOrder binary.ByteOrder, ifdBlock []byte, visitor RawTagVisitor, resolveValues bool) (nextIfdOffset uint32, entries []*IfdTagEntry, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ie := NewIfdEnumerate(ifdMapping, tagIndex, make([]byte, 0), byteOrder) - ite := NewIfdTagEnumerator(ifdBlock, byteOrder, 0) - - nextIfdOffset, entries, _, err = ie.ParseIfd(fqIfdPath, 0, ite, visitor, true, resolveValues) - log.PanicIf(err) - - return nextIfdOffset, entries, nil -} - -// ParseOneTag is a hack to use an IE to parse a raw tag block. -func ParseOneTag(ifdMapping *IfdMapping, tagIndex *TagIndex, fqIfdPath, ifdPath string, byteOrder binary.ByteOrder, tagBlock []byte, resolveValue bool) (tag *IfdTagEntry, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ie := NewIfdEnumerate(ifdMapping, tagIndex, make([]byte, 0), byteOrder) - ite := NewIfdTagEnumerator(tagBlock, byteOrder, 0) - - tag, err = ie.parseTag(fqIfdPath, 0, ite, resolveValue) - log.PanicIf(err) - - return tag, nil -} - -func FindIfdFromRootIfd(rootIfd *Ifd, ifdPath string) (ifd *Ifd, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Add test. - - lineage, err := rootIfd.ifdMapping.ResolvePath(ifdPath) - log.PanicIf(err) - - // Confirm the first IFD is our root IFD type, and then prune it because - // from then on we'll be searching down through our children. - - if len(lineage) == 0 { - log.Panicf("IFD path must be non-empty.") - } else if lineage[0].Name != IfdStandard { - log.Panicf("First IFD path item must be [%s].", IfdStandard) - } - - desiredRootIndex := lineage[0].Index - lineage = lineage[1:] - - // TODO(dustin): !! This is a poorly conceived fix that just doubles the work we already have to do below, which then interacts badly with the indices not being properly represented in the IFD-phrase. - // TODO(dustin): !! <-- However, we're not sure whether we shouldn't store a secondary IFD-path with the indices. Some IFDs may not necessarily restrict which IFD indices they can be a child of (only the IFD itself matters). Validation should be delegated to the caller. - thisIfd := rootIfd - for currentRootIndex := 0; currentRootIndex < desiredRootIndex; currentRootIndex++ { - if thisIfd.NextIfd == nil { - log.Panicf("Root-IFD index (%d) does not exist in the data.", currentRootIndex) - } - - thisIfd = thisIfd.NextIfd - } - - for i, itii := range lineage { - var hit *Ifd - for _, childIfd := range thisIfd.Children { - if childIfd.TagId == itii.TagId { - hit = childIfd - break - } - } - - // If we didn't find the child, add it. - if hit == nil { - log.Panicf("IFD [%s] in [%s] not found: %s", itii.Name, ifdPath, thisIfd.Children) - } - - thisIfd = hit - - // If we didn't find the sibling, add it. - for i = 0; i < itii.Index; i++ { - if thisIfd.NextIfd == nil { - log.Panicf("IFD [%s] does not have (%d) occurrences/siblings\n", thisIfd.IfdPath, itii.Index) - } - - thisIfd = thisIfd.NextIfd - } - } - - return thisIfd, nil -} diff --git a/vendor/github.com/dsoprea/go-exif/ifd_tag_entry.go b/vendor/github.com/dsoprea/go-exif/ifd_tag_entry.go deleted file mode 100644 index 59e79ccf75..0000000000 --- a/vendor/github.com/dsoprea/go-exif/ifd_tag_entry.go +++ /dev/null @@ -1,233 +0,0 @@ -package exif - -import ( - "fmt" - "reflect" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -var ( - iteLogger = log.NewLogger("exif.ifd_tag_entry") -) - -type IfdTagEntry struct { - TagId uint16 - TagIndex int - TagType TagTypePrimitive - UnitCount uint32 - ValueOffset uint32 - RawValueOffset []byte - - // ChildIfdName is the right most atom in the IFD-path. We need this to - // construct the fully-qualified IFD-path. - ChildIfdName string - - // ChildIfdPath is the IFD-path of the child if this tag represents a child - // IFD. - ChildIfdPath string - - // ChildFqIfdPath is the IFD-path of the child if this tag represents a - // child IFD. Includes indices. - ChildFqIfdPath string - - // TODO(dustin): !! IB's host the child-IBs directly in the tag, but that's not the case here. Refactor to accomodate it for a consistent experience. - - // IfdPath is the IFD that this tag belongs to. - IfdPath string - - // TODO(dustin): !! We now parse and read the value immediately. Update the rest of the logic to use this and get rid of all of the staggered and different resolution mechanisms. - value []byte - isUnhandledUnknown bool -} - -func (ite *IfdTagEntry) String() string { - return fmt.Sprintf("IfdTagEntry", ite.IfdPath, ite.TagId, TypeNames[ite.TagType], ite.UnitCount) -} - -// TODO(dustin): TODO(dustin): Stop exporting IfdPath and TagId. -// -// func (ite *IfdTagEntry) IfdPath() string { -// return ite.IfdPath -// } - -// TODO(dustin): TODO(dustin): Stop exporting IfdPath and TagId. -// -// func (ite *IfdTagEntry) TagId() uint16 { -// return ite.TagId -// } - -// ValueString renders a string from whatever the value in this tag is. -func (ite *IfdTagEntry) ValueString(addressableData []byte, byteOrder binary.ByteOrder) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - valueContext := - newValueContextFromTag( - ite, - addressableData, - byteOrder) - - if ite.TagType == TypeUndefined { - valueRaw, err := valueContext.Undefined() - log.PanicIf(err) - - value = fmt.Sprintf("%v", valueRaw) - } else { - value, err = valueContext.Format() - log.PanicIf(err) - } - - return value, nil -} - -// ValueBytes renders a specific list of bytes from the value in this tag. -func (ite *IfdTagEntry) ValueBytes(addressableData []byte, byteOrder binary.ByteOrder) (value []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // Return the exact bytes of the unknown-type value. Returning a string - // (`ValueString`) is easy because we can just pass everything to - // `Sprintf()`. Returning the raw, typed value (`Value`) is easy - // (obviously). However, here, in order to produce the list of bytes, we - // need to coerce whatever `Undefined()` returns. - if ite.TagType == TypeUndefined { - valueContext := - newValueContextFromTag( - ite, - addressableData, - byteOrder) - - value, err := valueContext.Undefined() - log.PanicIf(err) - - switch value.(type) { - case []byte: - return value.([]byte), nil - case TagUnknownType_UnknownValue: - b := []byte(value.(TagUnknownType_UnknownValue)) - return b, nil - case string: - return []byte(value.(string)), nil - case UnknownTagValue: - valueBytes, err := value.(UnknownTagValue).ValueBytes() - log.PanicIf(err) - - return valueBytes, nil - default: - // TODO(dustin): !! Finish translating the rest of the types (make reusable and replace into other similar implementations?) - log.Panicf("can not produce bytes for unknown-type tag (0x%04x) (2): [%s]", ite.TagId, reflect.TypeOf(value)) - } - } - - originalType := NewTagType(ite.TagType, byteOrder) - byteCount := uint32(originalType.Type().Size()) * ite.UnitCount - - tt := NewTagType(TypeByte, byteOrder) - - if tt.valueIsEmbedded(byteCount) == true { - iteLogger.Debugf(nil, "Reading BYTE value (ITE; embedded).") - - // In this case, the bytes normally used for the offset are actually - // data. - value, err = tt.ParseBytes(ite.RawValueOffset, byteCount) - log.PanicIf(err) - } else { - iteLogger.Debugf(nil, "Reading BYTE value (ITE; at offset).") - - value, err = tt.ParseBytes(addressableData[ite.ValueOffset:], byteCount) - log.PanicIf(err) - } - - return value, nil -} - -// Value returns the specific, parsed, typed value from the tag. -func (ite *IfdTagEntry) Value(addressableData []byte, byteOrder binary.ByteOrder) (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - valueContext := - newValueContextFromTag( - ite, - addressableData, - byteOrder) - - if ite.TagType == TypeUndefined { - value, err = valueContext.Undefined() - log.PanicIf(err) - } else { - tt := NewTagType(ite.TagType, byteOrder) - - value, err = tt.Resolve(valueContext) - log.PanicIf(err) - } - - return value, nil -} - -// IfdTagEntryValueResolver instances know how to resolve the values for any -// tag for a particular EXIF block. -type IfdTagEntryValueResolver struct { - addressableData []byte - byteOrder binary.ByteOrder -} - -func NewIfdTagEntryValueResolver(exifData []byte, byteOrder binary.ByteOrder) (itevr *IfdTagEntryValueResolver) { - return &IfdTagEntryValueResolver{ - addressableData: exifData[ExifAddressableAreaStart:], - byteOrder: byteOrder, - } -} - -// ValueBytes will resolve embedded or allocated data from the tag and return the raw bytes. -func (itevr *IfdTagEntryValueResolver) ValueBytes(ite *IfdTagEntry) (value []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // OBSOLETE(dustin): This is now redundant. Use `(*ValueContext).readRawEncoded()` instead of this method. - - valueContext := newValueContextFromTag( - ite, - itevr.addressableData, - itevr.byteOrder) - - rawBytes, err := valueContext.readRawEncoded() - log.PanicIf(err) - - return rawBytes, nil -} - -func (itevr *IfdTagEntryValueResolver) Value(ite *IfdTagEntry) (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // OBSOLETE(dustin): This is now redundant. Use `(*ValueContext).Values()` instead of this method. - - valueContext := newValueContextFromTag( - ite, - itevr.addressableData, - itevr.byteOrder) - - values, err := valueContext.Values() - log.PanicIf(err) - - return values, nil -} diff --git a/vendor/github.com/dsoprea/go-exif/package.go b/vendor/github.com/dsoprea/go-exif/package.go deleted file mode 100644 index 2eb6b3056d..0000000000 --- a/vendor/github.com/dsoprea/go-exif/package.go +++ /dev/null @@ -1,4 +0,0 @@ -// exif parses raw EXIF information given a block of raw EXIF data. -// -// v1 of go-exif is now deprecated. Please use v2. -package exif diff --git a/vendor/github.com/dsoprea/go-exif/parser.go b/vendor/github.com/dsoprea/go-exif/parser.go deleted file mode 100644 index 4702db2f85..0000000000 --- a/vendor/github.com/dsoprea/go-exif/parser.go +++ /dev/null @@ -1,190 +0,0 @@ -package exif - -import ( - "bytes" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -type Parser struct { -} - -func (p *Parser) ParseBytes(data []byte, unitCount uint32) (value []uint8, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeByte.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - value = []uint8(data[:count]) - - return value, nil -} - -// ParseAscii returns a string and auto-strips the trailing NUL character. -func (p *Parser) ParseAscii(data []byte, unitCount uint32) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeAscii.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - if len(data) == 0 || data[count-1] != 0 { - s := string(data[:count]) - typeLogger.Warningf(nil, "ascii not terminated with nul as expected: [%v]", s) - - return s, nil - } else { - // Auto-strip the NUL from the end. It serves no purpose outside of - // encoding semantics. - - return string(data[:count-1]), nil - } -} - -// ParseAsciiNoNul returns a string without any consideration for a trailing NUL -// character. -func (p *Parser) ParseAsciiNoNul(data []byte, unitCount uint32) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeAscii.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - return string(data[:count]), nil -} - -func (p *Parser) ParseShorts(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []uint16, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeShort.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - value = make([]uint16, count) - for i := 0; i < count; i++ { - value[i] = byteOrder.Uint16(data[i*2:]) - } - - return value, nil -} - -func (p *Parser) ParseLongs(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []uint32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeLong.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - value = make([]uint32, count) - for i := 0; i < count; i++ { - value[i] = byteOrder.Uint32(data[i*4:]) - } - - return value, nil -} - -func (p *Parser) ParseRationals(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []Rational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeRational.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - value = make([]Rational, count) - for i := 0; i < count; i++ { - value[i].Numerator = byteOrder.Uint32(data[i*8:]) - value[i].Denominator = byteOrder.Uint32(data[i*8+4:]) - } - - return value, nil -} - -func (p *Parser) ParseSignedLongs(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []int32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeSignedLong.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - b := bytes.NewBuffer(data) - - value = make([]int32, count) - for i := 0; i < count; i++ { - err := binary.Read(b, byteOrder, &value[i]) - log.PanicIf(err) - } - - return value, nil -} - -func (p *Parser) ParseSignedRationals(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []SignedRational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - count := int(unitCount) - - if len(data) < (TypeSignedRational.Size() * count) { - log.Panic(ErrNotEnoughData) - } - - b := bytes.NewBuffer(data) - - value = make([]SignedRational, count) - for i := 0; i < count; i++ { - err = binary.Read(b, byteOrder, &value[i].Numerator) - log.PanicIf(err) - - err = binary.Read(b, byteOrder, &value[i].Denominator) - log.PanicIf(err) - } - - return value, nil -} diff --git a/vendor/github.com/dsoprea/go-exif/tag_type.go b/vendor/github.com/dsoprea/go-exif/tag_type.go deleted file mode 100644 index e53b1c4985..0000000000 --- a/vendor/github.com/dsoprea/go-exif/tag_type.go +++ /dev/null @@ -1,397 +0,0 @@ -package exif - -// NOTE(dustin): Most of this file encapsulates deprecated functionality and awaits being dumped in a future release. - -import ( - "fmt" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -type TagType struct { - tagType TagTypePrimitive - name string - byteOrder binary.ByteOrder -} - -func NewTagType(tagType TagTypePrimitive, byteOrder binary.ByteOrder) TagType { - name, found := TypeNames[tagType] - if found == false { - log.Panicf("tag-type not valid: 0x%04x", tagType) - } - - return TagType{ - tagType: tagType, - name: name, - byteOrder: byteOrder, - } -} - -func (tt TagType) String() string { - return fmt.Sprintf("TagType", tt.name) -} - -func (tt TagType) Name() string { - return tt.name -} - -func (tt TagType) Type() TagTypePrimitive { - return tt.tagType -} - -func (tt TagType) ByteOrder() binary.ByteOrder { - return tt.byteOrder -} - -func (tt TagType) Size() int { - - // DEPRECATED(dustin): `(TagTypePrimitive).Size()` should be used, directly. - - return tt.Type().Size() -} - -// valueIsEmbedded will return a boolean indicating whether the value should be -// found directly within the IFD entry or an offset to somewhere else. -func (tt TagType) valueIsEmbedded(unitCount uint32) bool { - return (tt.tagType.Size() * int(unitCount)) <= 4 -} - -func (tt TagType) readRawEncoded(valueContext ValueContext) (rawBytes []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - unitSizeRaw := uint32(tt.tagType.Size()) - - if tt.valueIsEmbedded(valueContext.UnitCount()) == true { - byteLength := unitSizeRaw * valueContext.UnitCount() - return valueContext.RawValueOffset()[:byteLength], nil - } else { - return valueContext.AddressableData()[valueContext.ValueOffset() : valueContext.ValueOffset()+valueContext.UnitCount()*unitSizeRaw], nil - } -} - -func (tt TagType) ParseBytes(data []byte, unitCount uint32) (value []uint8, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseBytes()` should be used. - - value, err = parser.ParseBytes(data, unitCount) - log.PanicIf(err) - - return value, nil -} - -// ParseAscii returns a string and auto-strips the trailing NUL character. -func (tt TagType) ParseAscii(data []byte, unitCount uint32) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseAscii()` should be used. - - value, err = parser.ParseAscii(data, unitCount) - log.PanicIf(err) - - return value, nil -} - -// ParseAsciiNoNul returns a string without any consideration for a trailing NUL -// character. -func (tt TagType) ParseAsciiNoNul(data []byte, unitCount uint32) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseAsciiNoNul()` should be used. - - value, err = parser.ParseAsciiNoNul(data, unitCount) - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ParseShorts(data []byte, unitCount uint32) (value []uint16, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseShorts()` should be used. - - value, err = parser.ParseShorts(data, unitCount, tt.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ParseLongs(data []byte, unitCount uint32) (value []uint32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseLongs()` should be used. - - value, err = parser.ParseLongs(data, unitCount, tt.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ParseRationals(data []byte, unitCount uint32) (value []Rational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseRationals()` should be used. - - value, err = parser.ParseRationals(data, unitCount, tt.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ParseSignedLongs(data []byte, unitCount uint32) (value []int32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseSignedLongs()` should be used. - - value, err = parser.ParseSignedLongs(data, unitCount, tt.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ParseSignedRationals(data []byte, unitCount uint32) (value []SignedRational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(*Parser).ParseSignedRationals()` should be used. - - value, err = parser.ParseSignedRationals(data, unitCount, tt.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadByteValues(valueContext ValueContext) (value []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadBytes()` should be used. - - value, err = valueContext.ReadBytes() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadAsciiValue(valueContext ValueContext) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadAscii()` should be used. - - value, err = valueContext.ReadAscii() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadAsciiNoNulValue(valueContext ValueContext) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadAsciiNoNul()` should be used. - - value, err = valueContext.ReadAsciiNoNul() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadShortValues(valueContext ValueContext) (value []uint16, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadShorts()` should be used. - - value, err = valueContext.ReadShorts() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadLongValues(valueContext ValueContext) (value []uint32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadLongs()` should be used. - - value, err = valueContext.ReadLongs() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadRationalValues(valueContext ValueContext) (value []Rational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadRationals()` should be used. - - value, err = valueContext.ReadRationals() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadSignedLongValues(valueContext ValueContext) (value []int32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadSignedLongs()` should be used. - - value, err = valueContext.ReadSignedLongs() - log.PanicIf(err) - - return value, nil -} - -func (tt TagType) ReadSignedRationalValues(valueContext ValueContext) (value []SignedRational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).ReadSignedRationals()` should be used. - - value, err = valueContext.ReadSignedRationals() - log.PanicIf(err) - - return value, nil -} - -// ResolveAsString resolves the given value and returns a flat string. -// -// Where the type is not ASCII, `justFirst` indicates whether to just stringify -// the first item in the slice (or return an empty string if the slice is -// empty). -// -// Since this method lacks the information to process unknown-type tags (e.g. -// byte-order, tag-ID, IFD type), it will return an error if attempted. See -// `Undefined()`. -func (tt TagType) ResolveAsString(valueContext ValueContext, justFirst bool) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if justFirst == true { - value, err = valueContext.FormatFirst() - log.PanicIf(err) - } else { - value, err = valueContext.Format() - log.PanicIf(err) - } - - return value, nil -} - -// Resolve knows how to resolve the given value. -// -// Since this method lacks the information to process unknown-type tags (e.g. -// byte-order, tag-ID, IFD type), it will return an error if attempted. See -// `Undefined()`. -func (tt TagType) Resolve(valueContext *ValueContext) (values interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `(ValueContext).Values()` should be used. - - values, err = valueContext.Values() - log.PanicIf(err) - - return values, nil -} - -// Encode knows how to encode the given value to a byte slice. -func (tt TagType) Encode(value interface{}) (encoded []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ve := NewValueEncoder(tt.byteOrder) - - ed, err := ve.EncodeWithType(tt, value) - log.PanicIf(err) - - return ed.Encoded, err -} - -func (tt TagType) FromString(valueString string) (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // DEPRECATED(dustin): `EncodeStringToBytes()` should be used. - - value, err = EncodeStringToBytes(tt.tagType, valueString) - log.PanicIf(err) - - return value, nil -} diff --git a/vendor/github.com/dsoprea/go-exif/tags.go b/vendor/github.com/dsoprea/go-exif/tags.go deleted file mode 100644 index 7f7e515553..0000000000 --- a/vendor/github.com/dsoprea/go-exif/tags.go +++ /dev/null @@ -1,229 +0,0 @@ -package exif - -import ( - "fmt" - - "github.com/dsoprea/go-logging" - "gopkg.in/yaml.v2" -) - -const ( - // IFD1 - - ThumbnailOffsetTagId = 0x0201 - ThumbnailSizeTagId = 0x0202 - - // Exif - - TagVersionId = 0x0000 - - TagLatitudeId = 0x0002 - TagLatitudeRefId = 0x0001 - TagLongitudeId = 0x0004 - TagLongitudeRefId = 0x0003 - - TagTimestampId = 0x0007 - TagDatestampId = 0x001d - - TagAltitudeId = 0x0006 - TagAltitudeRefId = 0x0005 -) - -var ( - // tagsWithoutAlignment is a tag-lookup for tags whose value size won't - // necessarily be a multiple of its tag-type. - tagsWithoutAlignment = map[uint16]struct{}{ - // The thumbnail offset is stored as a long, but its data is a binary - // blob (not a slice of longs). - ThumbnailOffsetTagId: {}, - } -) - -var ( - tagsLogger = log.NewLogger("exif.tags") -) - -// File structures. - -type encodedTag struct { - // id is signed, here, because YAML doesn't have enough information to - // support unsigned. - Id int `yaml:"id"` - Name string `yaml:"name"` - TypeName string `yaml:"type_name"` -} - -// Indexing structures. - -type IndexedTag struct { - Id uint16 - Name string - IfdPath string - Type TagTypePrimitive -} - -func (it *IndexedTag) String() string { - return fmt.Sprintf("TAG", it.Id, it.Name, it.IfdPath) -} - -func (it *IndexedTag) IsName(ifdPath, name string) bool { - return it.Name == name && it.IfdPath == ifdPath -} - -func (it *IndexedTag) Is(ifdPath string, id uint16) bool { - return it.Id == id && it.IfdPath == ifdPath -} - -type TagIndex struct { - tagsByIfd map[string]map[uint16]*IndexedTag - tagsByIfdR map[string]map[string]*IndexedTag -} - -func NewTagIndex() *TagIndex { - ti := new(TagIndex) - - ti.tagsByIfd = make(map[string]map[uint16]*IndexedTag) - ti.tagsByIfdR = make(map[string]map[string]*IndexedTag) - - return ti -} - -func (ti *TagIndex) Add(it *IndexedTag) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // Store by ID. - - family, found := ti.tagsByIfd[it.IfdPath] - if found == false { - family = make(map[uint16]*IndexedTag) - ti.tagsByIfd[it.IfdPath] = family - } - - if _, found := family[it.Id]; found == true { - log.Panicf("tag-ID defined more than once for IFD [%s]: (%02x)", it.IfdPath, it.Id) - } - - family[it.Id] = it - - // Store by name. - - familyR, found := ti.tagsByIfdR[it.IfdPath] - if found == false { - familyR = make(map[string]*IndexedTag) - ti.tagsByIfdR[it.IfdPath] = familyR - } - - if _, found := familyR[it.Name]; found == true { - log.Panicf("tag-name defined more than once for IFD [%s]: (%s)", it.IfdPath, it.Name) - } - - familyR[it.Name] = it - - return nil -} - -// Get returns information about the non-IFD tag. -func (ti *TagIndex) Get(ifdPath string, id uint16) (it *IndexedTag, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if len(ti.tagsByIfd) == 0 { - err := LoadStandardTags(ti) - log.PanicIf(err) - } - - family, found := ti.tagsByIfd[ifdPath] - if found == false { - log.Panic(ErrTagNotFound) - } - - it, found = family[id] - if found == false { - log.Panic(ErrTagNotFound) - } - - return it, nil -} - -// Get returns information about the non-IFD tag. -func (ti *TagIndex) GetWithName(ifdPath string, name string) (it *IndexedTag, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if len(ti.tagsByIfdR) == 0 { - err := LoadStandardTags(ti) - log.PanicIf(err) - } - - it, found := ti.tagsByIfdR[ifdPath][name] - if found != true { - log.Panic(ErrTagNotFound) - } - - return it, nil -} - -// LoadStandardTags registers the tags that all devices/applications should -// support. -func LoadStandardTags(ti *TagIndex) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // Read static data. - - encodedIfds := make(map[string][]encodedTag) - - err = yaml.Unmarshal([]byte(tagsYaml), encodedIfds) - log.PanicIf(err) - - // Load structure. - - count := 0 - for ifdPath, tags := range encodedIfds { - for _, tagInfo := range tags { - tagId := uint16(tagInfo.Id) - tagName := tagInfo.Name - tagTypeName := tagInfo.TypeName - - // TODO(dustin): !! Non-standard types, but found in real data. Ignore for right now. - if tagTypeName == "SSHORT" || tagTypeName == "FLOAT" || tagTypeName == "DOUBLE" { - continue - } - - tagTypeId, found := TypeNamesR[tagTypeName] - if found == false { - log.Panicf("type [%s] for [%s] not valid", tagTypeName, tagName) - continue - } - - it := &IndexedTag{ - IfdPath: ifdPath, - Id: tagId, - Name: tagName, - Type: tagTypeId, - } - - err = ti.Add(it) - log.PanicIf(err) - - count++ - } - } - - tagsLogger.Debugf(nil, "(%d) tags loaded.", count) - - return nil -} diff --git a/vendor/github.com/dsoprea/go-exif/tags_data.go b/vendor/github.com/dsoprea/go-exif/tags_data.go deleted file mode 100644 index 64ec458d31..0000000000 --- a/vendor/github.com/dsoprea/go-exif/tags_data.go +++ /dev/null @@ -1,951 +0,0 @@ -package exif - -var ( - // From assets/tags.yaml . Needs to be here so it's embedded in the binary. - tagsYaml = ` -# Notes: -# -# This file was produced from http://www.exiv2.org/tags.html, using the included -# tool, though that document appears to have some duplicates when all IDs are -# supposed to be unique (EXIF information only has IDs, not IFDs; IFDs are -# determined by our pre-existing knowledge of those tags). -# -# The webpage that we've produced this file from appears to indicate that -# ImageWidth is represented by both 0x0100 and 0x0001 depending on whether the -# encoding is RGB or YCbCr. -IFD/Exif: -- id: 0x829a - name: ExposureTime - type_name: RATIONAL -- id: 0x829d - name: FNumber - type_name: RATIONAL -- id: 0x8822 - name: ExposureProgram - type_name: SHORT -- id: 0x8824 - name: SpectralSensitivity - type_name: ASCII -- id: 0x8827 - name: ISOSpeedRatings - type_name: SHORT -- id: 0x8828 - name: OECF - type_name: UNDEFINED -- id: 0x8830 - name: SensitivityType - type_name: SHORT -- id: 0x8831 - name: StandardOutputSensitivity - type_name: LONG -- id: 0x8832 - name: RecommendedExposureIndex - type_name: LONG -- id: 0x8833 - name: ISOSpeed - type_name: LONG -- id: 0x8834 - name: ISOSpeedLatitudeyyy - type_name: LONG -- id: 0x8835 - name: ISOSpeedLatitudezzz - type_name: LONG -- id: 0x9000 - name: ExifVersion - type_name: UNDEFINED -- id: 0x9003 - name: DateTimeOriginal - type_name: ASCII -- id: 0x9004 - name: DateTimeDigitized - type_name: ASCII -- id: 0x9101 - name: ComponentsConfiguration - type_name: UNDEFINED -- id: 0x9102 - name: CompressedBitsPerPixel - type_name: RATIONAL -- id: 0x9201 - name: ShutterSpeedValue - type_name: SRATIONAL -- id: 0x9202 - name: ApertureValue - type_name: RATIONAL -- id: 0x9203 - name: BrightnessValue - type_name: SRATIONAL -- id: 0x9204 - name: ExposureBiasValue - type_name: SRATIONAL -- id: 0x9205 - name: MaxApertureValue - type_name: RATIONAL -- id: 0x9206 - name: SubjectDistance - type_name: RATIONAL -- id: 0x9207 - name: MeteringMode - type_name: SHORT -- id: 0x9208 - name: LightSource - type_name: SHORT -- id: 0x9209 - name: Flash - type_name: SHORT -- id: 0x920a - name: FocalLength - type_name: RATIONAL -- id: 0x9214 - name: SubjectArea - type_name: SHORT -- id: 0x927c - name: MakerNote - type_name: UNDEFINED -- id: 0x9286 - name: UserComment - type_name: UNDEFINED -- id: 0x9290 - name: SubSecTime - type_name: ASCII -- id: 0x9291 - name: SubSecTimeOriginal - type_name: ASCII -- id: 0x9292 - name: SubSecTimeDigitized - type_name: ASCII -- id: 0xa000 - name: FlashpixVersion - type_name: UNDEFINED -- id: 0xa001 - name: ColorSpace - type_name: SHORT -- id: 0xa002 - name: PixelXDimension - type_name: LONG -- id: 0xa003 - name: PixelYDimension - type_name: LONG -- id: 0xa004 - name: RelatedSoundFile - type_name: ASCII -- id: 0xa005 - name: InteroperabilityTag - type_name: LONG -- id: 0xa20b - name: FlashEnergy - type_name: RATIONAL -- id: 0xa20c - name: SpatialFrequencyResponse - type_name: UNDEFINED -- id: 0xa20e - name: FocalPlaneXResolution - type_name: RATIONAL -- id: 0xa20f - name: FocalPlaneYResolution - type_name: RATIONAL -- id: 0xa210 - name: FocalPlaneResolutionUnit - type_name: SHORT -- id: 0xa214 - name: SubjectLocation - type_name: SHORT -- id: 0xa215 - name: ExposureIndex - type_name: RATIONAL -- id: 0xa217 - name: SensingMethod - type_name: SHORT -- id: 0xa300 - name: FileSource - type_name: UNDEFINED -- id: 0xa301 - name: SceneType - type_name: UNDEFINED -- id: 0xa302 - name: CFAPattern - type_name: UNDEFINED -- id: 0xa401 - name: CustomRendered - type_name: SHORT -- id: 0xa402 - name: ExposureMode - type_name: SHORT -- id: 0xa403 - name: WhiteBalance - type_name: SHORT -- id: 0xa404 - name: DigitalZoomRatio - type_name: RATIONAL -- id: 0xa405 - name: FocalLengthIn35mmFilm - type_name: SHORT -- id: 0xa406 - name: SceneCaptureType - type_name: SHORT -- id: 0xa407 - name: GainControl - type_name: SHORT -- id: 0xa408 - name: Contrast - type_name: SHORT -- id: 0xa409 - name: Saturation - type_name: SHORT -- id: 0xa40a - name: Sharpness - type_name: SHORT -- id: 0xa40b - name: DeviceSettingDescription - type_name: UNDEFINED -- id: 0xa40c - name: SubjectDistanceRange - type_name: SHORT -- id: 0xa420 - name: ImageUniqueID - type_name: ASCII -- id: 0xa430 - name: CameraOwnerName - type_name: ASCII -- id: 0xa431 - name: BodySerialNumber - type_name: ASCII -- id: 0xa432 - name: LensSpecification - type_name: RATIONAL -- id: 0xa433 - name: LensMake - type_name: ASCII -- id: 0xa434 - name: LensModel - type_name: ASCII -- id: 0xa435 - name: LensSerialNumber - type_name: ASCII -IFD/GPSInfo: -- id: 0x0000 - name: GPSVersionID - type_name: BYTE -- id: 0x0001 - name: GPSLatitudeRef - type_name: ASCII -- id: 0x0002 - name: GPSLatitude - type_name: RATIONAL -- id: 0x0003 - name: GPSLongitudeRef - type_name: ASCII -- id: 0x0004 - name: GPSLongitude - type_name: RATIONAL -- id: 0x0005 - name: GPSAltitudeRef - type_name: BYTE -- id: 0x0006 - name: GPSAltitude - type_name: RATIONAL -- id: 0x0007 - name: GPSTimeStamp - type_name: RATIONAL -- id: 0x0008 - name: GPSSatellites - type_name: ASCII -- id: 0x0009 - name: GPSStatus - type_name: ASCII -- id: 0x000a - name: GPSMeasureMode - type_name: ASCII -- id: 0x000b - name: GPSDOP - type_name: RATIONAL -- id: 0x000c - name: GPSSpeedRef - type_name: ASCII -- id: 0x000d - name: GPSSpeed - type_name: RATIONAL -- id: 0x000e - name: GPSTrackRef - type_name: ASCII -- id: 0x000f - name: GPSTrack - type_name: RATIONAL -- id: 0x0010 - name: GPSImgDirectionRef - type_name: ASCII -- id: 0x0011 - name: GPSImgDirection - type_name: RATIONAL -- id: 0x0012 - name: GPSMapDatum - type_name: ASCII -- id: 0x0013 - name: GPSDestLatitudeRef - type_name: ASCII -- id: 0x0014 - name: GPSDestLatitude - type_name: RATIONAL -- id: 0x0015 - name: GPSDestLongitudeRef - type_name: ASCII -- id: 0x0016 - name: GPSDestLongitude - type_name: RATIONAL -- id: 0x0017 - name: GPSDestBearingRef - type_name: ASCII -- id: 0x0018 - name: GPSDestBearing - type_name: RATIONAL -- id: 0x0019 - name: GPSDestDistanceRef - type_name: ASCII -- id: 0x001a - name: GPSDestDistance - type_name: RATIONAL -- id: 0x001b - name: GPSProcessingMethod - type_name: UNDEFINED -- id: 0x001c - name: GPSAreaInformation - type_name: UNDEFINED -- id: 0x001d - name: GPSDateStamp - type_name: ASCII -- id: 0x001e - name: GPSDifferential - type_name: SHORT -IFD: -- id: 0x000b - name: ProcessingSoftware - type_name: ASCII -- id: 0x00fe - name: NewSubfileType - type_name: LONG -- id: 0x00ff - name: SubfileType - type_name: SHORT -- id: 0x0100 - name: ImageWidth - type_name: LONG -- id: 0x0101 - name: ImageLength - type_name: LONG -- id: 0x0102 - name: BitsPerSample - type_name: SHORT -- id: 0x0103 - name: Compression - type_name: SHORT -- id: 0x0106 - name: PhotometricInterpretation - type_name: SHORT -- id: 0x0107 - name: Thresholding - type_name: SHORT -- id: 0x0108 - name: CellWidth - type_name: SHORT -- id: 0x0109 - name: CellLength - type_name: SHORT -- id: 0x010a - name: FillOrder - type_name: SHORT -- id: 0x010d - name: DocumentName - type_name: ASCII -- id: 0x010e - name: ImageDescription - type_name: ASCII -- id: 0x010f - name: Make - type_name: ASCII -- id: 0x0110 - name: Model - type_name: ASCII -- id: 0x0111 - name: StripOffsets - type_name: LONG -- id: 0x0112 - name: Orientation - type_name: SHORT -- id: 0x0115 - name: SamplesPerPixel - type_name: SHORT -- id: 0x0116 - name: RowsPerStrip - type_name: LONG -- id: 0x0117 - name: StripByteCounts - type_name: LONG -- id: 0x011a - name: XResolution - type_name: RATIONAL -- id: 0x011b - name: YResolution - type_name: RATIONAL -- id: 0x011c - name: PlanarConfiguration - type_name: SHORT -- id: 0x0122 - name: GrayResponseUnit - type_name: SHORT -- id: 0x0123 - name: GrayResponseCurve - type_name: SHORT -- id: 0x0124 - name: T4Options - type_name: LONG -- id: 0x0125 - name: T6Options - type_name: LONG -- id: 0x0128 - name: ResolutionUnit - type_name: SHORT -- id: 0x0129 - name: PageNumber - type_name: SHORT -- id: 0x012d - name: TransferFunction - type_name: SHORT -- id: 0x0131 - name: Software - type_name: ASCII -- id: 0x0132 - name: DateTime - type_name: ASCII -- id: 0x013b - name: Artist - type_name: ASCII -- id: 0x013c - name: HostComputer - type_name: ASCII -- id: 0x013d - name: Predictor - type_name: SHORT -- id: 0x013e - name: WhitePoint - type_name: RATIONAL -- id: 0x013f - name: PrimaryChromaticities - type_name: RATIONAL -- id: 0x0140 - name: ColorMap - type_name: SHORT -- id: 0x0141 - name: HalftoneHints - type_name: SHORT -- id: 0x0142 - name: TileWidth - type_name: SHORT -- id: 0x0143 - name: TileLength - type_name: SHORT -- id: 0x0144 - name: TileOffsets - type_name: SHORT -- id: 0x0145 - name: TileByteCounts - type_name: SHORT -- id: 0x014a - name: SubIFDs - type_name: LONG -- id: 0x014c - name: InkSet - type_name: SHORT -- id: 0x014d - name: InkNames - type_name: ASCII -- id: 0x014e - name: NumberOfInks - type_name: SHORT -- id: 0x0150 - name: DotRange - type_name: BYTE -- id: 0x0151 - name: TargetPrinter - type_name: ASCII -- id: 0x0152 - name: ExtraSamples - type_name: SHORT -- id: 0x0153 - name: SampleFormat - type_name: SHORT -- id: 0x0154 - name: SMinSampleValue - type_name: SHORT -- id: 0x0155 - name: SMaxSampleValue - type_name: SHORT -- id: 0x0156 - name: TransferRange - type_name: SHORT -- id: 0x0157 - name: ClipPath - type_name: BYTE -- id: 0x0158 - name: XClipPathUnits - type_name: SSHORT -- id: 0x0159 - name: YClipPathUnits - type_name: SSHORT -- id: 0x015a - name: Indexed - type_name: SHORT -- id: 0x015b - name: JPEGTables - type_name: UNDEFINED -- id: 0x015f - name: OPIProxy - type_name: SHORT -- id: 0x0200 - name: JPEGProc - type_name: LONG -- id: 0x0201 - name: JPEGInterchangeFormat - type_name: LONG -- id: 0x0202 - name: JPEGInterchangeFormatLength - type_name: LONG -- id: 0x0203 - name: JPEGRestartInterval - type_name: SHORT -- id: 0x0205 - name: JPEGLosslessPredictors - type_name: SHORT -- id: 0x0206 - name: JPEGPointTransforms - type_name: SHORT -- id: 0x0207 - name: JPEGQTables - type_name: LONG -- id: 0x0208 - name: JPEGDCTables - type_name: LONG -- id: 0x0209 - name: JPEGACTables - type_name: LONG -- id: 0x0211 - name: YCbCrCoefficients - type_name: RATIONAL -- id: 0x0212 - name: YCbCrSubSampling - type_name: SHORT -- id: 0x0213 - name: YCbCrPositioning - type_name: SHORT -- id: 0x0214 - name: ReferenceBlackWhite - type_name: RATIONAL -- id: 0x02bc - name: XMLPacket - type_name: BYTE -- id: 0x4746 - name: Rating - type_name: SHORT -- id: 0x4749 - name: RatingPercent - type_name: SHORT -- id: 0x800d - name: ImageID - type_name: ASCII -- id: 0x828d - name: CFARepeatPatternDim - type_name: SHORT -- id: 0x828e - name: CFAPattern - type_name: BYTE -- id: 0x828f - name: BatteryLevel - type_name: RATIONAL -- id: 0x8298 - name: Copyright - type_name: ASCII -- id: 0x829a - name: ExposureTime - type_name: RATIONAL -- id: 0x829d - name: FNumber - type_name: RATIONAL -- id: 0x83bb - name: IPTCNAA - type_name: LONG -- id: 0x8649 - name: ImageResources - type_name: BYTE -- id: 0x8769 - name: ExifTag - type_name: LONG -- id: 0x8773 - name: InterColorProfile - type_name: UNDEFINED -- id: 0x8822 - name: ExposureProgram - type_name: SHORT -- id: 0x8824 - name: SpectralSensitivity - type_name: ASCII -- id: 0x8825 - name: GPSTag - type_name: LONG -- id: 0x8827 - name: ISOSpeedRatings - type_name: SHORT -- id: 0x8828 - name: OECF - type_name: UNDEFINED -- id: 0x8829 - name: Interlace - type_name: SHORT -- id: 0x882a - name: TimeZoneOffset - type_name: SSHORT -- id: 0x882b - name: SelfTimerMode - type_name: SHORT -- id: 0x9003 - name: DateTimeOriginal - type_name: ASCII -- id: 0x9102 - name: CompressedBitsPerPixel - type_name: RATIONAL -- id: 0x9201 - name: ShutterSpeedValue - type_name: SRATIONAL -- id: 0x9202 - name: ApertureValue - type_name: RATIONAL -- id: 0x9203 - name: BrightnessValue - type_name: SRATIONAL -- id: 0x9204 - name: ExposureBiasValue - type_name: SRATIONAL -- id: 0x9205 - name: MaxApertureValue - type_name: RATIONAL -- id: 0x9206 - name: SubjectDistance - type_name: SRATIONAL -- id: 0x9207 - name: MeteringMode - type_name: SHORT -- id: 0x9208 - name: LightSource - type_name: SHORT -- id: 0x9209 - name: Flash - type_name: SHORT -- id: 0x920a - name: FocalLength - type_name: RATIONAL -- id: 0x920b - name: FlashEnergy - type_name: RATIONAL -- id: 0x920c - name: SpatialFrequencyResponse - type_name: UNDEFINED -- id: 0x920d - name: Noise - type_name: UNDEFINED -- id: 0x920e - name: FocalPlaneXResolution - type_name: RATIONAL -- id: 0x920f - name: FocalPlaneYResolution - type_name: RATIONAL -- id: 0x9210 - name: FocalPlaneResolutionUnit - type_name: SHORT -- id: 0x9211 - name: ImageNumber - type_name: LONG -- id: 0x9212 - name: SecurityClassification - type_name: ASCII -- id: 0x9213 - name: ImageHistory - type_name: ASCII -- id: 0x9214 - name: SubjectLocation - type_name: SHORT -- id: 0x9215 - name: ExposureIndex - type_name: RATIONAL -- id: 0x9216 - name: TIFFEPStandardID - type_name: BYTE -- id: 0x9217 - name: SensingMethod - type_name: SHORT -- id: 0x9c9b - name: XPTitle - type_name: BYTE -- id: 0x9c9c - name: XPComment - type_name: BYTE -- id: 0x9c9d - name: XPAuthor - type_name: BYTE -- id: 0x9c9e - name: XPKeywords - type_name: BYTE -- id: 0x9c9f - name: XPSubject - type_name: BYTE -- id: 0xc4a5 - name: PrintImageMatching - type_name: UNDEFINED -- id: 0xc612 - name: DNGVersion - type_name: BYTE -- id: 0xc613 - name: DNGBackwardVersion - type_name: BYTE -- id: 0xc614 - name: UniqueCameraModel - type_name: ASCII -- id: 0xc615 - name: LocalizedCameraModel - type_name: BYTE -- id: 0xc616 - name: CFAPlaneColor - type_name: BYTE -- id: 0xc617 - name: CFALayout - type_name: SHORT -- id: 0xc618 - name: LinearizationTable - type_name: SHORT -- id: 0xc619 - name: BlackLevelRepeatDim - type_name: SHORT -- id: 0xc61a - name: BlackLevel - type_name: RATIONAL -- id: 0xc61b - name: BlackLevelDeltaH - type_name: SRATIONAL -- id: 0xc61c - name: BlackLevelDeltaV - type_name: SRATIONAL -- id: 0xc61d - name: WhiteLevel - type_name: SHORT -- id: 0xc61e - name: DefaultScale - type_name: RATIONAL -- id: 0xc61f - name: DefaultCropOrigin - type_name: SHORT -- id: 0xc620 - name: DefaultCropSize - type_name: SHORT -- id: 0xc621 - name: ColorMatrix1 - type_name: SRATIONAL -- id: 0xc622 - name: ColorMatrix2 - type_name: SRATIONAL -- id: 0xc623 - name: CameraCalibration1 - type_name: SRATIONAL -- id: 0xc624 - name: CameraCalibration2 - type_name: SRATIONAL -- id: 0xc625 - name: ReductionMatrix1 - type_name: SRATIONAL -- id: 0xc626 - name: ReductionMatrix2 - type_name: SRATIONAL -- id: 0xc627 - name: AnalogBalance - type_name: RATIONAL -- id: 0xc628 - name: AsShotNeutral - type_name: SHORT -- id: 0xc629 - name: AsShotWhiteXY - type_name: RATIONAL -- id: 0xc62a - name: BaselineExposure - type_name: SRATIONAL -- id: 0xc62b - name: BaselineNoise - type_name: RATIONAL -- id: 0xc62c - name: BaselineSharpness - type_name: RATIONAL -- id: 0xc62d - name: BayerGreenSplit - type_name: LONG -- id: 0xc62e - name: LinearResponseLimit - type_name: RATIONAL -- id: 0xc62f - name: CameraSerialNumber - type_name: ASCII -- id: 0xc630 - name: LensInfo - type_name: RATIONAL -- id: 0xc631 - name: ChromaBlurRadius - type_name: RATIONAL -- id: 0xc632 - name: AntiAliasStrength - type_name: RATIONAL -- id: 0xc633 - name: ShadowScale - type_name: SRATIONAL -- id: 0xc634 - name: DNGPrivateData - type_name: BYTE -- id: 0xc635 - name: MakerNoteSafety - type_name: SHORT -- id: 0xc65a - name: CalibrationIlluminant1 - type_name: SHORT -- id: 0xc65b - name: CalibrationIlluminant2 - type_name: SHORT -- id: 0xc65c - name: BestQualityScale - type_name: RATIONAL -- id: 0xc65d - name: RawDataUniqueID - type_name: BYTE -- id: 0xc68b - name: OriginalRawFileName - type_name: BYTE -- id: 0xc68c - name: OriginalRawFileData - type_name: UNDEFINED -- id: 0xc68d - name: ActiveArea - type_name: SHORT -- id: 0xc68e - name: MaskedAreas - type_name: SHORT -- id: 0xc68f - name: AsShotICCProfile - type_name: UNDEFINED -- id: 0xc690 - name: AsShotPreProfileMatrix - type_name: SRATIONAL -- id: 0xc691 - name: CurrentICCProfile - type_name: UNDEFINED -- id: 0xc692 - name: CurrentPreProfileMatrix - type_name: SRATIONAL -- id: 0xc6bf - name: ColorimetricReference - type_name: SHORT -- id: 0xc6f3 - name: CameraCalibrationSignature - type_name: BYTE -- id: 0xc6f4 - name: ProfileCalibrationSignature - type_name: BYTE -- id: 0xc6f6 - name: AsShotProfileName - type_name: BYTE -- id: 0xc6f7 - name: NoiseReductionApplied - type_name: RATIONAL -- id: 0xc6f8 - name: ProfileName - type_name: BYTE -- id: 0xc6f9 - name: ProfileHueSatMapDims - type_name: LONG -- id: 0xc6fa - name: ProfileHueSatMapData1 - type_name: FLOAT -- id: 0xc6fb - name: ProfileHueSatMapData2 - type_name: FLOAT -- id: 0xc6fc - name: ProfileToneCurve - type_name: FLOAT -- id: 0xc6fd - name: ProfileEmbedPolicy - type_name: LONG -- id: 0xc6fe - name: ProfileCopyright - type_name: BYTE -- id: 0xc714 - name: ForwardMatrix1 - type_name: SRATIONAL -- id: 0xc715 - name: ForwardMatrix2 - type_name: SRATIONAL -- id: 0xc716 - name: PreviewApplicationName - type_name: BYTE -- id: 0xc717 - name: PreviewApplicationVersion - type_name: BYTE -- id: 0xc718 - name: PreviewSettingsName - type_name: BYTE -- id: 0xc719 - name: PreviewSettingsDigest - type_name: BYTE -- id: 0xc71a - name: PreviewColorSpace - type_name: LONG -- id: 0xc71b - name: PreviewDateTime - type_name: ASCII -- id: 0xc71c - name: RawImageDigest - type_name: UNDEFINED -- id: 0xc71d - name: OriginalRawFileDigest - type_name: UNDEFINED -- id: 0xc71e - name: SubTileBlockSize - type_name: LONG -- id: 0xc71f - name: RowInterleaveFactor - type_name: LONG -- id: 0xc725 - name: ProfileLookTableDims - type_name: LONG -- id: 0xc726 - name: ProfileLookTableData - type_name: FLOAT -- id: 0xc740 - name: OpcodeList1 - type_name: UNDEFINED -- id: 0xc741 - name: OpcodeList2 - type_name: UNDEFINED -- id: 0xc74e - name: OpcodeList3 - type_name: UNDEFINED -- id: 0xc761 - name: NoiseProfile - type_name: DOUBLE -IFD/Exif/Iop: -- id: 0x0001 - name: InteroperabilityIndex - type_name: ASCII -- id: 0x0002 - name: InteroperabilityVersion - type_name: UNDEFINED -- id: 0x1000 - name: RelatedImageFileFormat - type_name: ASCII -- id: 0x1001 - name: RelatedImageWidth - type_name: LONG -- id: 0x1002 - name: RelatedImageLength - type_name: LONG -` -) diff --git a/vendor/github.com/dsoprea/go-exif/tags_undefined.go b/vendor/github.com/dsoprea/go-exif/tags_undefined.go deleted file mode 100644 index 63ba593233..0000000000 --- a/vendor/github.com/dsoprea/go-exif/tags_undefined.go +++ /dev/null @@ -1,417 +0,0 @@ -package exif - -import ( - "bytes" - "fmt" - "strings" - - "crypto/sha1" - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -const ( - UnparseableUnknownTagValuePlaceholder = "!UNKNOWN" -) - -// TODO(dustin): Rename "unknown" in symbol names to "undefined" in the next release. -// -// See https://github.com/dsoprea/go-exif/issues/27 . - -const ( - TagUnknownType_9298_UserComment_Encoding_ASCII = iota - TagUnknownType_9298_UserComment_Encoding_JIS = iota - TagUnknownType_9298_UserComment_Encoding_UNICODE = iota - TagUnknownType_9298_UserComment_Encoding_UNDEFINED = iota -) - -const ( - TagUnknownType_9101_ComponentsConfiguration_Channel_Y = 0x1 - TagUnknownType_9101_ComponentsConfiguration_Channel_Cb = 0x2 - TagUnknownType_9101_ComponentsConfiguration_Channel_Cr = 0x3 - TagUnknownType_9101_ComponentsConfiguration_Channel_R = 0x4 - TagUnknownType_9101_ComponentsConfiguration_Channel_G = 0x5 - TagUnknownType_9101_ComponentsConfiguration_Channel_B = 0x6 -) - -const ( - TagUnknownType_9101_ComponentsConfiguration_OTHER = iota - TagUnknownType_9101_ComponentsConfiguration_RGB = iota - TagUnknownType_9101_ComponentsConfiguration_YCBCR = iota -) - -var ( - TagUnknownType_9298_UserComment_Encoding_Names = map[int]string{ - TagUnknownType_9298_UserComment_Encoding_ASCII: "ASCII", - TagUnknownType_9298_UserComment_Encoding_JIS: "JIS", - TagUnknownType_9298_UserComment_Encoding_UNICODE: "UNICODE", - TagUnknownType_9298_UserComment_Encoding_UNDEFINED: "UNDEFINED", - } - - TagUnknownType_9298_UserComment_Encodings = map[int][]byte{ - TagUnknownType_9298_UserComment_Encoding_ASCII: {'A', 'S', 'C', 'I', 'I', 0, 0, 0}, - TagUnknownType_9298_UserComment_Encoding_JIS: {'J', 'I', 'S', 0, 0, 0, 0, 0}, - TagUnknownType_9298_UserComment_Encoding_UNICODE: {'U', 'n', 'i', 'c', 'o', 'd', 'e', 0}, - TagUnknownType_9298_UserComment_Encoding_UNDEFINED: {0, 0, 0, 0, 0, 0, 0, 0}, - } - - TagUnknownType_9101_ComponentsConfiguration_Names = map[int]string{ - TagUnknownType_9101_ComponentsConfiguration_OTHER: "OTHER", - TagUnknownType_9101_ComponentsConfiguration_RGB: "RGB", - TagUnknownType_9101_ComponentsConfiguration_YCBCR: "YCBCR", - } - - TagUnknownType_9101_ComponentsConfiguration_Configurations = map[int][]byte{ - TagUnknownType_9101_ComponentsConfiguration_RGB: { - TagUnknownType_9101_ComponentsConfiguration_Channel_R, - TagUnknownType_9101_ComponentsConfiguration_Channel_G, - TagUnknownType_9101_ComponentsConfiguration_Channel_B, - 0, - }, - - TagUnknownType_9101_ComponentsConfiguration_YCBCR: { - TagUnknownType_9101_ComponentsConfiguration_Channel_Y, - TagUnknownType_9101_ComponentsConfiguration_Channel_Cb, - TagUnknownType_9101_ComponentsConfiguration_Channel_Cr, - 0, - }, - } -) - -// TODO(dustin): Rename `UnknownTagValue` to `UndefinedTagValue`. - -type UnknownTagValue interface { - ValueBytes() ([]byte, error) -} - -// TODO(dustin): Rename `TagUnknownType_GeneralString` to `TagUnknownType_GeneralString`. - -type TagUnknownType_GeneralString string - -func (gs TagUnknownType_GeneralString) ValueBytes() (value []byte, err error) { - return []byte(gs), nil -} - -// TODO(dustin): Rename `TagUnknownType_9298_UserComment` to `TagUndefinedType_9298_UserComment`. - -type TagUnknownType_9298_UserComment struct { - EncodingType int - EncodingBytes []byte -} - -func (uc TagUnknownType_9298_UserComment) String() string { - var valuePhrase string - - if len(uc.EncodingBytes) <= 8 { - valuePhrase = fmt.Sprintf("%v", uc.EncodingBytes) - } else { - valuePhrase = fmt.Sprintf("%v...", uc.EncodingBytes[:8]) - } - - return fmt.Sprintf("UserComment", len(uc.EncodingBytes), TagUnknownType_9298_UserComment_Encoding_Names[uc.EncodingType], valuePhrase, len(uc.EncodingBytes)) -} - -func (uc TagUnknownType_9298_UserComment) ValueBytes() (value []byte, err error) { - encodingTypeBytes, found := TagUnknownType_9298_UserComment_Encodings[uc.EncodingType] - if found == false { - log.Panicf("encoding-type not valid for unknown-type tag 9298 (UserComment): (%d)", uc.EncodingType) - } - - value = make([]byte, len(uc.EncodingBytes)+8) - - copy(value[:8], encodingTypeBytes) - copy(value[8:], uc.EncodingBytes) - - return value, nil -} - -// TODO(dustin): Rename `TagUnknownType_927C_MakerNote` to `TagUndefinedType_927C_MakerNote`. - -type TagUnknownType_927C_MakerNote struct { - MakerNoteType []byte - MakerNoteBytes []byte -} - -func (mn TagUnknownType_927C_MakerNote) String() string { - parts := make([]string, 20) - for i, c := range mn.MakerNoteType { - parts[i] = fmt.Sprintf("%02x", c) - } - - h := sha1.New() - - _, err := h.Write(mn.MakerNoteBytes) - log.PanicIf(err) - - digest := h.Sum(nil) - - return fmt.Sprintf("MakerNote", strings.Join(parts, " "), len(mn.MakerNoteBytes), digest) -} - -func (uc TagUnknownType_927C_MakerNote) ValueBytes() (value []byte, err error) { - return uc.MakerNoteBytes, nil -} - -// TODO(dustin): Rename `TagUnknownType_9101_ComponentsConfiguration` to `TagUndefinedType_9101_ComponentsConfiguration`. - -type TagUnknownType_9101_ComponentsConfiguration struct { - ConfigurationId int - ConfigurationBytes []byte -} - -func (cc TagUnknownType_9101_ComponentsConfiguration) String() string { - return fmt.Sprintf("ComponentsConfiguration", TagUnknownType_9101_ComponentsConfiguration_Names[cc.ConfigurationId], cc.ConfigurationBytes) -} - -func (uc TagUnknownType_9101_ComponentsConfiguration) ValueBytes() (value []byte, err error) { - return uc.ConfigurationBytes, nil -} - -// TODO(dustin): Rename `EncodeUnknown_9286` to `EncodeUndefined_9286`. - -func EncodeUnknown_9286(uc TagUnknownType_9298_UserComment) (encoded []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - b := new(bytes.Buffer) - - encodingTypeBytes := TagUnknownType_9298_UserComment_Encodings[uc.EncodingType] - - _, err = b.Write(encodingTypeBytes) - log.PanicIf(err) - - _, err = b.Write(uc.EncodingBytes) - log.PanicIf(err) - - return b.Bytes(), nil -} - -type EncodeableUndefinedValue struct { - IfdPath string - TagId uint16 - Parameters interface{} -} - -func EncodeUndefined(ifdPath string, tagId uint16, value interface{}) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Finish implementing these. - if ifdPath == IfdPathStandardExif { - if tagId == 0x9286 { - encoded, err := EncodeUnknown_9286(value.(TagUnknownType_9298_UserComment)) - log.PanicIf(err) - - ed.Type = TypeUndefined - ed.Encoded = encoded - ed.UnitCount = uint32(len(encoded)) - - return ed, nil - } - } - - log.Panicf("undefined value not encodable: %s (0x%02x)", ifdPath, tagId) - - // Never called. - return EncodedData{}, nil -} - -// TODO(dustin): Rename `TagUnknownType_UnknownValue` to `TagUndefinedType_UnknownValue`. - -type TagUnknownType_UnknownValue []byte - -func (tutuv TagUnknownType_UnknownValue) String() string { - parts := make([]string, len(tutuv)) - for i, c := range tutuv { - parts[i] = fmt.Sprintf("%02x", c) - } - - h := sha1.New() - - _, err := h.Write(tutuv) - log.PanicIf(err) - - digest := h.Sum(nil) - - return fmt.Sprintf("Unknown", strings.Join(parts, " "), len(tutuv), digest) -} - -// UndefinedValue knows how to resolve the value for most unknown-type tags. -func UndefinedValue(ifdPath string, tagId uint16, valueContext interface{}, byteOrder binary.ByteOrder) (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): Stop exporting this. Use `(*ValueContext).Undefined()`. - - var valueContextPtr *ValueContext - - if vc, ok := valueContext.(*ValueContext); ok == true { - // Legacy usage. - - valueContextPtr = vc - } else { - // Standard usage. - - valueContextValue := valueContext.(ValueContext) - valueContextPtr = &valueContextValue - } - - typeLogger.Debugf(nil, "UndefinedValue: IFD-PATH=[%s] TAG-ID=(0x%02x)", ifdPath, tagId) - - if ifdPath == IfdPathStandardExif { - if tagId == 0x9000 { - // ExifVersion - - valueContextPtr.SetUnknownValueType(TypeAsciiNoNul) - - valueString, err := valueContextPtr.ReadAsciiNoNul() - log.PanicIf(err) - - return TagUnknownType_GeneralString(valueString), nil - } else if tagId == 0xa000 { - // FlashpixVersion - - valueContextPtr.SetUnknownValueType(TypeAsciiNoNul) - - valueString, err := valueContextPtr.ReadAsciiNoNul() - log.PanicIf(err) - - return TagUnknownType_GeneralString(valueString), nil - } else if tagId == 0x9286 { - // UserComment - - valueContextPtr.SetUnknownValueType(TypeByte) - - valueBytes, err := valueContextPtr.ReadBytes() - log.PanicIf(err) - - unknownUc := TagUnknownType_9298_UserComment{ - EncodingType: TagUnknownType_9298_UserComment_Encoding_UNDEFINED, - EncodingBytes: []byte{}, - } - - encoding := valueBytes[:8] - for encodingIndex, encodingBytes := range TagUnknownType_9298_UserComment_Encodings { - if bytes.Compare(encoding, encodingBytes) == 0 { - uc := TagUnknownType_9298_UserComment{ - EncodingType: encodingIndex, - EncodingBytes: valueBytes[8:], - } - - return uc, nil - } - } - - typeLogger.Warningf(nil, "User-comment encoding not valid. Returning 'unknown' type (the default).") - return unknownUc, nil - } else if tagId == 0x927c { - // MakerNote - // TODO(dustin): !! This is the Wild Wild West. This very well might be a child IFD, but any and all OEM's define their own formats. If we're going to be writing changes and this is complete EXIF (which may not have the first eight bytes), it might be fine. However, if these are just IFDs they'll be relative to the main EXIF, this will invalidate the MakerNote data for IFDs and any other implementations that use offsets unless we can interpret them all. It be best to return to this later and just exclude this from being written for now, though means a loss of a wealth of image metadata. - // -> We can also just blindly try to interpret as an IFD and just validate that it's looks good (maybe it will even have a 'next ifd' pointer that we can validate is 0x0). - - valueContextPtr.SetUnknownValueType(TypeByte) - - valueBytes, err := valueContextPtr.ReadBytes() - log.PanicIf(err) - - // TODO(dustin): Doesn't work, but here as an example. - // ie := NewIfdEnumerate(valueBytes, byteOrder) - - // // TODO(dustin): !! Validate types (might have proprietary types, but it might be worth splitting the list between valid and not valid; maybe fail if a certain proportion are invalid, or maybe aren't less then a certain small integer)? - // ii, err := ie.Collect(0x0) - - // for _, entry := range ii.RootIfd.Entries { - // fmt.Printf("ENTRY: 0x%02x %d\n", entry.TagId, entry.TagType) - // } - - mn := TagUnknownType_927C_MakerNote{ - MakerNoteType: valueBytes[:20], - - // MakerNoteBytes has the whole length of bytes. There's always - // the chance that the first 20 bytes includes actual data. - MakerNoteBytes: valueBytes, - } - - return mn, nil - } else if tagId == 0x9101 { - // ComponentsConfiguration - - valueContextPtr.SetUnknownValueType(TypeByte) - - valueBytes, err := valueContextPtr.ReadBytes() - log.PanicIf(err) - - for configurationId, configurationBytes := range TagUnknownType_9101_ComponentsConfiguration_Configurations { - if bytes.Compare(valueBytes, configurationBytes) == 0 { - cc := TagUnknownType_9101_ComponentsConfiguration{ - ConfigurationId: configurationId, - ConfigurationBytes: valueBytes, - } - - return cc, nil - } - } - - cc := TagUnknownType_9101_ComponentsConfiguration{ - ConfigurationId: TagUnknownType_9101_ComponentsConfiguration_OTHER, - ConfigurationBytes: valueBytes, - } - - return cc, nil - } - } else if ifdPath == IfdPathStandardGps { - if tagId == 0x001c { - // GPSAreaInformation - - valueContextPtr.SetUnknownValueType(TypeAsciiNoNul) - - valueString, err := valueContextPtr.ReadAsciiNoNul() - log.PanicIf(err) - - return TagUnknownType_GeneralString(valueString), nil - } else if tagId == 0x001b { - // GPSProcessingMethod - - valueContextPtr.SetUnknownValueType(TypeAsciiNoNul) - - valueString, err := valueContextPtr.ReadAsciiNoNul() - log.PanicIf(err) - - return TagUnknownType_GeneralString(valueString), nil - } - } else if ifdPath == IfdPathStandardExifIop { - if tagId == 0x0002 { - // InteropVersion - - valueContextPtr.SetUnknownValueType(TypeAsciiNoNul) - - valueString, err := valueContextPtr.ReadAsciiNoNul() - log.PanicIf(err) - - return TagUnknownType_GeneralString(valueString), nil - } - } - - // TODO(dustin): !! Still need to do: - // - // complex: 0xa302, 0xa20c, 0x8828 - // long: 0xa301, 0xa300 - // - // 0xa40b is device-specific and unhandled. - // - // See https://github.com/dsoprea/go-exif/issues/26. - - // We have no choice but to return the error. We have no way of knowing how - // much data there is without already knowing what data-type this tag is. - return nil, ErrUnhandledUnknownTypedTag -} diff --git a/vendor/github.com/dsoprea/go-exif/type.go b/vendor/github.com/dsoprea/go-exif/type.go deleted file mode 100644 index 2012b60672..0000000000 --- a/vendor/github.com/dsoprea/go-exif/type.go +++ /dev/null @@ -1,310 +0,0 @@ -package exif - -import ( - "errors" - "fmt" - "strconv" - "strings" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -type TagTypePrimitive uint16 - -func (typeType TagTypePrimitive) String() string { - return TypeNames[typeType] -} - -func (tagType TagTypePrimitive) Size() int { - if tagType == TypeByte { - return 1 - } else if tagType == TypeAscii || tagType == TypeAsciiNoNul { - return 1 - } else if tagType == TypeShort { - return 2 - } else if tagType == TypeLong { - return 4 - } else if tagType == TypeRational { - return 8 - } else if tagType == TypeSignedLong { - return 4 - } else if tagType == TypeSignedRational { - return 8 - } else { - log.Panicf("can not determine tag-value size for type (%d): [%s]", tagType, TypeNames[tagType]) - - // Never called. - return 0 - } -} - -const ( - TypeByte TagTypePrimitive = 1 - TypeAscii TagTypePrimitive = 2 - TypeShort TagTypePrimitive = 3 - TypeLong TagTypePrimitive = 4 - TypeRational TagTypePrimitive = 5 - TypeUndefined TagTypePrimitive = 7 - TypeSignedLong TagTypePrimitive = 9 - TypeSignedRational TagTypePrimitive = 10 - - // TypeAsciiNoNul is just a pseudo-type, for our own purposes. - TypeAsciiNoNul TagTypePrimitive = 0xf0 -) - -var ( - typeLogger = log.NewLogger("exif.type") -) - -var ( - // TODO(dustin): Rename TypeNames() to typeNames() and add getter. - TypeNames = map[TagTypePrimitive]string{ - TypeByte: "BYTE", - TypeAscii: "ASCII", - TypeShort: "SHORT", - TypeLong: "LONG", - TypeRational: "RATIONAL", - TypeUndefined: "UNDEFINED", - TypeSignedLong: "SLONG", - TypeSignedRational: "SRATIONAL", - - TypeAsciiNoNul: "_ASCII_NO_NUL", - } - - TypeNamesR = map[string]TagTypePrimitive{} -) - -var ( - // ErrNotEnoughData is used when there isn't enough data to accomodate what - // we're trying to parse (sizeof(type) * unit_count). - ErrNotEnoughData = errors.New("not enough data for type") - - // ErrWrongType is used when we try to parse anything other than the - // current type. - ErrWrongType = errors.New("wrong type, can not parse") - - // ErrUnhandledUnknownTag is used when we try to parse a tag that's - // recorded as an "unknown" type but not a documented tag (therefore - // leaving us not knowning how to read it). - ErrUnhandledUnknownTypedTag = errors.New("not a standard unknown-typed tag") -) - -type Rational struct { - Numerator uint32 - Denominator uint32 -} - -type SignedRational struct { - Numerator int32 - Denominator int32 -} - -func TagTypeSize(tagType TagTypePrimitive) int { - - // DEPRECATED(dustin): `(TagTypePrimitive).Size()` should be used, directly. - - return tagType.Size() -} - -// Format returns a stringified value for the given bytes. Automatically -// calculates count based on type size. -func Format(rawBytes []byte, tagType TagTypePrimitive, justFirst bool, byteOrder binary.ByteOrder) (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): !! Add tests - - typeSize := tagType.Size() - - if len(rawBytes)%typeSize != 0 { - log.Panicf("byte-count (%d) does not align for [%s] type with a size of (%d) bytes", len(rawBytes), TypeNames[tagType], typeSize) - } - - // unitCount is the calculated unit-count. This should equal the original - // value from the tag (pre-resolution). - unitCount := uint32(len(rawBytes) / typeSize) - - // Truncate the items if it's not bytes or a string and we just want the first. - - valueSuffix := "" - if justFirst == true && unitCount > 1 && tagType != TypeByte && tagType != TypeAscii && tagType != TypeAsciiNoNul { - unitCount = 1 - valueSuffix = "..." - } - - if tagType == TypeByte { - items, err := parser.ParseBytes(rawBytes, unitCount) - log.PanicIf(err) - - return DumpBytesToString(items), nil - } else if tagType == TypeAscii { - phrase, err := parser.ParseAscii(rawBytes, unitCount) - log.PanicIf(err) - - return phrase, nil - } else if tagType == TypeAsciiNoNul { - phrase, err := parser.ParseAsciiNoNul(rawBytes, unitCount) - log.PanicIf(err) - - return phrase, nil - } else if tagType == TypeShort { - items, err := parser.ParseShorts(rawBytes, unitCount, byteOrder) - log.PanicIf(err) - - if len(items) > 0 { - if justFirst == true { - return fmt.Sprintf("%v%s", items[0], valueSuffix), nil - } else { - return fmt.Sprintf("%v", items), nil - } - } else { - return "", nil - } - } else if tagType == TypeLong { - items, err := parser.ParseLongs(rawBytes, unitCount, byteOrder) - log.PanicIf(err) - - if len(items) > 0 { - if justFirst == true { - return fmt.Sprintf("%v%s", items[0], valueSuffix), nil - } else { - return fmt.Sprintf("%v", items), nil - } - } else { - return "", nil - } - } else if tagType == TypeRational { - items, err := parser.ParseRationals(rawBytes, unitCount, byteOrder) - log.PanicIf(err) - - if len(items) > 0 { - parts := make([]string, len(items)) - for i, r := range items { - parts[i] = fmt.Sprintf("%d/%d", r.Numerator, r.Denominator) - } - - if justFirst == true { - return fmt.Sprintf("%v%s", parts[0], valueSuffix), nil - } else { - return fmt.Sprintf("%v", parts), nil - } - } else { - return "", nil - } - } else if tagType == TypeSignedLong { - items, err := parser.ParseSignedLongs(rawBytes, unitCount, byteOrder) - log.PanicIf(err) - - if len(items) > 0 { - if justFirst == true { - return fmt.Sprintf("%v%s", items[0], valueSuffix), nil - } else { - return fmt.Sprintf("%v", items), nil - } - } else { - return "", nil - } - } else if tagType == TypeSignedRational { - items, err := parser.ParseSignedRationals(rawBytes, unitCount, byteOrder) - log.PanicIf(err) - - parts := make([]string, len(items)) - for i, r := range items { - parts[i] = fmt.Sprintf("%d/%d", r.Numerator, r.Denominator) - } - - if len(items) > 0 { - if justFirst == true { - return fmt.Sprintf("%v%s", parts[0], valueSuffix), nil - } else { - return fmt.Sprintf("%v", parts), nil - } - } else { - return "", nil - } - } else { - // Affects only "unknown" values, in general. - log.Panicf("value of type [%s] can not be formatted into string", tagType.String()) - - // Never called. - return "", nil - } -} - -func EncodeStringToBytes(tagType TagTypePrimitive, valueString string) (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if tagType == TypeUndefined { - // TODO(dustin): Circle back to this. - log.Panicf("undefined-type values are not supported") - } - - if tagType == TypeByte { - return []byte(valueString), nil - } else if tagType == TypeAscii || tagType == TypeAsciiNoNul { - // Whether or not we're putting an NUL on the end is only relevant for - // byte-level encoding. This function really just supports a user - // interface. - - return valueString, nil - } else if tagType == TypeShort { - n, err := strconv.ParseUint(valueString, 10, 16) - log.PanicIf(err) - - return uint16(n), nil - } else if tagType == TypeLong { - n, err := strconv.ParseUint(valueString, 10, 32) - log.PanicIf(err) - - return uint32(n), nil - } else if tagType == TypeRational { - parts := strings.SplitN(valueString, "/", 2) - - numerator, err := strconv.ParseUint(parts[0], 10, 32) - log.PanicIf(err) - - denominator, err := strconv.ParseUint(parts[1], 10, 32) - log.PanicIf(err) - - return Rational{ - Numerator: uint32(numerator), - Denominator: uint32(denominator), - }, nil - } else if tagType == TypeSignedLong { - n, err := strconv.ParseInt(valueString, 10, 32) - log.PanicIf(err) - - return int32(n), nil - } else if tagType == TypeSignedRational { - parts := strings.SplitN(valueString, "/", 2) - - numerator, err := strconv.ParseInt(parts[0], 10, 32) - log.PanicIf(err) - - denominator, err := strconv.ParseInt(parts[1], 10, 32) - log.PanicIf(err) - - return SignedRational{ - Numerator: int32(numerator), - Denominator: int32(denominator), - }, nil - } - - log.Panicf("from-string encoding for type not supported; this shouldn't happen: [%s]", tagType.String()) - return nil, nil -} - -func init() { - for typeId, typeName := range TypeNames { - TypeNamesR[typeName] = typeId - } -} diff --git a/vendor/github.com/dsoprea/go-exif/type_encode.go b/vendor/github.com/dsoprea/go-exif/type_encode.go deleted file mode 100644 index 9ff754916c..0000000000 --- a/vendor/github.com/dsoprea/go-exif/type_encode.go +++ /dev/null @@ -1,262 +0,0 @@ -package exif - -import ( - "bytes" - "reflect" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -var ( - typeEncodeLogger = log.NewLogger("exif.type_encode") -) - -// EncodedData encapsulates the compound output of an encoding operation. -type EncodedData struct { - Type TagTypePrimitive - Encoded []byte - - // TODO(dustin): Is this really necessary? We might have this just to correlate to the incoming stream format (raw bytes and a unit-count both for incoming and outgoing). - UnitCount uint32 -} - -type ValueEncoder struct { - byteOrder binary.ByteOrder -} - -func NewValueEncoder(byteOrder binary.ByteOrder) *ValueEncoder { - return &ValueEncoder{ - byteOrder: byteOrder, - } -} - -func (ve *ValueEncoder) encodeBytes(value []uint8) (ed EncodedData, err error) { - ed.Type = TypeByte - ed.Encoded = []byte(value) - ed.UnitCount = uint32(len(value)) - - return ed, nil -} - -func (ve *ValueEncoder) encodeAscii(value string) (ed EncodedData, err error) { - ed.Type = TypeAscii - - ed.Encoded = []byte(value) - ed.Encoded = append(ed.Encoded, 0) - - ed.UnitCount = uint32(len(ed.Encoded)) - - return ed, nil -} - -// encodeAsciiNoNul returns a string encoded as a byte-string without a trailing -// NUL byte. -// -// Note that: -// -// 1. This type can not be automatically encoded using `Encode()`. The default -// mode is to encode *with* a trailing NUL byte using `encodeAscii`. Only -// certain undefined-type tags using an unterminated ASCII string and these -// are exceptional in nature. -// -// 2. The presence of this method allows us to completely test the complimentary -// no-nul parser. -// -func (ve *ValueEncoder) encodeAsciiNoNul(value string) (ed EncodedData, err error) { - ed.Type = TypeAsciiNoNul - ed.Encoded = []byte(value) - ed.UnitCount = uint32(len(ed.Encoded)) - - return ed, nil -} - -func (ve *ValueEncoder) encodeShorts(value []uint16) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ed.UnitCount = uint32(len(value)) - ed.Encoded = make([]byte, ed.UnitCount*2) - - for i := uint32(0); i < ed.UnitCount; i++ { - ve.byteOrder.PutUint16(ed.Encoded[i*2:(i+1)*2], value[i]) - } - - ed.Type = TypeShort - - return ed, nil -} - -func (ve *ValueEncoder) encodeLongs(value []uint32) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ed.UnitCount = uint32(len(value)) - ed.Encoded = make([]byte, ed.UnitCount*4) - - for i := uint32(0); i < ed.UnitCount; i++ { - ve.byteOrder.PutUint32(ed.Encoded[i*4:(i+1)*4], value[i]) - } - - ed.Type = TypeLong - - return ed, nil -} - -func (ve *ValueEncoder) encodeRationals(value []Rational) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ed.UnitCount = uint32(len(value)) - ed.Encoded = make([]byte, ed.UnitCount*8) - - for i := uint32(0); i < ed.UnitCount; i++ { - ve.byteOrder.PutUint32(ed.Encoded[i*8+0:i*8+4], value[i].Numerator) - ve.byteOrder.PutUint32(ed.Encoded[i*8+4:i*8+8], value[i].Denominator) - } - - ed.Type = TypeRational - - return ed, nil -} - -func (ve *ValueEncoder) encodeSignedLongs(value []int32) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ed.UnitCount = uint32(len(value)) - - b := bytes.NewBuffer(make([]byte, 0, 8*ed.UnitCount)) - - for i := uint32(0); i < ed.UnitCount; i++ { - err := binary.Write(b, ve.byteOrder, value[i]) - log.PanicIf(err) - } - - ed.Type = TypeSignedLong - ed.Encoded = b.Bytes() - - return ed, nil -} - -func (ve *ValueEncoder) encodeSignedRationals(value []SignedRational) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - ed.UnitCount = uint32(len(value)) - - b := bytes.NewBuffer(make([]byte, 0, 8*ed.UnitCount)) - - for i := uint32(0); i < ed.UnitCount; i++ { - err := binary.Write(b, ve.byteOrder, value[i].Numerator) - log.PanicIf(err) - - err = binary.Write(b, ve.byteOrder, value[i].Denominator) - log.PanicIf(err) - } - - ed.Type = TypeSignedRational - ed.Encoded = b.Bytes() - - return ed, nil -} - -// Encode returns bytes for the given value, infering type from the actual -// value. This does not support `TypeAsciiNoNull` (all strings are encoded as -// `TypeAscii`). -func (ve *ValueEncoder) Encode(value interface{}) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): This is redundant with EncodeWithType. Refactor one to use the other. - - switch value.(type) { - case []byte: - ed, err = ve.encodeBytes(value.([]byte)) - log.PanicIf(err) - case string: - ed, err = ve.encodeAscii(value.(string)) - log.PanicIf(err) - case []uint16: - ed, err = ve.encodeShorts(value.([]uint16)) - log.PanicIf(err) - case []uint32: - ed, err = ve.encodeLongs(value.([]uint32)) - log.PanicIf(err) - case []Rational: - ed, err = ve.encodeRationals(value.([]Rational)) - log.PanicIf(err) - case []int32: - ed, err = ve.encodeSignedLongs(value.([]int32)) - log.PanicIf(err) - case []SignedRational: - ed, err = ve.encodeSignedRationals(value.([]SignedRational)) - log.PanicIf(err) - default: - log.Panicf("value not encodable: [%s] [%v]", reflect.TypeOf(value), value) - } - - return ed, nil -} - -// EncodeWithType returns bytes for the given value, using the given `TagType` -// value to determine how to encode. This supports `TypeAsciiNoNul`. -func (ve *ValueEncoder) EncodeWithType(tt TagType, value interface{}) (ed EncodedData, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): This is redundant with Encode. Refactor one to use the other. - - switch tt.Type() { - case TypeByte: - ed, err = ve.encodeBytes(value.([]byte)) - log.PanicIf(err) - case TypeAscii: - ed, err = ve.encodeAscii(value.(string)) - log.PanicIf(err) - case TypeAsciiNoNul: - ed, err = ve.encodeAsciiNoNul(value.(string)) - log.PanicIf(err) - case TypeShort: - ed, err = ve.encodeShorts(value.([]uint16)) - log.PanicIf(err) - case TypeLong: - ed, err = ve.encodeLongs(value.([]uint32)) - log.PanicIf(err) - case TypeRational: - ed, err = ve.encodeRationals(value.([]Rational)) - log.PanicIf(err) - case TypeSignedLong: - ed, err = ve.encodeSignedLongs(value.([]int32)) - log.PanicIf(err) - case TypeSignedRational: - ed, err = ve.encodeSignedRationals(value.([]SignedRational)) - log.PanicIf(err) - default: - log.Panicf("value not encodable (with type): %v [%v]", tt, value) - } - - return ed, nil -} diff --git a/vendor/github.com/dsoprea/go-exif/v2/LICENSE b/vendor/github.com/dsoprea/go-exif/v2/LICENSE deleted file mode 100644 index 0b9358a3aa..0000000000 --- a/vendor/github.com/dsoprea/go-exif/v2/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -MIT LICENSE - -Copyright 2019 Dustin Oprea - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/dsoprea/go-exif/v2/ifd.go b/vendor/github.com/dsoprea/go-exif/v2/ifd.go deleted file mode 100644 index 80872e624f..0000000000 --- a/vendor/github.com/dsoprea/go-exif/v2/ifd.go +++ /dev/null @@ -1,34 +0,0 @@ -package exif - -import ( - "github.com/dsoprea/go-logging" - - "github.com/dsoprea/go-exif/v2/common" -) - -// TODO(dustin): This file now exists for backwards-compatibility only. - -// NewIfdMapping returns a new IfdMapping struct. -func NewIfdMapping() (ifdMapping *exifcommon.IfdMapping) { - return exifcommon.NewIfdMapping() -} - -// NewIfdMappingWithStandard retruns a new IfdMapping struct preloaded with the -// standard IFDs. -func NewIfdMappingWithStandard() (ifdMapping *exifcommon.IfdMapping) { - return exifcommon.NewIfdMappingWithStandard() -} - -// LoadStandardIfds loads the standard IFDs into the mapping. -func LoadStandardIfds(im *exifcommon.IfdMapping) (err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - err = exifcommon.LoadStandardIfds(im) - log.PanicIf(err) - - return nil -} diff --git a/vendor/github.com/dsoprea/go-exif/v2/.MODULE_ROOT b/vendor/github.com/dsoprea/go-exif/v3/.MODULE_ROOT similarity index 100% rename from vendor/github.com/dsoprea/go-exif/v2/.MODULE_ROOT rename to vendor/github.com/dsoprea/go-exif/v3/.MODULE_ROOT diff --git a/vendor/github.com/dsoprea/go-exif/LICENSE b/vendor/github.com/dsoprea/go-exif/v3/LICENSE similarity index 100% rename from vendor/github.com/dsoprea/go-exif/LICENSE rename to vendor/github.com/dsoprea/go-exif/v3/LICENSE diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/ifd.go b/vendor/github.com/dsoprea/go-exif/v3/common/ifd.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/common/ifd.go rename to vendor/github.com/dsoprea/go-exif/v3/common/ifd.go index 9b93f04d9f..01886e9662 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/common/ifd.go +++ b/vendor/github.com/dsoprea/go-exif/v3/common/ifd.go @@ -59,20 +59,19 @@ func NewIfdMapping() (ifdMapping *IfdMapping) { // NewIfdMappingWithStandard retruns a new IfdMapping struct preloaded with the // standard IFDs. -func NewIfdMappingWithStandard() (ifdMapping *IfdMapping) { +func NewIfdMappingWithStandard() (ifdMapping *IfdMapping, err error) { defer func() { if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) + err = log.Wrap(state.(error)) } }() im := NewIfdMapping() - err := LoadStandardIfds(im) + err = LoadStandardIfds(im) log.PanicIf(err) - return im + return im, nil } // Get returns the node given the path slice. @@ -650,10 +649,3 @@ var ( // Ifd1StandardIfdIdentity represents the IFD path for IFD1. Ifd1StandardIfdIdentity = NewIfdIdentity(rootStandardIfd, IfdIdentityPart{"IFD", 1}) ) - -var ( - IfdPathStandard = IfdStandardIfdIdentity - IfdPathStandardExif = IfdExifStandardIfdIdentity - IfdPathStandardExifIop = IfdExifIopStandardIfdIdentity - IfdPathStandardGps = IfdGpsInfoStandardIfdIdentity -) diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/parser.go b/vendor/github.com/dsoprea/go-exif/v3/common/parser.go similarity index 77% rename from vendor/github.com/dsoprea/go-exif/v2/common/parser.go rename to vendor/github.com/dsoprea/go-exif/v3/common/parser.go index bbdd8f53a8..76e8ef4254 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/common/parser.go +++ b/vendor/github.com/dsoprea/go-exif/v3/common/parser.go @@ -2,6 +2,8 @@ package exifcommon import ( "bytes" + "errors" + "math" "encoding/binary" @@ -12,6 +14,10 @@ var ( parserLogger = log.NewLogger("exifcommon.parser") ) +var ( + ErrParseFail = errors.New("parse failure") +) + // Parser knows how to parse all well-defined, encoded EXIF types. type Parser struct { } @@ -56,7 +62,18 @@ func (p *Parser) ParseAscii(data []byte, unitCount uint32) (value string, err er if len(data) == 0 || data[count-1] != 0 { s := string(data[:count]) - parserLogger.Warningf(nil, "ascii not terminated with nul as expected: [%v]", s) + parserLogger.Warningf(nil, "ASCII not terminated with NUL as expected: [%v]", s) + + for i, c := range s { + if c > 127 { + // Binary + + t := s[:i] + parserLogger.Warningf(nil, "ASCII also had binary characters. Truncating: [%v]->[%s]", s, t) + + return t, nil + } + } return s, nil } @@ -135,6 +152,50 @@ func (p *Parser) ParseLongs(data []byte, unitCount uint32, byteOrder binary.Byte return value, nil } +// ParseFloats knows how to encode an encoded list of floats. +func (p *Parser) ParseFloats(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []float32, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + count := int(unitCount) + + if len(data) != (TypeFloat.Size() * count) { + log.Panic(ErrNotEnoughData) + } + + value = make([]float32, count) + for i := 0; i < count; i++ { + value[i] = math.Float32frombits(byteOrder.Uint32(data[i*4 : (i+1)*4])) + } + + return value, nil +} + +// ParseDoubles knows how to encode an encoded list of doubles. +func (p *Parser) ParseDoubles(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []float64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + count := int(unitCount) + + if len(data) != (TypeDouble.Size() * count) { + log.Panic(ErrNotEnoughData) + } + + value = make([]float64, count) + for i := 0; i < count; i++ { + value[i] = math.Float64frombits(byteOrder.Uint64(data[i*8 : (i+1)*8])) + } + + return value, nil +} + // ParseRationals knows how to parse an encoded list of unsigned rationals. func (p *Parser) ParseRationals(data []byte, unitCount uint32, byteOrder binary.ByteOrder) (value []Rational, err error) { defer func() { diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/testing_common.go b/vendor/github.com/dsoprea/go-exif/v3/common/testing_common.go similarity index 100% rename from vendor/github.com/dsoprea/go-exif/v2/common/testing_common.go rename to vendor/github.com/dsoprea/go-exif/v3/common/testing_common.go diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/type.go b/vendor/github.com/dsoprea/go-exif/v3/common/type.go similarity index 85% rename from vendor/github.com/dsoprea/go-exif/v2/common/type.go rename to vendor/github.com/dsoprea/go-exif/v3/common/type.go index 86b38d044d..e79bcb9a1a 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/common/type.go +++ b/vendor/github.com/dsoprea/go-exif/v3/common/type.go @@ -6,6 +6,7 @@ import ( "reflect" "strconv" "strings" + "unicode" "encoding/binary" @@ -63,6 +64,12 @@ const ( // TypeSignedRational describes an encoded list of signed rationals. TypeSignedRational TagTypePrimitive = 10 + // TypeFloat describes an encoded list of floats + TypeFloat TagTypePrimitive = 11 + + // TypeDouble describes an encoded list of doubles. + TypeDouble TagTypePrimitive = 12 + // TypeAsciiNoNul is just a pseudo-type, for our own purposes. TypeAsciiNoNul TagTypePrimitive = 0xf0 ) @@ -74,23 +81,19 @@ func (typeType TagTypePrimitive) String() string { // Size returns the size of one atomic unit of the type. func (tagType TagTypePrimitive) Size() int { - if tagType == TypeByte { - return 1 - } else if tagType == TypeAscii || tagType == TypeAsciiNoNul { + switch tagType { + case TypeByte, TypeAscii, TypeAsciiNoNul: return 1 - } else if tagType == TypeShort { + case TypeShort: return 2 - } else if tagType == TypeLong { + case TypeLong, TypeSignedLong, TypeFloat: return 4 - } else if tagType == TypeRational { + case TypeRational, TypeSignedRational, TypeDouble: return 8 - } else if tagType == TypeSignedLong { - return 4 - } else if tagType == TypeSignedRational { - return 8 - } else { - log.Panicf("can not determine tag-value size for type (%d): [%s]", tagType, TypeNames[tagType]) - + default: + log.Panicf("can not determine tag-value size for type (%d): [%s]", + tagType, + TypeNames[tagType]) // Never called. return 0 } @@ -109,6 +112,8 @@ func (tagType TagTypePrimitive) IsValid() bool { tagType == TypeRational || tagType == TypeSignedLong || tagType == TypeSignedRational || + tagType == TypeFloat || + tagType == TypeDouble || tagType == TypeUndefined } @@ -123,6 +128,8 @@ var ( TypeUndefined: "UNDEFINED", TypeSignedLong: "SLONG", TypeSignedRational: "SRATIONAL", + TypeFloat: "FLOAT", + TypeDouble: "DOUBLE", TypeAsciiNoNul: "_ASCII_NO_NUL", } @@ -148,6 +155,19 @@ type SignedRational struct { Denominator int32 } +func isPrintableText(s string) bool { + for _, c := range s { + // unicode.IsPrint() returns false for newline characters. + if c == 0x0d || c == 0x0a { + continue + } else if unicode.IsPrint(rune(c)) == false { + return false + } + } + + return true +} + // Format returns a stringified value for the given encoding. Automatically // parses. Automatically calculates count based on type size. This function // also supports undefined-type values (the ones that we support, anyway) by @@ -166,37 +186,36 @@ func FormatFromType(value interface{}, justFirst bool) (phrase string, err error case []byte: return DumpBytesToString(t), nil case string: - return t, nil - case []uint16: - if len(t) == 0 { - return "", nil - } - - if justFirst == true { - var valueSuffix string - if len(t) > 1 { - valueSuffix = "..." + for i, c := range t { + if c == 0 { + t = t[:i] + break } + } - return fmt.Sprintf("%v%s", t[0], valueSuffix), nil + if isPrintableText(t) == false { + phrase = fmt.Sprintf("string with binary data (%d bytes)", len(t)) + return phrase, nil } - return fmt.Sprintf("%v", t), nil - case []uint32: - if len(t) == 0 { + return t, nil + case []uint16, []uint32, []int32, []float64, []float32: + val := reflect.ValueOf(t) + + if val.Len() == 0 { return "", nil } if justFirst == true { var valueSuffix string - if len(t) > 1 { + if val.Len() > 1 { valueSuffix = "..." } - return fmt.Sprintf("%v%s", t[0], valueSuffix), nil + return fmt.Sprintf("%v%s", val.Index(0), valueSuffix), nil } - return fmt.Sprintf("%v", t), nil + return fmt.Sprintf("%v", val), nil case []Rational: if len(t) == 0 { return "", nil @@ -221,21 +240,6 @@ func FormatFromType(value interface{}, justFirst bool) (phrase string, err error } return fmt.Sprintf("%v", parts), nil - case []int32: - if len(t) == 0 { - return "", nil - } - - if justFirst == true { - var valueSuffix string - if len(t) > 1 { - valueSuffix = "..." - } - - return fmt.Sprintf("%v%s", t[0], valueSuffix), nil - } - - return fmt.Sprintf("%v", t), nil case []SignedRational: if len(t) == 0 { return "", nil @@ -261,8 +265,14 @@ func FormatFromType(value interface{}, justFirst bool) (phrase string, err error return fmt.Sprintf("%v", parts), nil case fmt.Stringer: + s := t.String() + if isPrintableText(s) == false { + phrase = fmt.Sprintf("stringable with binary data (%d bytes)", len(s)) + return phrase, nil + } + // An undefined value that is documented (or that we otherwise support). - return t.String(), nil + return s, nil default: // Affects only "unknown" values, in general. log.Panicf("type can not be formatted into string: %v", reflect.TypeOf(value).Name()) @@ -323,6 +333,16 @@ func FormatFromBytes(rawBytes []byte, tagType TagTypePrimitive, justFirst bool, value, err = parser.ParseLongs(rawBytes, unitCount, byteOrder) log.PanicIf(err) + case TypeFloat: + var err error + + value, err = parser.ParseFloats(rawBytes, unitCount, byteOrder) + log.PanicIf(err) + case TypeDouble: + var err error + + value, err = parser.ParseDoubles(rawBytes, unitCount, byteOrder) + log.PanicIf(err) case TypeRational: var err error @@ -407,6 +427,16 @@ func TranslateStringToType(tagType TagTypePrimitive, valueString string) (value log.PanicIf(err) return int32(n), nil + } else if tagType == TypeFloat { + n, err := strconv.ParseFloat(valueString, 32) + log.PanicIf(err) + + return float32(n), nil + } else if tagType == TypeDouble { + n, err := strconv.ParseFloat(valueString, 64) + log.PanicIf(err) + + return float64(n), nil } else if tagType == TypeSignedRational { parts := strings.SplitN(valueString, "/", 2) diff --git a/vendor/github.com/dsoprea/go-exif/utility.go b/vendor/github.com/dsoprea/go-exif/v3/common/utility.go similarity index 52% rename from vendor/github.com/dsoprea/go-exif/utility.go rename to vendor/github.com/dsoprea/go-exif/v3/common/utility.go index 3d1ea2489d..5750497061 100644 --- a/vendor/github.com/dsoprea/go-exif/utility.go +++ b/vendor/github.com/dsoprea/go-exif/v3/common/utility.go @@ -1,8 +1,9 @@ -package exif +package exifcommon import ( "bytes" "fmt" + "reflect" "strconv" "strings" "time" @@ -10,6 +11,11 @@ import ( "github.com/dsoprea/go-logging" ) +var ( + timeType = reflect.TypeOf(time.Time{}) +) + +// DumpBytes prints a list of hex-encoded bytes. func DumpBytes(data []byte) { fmt.Printf("DUMP: ") for _, x := range data { @@ -19,6 +25,8 @@ func DumpBytes(data []byte) { fmt.Printf("\n") } +// DumpBytesClause prints a list like DumpBytes(), but encapsulated in +// "[]byte { ... }". func DumpBytesClause(data []byte) { fmt.Printf("DUMP: ") @@ -35,6 +43,7 @@ func DumpBytesClause(data []byte) { fmt.Printf(" }\n") } +// DumpBytesToString returns a stringified list of hex-encoded bytes. func DumpBytesToString(data []byte) string { b := new(bytes.Buffer) @@ -51,6 +60,7 @@ func DumpBytesToString(data []byte) string { return b.String() } +// DumpBytesClauseToString returns a comma-separated list of hex-encoded bytes. func DumpBytesClauseToString(data []byte) string { b := new(bytes.Buffer) @@ -67,6 +77,14 @@ func DumpBytesClauseToString(data []byte) string { return b.String() } +// ExifFullTimestampString produces a string like "2018:11:30 13:01:49" from a +// `time.Time` struct. It will attempt to convert to UTC first. +func ExifFullTimestampString(t time.Time) (fullTimestampPhrase string) { + t = t.UTC() + + return fmt.Sprintf("%04d:%02d:%02d %02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()) +} + // ParseExifFullTimestamp parses dates like "2018:11:30 13:01:49" into a UTC // `time.Time` struct. func ParseExifFullTimestamp(fullTimestampPhrase string) (timestamp time.Time, err error) { @@ -79,6 +97,10 @@ func ParseExifFullTimestamp(fullTimestampPhrase string) (timestamp time.Time, er parts := strings.Split(fullTimestampPhrase, " ") datestampValue, timestampValue := parts[0], parts[1] + // Normalize the separators. + datestampValue = strings.ReplaceAll(datestampValue, "-", ":") + timestampValue = strings.ReplaceAll(timestampValue, "-", ":") + dateParts := strings.Split(datestampValue, ":") year, err := strconv.ParseUint(dateParts[0], 10, 16) @@ -117,106 +139,10 @@ func ParseExifFullTimestamp(fullTimestampPhrase string) (timestamp time.Time, er return timestamp, nil } -// ExifFullTimestampString produces a string like "2018:11:30 13:01:49" from a -// `time.Time` struct. It will attempt to convert to UTC first. -func ExifFullTimestampString(t time.Time) (fullTimestampPhrase string) { - t = t.UTC() - - return fmt.Sprintf("%04d:%02d:%02d %02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()) -} - -// ExifTag is one simple representation of a tag in a flat list of all of them. -type ExifTag struct { - IfdPath string `json:"ifd_path"` +// IsTime returns true if the value is a `time.Time`. +func IsTime(v interface{}) bool { - TagId uint16 `json:"id"` - TagName string `json:"name"` - - TagTypeId TagTypePrimitive `json:"type_id"` - TagTypeName string `json:"type_name"` - Value interface{} `json:"value"` - ValueBytes []byte `json:"value_bytes"` - - ChildIfdPath string `json:"child_ifd_path"` -} - -// String returns a string representation. -func (et ExifTag) String() string { - return fmt.Sprintf("ExifTag 0 { - var ifd *Ifd - ifd, q = q[0], q[1:] - - ti := NewTagIndex() - for _, ite := range ifd.Entries { - tagName := "" - - it, err := ti.Get(ifd.IfdPath, ite.TagId) - if err != nil { - // If it's a non-standard tag, just leave the name blank. - if log.Is(err, ErrTagNotFound) != true { - log.PanicIf(err) - } - } else { - tagName = it.Name - } - - value, err := ifd.TagValue(ite) - if err != nil { - if err == ErrUnhandledUnknownTypedTag { - value = UnparseableUnknownTagValuePlaceholder - } else { - log.Panic(err) - } - } - - valueBytes, err := ifd.TagValueBytes(ite) - if err != nil && err != ErrUnhandledUnknownTypedTag { - log.Panic(err) - } - - et := ExifTag{ - IfdPath: ifd.IfdPath, - TagId: ite.TagId, - TagName: tagName, - TagTypeId: ite.TagType, - TagTypeName: TypeNames[ite.TagType], - Value: value, - ValueBytes: valueBytes, - ChildIfdPath: ite.ChildIfdPath, - } - - exifTags = append(exifTags, et) - } - - for _, childIfd := range ifd.Children { - q = append(q, childIfd) - } - - if ifd.NextIfd != nil { - q = append(q, ifd.NextIfd) - } - } + // TODO(dustin): Add test - return exifTags, nil + return reflect.TypeOf(v) == timeType } diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/value_context.go b/vendor/github.com/dsoprea/go-exif/v3/common/value_context.go similarity index 85% rename from vendor/github.com/dsoprea/go-exif/v2/common/value_context.go rename to vendor/github.com/dsoprea/go-exif/v3/common/value_context.go index feb078ccfa..b9e6341067 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/common/value_context.go +++ b/vendor/github.com/dsoprea/go-exif/v3/common/value_context.go @@ -2,6 +2,7 @@ package exifcommon import ( "errors" + "io" "encoding/binary" @@ -21,10 +22,10 @@ var ( // ValueContext embeds all of the parameters required to find and extract the // actual tag value. type ValueContext struct { - unitCount uint32 - valueOffset uint32 - rawValueOffset []byte - addressableData []byte + unitCount uint32 + valueOffset uint32 + rawValueOffset []byte + rs io.ReadSeeker tagType TagTypePrimitive byteOrder binary.ByteOrder @@ -40,12 +41,12 @@ type ValueContext struct { // TODO(dustin): We can update newValueContext() to derive `valueOffset` itself (from `rawValueOffset`). // NewValueContext returns a new ValueContext struct. -func NewValueContext(ifdPath string, tagId uint16, unitCount, valueOffset uint32, rawValueOffset, addressableData []byte, tagType TagTypePrimitive, byteOrder binary.ByteOrder) *ValueContext { +func NewValueContext(ifdPath string, tagId uint16, unitCount, valueOffset uint32, rawValueOffset []byte, rs io.ReadSeeker, tagType TagTypePrimitive, byteOrder binary.ByteOrder) *ValueContext { return &ValueContext{ - unitCount: unitCount, - valueOffset: valueOffset, - rawValueOffset: rawValueOffset, - addressableData: addressableData, + unitCount: unitCount, + valueOffset: valueOffset, + rawValueOffset: rawValueOffset, + rs: rs, tagType: tagType, byteOrder: byteOrder, @@ -82,8 +83,11 @@ func (vc *ValueContext) RawValueOffset() []byte { } // AddressableData returns the block of data that we can dereference into. -func (vc *ValueContext) AddressableData() []byte { - return vc.addressableData +func (vc *ValueContext) AddressableData() io.ReadSeeker { + + // RELEASE)dustin): Rename from AddressableData() to ReadSeeker() + + return vc.rs } // ByteOrder returns the byte-order of numbers. @@ -152,7 +156,15 @@ func (vc *ValueContext) readRawEncoded() (rawBytes []byte, err error) { return vc.rawValueOffset[:byteLength], nil } - return vc.addressableData[vc.valueOffset : vc.valueOffset+vc.unitCount*unitSizeRaw], nil + _, err = vc.rs.Seek(int64(vc.valueOffset), io.SeekStart) + log.PanicIf(err) + + rawBytes = make([]byte, vc.unitCount*unitSizeRaw) + + _, err = io.ReadFull(vc.rs, rawBytes) + log.PanicIf(err) + + return rawBytes, nil } // GetFarOffset returns the offset if the value is not embedded [within the @@ -303,6 +315,40 @@ func (vc *ValueContext) ReadLongs() (value []uint32, err error) { return value, nil } +// ReadFloats parses the list of encoded, floats from the value-context. +func (vc *ValueContext) ReadFloats() (value []float32, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + rawValue, err := vc.readRawEncoded() + log.PanicIf(err) + + value, err = parser.ParseFloats(rawValue, vc.unitCount, vc.byteOrder) + log.PanicIf(err) + + return value, nil +} + +// ReadDoubles parses the list of encoded, doubles from the value-context. +func (vc *ValueContext) ReadDoubles() (value []float64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + rawValue, err := vc.readRawEncoded() + log.PanicIf(err) + + value, err = parser.ParseDoubles(rawValue, vc.unitCount, vc.byteOrder) + log.PanicIf(err) + + return value, nil +} + // ReadRationals parses the list of encoded, unsigned rationals from the value- // context. func (vc *ValueContext) ReadRationals() (value []Rational, err error) { @@ -393,6 +439,12 @@ func (vc *ValueContext) Values() (values interface{}, err error) { } else if vc.tagType == TypeSignedRational { values, err = vc.ReadSignedRationals() log.PanicIf(err) + } else if vc.tagType == TypeFloat { + values, err = vc.ReadFloats() + log.PanicIf(err) + } else if vc.tagType == TypeDouble { + values, err = vc.ReadDoubles() + log.PanicIf(err) } else if vc.tagType == TypeUndefined { log.Panicf("will not parse undefined-type value") diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/value_encoder.go b/vendor/github.com/dsoprea/go-exif/v3/common/value_encoder.go similarity index 80% rename from vendor/github.com/dsoprea/go-exif/v2/common/value_encoder.go rename to vendor/github.com/dsoprea/go-exif/v3/common/value_encoder.go index 52e0eacfd0..2cd26cc7b1 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/common/value_encoder.go +++ b/vendor/github.com/dsoprea/go-exif/v3/common/value_encoder.go @@ -2,6 +2,7 @@ package exifcommon import ( "bytes" + "math" "reflect" "time" @@ -113,6 +114,44 @@ func (ve *ValueEncoder) encodeLongs(value []uint32) (ed EncodedData, err error) return ed, nil } +func (ve *ValueEncoder) encodeFloats(value []float32) (ed EncodedData, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + ed.UnitCount = uint32(len(value)) + ed.Encoded = make([]byte, ed.UnitCount*4) + + for i := uint32(0); i < ed.UnitCount; i++ { + ve.byteOrder.PutUint32(ed.Encoded[i*4:(i+1)*4], math.Float32bits(value[i])) + } + + ed.Type = TypeFloat + + return ed, nil +} + +func (ve *ValueEncoder) encodeDoubles(value []float64) (ed EncodedData, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + ed.UnitCount = uint32(len(value)) + ed.Encoded = make([]byte, ed.UnitCount*8) + + for i := uint32(0); i < ed.UnitCount; i++ { + ve.byteOrder.PutUint64(ed.Encoded[i*8:(i+1)*8], math.Float64bits(value[i])) + } + + ed.Type = TypeDouble + + return ed, nil +} + func (ve *ValueEncoder) encodeRationals(value []Rational) (ed EncodedData, err error) { defer func() { if state := recover(); state != nil { @@ -190,33 +229,38 @@ func (ve *ValueEncoder) Encode(value interface{}) (ed EncodedData, err error) { } }() - switch value.(type) { + switch t := value.(type) { case []byte: - ed, err = ve.encodeBytes(value.([]byte)) + ed, err = ve.encodeBytes(t) log.PanicIf(err) case string: - ed, err = ve.encodeAscii(value.(string)) + ed, err = ve.encodeAscii(t) log.PanicIf(err) case []uint16: - ed, err = ve.encodeShorts(value.([]uint16)) + ed, err = ve.encodeShorts(t) log.PanicIf(err) case []uint32: - ed, err = ve.encodeLongs(value.([]uint32)) + ed, err = ve.encodeLongs(t) + log.PanicIf(err) + case []float32: + ed, err = ve.encodeFloats(t) + log.PanicIf(err) + case []float64: + ed, err = ve.encodeDoubles(t) log.PanicIf(err) case []Rational: - ed, err = ve.encodeRationals(value.([]Rational)) + ed, err = ve.encodeRationals(t) log.PanicIf(err) case []int32: - ed, err = ve.encodeSignedLongs(value.([]int32)) + ed, err = ve.encodeSignedLongs(t) log.PanicIf(err) case []SignedRational: - ed, err = ve.encodeSignedRationals(value.([]SignedRational)) + ed, err = ve.encodeSignedRationals(t) log.PanicIf(err) case time.Time: // For convenience, if the user doesn't want to deal with translation // semantics with timestamps. - t := value.(time.Time) s := ExifFullTimestampString(t) ed, err = ve.encodeAscii(s) diff --git a/vendor/github.com/dsoprea/go-exif/v3/data_layer.go b/vendor/github.com/dsoprea/go-exif/v3/data_layer.go new file mode 100644 index 0000000000..7883752cc9 --- /dev/null +++ b/vendor/github.com/dsoprea/go-exif/v3/data_layer.go @@ -0,0 +1,50 @@ +package exif + +import ( + "io" + + "github.com/dsoprea/go-logging" + "github.com/dsoprea/go-utility/v2/filesystem" +) + +type ExifBlobSeeker interface { + GetReadSeeker(initialOffset int64) (rs io.ReadSeeker, err error) +} + +// ExifReadSeeker knows how to retrieve data from the EXIF blob relative to the +// beginning of the blob (so, absolute position (0) is the first byte of the +// EXIF data). +type ExifReadSeeker struct { + rs io.ReadSeeker +} + +func NewExifReadSeeker(rs io.ReadSeeker) *ExifReadSeeker { + return &ExifReadSeeker{ + rs: rs, + } +} + +func NewExifReadSeekerWithBytes(exifData []byte) *ExifReadSeeker { + sb := rifs.NewSeekableBufferWithBytes(exifData) + edbs := NewExifReadSeeker(sb) + + return edbs +} + +// Fork creates a new ReadSeeker instead that wraps a BouncebackReader to +// maintain its own position in the stream. +func (edbs *ExifReadSeeker) GetReadSeeker(initialOffset int64) (rs io.ReadSeeker, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + br, err := rifs.NewBouncebackReader(edbs.rs) + log.PanicIf(err) + + _, err = br.Seek(initialOffset, io.SeekStart) + log.PanicIf(err) + + return br, nil +} diff --git a/vendor/github.com/dsoprea/go-exif/v2/error.go b/vendor/github.com/dsoprea/go-exif/v3/error.go similarity index 100% rename from vendor/github.com/dsoprea/go-exif/v2/error.go rename to vendor/github.com/dsoprea/go-exif/v3/error.go diff --git a/vendor/github.com/dsoprea/go-exif/v2/exif.go b/vendor/github.com/dsoprea/go-exif/v3/exif.go similarity index 70% rename from vendor/github.com/dsoprea/go-exif/v2/exif.go rename to vendor/github.com/dsoprea/go-exif/v3/exif.go index 20b723769f..f66e839d9b 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/exif.go +++ b/vendor/github.com/dsoprea/go-exif/v3/exif.go @@ -13,7 +13,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) const ( @@ -70,10 +70,58 @@ func SearchAndExtractExif(data []byte) (rawExif []byte, err error) { return rawExif, nil } -// SearchAndExtractExifWithReader searches for an EXIF blob using an -// `io.Reader`. We can't know how much long the EXIF data is without parsing it, -// so this will likely grab up a lot of the image-data, too. -func SearchAndExtractExifWithReader(r io.Reader) (rawExif []byte, err error) { +// SearchAndExtractExifN searches for an EXIF blob in the byte-slice, but skips +// the given number of EXIF blocks first. This is a forensics tool that helps +// identify multiple EXIF blocks in a file. +func SearchAndExtractExifN(data []byte, n int) (rawExif []byte, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + skips := 0 + totalDiscarded := 0 + for { + b := bytes.NewBuffer(data) + + var discarded int + + rawExif, discarded, err = searchAndExtractExifWithReaderWithDiscarded(b) + if err != nil { + if err == ErrNoExif { + return nil, err + } + + log.Panic(err) + } + + exifLogger.Debugf(nil, "Read EXIF block (%d).", skips) + + totalDiscarded += discarded + + if skips >= n { + exifLogger.Debugf(nil, "Reached requested EXIF block (%d).", n) + break + } + + nextOffset := discarded + 1 + exifLogger.Debugf(nil, "Skipping EXIF block (%d) by seeking to position (%d).", skips, nextOffset) + + data = data[nextOffset:] + skips++ + } + + exifLogger.Debugf(nil, "Found EXIF blob (%d) bytes from initial position.", totalDiscarded) + return rawExif, nil +} + +// searchAndExtractExifWithReaderWithDiscarded searches for an EXIF blob using +// an `io.Reader`. We can't know how much long the EXIF data is without parsing +// it, so this will likely grab up a lot of the image-data, too. +// +// This function returned the count of preceding bytes. +func searchAndExtractExifWithReaderWithDiscarded(r io.Reader) (rawExif []byte, discarded int, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -85,13 +133,12 @@ func SearchAndExtractExifWithReader(r io.Reader) (rawExif []byte, err error) { // least, again, with JPEGs). br := bufio.NewReader(r) - discarded := 0 for { window, err := br.Peek(ExifSignatureLength) if err != nil { if err == io.EOF { - return nil, ErrNoExif + return nil, 0, ErrNoExif } log.Panic(err) @@ -122,6 +169,30 @@ func SearchAndExtractExifWithReader(r io.Reader) (rawExif []byte, err error) { rawExif, err = ioutil.ReadAll(br) log.PanicIf(err) + return rawExif, discarded, nil +} + +// RELEASE(dustin): We should replace the implementation of SearchAndExtractExifWithReader with searchAndExtractExifWithReaderWithDiscarded and drop the latter. + +// SearchAndExtractExifWithReader searches for an EXIF blob using an +// `io.Reader`. We can't know how much long the EXIF data is without parsing it, +// so this will likely grab up a lot of the image-data, too. +func SearchAndExtractExifWithReader(r io.Reader) (rawExif []byte, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + rawExif, _, err = searchAndExtractExifWithReaderWithDiscarded(r) + if err != nil { + if err == ErrNoExif { + return nil, err + } + + log.Panic(err) + } + return rawExif, nil } @@ -179,9 +250,11 @@ func ParseExifHeader(data []byte) (eh ExifHeader, err error) { } if bytes.Equal(data[:4], ExifBigEndianSignature[:]) == true { + exifLogger.Debugf(nil, "Byte-order is big-endian.") eh.ByteOrder = binary.BigEndian } else if bytes.Equal(data[:4], ExifLittleEndianSignature[:]) == true { eh.ByteOrder = binary.LittleEndian + exifLogger.Debugf(nil, "Byte-order is little-endian.") } else { return eh, ErrNoExif } @@ -192,7 +265,7 @@ func ParseExifHeader(data []byte) (eh ExifHeader, err error) { } // Visit recursively invokes a callback for every tag. -func Visit(rootIfdIdentity *exifcommon.IfdIdentity, ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, visitor TagVisitorFn) (eh ExifHeader, furthestOffset uint32, err error) { +func Visit(rootIfdIdentity *exifcommon.IfdIdentity, ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, visitor TagVisitorFn, so *ScanOptions) (eh ExifHeader, furthestOffset uint32, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -202,9 +275,10 @@ func Visit(rootIfdIdentity *exifcommon.IfdIdentity, ifdMapping *exifcommon.IfdMa eh, err = ParseExifHeader(exifData) log.PanicIf(err) - ie := NewIfdEnumerate(ifdMapping, tagIndex, exifData, eh.ByteOrder) + ebs := NewExifReadSeekerWithBytes(exifData) + ie := NewIfdEnumerate(ifdMapping, tagIndex, ebs, eh.ByteOrder) - _, err = ie.Scan(rootIfdIdentity, eh.FirstIfdOffset, visitor) + _, err = ie.Scan(rootIfdIdentity, eh.FirstIfdOffset, visitor, so) log.PanicIf(err) furthestOffset = ie.FurthestOffset() @@ -223,7 +297,8 @@ func Collect(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []b eh, err = ParseExifHeader(exifData) log.PanicIf(err) - ie := NewIfdEnumerate(ifdMapping, tagIndex, exifData, eh.ByteOrder) + ebs := NewExifReadSeekerWithBytes(exifData) + ie := NewIfdEnumerate(ifdMapping, tagIndex, ebs, eh.ByteOrder) index, err = ie.Collect(eh.FirstIfdOffset) log.PanicIf(err) diff --git a/vendor/github.com/dsoprea/go-exif/v2/gps.go b/vendor/github.com/dsoprea/go-exif/v3/gps.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/gps.go rename to vendor/github.com/dsoprea/go-exif/v3/gps.go index d44ede1ad7..7a61cd94df 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/gps.go +++ b/vendor/github.com/dsoprea/go-exif/v3/gps.go @@ -8,7 +8,7 @@ import ( "github.com/dsoprea/go-logging" "github.com/golang/geo/s2" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) var ( diff --git a/vendor/github.com/dsoprea/go-exif/v2/ifd_builder.go b/vendor/github.com/dsoprea/go-exif/v3/ifd_builder.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/ifd_builder.go rename to vendor/github.com/dsoprea/go-exif/v3/ifd_builder.go index 64a09299c4..a404b362a3 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/ifd_builder.go +++ b/vendor/github.com/dsoprea/go-exif/v3/ifd_builder.go @@ -14,8 +14,8 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" - "github.com/dsoprea/go-exif/v2/undefined" + "github.com/dsoprea/go-exif/v3/common" + "github.com/dsoprea/go-exif/v3/undefined" ) var ( @@ -262,8 +262,8 @@ func NewIfdBuilderWithExistingIfd(ifd *Ifd) (ib *IfdBuilder) { ib = &IfdBuilder{ ifdIdentity: ifd.IfdIdentity(), - byteOrder: ifd.ByteOrder, - existingOffset: ifd.Offset, + byteOrder: ifd.ByteOrder(), + existingOffset: ifd.Offset(), ifdMapping: ifd.ifdMapping, tagIndex: ifd.tagIndex, } @@ -276,12 +276,12 @@ func NewIfdBuilderWithExistingIfd(ifd *Ifd) (ib *IfdBuilder) { func NewIfdBuilderFromExistingChain(rootIfd *Ifd) (firstIb *IfdBuilder) { var lastIb *IfdBuilder i := 0 - for thisExistingIfd := rootIfd; thisExistingIfd != nil; thisExistingIfd = thisExistingIfd.NextIfd { + for thisExistingIfd := rootIfd; thisExistingIfd != nil; thisExistingIfd = thisExistingIfd.nextIfd { newIb := NewIfdBuilder( rootIfd.ifdMapping, rootIfd.tagIndex, rootIfd.ifdIdentity, - thisExistingIfd.ByteOrder) + thisExistingIfd.ByteOrder()) if firstIb == nil { firstIb = newIb @@ -1005,7 +1005,7 @@ func (ib *IfdBuilder) AddTagsFromExisting(ifd *Ifd, includeTagIds []uint16, excl log.Panic(err) } - for i, ite := range ifd.Entries { + for i, ite := range ifd.Entries() { if ite.IsThumbnailOffset() == true || ite.IsThumbnailSize() { // These will be added on-the-fly when we encode. continue @@ -1051,11 +1051,11 @@ func (ib *IfdBuilder) AddTagsFromExisting(ifd *Ifd, includeTagIds []uint16, excl // this IFD represents this specific child IFD. var childIfd *Ifd - for _, thisChildIfd := range ifd.Children { - if thisChildIfd.ParentTagIndex != i { + for _, thisChildIfd := range ifd.Children() { + if thisChildIfd.ParentTagIndex() != i { continue } else if thisChildIfd.ifdIdentity.TagId() != 0xffff && thisChildIfd.ifdIdentity.TagId() != ite.TagId() { - log.Panicf("child-IFD tag is not correct: TAG-POSITION=(%d) ITE=%s CHILD-IFD=%s", thisChildIfd.ParentTagIndex, ite, thisChildIfd) + log.Panicf("child-IFD tag is not correct: TAG-POSITION=(%d) ITE=%s CHILD-IFD=%s", thisChildIfd.ParentTagIndex(), ite, thisChildIfd) } childIfd = thisChildIfd @@ -1063,9 +1063,9 @@ func (ib *IfdBuilder) AddTagsFromExisting(ifd *Ifd, includeTagIds []uint16, excl } if childIfd == nil { - childTagIds := make([]string, len(ifd.Children)) - for j, childIfd := range ifd.Children { - childTagIds[j] = fmt.Sprintf("0x%04x (parent tag-position %d)", childIfd.ifdIdentity.TagId(), childIfd.ParentTagIndex) + childTagIds := make([]string, len(ifd.Children())) + for j, childIfd := range ifd.Children() { + childTagIds[j] = fmt.Sprintf("0x%04x (parent tag-position %d)", childIfd.ifdIdentity.TagId(), childIfd.ParentTagIndex()) } log.Panicf("could not find child IFD for child ITE: IFD-PATH=[%s] TAG-ID=(0x%04x) CURRENT-TAG-POSITION=(%d) CHILDREN=%v", ite.IfdPath(), ite.TagId(), i, childTagIds) diff --git a/vendor/github.com/dsoprea/go-exif/v2/ifd_builder_encode.go b/vendor/github.com/dsoprea/go-exif/v3/ifd_builder_encode.go similarity index 99% rename from vendor/github.com/dsoprea/go-exif/v2/ifd_builder_encode.go rename to vendor/github.com/dsoprea/go-exif/v3/ifd_builder_encode.go index a0bac3e5ba..a0f4ff79cc 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/ifd_builder_encode.go +++ b/vendor/github.com/dsoprea/go-exif/v3/ifd_builder_encode.go @@ -9,7 +9,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) const ( diff --git a/vendor/github.com/dsoprea/go-exif/v2/ifd_enumerate.go b/vendor/github.com/dsoprea/go-exif/v3/ifd_enumerate.go similarity index 77% rename from vendor/github.com/dsoprea/go-exif/v2/ifd_enumerate.go rename to vendor/github.com/dsoprea/go-exif/v3/ifd_enumerate.go index 33a5f84b36..3167596ef0 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/ifd_enumerate.go +++ b/vendor/github.com/dsoprea/go-exif/v3/ifd_enumerate.go @@ -13,8 +13,8 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" - "github.com/dsoprea/go-exif/v2/undefined" + "github.com/dsoprea/go-exif/v3/common" + "github.com/dsoprea/go-exif/v3/undefined" ) var ( @@ -75,23 +75,23 @@ var ( // statically-sized records. So, the tags (though notnecessarily their values) // are fairly simple to enumerate. type byteParser struct { - byteOrder binary.ByteOrder - addressableData []byte - ifdOffset uint32 - currentOffset uint32 + byteOrder binary.ByteOrder + rs io.ReadSeeker + ifdOffset uint32 + currentOffset uint32 } -func newByteParser(addressableData []byte, byteOrder binary.ByteOrder, ifdOffset uint32) (bp *byteParser, err error) { - if ifdOffset >= uint32(len(addressableData)) { - return nil, ErrOffsetInvalid - } - +// newByteParser returns a new byteParser struct. +// +// initialOffset is for arithmetic-based tracking of where we should be at in +// the stream. +func newByteParser(rs io.ReadSeeker, byteOrder binary.ByteOrder, initialOffset uint32) (bp *byteParser, err error) { // TODO(dustin): Add test bp = &byteParser{ - addressableData: addressableData, - byteOrder: byteOrder, - currentOffset: ifdOffset, + rs: rs, + byteOrder: byteOrder, + currentOffset: initialOffset, } return bp, nil @@ -109,13 +109,13 @@ func (bp *byteParser) getUint16() (value uint16, raw []byte, err error) { // TODO(dustin): Add test - needBytes := uint32(2) + needBytes := 2 - if bp.currentOffset+needBytes > uint32(len(bp.addressableData)) { - return 0, nil, io.EOF - } + raw = make([]byte, needBytes) + + _, err = io.ReadFull(bp.rs, raw) + log.PanicIf(err) - raw = bp.addressableData[bp.currentOffset : bp.currentOffset+needBytes] value = bp.byteOrder.Uint16(raw) bp.currentOffset += uint32(needBytes) @@ -135,13 +135,13 @@ func (bp *byteParser) getUint32() (value uint32, raw []byte, err error) { // TODO(dustin): Add test - needBytes := uint32(4) + needBytes := 4 - if bp.currentOffset+needBytes > uint32(len(bp.addressableData)) { - return 0, nil, io.EOF - } + raw = make([]byte, needBytes) + + _, err = io.ReadFull(bp.rs, raw) + log.PanicIf(err) - raw = bp.addressableData[bp.currentOffset : bp.currentOffset+needBytes] value = bp.byteOrder.Uint32(raw) bp.currentOffset += uint32(needBytes) @@ -158,20 +158,24 @@ func (bp *byteParser) CurrentOffset() uint32 { // IfdEnumerate is the main enumeration type. It knows how to parse the IFD // containers in the EXIF blob. type IfdEnumerate struct { - exifData []byte + ebs ExifBlobSeeker byteOrder binary.ByteOrder tagIndex *TagIndex ifdMapping *exifcommon.IfdMapping furthestOffset uint32 + + visitedIfdOffsets map[uint32]struct{} } // NewIfdEnumerate returns a new instance of IfdEnumerate. -func NewIfdEnumerate(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, byteOrder binary.ByteOrder) *IfdEnumerate { +func NewIfdEnumerate(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ebs ExifBlobSeeker, byteOrder binary.ByteOrder) *IfdEnumerate { return &IfdEnumerate{ - exifData: exifData, + ebs: ebs, byteOrder: byteOrder, ifdMapping: ifdMapping, tagIndex: tagIndex, + + visitedIfdOffsets: make(map[uint32]struct{}), } } @@ -182,11 +186,16 @@ func (ie *IfdEnumerate) getByteParser(ifdOffset uint32) (bp *byteParser, err err } }() + initialOffset := ExifAddressableAreaStart + ifdOffset + + rs, err := ie.ebs.GetReadSeeker(int64(initialOffset)) + log.PanicIf(err) + bp, err = newByteParser( - ie.exifData[ExifAddressableAreaStart:], + rs, ie.byteOrder, - ifdOffset) + initialOffset) if err != nil { if err == ErrOffsetInvalid { @@ -220,15 +229,63 @@ func (ie *IfdEnumerate) parseTag(ii *exifcommon.IfdIdentity, tagPosition int, bp valueOffset, rawValueOffset, err := bp.getUint32() log.PanicIf(err) + // Check whether the embedded type indicator is valid. + if tagType.IsValid() == false { + // Technically, we have the type on-file in the tags-index, but + // if the type stored alongside the data disagrees with it, + // which it apparently does, all bets are off. + ifdEnumerateLogger.Warningf(nil, + "Tag (0x%04x) in IFD [%s] at position (%d) has invalid type (0x%04x) and will be skipped.", + tagId, ii, tagPosition, int(tagType)) + ite = &IfdTagEntry{ tagId: tagId, tagType: tagType, } - log.Panic(ErrTagTypeNotValid) + return ite, ErrTagTypeNotValid + } + + // Check whether the embedded type is listed among the supported types for + // the registered tag. If not, skip processing the tag. + + it, err := ie.tagIndex.Get(ii, tagId) + if err != nil { + if log.Is(err, ErrTagNotFound) == true { + ifdEnumerateLogger.Warningf(nil, "Tag (0x%04x) is not known and will be skipped.", tagId) + + ite = &IfdTagEntry{ + tagId: tagId, + } + + return ite, ErrTagNotFound + } + + log.Panic(err) } + // If we're trying to be as forgiving as possible then use whatever type was + // reported in the format. Otherwise, only accept a type that's expected for + // this tag. + if ie.tagIndex.UniversalSearch() == false && it.DoesSupportType(tagType) == false { + // The type in the stream disagrees with the type that this tag is + // expected to have. This can present issues with how we handle the + // special-case tags (e.g. thumbnails, GPS, etc..) when those tags + // suddenly have data that we no longer manipulate correctly/ + // accurately. + ifdEnumerateLogger.Warningf(nil, + "Tag (0x%04x) in IFD [%s] at position (%d) has unsupported type (0x%02x) and will be skipped.", + tagId, ii, tagPosition, int(tagType)) + + return nil, ErrTagTypeNotValid + } + + // Construct tag struct. + + rs, err := ie.ebs.GetReadSeeker(0) + log.PanicIf(err) + ite = newIfdTagEntry( ii, tagId, @@ -237,7 +294,7 @@ func (ie *IfdEnumerate) parseTag(ii *exifcommon.IfdIdentity, tagPosition int, bp unitCount, valueOffset, rawValueOffset, - ie.exifData[ExifAddressableAreaStart:], + rs, ie.byteOrder) ifdPath := ii.UnindexedString() @@ -263,10 +320,10 @@ func (ie *IfdEnumerate) parseTag(ii *exifcommon.IfdIdentity, tagPosition int, bp } // TagVisitorFn is called for each tag when enumerating through the EXIF. -type TagVisitorFn func(fqIfdPath string, ifdIndex int, ite *IfdTagEntry) (err error) +type TagVisitorFn func(ite *IfdTagEntry) (err error) -// postparseTag do some tag-level processing here following the parse of each. -func (ie *IfdEnumerate) postparseTag(ite *IfdTagEntry, med *MiscellaneousExifData) (err error) { +// tagPostParse do some tag-level processing here following the parse of each. +func (ie *IfdEnumerate) tagPostParse(ite *IfdTagEntry, med *MiscellaneousExifData) (err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -355,7 +412,7 @@ func (ie *IfdEnumerate) postparseTag(ite *IfdTagEntry, med *MiscellaneousExifDat // tag should ever be repeated, and b) all but one had an incorrect // type and caused parsing/conversion woes. So, this is a quick fix // for those scenarios. - if it.DoesSupportType(tagType) == false { + if ie.tagIndex.UniversalSearch() == false && it.DoesSupportType(tagType) == false { ifdEnumerateLogger.Warningf(nil, "Skipping tag [%s] (0x%04x) [%s] with an unexpected type: %v ∉ %v", ii.UnindexedString(), tagId, it.Name, @@ -389,18 +446,16 @@ func (ie *IfdEnumerate) parseIfd(ii *exifcommon.IfdIdentity, bp *byteParser, vis for i := 0; i < int(tagCount); i++ { ite, err := ie.parseTag(ii, i, bp) if err != nil { - if log.Is(err, ErrTagTypeNotValid) == true { - // Technically, we have the type on-file in the tags-index, but - // if the type stored alongside the data disagrees with it, - // which it apparently does, all bets are off. - ifdEnumerateLogger.Warningf(nil, "Tag (0x%04x) in IFD [%s] at position (%d) has invalid type (%d) and will be skipped.", ite.tagId, ii, i, ite.tagType) + if log.Is(err, ErrTagNotFound) == true || log.Is(err, ErrTagTypeNotValid) == true { + // These tags should've been fully logged in parseTag(). The + // ITE returned is nil so we can't print anything about them, now. continue } log.Panic(err) } - err = ie.postparseTag(ite, med) + err = ie.tagPostParse(ite, med) if err == nil { if err == ErrTagNotFound { continue @@ -412,7 +467,7 @@ func (ie *IfdEnumerate) parseIfd(ii *exifcommon.IfdIdentity, bp *byteParser, vis tagId := ite.TagId() if visitor != nil { - err := visitor(ii.String(), ii.Index(), ite) + err := visitor(ite) log.PanicIf(err) } @@ -478,27 +533,43 @@ func (ie *IfdEnumerate) parseIfd(ii *exifcommon.IfdIdentity, bp *byteParser, vis if enumeratorThumbnailOffset != nil && enumeratorThumbnailSize != nil { thumbnailData, err = ie.parseThumbnail(enumeratorThumbnailOffset, enumeratorThumbnailSize) - log.PanicIf(err) - - // In this case, the value is always an offset. - offset := enumeratorThumbnailOffset.getValueOffset() + if err != nil { + ifdEnumerateLogger.Errorf( + nil, err, + "We tried to bump our furthest-offset counter but there was an issue first seeking past the thumbnail.") + } else { + // In this case, the value is always an offset. + offset := enumeratorThumbnailOffset.getValueOffset() - // This this case, the value is always a length. - length := enumeratorThumbnailSize.getValueOffset() + // This this case, the value is always a length. + length := enumeratorThumbnailSize.getValueOffset() - ifdEnumerateLogger.Debugf(nil, "Found thumbnail in IFD [%s]. Its offset is (%d) and is (%d) bytes.", ii, offset, length) + ifdEnumerateLogger.Debugf(nil, "Found thumbnail in IFD [%s]. Its offset is (%d) and is (%d) bytes.", ii, offset, length) - furthestOffset := offset + length + furthestOffset := offset + length - if furthestOffset > ie.furthestOffset { - ie.furthestOffset = furthestOffset + if furthestOffset > ie.furthestOffset { + ie.furthestOffset = furthestOffset + } } } nextIfdOffset, _, err = bp.getUint32() log.PanicIf(err) - ifdEnumerateLogger.Debugf(nil, "Next IFD at offset: (%08x)", nextIfdOffset) + _, alreadyVisited := ie.visitedIfdOffsets[nextIfdOffset] + + if alreadyVisited == true { + ifdEnumerateLogger.Warningf(nil, "IFD at offset (0x%08x) has been linked-to more than once. There might be a cycle in the IFD chain. Not reparsing.", nextIfdOffset) + nextIfdOffset = 0 + } + + if nextIfdOffset != 0 { + ie.visitedIfdOffsets[nextIfdOffset] = struct{}{} + ifdEnumerateLogger.Debugf(nil, "[%s] Next IFD at offset: (0x%08x)", ii.String(), nextIfdOffset) + } else { + ifdEnumerateLogger.Debugf(nil, "[%s] IFD chain has terminated.", ii.String()) + } return nextIfdOffset, entries, thumbnailData, nil } @@ -587,9 +658,14 @@ func (med *MiscellaneousExifData) UnknownTags() map[exifcommon.BasicTag]exifcomm return med.unknownTags } +// ScanOptions tweaks parser behavior/choices. +type ScanOptions struct { + // NOTE(dustin): Reserved for future usage. +} + // Scan enumerates the different EXIF blocks (called IFDs). `rootIfdName` will // be "IFD" in the TIFF standard. -func (ie *IfdEnumerate) Scan(iiRoot *exifcommon.IfdIdentity, ifdOffset uint32, visitor TagVisitorFn) (med *MiscellaneousExifData, err error) { +func (ie *IfdEnumerate) Scan(iiRoot *exifcommon.IfdIdentity, ifdOffset uint32, visitor TagVisitorFn, so *ScanOptions) (med *MiscellaneousExifData, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -612,38 +688,32 @@ func (ie *IfdEnumerate) Scan(iiRoot *exifcommon.IfdIdentity, ifdOffset uint32, v // Ifd represents a single, parsed IFD. type Ifd struct { - - // TODO(dustin): Add NextIfd(). - ifdIdentity *exifcommon.IfdIdentity - ByteOrder binary.ByteOrder + ifdMapping *exifcommon.IfdMapping + tagIndex *TagIndex - Id int + offset uint32 + byteOrder binary.ByteOrder + id int - ParentIfd *Ifd + parentIfd *Ifd // ParentTagIndex is our tag position in the parent IFD, if we had a parent // (if `ParentIfd` is not nil and we weren't an IFD referenced as a sibling // instead of as a child). - ParentTagIndex int - - Offset uint32 + parentTagIndex int - Entries []*IfdTagEntry - EntriesByTagId map[uint16][]*IfdTagEntry + entries []*IfdTagEntry + entriesByTagId map[uint16][]*IfdTagEntry - Children []*Ifd - - ChildIfdIndex map[string]*Ifd - - NextIfdOffset uint32 - NextIfd *Ifd + children []*Ifd + childIfdIndex map[string]*Ifd thumbnailData []byte - ifdMapping *exifcommon.IfdMapping - tagIndex *TagIndex + nextIfdOffset uint32 + nextIfd *Ifd } // IfdIdentity returns IFD identity that this struct represents. @@ -651,6 +721,71 @@ func (ifd *Ifd) IfdIdentity() *exifcommon.IfdIdentity { return ifd.ifdIdentity } +// Entries returns a flat list of all tags for this IFD. +func (ifd *Ifd) Entries() []*IfdTagEntry { + + // TODO(dustin): Add test + + return ifd.entries +} + +// EntriesByTagId returns a map of all tags for this IFD. +func (ifd *Ifd) EntriesByTagId() map[uint16][]*IfdTagEntry { + + // TODO(dustin): Add test + + return ifd.entriesByTagId +} + +// Children returns a flat list of all child IFDs of this IFD. +func (ifd *Ifd) Children() []*Ifd { + + // TODO(dustin): Add test + + return ifd.children +} + +// ChildWithIfdPath returns a map of all child IFDs of this IFD. +func (ifd *Ifd) ChildIfdIndex() map[string]*Ifd { + + // TODO(dustin): Add test + + return ifd.childIfdIndex +} + +// ParentTagIndex returns the position of this IFD's tag in its parent IFD (*if* +// there is a parent). +func (ifd *Ifd) ParentTagIndex() int { + + // TODO(dustin): Add test + + return ifd.parentTagIndex +} + +// Offset returns the offset of the IFD in the stream. +func (ifd *Ifd) Offset() uint32 { + + // TODO(dustin): Add test + + return ifd.offset +} + +// Offset returns the offset of the IFD in the stream. +func (ifd *Ifd) ByteOrder() binary.ByteOrder { + + // TODO(dustin): Add test + + return ifd.byteOrder +} + +// NextIfd returns the Ifd struct for the next IFD in the chain. +func (ifd *Ifd) NextIfd() *Ifd { + + // TODO(dustin): Add test + + return ifd.nextIfd +} + // ChildWithIfdPath returns an `Ifd` struct for the given child of the current // IFD. func (ifd *Ifd) ChildWithIfdPath(iiChild *exifcommon.IfdIdentity) (childIfd *Ifd, err error) { @@ -663,7 +798,7 @@ func (ifd *Ifd) ChildWithIfdPath(iiChild *exifcommon.IfdIdentity) (childIfd *Ifd // TODO(dustin): This is a bridge while we're introducing the IFD type-system. We should be able to use the (IfdIdentity).Equals() method for this. ifdPath := iiChild.UnindexedString() - for _, childIfd := range ifd.Children { + for _, childIfd := range ifd.children { if childIfd.ifdIdentity.UnindexedString() == ifdPath { return childIfd, nil } @@ -682,7 +817,7 @@ func (ifd *Ifd) FindTagWithId(tagId uint16) (results []*IfdTagEntry, err error) } }() - results, found := ifd.EntriesByTagId[tagId] + results, found := ifd.entriesByTagId[tagId] if found != true { log.Panic(ErrTagNotFound) } @@ -707,7 +842,7 @@ func (ifd *Ifd) FindTagWithName(tagName string) (results []*IfdTagEntry, err err } results = make([]*IfdTagEntry, 0) - for _, ite := range ifd.Entries { + for _, ite := range ifd.entries { if ite.TagId() == it.Id { results = append(results, ite) } @@ -723,11 +858,11 @@ func (ifd *Ifd) FindTagWithName(tagName string) (results []*IfdTagEntry, err err // String returns a description string. func (ifd *Ifd) String() string { parentOffset := uint32(0) - if ifd.ParentIfd != nil { - parentOffset = ifd.ParentIfd.Offset + if ifd.parentIfd != nil { + parentOffset = ifd.parentIfd.offset } - return fmt.Sprintf("Ifd", ifd.Id, ifd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.Index(), len(ifd.Entries), ifd.Offset, len(ifd.Children), parentOffset, ifd.NextIfdOffset) + return fmt.Sprintf("Ifd", ifd.id, ifd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.Index(), len(ifd.entries), ifd.offset, len(ifd.children), parentOffset, ifd.nextIfdOffset) } // Thumbnail returns the raw thumbnail bytes. This is typically directly @@ -751,14 +886,14 @@ func (ifd *Ifd) dumpTags(tags []*IfdTagEntry) []*IfdTagEntry { ifdsFoundCount := 0 - for _, ite := range ifd.Entries { + for _, ite := range ifd.entries { tags = append(tags, ite) childIfdPath := ite.ChildIfdPath() if childIfdPath != "" { ifdsFoundCount++ - childIfd, found := ifd.ChildIfdIndex[childIfdPath] + childIfd, found := ifd.childIfdIndex[childIfdPath] if found != true { log.Panicf("alien child IFD referenced by a tag: [%s]", childIfdPath) } @@ -767,12 +902,12 @@ func (ifd *Ifd) dumpTags(tags []*IfdTagEntry) []*IfdTagEntry { } } - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) + if len(ifd.children) != ifdsFoundCount { + log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.children), ifdsFoundCount) } - if ifd.NextIfd != nil { - tags = ifd.NextIfd.dumpTags(tags) + if ifd.nextIfd != nil { + tags = ifd.nextIfd.dumpTags(tags) } return tags @@ -797,7 +932,7 @@ func (ifd *Ifd) printTagTree(populateValues bool, index, level int, nextLink boo ifdsFoundCount := 0 - for _, ite := range ifd.Entries { + for _, ite := range ifd.entries { if ite.ChildIfdPath() != "" { fmt.Printf("%s - TAG: %s\n", indent, ite) } else { @@ -841,7 +976,7 @@ func (ifd *Ifd) printTagTree(populateValues bool, index, level int, nextLink boo if childIfdPath != "" { ifdsFoundCount++ - childIfd, found := ifd.ChildIfdIndex[childIfdPath] + childIfd, found := ifd.childIfdIndex[childIfdPath] if found != true { log.Panicf("alien child IFD referenced by a tag: [%s]", childIfdPath) } @@ -850,12 +985,12 @@ func (ifd *Ifd) printTagTree(populateValues bool, index, level int, nextLink boo } } - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) + if len(ifd.children) != ifdsFoundCount { + log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.children), ifdsFoundCount) } - if ifd.NextIfd != nil { - ifd.NextIfd.printTagTree(populateValues, index+1, level, true) + if ifd.nextIfd != nil { + ifd.nextIfd.printTagTree(populateValues, index+1, level, true) } } @@ -878,12 +1013,12 @@ func (ifd *Ifd) printIfdTree(level int, nextLink bool) { ifdsFoundCount := 0 - for _, ite := range ifd.Entries { + for _, ite := range ifd.entries { childIfdPath := ite.ChildIfdPath() if childIfdPath != "" { ifdsFoundCount++ - childIfd, found := ifd.ChildIfdIndex[childIfdPath] + childIfd, found := ifd.childIfdIndex[childIfdPath] if found != true { log.Panicf("alien child IFD referenced by a tag: [%s]", childIfdPath) } @@ -892,12 +1027,12 @@ func (ifd *Ifd) printIfdTree(level int, nextLink bool) { } } - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) + if len(ifd.children) != ifdsFoundCount { + log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.children), ifdsFoundCount) } - if ifd.NextIfd != nil { - ifd.NextIfd.printIfdTree(level, true) + if ifd.nextIfd != nil { + ifd.nextIfd.printIfdTree(level, true) } } @@ -914,8 +1049,8 @@ func (ifd *Ifd) dumpTree(tagsDump []string, level int) []string { indent := strings.Repeat(" ", level*2) var ifdPhrase string - if ifd.ParentIfd != nil { - ifdPhrase = fmt.Sprintf("[%s]->[%s]:(%d)", ifd.ParentIfd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.Index()) + if ifd.parentIfd != nil { + ifdPhrase = fmt.Sprintf("[%s]->[%s]:(%d)", ifd.parentIfd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.Index()) } else { ifdPhrase = fmt.Sprintf("[ROOT]->[%s]:(%d)", ifd.ifdIdentity.UnindexedString(), ifd.ifdIdentity.Index()) } @@ -924,14 +1059,14 @@ func (ifd *Ifd) dumpTree(tagsDump []string, level int) []string { tagsDump = append(tagsDump, startBlurb) ifdsFoundCount := 0 - for _, ite := range ifd.Entries { + for _, ite := range ifd.entries { tagsDump = append(tagsDump, fmt.Sprintf("%s - (0x%04x)", indent, ite.TagId())) childIfdPath := ite.ChildIfdPath() if childIfdPath != "" { ifdsFoundCount++ - childIfd, found := ifd.ChildIfdIndex[childIfdPath] + childIfd, found := ifd.childIfdIndex[childIfdPath] if found != true { log.Panicf("alien child IFD referenced by a tag: [%s]", childIfdPath) } @@ -940,18 +1075,18 @@ func (ifd *Ifd) dumpTree(tagsDump []string, level int) []string { } } - if len(ifd.Children) != ifdsFoundCount { - log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.Children), ifdsFoundCount) + if len(ifd.children) != ifdsFoundCount { + log.Panicf("have one or more dangling child IFDs: (%d) != (%d)", len(ifd.children), ifdsFoundCount) } finishBlurb := fmt.Sprintf("%s< IFD %s BOTTOM", indent, ifdPhrase) tagsDump = append(tagsDump, finishBlurb) - if ifd.NextIfd != nil { - siblingBlurb := fmt.Sprintf("%s* LINKING TO SIBLING IFD [%s]:(%d)", indent, ifd.NextIfd.ifdIdentity.UnindexedString(), ifd.NextIfd.ifdIdentity.Index()) + if ifd.nextIfd != nil { + siblingBlurb := fmt.Sprintf("%s* LINKING TO SIBLING IFD [%s]:(%d)", indent, ifd.nextIfd.ifdIdentity.UnindexedString(), ifd.nextIfd.ifdIdentity.Index()) tagsDump = append(tagsDump, siblingBlurb) - tagsDump = ifd.NextIfd.dumpTree(tagsDump, level) + tagsDump = ifd.nextIfd.dumpTree(tagsDump, level) } return tagsDump @@ -973,11 +1108,11 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { gi = new(GpsInfo) - if ifd.ifdIdentity.UnindexedString() != exifcommon.IfdGpsInfoStandardIfdIdentity.UnindexedString() { - log.Panicf("GPS can only be read on GPS IFD: [%s] != [%s]", ifd.ifdIdentity.UnindexedString(), exifcommon.IfdGpsInfoStandardIfdIdentity.UnindexedString()) + if ifd.ifdIdentity.Equals(exifcommon.IfdGpsInfoStandardIfdIdentity) == false { + log.Panicf("GPS can only be read on GPS IFD: [%s]", ifd.ifdIdentity.UnindexedString()) } - if tags, found := ifd.EntriesByTagId[TagGpsVersionId]; found == false { + if tags, found := ifd.entriesByTagId[TagGpsVersionId]; found == false { // We've seen this. We'll just have to default to assuming we're in a // 2.2.0.0 format. ifdEnumerateLogger.Warningf(nil, "No GPS version tag (0x%04x) found.", TagGpsVersionId) @@ -999,7 +1134,7 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { } } - tags, found := ifd.EntriesByTagId[TagLatitudeId] + tags, found := ifd.entriesByTagId[TagLatitudeId] if found == false { ifdEnumerateLogger.Warningf(nil, "latitude not found") log.Panic(ErrNoGpsTags) @@ -1009,7 +1144,7 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { log.PanicIf(err) // Look for whether North or South. - tags, found = ifd.EntriesByTagId[TagLatitudeRefId] + tags, found = ifd.entriesByTagId[TagLatitudeRefId] if found == false { ifdEnumerateLogger.Warningf(nil, "latitude-ref not found") log.Panic(ErrNoGpsTags) @@ -1018,7 +1153,7 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { latitudeRefValue, err := tags[0].Value() log.PanicIf(err) - tags, found = ifd.EntriesByTagId[TagLongitudeId] + tags, found = ifd.entriesByTagId[TagLongitudeId] if found == false { ifdEnumerateLogger.Warningf(nil, "longitude not found") log.Panic(ErrNoGpsTags) @@ -1028,7 +1163,7 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { log.PanicIf(err) // Look for whether West or East. - tags, found = ifd.EntriesByTagId[TagLongitudeRefId] + tags, found = ifd.entriesByTagId[TagLongitudeRefId] if found == false { ifdEnumerateLogger.Warningf(nil, "longitude-ref not found") log.Panic(ErrNoGpsTags) @@ -1051,8 +1186,8 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { // Parse altitude. - altitudeTags, foundAltitude := ifd.EntriesByTagId[TagAltitudeId] - altitudeRefTags, foundAltitudeRef := ifd.EntriesByTagId[TagAltitudeRefId] + altitudeTags, foundAltitude := ifd.entriesByTagId[TagAltitudeId] + altitudeRefTags, foundAltitudeRef := ifd.entriesByTagId[TagAltitudeRefId] if foundAltitude == true && foundAltitudeRef == true { altitudePhrase, err := altitudeTags[0].Format() @@ -1085,8 +1220,8 @@ func (ifd *Ifd) GpsInfo() (gi *GpsInfo, err error) { // Parse timestamp from separate date and time tags. - timestampTags, foundTimestamp := ifd.EntriesByTagId[TagTimestampId] - datestampTags, foundDatestamp := ifd.EntriesByTagId[TagDatestampId] + timestampTags, foundTimestamp := ifd.entriesByTagId[TagTimestampId] + datestampTags, foundDatestamp := ifd.entriesByTagId[TagDatestampId] if foundTimestamp == true && foundDatestamp == true { datestampValue, err := datestampTags[0].Value() @@ -1139,11 +1274,11 @@ func (ifd *Ifd) EnumerateTagsRecursively(visitor ParsedTagVisitor) (err error) { } }() - for ptr := ifd; ptr != nil; ptr = ptr.NextIfd { - for _, ite := range ifd.Entries { + for ptr := ifd; ptr != nil; ptr = ptr.nextIfd { + for _, ite := range ifd.entries { childIfdPath := ite.ChildIfdPath() if childIfdPath != "" { - childIfd := ifd.ChildIfdIndex[childIfdPath] + childIfd := ifd.childIfdIndex[childIfdPath] err := childIfd.EnumerateTagsRecursively(visitor) log.PanicIf(err) @@ -1254,21 +1389,21 @@ func (ie *IfdEnumerate) Collect(rootIfdOffset uint32) (index IfdIndex, err error ifd := &Ifd{ ifdIdentity: ii, - ByteOrder: ie.byteOrder, + byteOrder: ie.byteOrder, - Id: id, + id: id, - ParentIfd: parentIfd, - ParentTagIndex: qi.ParentTagIndex, + parentIfd: parentIfd, + parentTagIndex: qi.ParentTagIndex, - Offset: offset, - Entries: entries, - EntriesByTagId: entriesByTagId, + offset: offset, + entries: entries, + entriesByTagId: entriesByTagId, // This is populated as each child is processed. - Children: make([]*Ifd, 0), + children: make([]*Ifd, 0), - NextIfdOffset: nextIfdOffset, + nextIfdOffset: nextIfdOffset, thumbnailData: thumbnailData, ifdMapping: ie.ifdMapping, @@ -1286,13 +1421,13 @@ func (ie *IfdEnumerate) Collect(rootIfdOffset uint32) (index IfdIndex, err error // Add a link from the previous IFD in the chain to us. if previousIfd, found := edges[offset]; found == true { - previousIfd.NextIfd = ifd + previousIfd.nextIfd = ifd } // Attach as a child to our parent (where we appeared as a tag in // that IFD). if parentIfd != nil { - parentIfd.Children = append(parentIfd.Children, ifd) + parentIfd.children = append(parentIfd.children, ifd) } // Determine if any of our entries is a child IFD and queue it. @@ -1362,13 +1497,13 @@ func (ie *IfdEnumerate) setChildrenIndex(ifd *Ifd) (err error) { }() childIfdIndex := make(map[string]*Ifd) - for _, childIfd := range ifd.Children { + for _, childIfd := range ifd.children { childIfdIndex[childIfd.ifdIdentity.UnindexedString()] = childIfd } - ifd.ChildIfdIndex = childIfdIndex + ifd.childIfdIndex = childIfdIndex - for _, childIfd := range ifd.Children { + for _, childIfd := range ifd.children { err := ie.setChildrenIndex(childIfd) log.PanicIf(err) } @@ -1391,21 +1526,26 @@ func (ie *IfdEnumerate) FurthestOffset() uint32 { return ie.furthestOffset } -// ParseOneIfd is a hack to use an IE to parse a raw IFD block. Can be used for +// parseOneIfd is a hack to use an IE to parse a raw IFD block. Can be used for // testing. The fqIfdPath ("fully-qualified IFD path") will be less qualified // in that the numeric index will always be zero (the zeroth child) rather than // the proper number (if its actually a sibling to the first child, for // instance). -func ParseOneIfd(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ii *exifcommon.IfdIdentity, byteOrder binary.ByteOrder, ifdBlock []byte, visitor TagVisitorFn) (nextIfdOffset uint32, entries []*IfdTagEntry, err error) { +func parseOneIfd(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ii *exifcommon.IfdIdentity, byteOrder binary.ByteOrder, ifdBlock []byte, visitor TagVisitorFn) (nextIfdOffset uint32, entries []*IfdTagEntry, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) } }() - ie := NewIfdEnumerate(ifdMapping, tagIndex, make([]byte, 0), byteOrder) + // TODO(dustin): Add test + + ebs := NewExifReadSeekerWithBytes(ifdBlock) + + rs, err := ebs.GetReadSeeker(0) + log.PanicIf(err) - bp, err := newByteParser(ifdBlock, byteOrder, 0) + bp, err := newByteParser(rs, byteOrder, 0) if err != nil { if err == ErrOffsetInvalid { return 0, nil, err @@ -1414,23 +1554,31 @@ func ParseOneIfd(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ii *exif log.Panic(err) } + dummyEbs := NewExifReadSeekerWithBytes([]byte{}) + ie := NewIfdEnumerate(ifdMapping, tagIndex, dummyEbs, byteOrder) + nextIfdOffset, entries, _, err = ie.parseIfd(ii, bp, visitor, true, nil) log.PanicIf(err) return nextIfdOffset, entries, nil } -// ParseOneTag is a hack to use an IE to parse a raw tag block. -func ParseOneTag(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ii *exifcommon.IfdIdentity, byteOrder binary.ByteOrder, tagBlock []byte) (ite *IfdTagEntry, err error) { +// parseOneTag is a hack to use an IE to parse a raw tag block. +func parseOneTag(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ii *exifcommon.IfdIdentity, byteOrder binary.ByteOrder, tagBlock []byte) (ite *IfdTagEntry, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) } }() - ie := NewIfdEnumerate(ifdMapping, tagIndex, make([]byte, 0), byteOrder) + // TODO(dustin): Add test + + ebs := NewExifReadSeekerWithBytes(tagBlock) - bp, err := newByteParser(tagBlock, byteOrder, 0) + rs, err := ebs.GetReadSeeker(0) + log.PanicIf(err) + + bp, err := newByteParser(rs, byteOrder, 0) if err != nil { if err == ErrOffsetInvalid { return nil, err @@ -1439,10 +1587,13 @@ func ParseOneTag(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, ii *exif log.Panic(err) } + dummyEbs := NewExifReadSeekerWithBytes([]byte{}) + ie := NewIfdEnumerate(ifdMapping, tagIndex, dummyEbs, byteOrder) + ite, err = ie.parseTag(ii, 0, bp) log.PanicIf(err) - err = ie.postparseTag(ite, nil) + err = ie.tagPostParse(ite, nil) if err != nil { if err == ErrTagNotFound { return nil, err @@ -1484,16 +1635,16 @@ func FindIfdFromRootIfd(rootIfd *Ifd, ifdPath string) (ifd *Ifd, err error) { // TODO(dustin): !! <-- However, we're not sure whether we shouldn't store a secondary IFD-path with the indices. Some IFDs may not necessarily restrict which IFD indices they can be a child of (only the IFD itself matters). Validation should be delegated to the caller. thisIfd := rootIfd for currentRootIndex := 0; currentRootIndex < desiredRootIndex; currentRootIndex++ { - if thisIfd.NextIfd == nil { + if thisIfd.nextIfd == nil { log.Panicf("Root-IFD index (%d) does not exist in the data.", currentRootIndex) } - thisIfd = thisIfd.NextIfd + thisIfd = thisIfd.nextIfd } for _, itii := range lineage { var hit *Ifd - for _, childIfd := range thisIfd.Children { + for _, childIfd := range thisIfd.children { if childIfd.ifdIdentity.TagId() == itii.TagId { hit = childIfd break @@ -1502,18 +1653,18 @@ func FindIfdFromRootIfd(rootIfd *Ifd, ifdPath string) (ifd *Ifd, err error) { // If we didn't find the child, add it. if hit == nil { - log.Panicf("IFD [%s] in [%s] not found: %s", itii.Name, ifdPath, thisIfd.Children) + log.Panicf("IFD [%s] in [%s] not found: %s", itii.Name, ifdPath, thisIfd.children) } thisIfd = hit // If we didn't find the sibling, add it. for i := 0; i < itii.Index; i++ { - if thisIfd.NextIfd == nil { + if thisIfd.nextIfd == nil { log.Panicf("IFD [%s] does not have (%d) occurrences/siblings", thisIfd.ifdIdentity.UnindexedString(), itii.Index) } - thisIfd = thisIfd.NextIfd + thisIfd = thisIfd.nextIfd } } diff --git a/vendor/github.com/dsoprea/go-exif/v2/ifd_tag_entry.go b/vendor/github.com/dsoprea/go-exif/v3/ifd_tag_entry.go similarity index 93% rename from vendor/github.com/dsoprea/go-exif/v2/ifd_tag_entry.go rename to vendor/github.com/dsoprea/go-exif/v3/ifd_tag_entry.go index 789a9981c1..ed6ba2291e 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/ifd_tag_entry.go +++ b/vendor/github.com/dsoprea/go-exif/v3/ifd_tag_entry.go @@ -2,13 +2,14 @@ package exif import ( "fmt" + "io" "encoding/binary" "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" - "github.com/dsoprea/go-exif/v2/undefined" + "github.com/dsoprea/go-exif/v3/common" + "github.com/dsoprea/go-exif/v3/undefined" ) var ( @@ -42,23 +43,23 @@ type IfdTagEntry struct { isUnhandledUnknown bool - addressableData []byte - byteOrder binary.ByteOrder + rs io.ReadSeeker + byteOrder binary.ByteOrder tagName string } -func newIfdTagEntry(ii *exifcommon.IfdIdentity, tagId uint16, tagIndex int, tagType exifcommon.TagTypePrimitive, unitCount uint32, valueOffset uint32, rawValueOffset []byte, addressableData []byte, byteOrder binary.ByteOrder) *IfdTagEntry { +func newIfdTagEntry(ii *exifcommon.IfdIdentity, tagId uint16, tagIndex int, tagType exifcommon.TagTypePrimitive, unitCount uint32, valueOffset uint32, rawValueOffset []byte, rs io.ReadSeeker, byteOrder binary.ByteOrder) *IfdTagEntry { return &IfdTagEntry{ - ifdIdentity: ii, - tagId: tagId, - tagIndex: tagIndex, - tagType: tagType, - unitCount: unitCount, - valueOffset: valueOffset, - rawValueOffset: rawValueOffset, - addressableData: addressableData, - byteOrder: byteOrder, + ifdIdentity: ii, + tagId: tagId, + tagIndex: tagIndex, + tagType: tagType, + unitCount: unitCount, + valueOffset: valueOffset, + rawValueOffset: rawValueOffset, + rs: rs, + byteOrder: byteOrder, } } @@ -291,7 +292,7 @@ func (ite *IfdTagEntry) getValueContext() *exifcommon.ValueContext { ite.unitCount, ite.valueOffset, ite.rawValueOffset, - ite.addressableData, + ite.rs, ite.tagType, ite.byteOrder) } diff --git a/vendor/github.com/dsoprea/go-exif/v2/package.go b/vendor/github.com/dsoprea/go-exif/v3/package.go similarity index 100% rename from vendor/github.com/dsoprea/go-exif/v2/package.go rename to vendor/github.com/dsoprea/go-exif/v3/package.go diff --git a/vendor/github.com/dsoprea/go-exif/v2/tags.go b/vendor/github.com/dsoprea/go-exif/v3/tags.go similarity index 88% rename from vendor/github.com/dsoprea/go-exif/v2/tags.go rename to vendor/github.com/dsoprea/go-exif/v3/tags.go index f53d9ce9c9..aca902c5d7 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/tags.go +++ b/vendor/github.com/dsoprea/go-exif/v3/tags.go @@ -2,11 +2,12 @@ package exif import ( "fmt" + "sync" "github.com/dsoprea/go-logging" "gopkg.in/yaml.v2" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) const ( @@ -114,7 +115,7 @@ func (it *IndexedTag) Is(ifdPath string, id uint16) bool { // GetEncodingType returns the largest type that this tag's value can occupy. func (it *IndexedTag) GetEncodingType(value interface{}) exifcommon.TagTypePrimitive { // For convenience, we handle encoding a `time.Time` directly. - if IsTime(value) == true { + if exifcommon.IsTime(value) == true { // Timestamps are encoded as ASCII. value = "" } @@ -177,6 +178,10 @@ func (it *IndexedTag) DoesSupportType(tagType exifcommon.TagTypePrimitive) bool type TagIndex struct { tagsByIfd map[string]map[uint16]*IndexedTag tagsByIfdR map[string]map[string]*IndexedTag + + mutex sync.Mutex + + doUniversalSearch bool } // NewTagIndex returns a new TagIndex struct. @@ -189,6 +194,16 @@ func NewTagIndex() *TagIndex { return ti } +// SetUniversalSearch enables a fallback to matching tags under *any* IFD. +func (ti *TagIndex) SetUniversalSearch(flag bool) { + ti.doUniversalSearch = flag +} + +// UniversalSearch enables a fallback to matching tags under *any* IFD. +func (ti *TagIndex) UniversalSearch() bool { + return ti.doUniversalSearch +} + // Add registers a new tag to be recognized during the parse. func (ti *TagIndex) Add(it *IndexedTag) (err error) { defer func() { @@ -197,6 +212,9 @@ func (ti *TagIndex) Add(it *IndexedTag) (err error) { } }() + ti.mutex.Lock() + defer ti.mutex.Unlock() + // Store by ID. family, found := ti.tagsByIfd[it.IfdPath] @@ -228,9 +246,7 @@ func (ti *TagIndex) Add(it *IndexedTag) (err error) { return nil } -// Get returns information about the non-IFD tag given a tag ID. `ifdPath` must -// not be fully-qualified. -func (ti *TagIndex) Get(ii *exifcommon.IfdIdentity, id uint16) (it *IndexedTag, err error) { +func (ti *TagIndex) getOne(ifdPath string, id uint16) (it *IndexedTag, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -242,7 +258,8 @@ func (ti *TagIndex) Get(ii *exifcommon.IfdIdentity, id uint16) (it *IndexedTag, log.PanicIf(err) } - ifdPath := ii.UnindexedString() + ti.mutex.Lock() + defer ti.mutex.Unlock() family, found := ti.tagsByIfd[ifdPath] if found == false { @@ -257,6 +274,53 @@ func (ti *TagIndex) Get(ii *exifcommon.IfdIdentity, id uint16) (it *IndexedTag, return it, nil } +// Get returns information about the non-IFD tag given a tag ID. `ifdPath` must +// not be fully-qualified. +func (ti *TagIndex) Get(ii *exifcommon.IfdIdentity, id uint16) (it *IndexedTag, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + ifdPath := ii.UnindexedString() + + it, err = ti.getOne(ifdPath, id) + if err == nil { + return it, nil + } else if err != ErrTagNotFound { + log.Panic(err) + } + + if ti.doUniversalSearch == false { + return nil, ErrTagNotFound + } + + // We've been told to fallback to look for the tag in other IFDs. + + skipIfdPath := ii.UnindexedString() + + for currentIfdPath, _ := range ti.tagsByIfd { + if currentIfdPath == skipIfdPath { + // Skip the primary IFD, which has already been checked. + continue + } + + it, err = ti.getOne(currentIfdPath, id) + if err == nil { + tagsLogger.Warningf(nil, + "Found tag (0x%02x) in the wrong IFD: [%s] != [%s]", + id, currentIfdPath, ifdPath) + + return it, nil + } else if err != ErrTagNotFound { + log.Panic(err) + } + } + + return nil, ErrTagNotFound +} + var ( // tagGuessDefaultIfdIdentities describes which IFDs we'll look for a given // tag-ID in, if it's not found where it's supposed to be. We suppose that diff --git a/vendor/github.com/dsoprea/go-exif/v2/tags_data.go b/vendor/github.com/dsoprea/go-exif/v3/tags_data.go similarity index 91% rename from vendor/github.com/dsoprea/go-exif/v2/tags_data.go rename to vendor/github.com/dsoprea/go-exif/v3/tags_data.go index a770e55971..dcf0cc4f45 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/tags_data.go +++ b/vendor/github.com/dsoprea/go-exif/v3/tags_data.go @@ -59,6 +59,15 @@ IFD/Exif: - id: 0x9004 name: DateTimeDigitized type_name: ASCII +- id: 0x9010 + name: OffsetTime + type_name: ASCII +- id: 0x9011 + name: OffsetTimeOriginal + type_name: ASCII +- id: 0x9012 + name: OffsetTimeDigitized + type_name: ASCII - id: 0x9101 name: ComponentsConfiguration type_name: UNDEFINED @@ -909,6 +918,36 @@ IFD: - id: 0xc74e name: OpcodeList3 type_name: UNDEFINED +# This tag may be used to specify the size of raster pixel spacing in the +# model space units, when the raster space can be embedded in the model space +# coordinate system without rotation, and consists of the following 3 values: +# ModelPixelScaleTag = (ScaleX, ScaleY, ScaleZ) +# where ScaleX and ScaleY give the horizontal and vertical spacing of raster +# pixels. The ScaleZ is primarily used to map the pixel value of a digital +# elevation model into the correct Z-scale, and so for most other purposes +# this value should be zero (since most model spaces are 2-D, with Z=0). +# Source: http://geotiff.maptools.org/spec/geotiff2.6.html#2.6.1 +- id: 0x830e + name: ModelPixelScaleTag + type_name: DOUBLE +# This tag stores raster->model tiepoint pairs in the order +# ModelTiepointTag = (...,I,J,K, X,Y,Z...), +# where (I,J,K) is the point at location (I,J) in raster space with +# pixel-value K, and (X,Y,Z) is a vector in model space. In most cases the +# model space is only two-dimensional, in which case both K and Z should be +# set to zero; this third dimension is provided in anticipation of future +# support for 3D digital elevation models and vertical coordinate systems. +# Source: http://geotiff.maptools.org/spec/geotiff2.6.html#2.6.1 +- id: 0x8482 + name: ModelTiepointTag + type_name: DOUBLE +# This tag may be used to specify the transformation matrix between the +# raster space (and its dependent pixel-value space) and the (possibly 3D) +# model space. +# Source: http://geotiff.maptools.org/spec/geotiff2.6.html#2.6.1 +- id: 0x85d8 + name: ModelTransformationTag + type_name: DOUBLE IFD/Exif/Iop: - id: 0x0001 name: InteroperabilityIndex diff --git a/vendor/github.com/dsoprea/go-exif/v2/testing_common.go b/vendor/github.com/dsoprea/go-exif/v3/testing_common.go similarity index 84% rename from vendor/github.com/dsoprea/go-exif/v2/testing_common.go rename to vendor/github.com/dsoprea/go-exif/v3/testing_common.go index fe69df936c..061276430f 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/testing_common.go +++ b/vendor/github.com/dsoprea/go-exif/v3/testing_common.go @@ -9,7 +9,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) var ( @@ -24,9 +24,9 @@ func getExifSimpleTestIb() *IfdBuilder { } }() - im := NewIfdMapping() + im := exifcommon.NewIfdMapping() - err := LoadStandardIfds(im) + err := exifcommon.LoadStandardIfds(im) log.PanicIf(err) ti := NewTagIndex() @@ -55,9 +55,9 @@ func getExifSimpleTestIbBytes() []byte { } }() - im := NewIfdMapping() + im := exifcommon.NewIfdMapping() - err := LoadStandardIfds(im) + err := exifcommon.LoadStandardIfds(im) log.PanicIf(err) ti := NewTagIndex() @@ -91,9 +91,9 @@ func validateExifSimpleTestIb(exifData []byte, t *testing.T) { } }() - im := NewIfdMapping() + im := exifcommon.NewIfdMapping() - err := LoadStandardIfds(im) + err := exifcommon.LoadStandardIfds(im) log.PanicIf(err) ti := NewTagIndex() @@ -113,19 +113,19 @@ func validateExifSimpleTestIb(exifData []byte, t *testing.T) { ifd := index.RootIfd - if ifd.ByteOrder != exifcommon.TestDefaultByteOrder { + if ifd.ByteOrder() != exifcommon.TestDefaultByteOrder { t.Fatalf("IFD byte-order not correct.") } else if ifd.ifdIdentity.UnindexedString() != exifcommon.IfdStandardIfdIdentity.UnindexedString() { t.Fatalf("IFD name not correct.") } else if ifd.ifdIdentity.Index() != 0 { t.Fatalf("IFD index not zero: (%d)", ifd.ifdIdentity.Index()) - } else if ifd.Offset != uint32(0x0008) { + } else if ifd.Offset() != uint32(0x0008) { t.Fatalf("IFD offset not correct.") - } else if len(ifd.Entries) != 4 { - t.Fatalf("IFD number of entries not correct: (%d)", len(ifd.Entries)) - } else if ifd.NextIfdOffset != uint32(0) { + } else if len(ifd.Entries()) != 4 { + t.Fatalf("IFD number of entries not correct: (%d)", len(ifd.Entries())) + } else if ifd.nextIfdOffset != uint32(0) { t.Fatalf("Next-IFD offset is non-zero.") - } else if ifd.NextIfd != nil { + } else if ifd.nextIfd != nil { t.Fatalf("Next-IFD pointer is non-nil.") } @@ -141,7 +141,7 @@ func validateExifSimpleTestIb(exifData []byte, t *testing.T) { {tagId: 0x013e, value: []exifcommon.Rational{{Numerator: 0x11112222, Denominator: 0x33334444}}}, } - for i, ite := range ifd.Entries { + for i, ite := range ifd.Entries() { if ite.TagId() != expected[i].tagId { t.Fatalf("Tag-ID for entry (%d) not correct: (0x%02x) != (0x%02x)", i, ite.TagId(), expected[i].tagId) } @@ -180,3 +180,9 @@ func getTestGpsImageFilepath() string { testGpsImageFilepath := path.Join(assetsPath, "gps.jpg") return testGpsImageFilepath } + +func getTestGeotiffFilepath() string { + assetsPath := exifcommon.GetTestAssetsPath() + testGeotiffFilepath := path.Join(assetsPath, "geotiff_example.tif") + return testGeotiffFilepath +} diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/README.md b/vendor/github.com/dsoprea/go-exif/v3/undefined/README.md similarity index 100% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/README.md rename to vendor/github.com/dsoprea/go-exif/v3/undefined/README.md diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/accessor.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/accessor.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/accessor.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/accessor.go index 3e82c0f610..11a21e1f02 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/accessor.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/accessor.go @@ -5,7 +5,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) // Encode encodes the given encodeable undefined value to bytes. diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_8828_oecf.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_8828_oecf.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go index 796d17ca74..26f3675ab8 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_8828_oecf.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go @@ -8,7 +8,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type Tag8828Oecf struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9000_exif_version.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9000_exif_version.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9000_exif_version.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9000_exif_version.go index 19cfcc9060..8f18c8114e 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9000_exif_version.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9000_exif_version.go @@ -5,7 +5,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type Tag9000ExifVersion struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9101_components_configuration.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9101_components_configuration.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9101_components_configuration.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9101_components_configuration.go index 16a4b38e49..e357fe0a6a 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9101_components_configuration.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9101_components_configuration.go @@ -8,7 +8,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) const ( diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_927C_maker_note.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_927C_maker_note.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_927C_maker_note.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_927C_maker_note.go index e0a52db2a2..f9cd2788e8 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_927C_maker_note.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_927C_maker_note.go @@ -9,7 +9,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type Tag927CMakerNote struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9286_user_comment.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9286_user_comment.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9286_user_comment.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9286_user_comment.go index de07fe19ea..320edc1459 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_9286_user_comment.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_9286_user_comment.go @@ -8,7 +8,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) var ( diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A000_flashpix_version.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A000_flashpix_version.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A000_flashpix_version.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A000_flashpix_version.go index 28849cde5c..4a0fefad71 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A000_flashpix_version.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A000_flashpix_version.go @@ -5,7 +5,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type TagA000FlashpixVersion struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A20C_spatial_frequency_response.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A20C_spatial_frequency_response.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A20C_spatial_frequency_response.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A20C_spatial_frequency_response.go index d49c8c52da..0311175d6e 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A20C_spatial_frequency_response.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A20C_spatial_frequency_response.go @@ -8,7 +8,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type TagA20CSpatialFrequencyResponse struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A300_file_source.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A300_file_source.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A300_file_source.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A300_file_source.go index 18a7cdf635..f4f3a49f9e 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A300_file_source.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A300_file_source.go @@ -7,7 +7,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type TagExifA300FileSource uint32 diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A301_scene_type.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A301_scene_type.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A301_scene_type.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A301_scene_type.go index b4246da187..a29fd76738 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A301_scene_type.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A301_scene_type.go @@ -7,7 +7,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type TagExifA301SceneType uint32 diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A302_cfa_pattern.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A302_cfa_pattern.go similarity index 98% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A302_cfa_pattern.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A302_cfa_pattern.go index beca78c239..88976296d9 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_A302_cfa_pattern.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_A302_cfa_pattern.go @@ -8,7 +8,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type TagA302CfaPattern struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_iop_0002_interop_version.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_iop_0002_interop_version.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/exif_iop_0002_interop_version.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/exif_iop_0002_interop_version.go index eca046b051..09ec987033 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/exif_iop_0002_interop_version.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_iop_0002_interop_version.go @@ -5,7 +5,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type Tag0002InteropVersion struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/gps_001B_gps_processing_method.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/gps_001B_gps_processing_method.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/gps_001B_gps_processing_method.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/gps_001B_gps_processing_method.go index 8583bfb270..6f54d2fc67 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/gps_001B_gps_processing_method.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/gps_001B_gps_processing_method.go @@ -5,7 +5,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type Tag001BGPSProcessingMethod struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/gps_001C_gps_area_information.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/gps_001C_gps_area_information.go similarity index 97% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/gps_001C_gps_area_information.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/gps_001C_gps_area_information.go index 67acceb659..ffdeb905bc 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/gps_001C_gps_area_information.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/gps_001C_gps_area_information.go @@ -5,7 +5,7 @@ import ( "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) type Tag001CGPSAreaInformation struct { diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/registration.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/registration.go similarity index 100% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/registration.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/registration.go diff --git a/vendor/github.com/dsoprea/go-exif/v2/undefined/type.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/type.go similarity index 96% rename from vendor/github.com/dsoprea/go-exif/v2/undefined/type.go rename to vendor/github.com/dsoprea/go-exif/v3/undefined/type.go index 29890ef86f..ff6ac2b4c8 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/undefined/type.go +++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/type.go @@ -5,7 +5,7 @@ import ( "encoding/binary" - "github.com/dsoprea/go-exif/v2/common" + "github.com/dsoprea/go-exif/v3/common" ) const ( diff --git a/vendor/github.com/dsoprea/go-exif/v2/utility.go b/vendor/github.com/dsoprea/go-exif/v3/utility.go similarity index 55% rename from vendor/github.com/dsoprea/go-exif/v2/utility.go rename to vendor/github.com/dsoprea/go-exif/v3/utility.go index ad692477e2..f0b5e63838 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/utility.go +++ b/vendor/github.com/dsoprea/go-exif/v3/utility.go @@ -2,86 +2,20 @@ package exif import ( "fmt" + "io" "math" - "reflect" - "strconv" - "strings" - "time" "github.com/dsoprea/go-logging" + "github.com/dsoprea/go-utility/v2/filesystem" - "github.com/dsoprea/go-exif/v2/common" - "github.com/dsoprea/go-exif/v2/undefined" + "github.com/dsoprea/go-exif/v3/common" + "github.com/dsoprea/go-exif/v3/undefined" ) var ( utilityLogger = log.NewLogger("exif.utility") ) -var ( - timeType = reflect.TypeOf(time.Time{}) -) - -// ParseExifFullTimestamp parses dates like "2018:11:30 13:01:49" into a UTC -// `time.Time` struct. -func ParseExifFullTimestamp(fullTimestampPhrase string) (timestamp time.Time, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - parts := strings.Split(fullTimestampPhrase, " ") - datestampValue, timestampValue := parts[0], parts[1] - - // Normalize the separators. - datestampValue = strings.ReplaceAll(datestampValue, "-", ":") - timestampValue = strings.ReplaceAll(timestampValue, "-", ":") - - dateParts := strings.Split(datestampValue, ":") - - year, err := strconv.ParseUint(dateParts[0], 10, 16) - if err != nil { - log.Panicf("could not parse year") - } - - month, err := strconv.ParseUint(dateParts[1], 10, 8) - if err != nil { - log.Panicf("could not parse month") - } - - day, err := strconv.ParseUint(dateParts[2], 10, 8) - if err != nil { - log.Panicf("could not parse day") - } - - timeParts := strings.Split(timestampValue, ":") - - hour, err := strconv.ParseUint(timeParts[0], 10, 8) - if err != nil { - log.Panicf("could not parse hour") - } - - minute, err := strconv.ParseUint(timeParts[1], 10, 8) - if err != nil { - log.Panicf("could not parse minute") - } - - second, err := strconv.ParseUint(timeParts[2], 10, 8) - if err != nil { - log.Panicf("could not parse second") - } - - timestamp = time.Date(int(year), time.Month(month), int(day), int(hour), int(minute), int(second), 0, time.UTC) - return timestamp, nil -} - -// ExifFullTimestampString produces a string like "2018:11:30 13:01:49" from a -// `time.Time` struct. It will attempt to convert to UTC first. -func ExifFullTimestampString(t time.Time) (fullTimestampPhrase string) { - return exifcommon.ExifFullTimestampString(t) -} - // ExifTag is one simple representation of a tag in a flat list of all of them. type ExifTag struct { // IfdPath is the fully-qualified IFD path (even though it is not named as @@ -137,24 +71,93 @@ func (et ExifTag) String() string { } // GetFlatExifData returns a simple, flat representation of all tags. -func GetFlatExifData(exifData []byte) (exifTags []ExifTag, err error) { +func GetFlatExifData(exifData []byte, so *ScanOptions) (exifTags []ExifTag, med *MiscellaneousExifData, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) } }() - eh, err := ParseExifHeader(exifData) + sb := rifs.NewSeekableBufferWithBytes(exifData) + + exifTags, med, err = getFlatExifDataUniversalSearchWithReadSeeker(sb, so, false) + log.PanicIf(err) + + return exifTags, med, nil +} + +// RELEASE(dustin): GetFlatExifDataUniversalSearch is a kludge to allow univeral tag searching in a backwards-compatible manner. For the next release, undo this and simply add the flag to GetFlatExifData. + +// GetFlatExifDataUniversalSearch returns a simple, flat representation of all +// tags. +func GetFlatExifDataUniversalSearch(exifData []byte, so *ScanOptions, doUniversalSearch bool) (exifTags []ExifTag, med *MiscellaneousExifData, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + sb := rifs.NewSeekableBufferWithBytes(exifData) + + exifTags, med, err = getFlatExifDataUniversalSearchWithReadSeeker(sb, so, doUniversalSearch) + log.PanicIf(err) + + return exifTags, med, nil +} + +// RELEASE(dustin): GetFlatExifDataUniversalSearchWithReadSeeker is a kludge to allow using a ReadSeeker in a backwards-compatible manner. For the next release, drop this and refactor GetFlatExifDataUniversalSearch to take a ReadSeeker. + +// GetFlatExifDataUniversalSearchWithReadSeeker returns a simple, flat +// representation of all tags given a ReadSeeker. +func GetFlatExifDataUniversalSearchWithReadSeeker(rs io.ReadSeeker, so *ScanOptions, doUniversalSearch bool) (exifTags []ExifTag, med *MiscellaneousExifData, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + exifTags, med, err = getFlatExifDataUniversalSearchWithReadSeeker(rs, so, doUniversalSearch) + log.PanicIf(err) + + return exifTags, med, nil +} + +// getFlatExifDataUniversalSearchWithReadSeeker returns a simple, flat +// representation of all tags given a ReadSeeker. +func getFlatExifDataUniversalSearchWithReadSeeker(rs io.ReadSeeker, so *ScanOptions, doUniversalSearch bool) (exifTags []ExifTag, med *MiscellaneousExifData, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + headerData := make([]byte, ExifSignatureLength) + if _, err = io.ReadFull(rs, headerData); err != nil { + if err == io.EOF { + return nil, nil, err + } + + log.Panic(err) + } + + eh, err := ParseExifHeader(headerData) + log.PanicIf(err) + + im, err := exifcommon.NewIfdMappingWithStandard() log.PanicIf(err) - im := NewIfdMappingWithStandard() ti := NewTagIndex() - ie := NewIfdEnumerate(im, ti, exifData, eh.ByteOrder) + if doUniversalSearch == true { + ti.SetUniversalSearch(true) + } + + ebs := NewExifReadSeeker(rs) + ie := NewIfdEnumerate(im, ti, ebs, eh.ByteOrder) exifTags = make([]ExifTag, 0) - visitor := func(fqIfdPath string, ifdIndex int, ite *IfdTagEntry) (err error) { + visitor := func(ite *IfdTagEntry) (err error) { // This encodes down to base64. Since this an example tool and we do not // expect to ever decode the output, we are not worried about // specifically base64-encoding it in order to have a measure of @@ -172,13 +175,19 @@ func GetFlatExifData(exifData []byte) (exifTags []ExifTag, err error) { if err != nil { if err == exifcommon.ErrUnhandledUndefinedTypedTag { value = exifundefined.UnparseableUnknownTagValuePlaceholder + } else if log.Is(err, exifcommon.ErrParseFail) == true { + utilityLogger.Warningf(nil, + "Could not parse value for tag [%s] (%04x) [%s].", + ite.IfdPath(), ite.TagId(), ite.TagName()) + + return nil } else { log.Panic(err) } } et := ExifTag{ - IfdPath: fqIfdPath, + IfdPath: ite.IfdPath(), TagId: ite.TagId(), TagName: ite.TagName(), UnitCount: ite.UnitCount(), @@ -200,10 +209,10 @@ func GetFlatExifData(exifData []byte) (exifTags []ExifTag, err error) { return nil } - _, err = ie.Scan(exifcommon.IfdStandardIfdIdentity, eh.FirstIfdOffset, visitor) + med, err = ie.Scan(exifcommon.IfdStandardIfdIdentity, eh.FirstIfdOffset, visitor, nil) log.PanicIf(err) - return exifTags, nil + return exifTags, med, nil } // GpsDegreesEquals returns true if the two `GpsDegrees` are identical. @@ -226,8 +235,3 @@ func GpsDegreesEquals(gi1, gi2 GpsDegrees) bool { return true } - -// IsTime returns true if the value is a `time.Time`. -func IsTime(v interface{}) bool { - return reflect.TypeOf(v) == timeType -} diff --git a/vendor/github.com/dsoprea/go-exif/value_context.go b/vendor/github.com/dsoprea/go-exif/value_context.go deleted file mode 100644 index 3fce352a30..0000000000 --- a/vendor/github.com/dsoprea/go-exif/value_context.go +++ /dev/null @@ -1,367 +0,0 @@ -package exif - -import ( - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -var ( - parser *Parser -) - -// ValueContext describes all of the parameters required to find and extract -// the actual tag value. -type ValueContext struct { - unitCount uint32 - valueOffset uint32 - rawValueOffset []byte - addressableData []byte - - tagType TagTypePrimitive - byteOrder binary.ByteOrder - - // undefinedValueTagType is the effective type to use if this is an - // "undefined" value. - undefinedValueTagType TagTypePrimitive - - ifdPath string - tagId uint16 -} - -func newValueContext(ifdPath string, tagId uint16, unitCount, valueOffset uint32, rawValueOffset, addressableData []byte, tagType TagTypePrimitive, byteOrder binary.ByteOrder) *ValueContext { - return &ValueContext{ - unitCount: unitCount, - valueOffset: valueOffset, - rawValueOffset: rawValueOffset, - addressableData: addressableData, - - tagType: tagType, - byteOrder: byteOrder, - - ifdPath: ifdPath, - tagId: tagId, - } -} - -func newValueContextFromTag(ite *IfdTagEntry, addressableData []byte, byteOrder binary.ByteOrder) *ValueContext { - return newValueContext( - ite.IfdPath, - ite.TagId, - ite.UnitCount, - ite.ValueOffset, - ite.RawValueOffset, - addressableData, - ite.TagType, - byteOrder) -} - -func (vc *ValueContext) SetUnknownValueType(tagType TagTypePrimitive) { - vc.undefinedValueTagType = tagType -} - -func (vc *ValueContext) UnitCount() uint32 { - return vc.unitCount -} - -func (vc *ValueContext) ValueOffset() uint32 { - return vc.valueOffset -} - -func (vc *ValueContext) RawValueOffset() []byte { - return vc.rawValueOffset -} - -func (vc *ValueContext) AddressableData() []byte { - return vc.addressableData -} - -// isEmbedded returns whether the value is embedded or a reference. This can't -// be precalculated since the size is not defined for all types (namely the -// "undefined" types). -func (vc *ValueContext) isEmbedded() bool { - tagType := vc.effectiveValueType() - - return (tagType.Size() * int(vc.unitCount)) <= 4 -} - -func (vc *ValueContext) effectiveValueType() (tagType TagTypePrimitive) { - if vc.tagType == TypeUndefined { - tagType = vc.undefinedValueTagType - - if tagType == 0 { - log.Panicf("undefined-value type not set") - } - } else { - tagType = vc.tagType - } - - return tagType -} - -func (vc *ValueContext) readRawEncoded() (rawBytes []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - tagType := vc.effectiveValueType() - - unitSizeRaw := uint32(tagType.Size()) - - if vc.isEmbedded() == true { - byteLength := unitSizeRaw * vc.unitCount - return vc.rawValueOffset[:byteLength], nil - } else { - return vc.addressableData[vc.valueOffset : vc.valueOffset+vc.unitCount*unitSizeRaw], nil - } -} - -// Format returns a string representation for the value. -// -// Where the type is not ASCII, `justFirst` indicates whether to just stringify -// the first item in the slice (or return an empty string if the slice is -// empty). -// -// Since this method lacks the information to process undefined-type tags (e.g. -// byte-order, tag-ID, IFD type), it will return an error if attempted. See -// `Undefined()`. -func (vc *ValueContext) Format() (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawBytes, err := vc.readRawEncoded() - log.PanicIf(err) - - phrase, err := Format(rawBytes, vc.tagType, false, vc.byteOrder) - log.PanicIf(err) - - return phrase, nil -} - -// FormatOne is similar to `Format` but only gets and stringifies the first -// item. -func (vc *ValueContext) FormatFirst() (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawBytes, err := vc.readRawEncoded() - log.PanicIf(err) - - phrase, err := Format(rawBytes, vc.tagType, true, vc.byteOrder) - log.PanicIf(err) - - return phrase, nil -} - -func (vc *ValueContext) ReadBytes() (value []byte, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseBytes(rawValue, vc.unitCount) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadAscii() (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseAscii(rawValue, vc.unitCount) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadAsciiNoNul() (value string, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseAsciiNoNul(rawValue, vc.unitCount) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadShorts() (value []uint16, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseShorts(rawValue, vc.unitCount, vc.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadLongs() (value []uint32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseLongs(rawValue, vc.unitCount, vc.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadRationals() (value []Rational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseRationals(rawValue, vc.unitCount, vc.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadSignedLongs() (value []int32, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseSignedLongs(rawValue, vc.unitCount, vc.byteOrder) - log.PanicIf(err) - - return value, nil -} - -func (vc *ValueContext) ReadSignedRationals() (value []SignedRational, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - rawValue, err := vc.readRawEncoded() - log.PanicIf(err) - - value, err = parser.ParseSignedRationals(rawValue, vc.unitCount, vc.byteOrder) - log.PanicIf(err) - - return value, nil -} - -// Values knows how to resolve the given value. This value is always a list -// (undefined-values aside), so we're named accordingly. -// -// Since this method lacks the information to process unknown-type tags (e.g. -// byte-order, tag-ID, IFD type), it will return an error if attempted. See -// `Undefined()`. -func (vc *ValueContext) Values() (values interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - if vc.tagType == TypeByte { - values, err = vc.ReadBytes() - log.PanicIf(err) - } else if vc.tagType == TypeAscii { - values, err = vc.ReadAscii() - log.PanicIf(err) - } else if vc.tagType == TypeAsciiNoNul { - values, err = vc.ReadAsciiNoNul() - log.PanicIf(err) - } else if vc.tagType == TypeShort { - values, err = vc.ReadShorts() - log.PanicIf(err) - } else if vc.tagType == TypeLong { - values, err = vc.ReadLongs() - log.PanicIf(err) - } else if vc.tagType == TypeRational { - values, err = vc.ReadRationals() - log.PanicIf(err) - } else if vc.tagType == TypeSignedLong { - values, err = vc.ReadSignedLongs() - log.PanicIf(err) - } else if vc.tagType == TypeSignedRational { - values, err = vc.ReadSignedRationals() - log.PanicIf(err) - } else if vc.tagType == TypeUndefined { - log.Panicf("will not parse undefined-type value") - - // Never called. - return nil, nil - } else { - log.Panicf("value of type [%s] is unparseable", vc.tagType) - - // Never called. - return nil, nil - } - - return values, nil -} - -// Undefined attempts to identify and decode supported undefined-type fields. -// This is the primary, preferred interface to reading undefined values. -func (vc *ValueContext) Undefined() (value interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - value, err = UndefinedValue(vc.ifdPath, vc.tagId, vc, vc.byteOrder) - if err != nil { - if err == ErrUnhandledUnknownTypedTag { - return nil, err - } - - log.Panic(err) - } - - return value, nil -} - -func init() { - parser = &Parser{} -} diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/.travis.yml b/vendor/github.com/dsoprea/go-jpeg-image-structure/.travis.yml deleted file mode 100644 index 4c79875ed3..0000000000 --- a/vendor/github.com/dsoprea/go-jpeg-image-structure/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: go -go: - - master - - stable - - "1.14" - - "1.13" - - "1.12" -env: - - GO111MODULE=on -install: - - go get -t ./... -script: -# v1 - - go test -v . -# v2 - - cd v2 - - go test -v ./... -coverprofile=coverage.txt -covermode=atomic - - cd .. -after_success: - - cd v2 - - curl -s https://codecov.io/bash | bash diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/.MODULE_ROOT b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/.MODULE_ROOT similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/.MODULE_ROOT rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/.MODULE_ROOT diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/LICENSE b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/LICENSE similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/LICENSE rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/LICENSE diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/README.md b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/README.md similarity index 80% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/README.md rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/README.md index 67bc576170..bf60ef504b 100644 --- a/vendor/github.com/dsoprea/go-jpeg-image-structure/README.md +++ b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/README.md @@ -1,5 +1,5 @@ -[![Build Status](https://travis-ci.org/dsoprea/go-jpeg-image-structure.svg?branch=master)](https://travis-ci.org/dsoprea/go-jpeg-image-structure) -[![codecov](https://codecov.io/gh/dsoprea/go-jpeg-image-structure/branch/master/graph/badge.svg?token=Twxyx7kpAa)](https://codecov.io/gh/dsoprea/go-jpeg-image-structure) +[![Build Status](https://travis-ci.org/dsoprea/go-jpeg-image-structure/v2.svg?branch=master)](https://travis-ci.org/dsoprea/go-jpeg-image-structure/v2) +[![codecov](https://codecov.io/gh/dsoprea/go-jpeg-image-structure/branch/master/graph/badge.svg)](https://codecov.io/gh/dsoprea/go-jpeg-image-structure) [![Go Report Card](https://goreportcard.com/badge/github.com/dsoprea/go-jpeg-image-structure/v2)](https://goreportcard.com/report/github.com/dsoprea/go-jpeg-image-structure/v2) [![GoDoc](https://godoc.org/github.com/dsoprea/go-jpeg-image-structure/v2?status.svg)](https://godoc.org/github.com/dsoprea/go-jpeg-image-structure/v2) diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/markers.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/markers.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/markers.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/markers.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/media_parser.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/media_parser.go similarity index 90% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/media_parser.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/media_parser.go index dd4c73af99..e6fc60bc48 100644 --- a/vendor/github.com/dsoprea/go-jpeg-image-structure/media_parser.go +++ b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/media_parser.go @@ -3,11 +3,14 @@ package jpegstructure import ( "bufio" "bytes" + "image" "io" "os" + "image/jpeg" + "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-utility/image" + "github.com/dsoprea/go-utility/v2/image" ) // JpegMediaParser is a `riimage.MediaParser` that knows how to parse JPEG @@ -122,6 +125,14 @@ func (jmp *JpegMediaParser) LooksLikeFormat(data []byte) bool { return true } +// GetImage returns an image.Image-compatible struct. +func (jmp *JpegMediaParser) GetImage(r io.Reader) (img image.Image, err error) { + img, err = jpeg.Decode(r) + log.PanicIf(err) + + return img, nil +} + var ( // Enforce interface conformance. _ riimage.MediaParser = new(JpegMediaParser) diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/segment.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment.go similarity index 96% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/segment.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment.go index d6a1c42bbd..6b433bf1f5 100644 --- a/vendor/github.com/dsoprea/go-jpeg-image-structure/segment.go +++ b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment.go @@ -8,11 +8,12 @@ import ( "crypto/sha1" "encoding/hex" - "github.com/dsoprea/go-exif/v2" + "github.com/dsoprea/go-exif/v3" + "github.com/dsoprea/go-exif/v3/common" "github.com/dsoprea/go-iptc" "github.com/dsoprea/go-logging" "github.com/dsoprea/go-photoshop-info-format" - "github.com/dsoprea/go-utility/image" + "github.com/dsoprea/go-utility/v2/image" ) const ( @@ -125,7 +126,9 @@ func (s *Segment) Exif() (rootIfd *exif.Ifd, data []byte, err error) { jpegLogger.Debugf(nil, "Attempting to parse (%d) byte EXIF blob (Exif).", len(rawExif)) - im := exif.NewIfdMappingWithStandard() + im, err := exifcommon.NewIfdMappingWithStandard() + log.PanicIf(err) + ti := exif.NewTagIndex() _, index, err := exif.Collect(im, ti, rawExif) @@ -150,7 +153,7 @@ func (s *Segment) FlatExif() (exifTags []exif.ExifTag, err error) { jpegLogger.Debugf(nil, "Attempting to parse (%d) byte EXIF blob (FlatExif).", len(rawExif)) - exifTags, err = exif.GetFlatExifData(rawExif) + exifTags, _, err = exif.GetFlatExifData(rawExif, nil) log.PanicIf(err) return exifTags, nil diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/segment_list.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment_list.go similarity index 93% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/segment_list.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment_list.go index 1b5b06a3a4..b4f4d58101 100644 --- a/vendor/github.com/dsoprea/go-jpeg-image-structure/segment_list.go +++ b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment_list.go @@ -8,7 +8,8 @@ import ( "crypto/sha1" "encoding/binary" - "github.com/dsoprea/go-exif/v2" + "github.com/dsoprea/go-exif/v3" + "github.com/dsoprea/go-exif/v3/common" "github.com/dsoprea/go-iptc" "github.com/dsoprea/go-logging" ) @@ -241,11 +242,31 @@ func (sl *SegmentList) ConstructExifBuilder() (rootIb *exif.IfdBuilder, err erro }() rootIfd, _, err := sl.Exif() - log.PanicIf(err) + if log.Is(err, exif.ErrNoExif) == true { + // No EXIF. Just create a boilerplate builder. + + im := exifcommon.NewIfdMapping() + + err := exifcommon.LoadStandardIfds(im) + log.PanicIf(err) + + ti := exif.NewTagIndex() + + rootIb := + exif.NewIfdBuilder( + im, + ti, + exifcommon.IfdStandardIfdIdentity, + exifcommon.EncodeDefaultByteOrder) + + return rootIb, nil + } else if err != nil { + log.Panic(err) + } - ib := exif.NewIfdBuilderFromExistingChain(rootIfd) + rootIb = exif.NewIfdBuilderFromExistingChain(rootIfd) - return ib, nil + return rootIb, nil } // DumpExif returns an unstructured list of tags (useful when just reviewing). diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/splitter.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/splitter.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/splitter.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/splitter.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/testing_common.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/testing_common.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/testing_common.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/testing_common.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/utility.go b/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/utility.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/utility.go rename to vendor/github.com/dsoprea/go-jpeg-image-structure/v2/utility.go diff --git a/vendor/github.com/dsoprea/go-png-image-structure/.travis.yml b/vendor/github.com/dsoprea/go-png-image-structure/.travis.yml deleted file mode 100644 index fdeab54e15..0000000000 --- a/vendor/github.com/dsoprea/go-png-image-structure/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: go -go: - - master - - stable - - "1.14" - - "1.13" - - "1.12" -env: - - GO111MODULE=on -install: - - go get -t ./... -script: -# v1 - - go test -v . -# v2 - - cd v2 - - go test -v . - - cd .. -after_success: - - cd v2 - - curl -s https://codecov.io/bash | bash diff --git a/vendor/github.com/dsoprea/go-png-image-structure/README.md b/vendor/github.com/dsoprea/go-png-image-structure/README.md deleted file mode 100644 index 46297a2a75..0000000000 --- a/vendor/github.com/dsoprea/go-png-image-structure/README.md +++ /dev/null @@ -1,8 +0,0 @@ -[![Build Status](https://travis-ci.org/dsoprea/go-png-image-structure.svg?branch=master)](https://travis-ci.org/dsoprea/go-png-image-structure) -[![codecov](https://codecov.io/gh/dsoprea/go-png-image-structure/branch/master/graph/badge.svg)](https://codecov.io/gh/dsoprea/go-png-image-structure) -[![Go Report Card](https://goreportcard.com/badge/github.com/dsoprea/go-png-image-structure/v2)](https://goreportcard.com/report/github.com/dsoprea/go-png-image-structure/v2) -[![GoDoc](https://godoc.org/github.com/dsoprea/go-png-image-structure/v2?status.svg)](https://godoc.org/github.com/dsoprea/go-png-image-structure/v2) - -## Overview - -Parse raw PNG data into individual chunks. Parse/modify EXIF data and write an updated image. diff --git a/vendor/github.com/dsoprea/go-png-image-structure/chunk_decoder.go b/vendor/github.com/dsoprea/go-png-image-structure/chunk_decoder.go deleted file mode 100644 index 1358c3df29..0000000000 --- a/vendor/github.com/dsoprea/go-png-image-structure/chunk_decoder.go +++ /dev/null @@ -1,89 +0,0 @@ -package pngstructure - -import ( - "fmt" - "bytes" - - "encoding/binary" - - "github.com/dsoprea/go-logging" -) - -type ChunkDecoder struct { - -} - -func NewChunkDecoder() *ChunkDecoder { - return new(ChunkDecoder) -} - -func (cd *ChunkDecoder) Decode(c *Chunk) (decoded interface{}, err error) { - defer func() { - if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) - } - }() - - switch c.Type { - case "IHDR": - ihdr, err := cd.decodeIHDR(c) - log.PanicIf(err) - - return ihdr, nil - } - - // We don't decode this particular type. - return nil, nil -} - - -type ChunkIHDR struct { - Width uint32 - Height uint32 - BitDepth uint8 - ColorType uint8 - CompressionMethod uint8 - FilterMethod uint8 - InterlaceMethod uint8 -} - -func (ihdr *ChunkIHDR) String() string { - return fmt.Sprintf("IHDR", ihdr.Width, ihdr.Height, ihdr.BitDepth, ihdr.ColorType, ihdr.CompressionMethod, ihdr.FilterMethod, ihdr.InterlaceMethod) -} - -func (cd *ChunkDecoder) decodeIHDR(c *Chunk) (ihdr *ChunkIHDR, err error) { - defer func() { - if state := recover(); state != nil { - err := log.Wrap(state.(error)) - log.Panic(err) - } - }() - - b := bytes.NewBuffer(c.Data) - - ihdr = new(ChunkIHDR) - - err = binary.Read(b, binary.BigEndian, &ihdr.Width) - log.PanicIf(err) - - err = binary.Read(b, binary.BigEndian, &ihdr.Height) - log.PanicIf(err) - - err = binary.Read(b, binary.BigEndian, &ihdr.BitDepth) - log.PanicIf(err) - - err = binary.Read(b, binary.BigEndian, &ihdr.ColorType) - log.PanicIf(err) - - err = binary.Read(b, binary.BigEndian, &ihdr.CompressionMethod) - log.PanicIf(err) - - err = binary.Read(b, binary.BigEndian, &ihdr.FilterMethod) - log.PanicIf(err) - - err = binary.Read(b, binary.BigEndian, &ihdr.InterlaceMethod) - log.PanicIf(err) - - return ihdr, nil -} diff --git a/vendor/github.com/dsoprea/go-png-image-structure/media_parser.go b/vendor/github.com/dsoprea/go-png-image-structure/media_parser.go deleted file mode 100644 index f7467593f6..0000000000 --- a/vendor/github.com/dsoprea/go-png-image-structure/media_parser.go +++ /dev/null @@ -1,106 +0,0 @@ -package pngstructure - -import ( - "bufio" - "bytes" - "io" - "os" - - "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-utility/image" -) - -// PngMediaParser knows how to parse a PNG stream. -type PngMediaParser struct { -} - -// NewPngMediaParser returns a new `PngMediaParser` struct. -func NewPngMediaParser() *PngMediaParser { - - // TODO(dustin): Add test - - return new(PngMediaParser) -} - -// Parse parses a PNG stream given a `io.ReadSeeker`. -func (pmp *PngMediaParser) Parse(rs io.ReadSeeker, size int) (mc riimage.MediaContext, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): Add test - - ps := NewPngSplitter() - - err = ps.readHeader(rs) - log.PanicIf(err) - - s := bufio.NewScanner(rs) - - // Since each segment can be any size, our buffer must be allowed to grow - // as large as the file. - buffer := []byte{} - s.Buffer(buffer, size) - s.Split(ps.Split) - - for s.Scan() != false { - } - log.PanicIf(s.Err()) - - return ps.Chunks(), nil -} - -// ParseFile parses a PNG stream given a file-path. -func (pmp *PngMediaParser) ParseFile(filepath string) (mc riimage.MediaContext, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - f, err := os.Open(filepath) - log.PanicIf(err) - - defer f.Close() - - stat, err := f.Stat() - log.PanicIf(err) - - size := stat.Size() - - chunks, err := pmp.Parse(f, int(size)) - log.PanicIf(err) - - return chunks, nil -} - -// ParseBytes parses a PNG stream given a byte-slice. -func (pmp *PngMediaParser) ParseBytes(data []byte) (mc riimage.MediaContext, err error) { - defer func() { - if state := recover(); state != nil { - err = log.Wrap(state.(error)) - } - }() - - // TODO(dustin): Add test - - br := bytes.NewReader(data) - - chunks, err := pmp.Parse(br, len(data)) - log.PanicIf(err) - - return chunks, nil -} - -// LooksLikeFormat returns a boolean indicating whether the stream looks like a -// PNG image. -func (pmp *PngMediaParser) LooksLikeFormat(data []byte) bool { - return bytes.Compare(data[:len(PngSignature)], PngSignature[:]) == 0 -} - -var ( - // Enforce interface conformance. - _ riimage.MediaParser = new(PngMediaParser) -) diff --git a/vendor/github.com/dsoprea/go-png-image-structure/testing_common.go b/vendor/github.com/dsoprea/go-png-image-structure/testing_common.go deleted file mode 100644 index e7dad11af1..0000000000 --- a/vendor/github.com/dsoprea/go-png-image-structure/testing_common.go +++ /dev/null @@ -1,64 +0,0 @@ -package pngstructure - -import ( - "os" - "path" - - "github.com/dsoprea/go-logging" -) - -var ( - assetsPath = "" -) - -func getModuleRootPath() string { - moduleRootPath := os.Getenv("PNG_MODULE_ROOT_PATH") - if moduleRootPath != "" { - return moduleRootPath - } - - currentWd, err := os.Getwd() - log.PanicIf(err) - - currentPath := currentWd - visited := make([]string, 0) - - for { - tryStampFilepath := path.Join(currentPath, ".MODULE_ROOT") - - _, err := os.Stat(tryStampFilepath) - if err != nil && os.IsNotExist(err) != true { - log.Panic(err) - } else if err == nil { - break - } - - visited = append(visited, tryStampFilepath) - - currentPath = path.Dir(currentPath) - if currentPath == "/" { - log.Panicf("could not find module-root: %v", visited) - } - } - - return currentPath -} - -func getTestAssetsPath() string { - if assetsPath == "" { - moduleRootPath := getModuleRootPath() - assetsPath = path.Join(moduleRootPath, "assets") - } - - return assetsPath -} - -func getTestBasicImageFilepath() string { - assetsPath := getTestAssetsPath() - return path.Join(assetsPath, "libpng.png") -} - -func getTestExifImageFilepath() string { - assetsPath := getTestAssetsPath() - return path.Join(assetsPath, "exif.png") -} diff --git a/vendor/github.com/dsoprea/go-png-image-structure/utility.go b/vendor/github.com/dsoprea/go-png-image-structure/utility.go deleted file mode 100644 index 9bfab14a4c..0000000000 --- a/vendor/github.com/dsoprea/go-png-image-structure/utility.go +++ /dev/null @@ -1,65 +0,0 @@ -package pngstructure - -import ( - "fmt" - "bytes" - - "github.com/dsoprea/go-logging" -) - -func DumpBytes(data []byte) { - fmt.Printf("DUMP: ") - for _, x := range data { - fmt.Printf("%02x ", x) - } - - fmt.Printf("\n") -} - -func DumpBytesClause(data []byte) { - fmt.Printf("DUMP: ") - - fmt.Printf("[]byte { ") - - for i, x := range data { - fmt.Printf("0x%02x", x) - - if i < len(data) - 1 { - fmt.Printf(", ") - } - } - - fmt.Printf(" }\n") -} - -func DumpBytesToString(data []byte) string { - b := new(bytes.Buffer) - - for i, x := range data { - _, err := b.WriteString(fmt.Sprintf("%02x", x)) - log.PanicIf(err) - - if i < len(data) - 1 { - _, err := b.WriteRune(' ') - log.PanicIf(err) - } - } - - return b.String() -} - -func DumpBytesClauseToString(data []byte) string { - b := new(bytes.Buffer) - - for i, x := range data { - _, err := b.WriteString(fmt.Sprintf("0x%02x", x)) - log.PanicIf(err) - - if i < len(data) - 1 { - _, err := b.WriteString(", ") - log.PanicIf(err) - } - } - - return b.String() -} diff --git a/vendor/github.com/dsoprea/go-png-image-structure/.MODULE_ROOT b/vendor/github.com/dsoprea/go-png-image-structure/v2/.MODULE_ROOT similarity index 100% rename from vendor/github.com/dsoprea/go-png-image-structure/.MODULE_ROOT rename to vendor/github.com/dsoprea/go-png-image-structure/v2/.MODULE_ROOT diff --git a/vendor/github.com/dsoprea/go-png-image-structure/LICENSE b/vendor/github.com/dsoprea/go-png-image-structure/v2/LICENSE similarity index 100% rename from vendor/github.com/dsoprea/go-png-image-structure/LICENSE rename to vendor/github.com/dsoprea/go-png-image-structure/v2/LICENSE diff --git a/vendor/github.com/dsoprea/go-png-image-structure/v2/chunk_decoder.go b/vendor/github.com/dsoprea/go-png-image-structure/v2/chunk_decoder.go new file mode 100644 index 0000000000..b5e0b1b164 --- /dev/null +++ b/vendor/github.com/dsoprea/go-png-image-structure/v2/chunk_decoder.go @@ -0,0 +1,87 @@ +package pngstructure + +import ( + "bytes" + "fmt" + + "encoding/binary" + + "github.com/dsoprea/go-logging" +) + +type ChunkDecoder struct { +} + +func NewChunkDecoder() *ChunkDecoder { + return new(ChunkDecoder) +} + +func (cd *ChunkDecoder) Decode(c *Chunk) (decoded interface{}, err error) { + defer func() { + if state := recover(); state != nil { + err := log.Wrap(state.(error)) + log.Panic(err) + } + }() + + switch c.Type { + case "IHDR": + ihdr, err := cd.decodeIHDR(c) + log.PanicIf(err) + + return ihdr, nil + } + + // We don't decode this particular type. + return nil, nil +} + +type ChunkIHDR struct { + Width uint32 + Height uint32 + BitDepth uint8 + ColorType uint8 + CompressionMethod uint8 + FilterMethod uint8 + InterlaceMethod uint8 +} + +func (ihdr *ChunkIHDR) String() string { + return fmt.Sprintf("IHDR", ihdr.Width, ihdr.Height, ihdr.BitDepth, ihdr.ColorType, ihdr.CompressionMethod, ihdr.FilterMethod, ihdr.InterlaceMethod) +} + +func (cd *ChunkDecoder) decodeIHDR(c *Chunk) (ihdr *ChunkIHDR, err error) { + defer func() { + if state := recover(); state != nil { + err := log.Wrap(state.(error)) + log.Panic(err) + } + }() + + b := bytes.NewBuffer(c.Data) + + ihdr = new(ChunkIHDR) + + err = binary.Read(b, binary.BigEndian, &ihdr.Width) + log.PanicIf(err) + + err = binary.Read(b, binary.BigEndian, &ihdr.Height) + log.PanicIf(err) + + err = binary.Read(b, binary.BigEndian, &ihdr.BitDepth) + log.PanicIf(err) + + err = binary.Read(b, binary.BigEndian, &ihdr.ColorType) + log.PanicIf(err) + + err = binary.Read(b, binary.BigEndian, &ihdr.CompressionMethod) + log.PanicIf(err) + + err = binary.Read(b, binary.BigEndian, &ihdr.FilterMethod) + log.PanicIf(err) + + err = binary.Read(b, binary.BigEndian, &ihdr.InterlaceMethod) + log.PanicIf(err) + + return ihdr, nil +} diff --git a/vendor/github.com/dsoprea/go-png-image-structure/v2/media_parser.go b/vendor/github.com/dsoprea/go-png-image-structure/v2/media_parser.go new file mode 100644 index 0000000000..c0e2873654 --- /dev/null +++ b/vendor/github.com/dsoprea/go-png-image-structure/v2/media_parser.go @@ -0,0 +1,118 @@ +package pngstructure + +import ( + "bufio" + "bytes" + "image" + "io" + "os" + + "image/png" + + "github.com/dsoprea/go-logging" + "github.com/dsoprea/go-utility/v2/image" +) + +// PngMediaParser knows how to parse a PNG stream. +type PngMediaParser struct { +} + +// NewPngMediaParser returns a new `PngMediaParser` struct. +func NewPngMediaParser() *PngMediaParser { + + // TODO(dustin): Add test + + return new(PngMediaParser) +} + +// Parse parses a PNG stream given a `io.ReadSeeker`. +func (pmp *PngMediaParser) Parse(rs io.ReadSeeker, size int) (mc riimage.MediaContext, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + // TODO(dustin): Add test + + ps := NewPngSplitter() + + err = ps.readHeader(rs) + log.PanicIf(err) + + s := bufio.NewScanner(rs) + + // Since each segment can be any size, our buffer must be allowed to grow + // as large as the file. + buffer := []byte{} + s.Buffer(buffer, size) + s.Split(ps.Split) + + for s.Scan() != false { + } + + log.PanicIf(s.Err()) + + return ps.Chunks(), nil +} + +// ParseFile parses a PNG stream given a file-path. +func (pmp *PngMediaParser) ParseFile(filepath string) (mc riimage.MediaContext, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + f, err := os.Open(filepath) + log.PanicIf(err) + + defer f.Close() + + stat, err := f.Stat() + log.PanicIf(err) + + size := stat.Size() + + chunks, err := pmp.Parse(f, int(size)) + log.PanicIf(err) + + return chunks, nil +} + +// ParseBytes parses a PNG stream given a byte-slice. +func (pmp *PngMediaParser) ParseBytes(data []byte) (mc riimage.MediaContext, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + // TODO(dustin): Add test + + br := bytes.NewReader(data) + + chunks, err := pmp.Parse(br, len(data)) + log.PanicIf(err) + + return chunks, nil +} + +// LooksLikeFormat returns a boolean indicating whether the stream looks like a +// PNG image. +func (pmp *PngMediaParser) LooksLikeFormat(data []byte) bool { + return bytes.Compare(data[:len(PngSignature)], PngSignature[:]) == 0 +} + +// GetImage returns an image.Image-compatible struct. +func (pmp *PngMediaParser) GetImage(r io.Reader) (img image.Image, err error) { + img, err = png.Decode(r) + log.PanicIf(err) + + return img, nil +} + +var ( + // Enforce interface conformance. + _ riimage.MediaParser = new(PngMediaParser) +) diff --git a/vendor/github.com/dsoprea/go-png-image-structure/png.go b/vendor/github.com/dsoprea/go-png-image-structure/v2/png.go similarity index 97% rename from vendor/github.com/dsoprea/go-png-image-structure/png.go rename to vendor/github.com/dsoprea/go-png-image-structure/v2/png.go index 203bbf5627..fbb0228872 100644 --- a/vendor/github.com/dsoprea/go-png-image-structure/png.go +++ b/vendor/github.com/dsoprea/go-png-image-structure/v2/png.go @@ -9,9 +9,10 @@ import ( "encoding/binary" "hash/crc32" - "github.com/dsoprea/go-exif/v2" + "github.com/dsoprea/go-exif/v3" + "github.com/dsoprea/go-exif/v3/common" "github.com/dsoprea/go-logging" - "github.com/dsoprea/go-utility/image" + "github.com/dsoprea/go-utility/v2/image" ) var ( @@ -22,7 +23,6 @@ var ( var ( ErrNotPng = errors.New("not png data") - ErrNoExif = errors.New("file does not have EXIF") ErrCrcFailure = errors.New("crc failure") ) @@ -111,7 +111,7 @@ func (cs *ChunkSlice) FindExif() (chunk *Chunk, err error) { return chunks[0], nil } - log.Panic(ErrNoExif) + log.Panic(exif.ErrNoExif) // Never called. return nil, nil @@ -128,7 +128,9 @@ func (cs *ChunkSlice) Exif() (rootIfd *exif.Ifd, data []byte, err error) { chunk, err := cs.FindExif() log.PanicIf(err) - im := exif.NewIfdMappingWithStandard() + im, err := exifcommon.NewIfdMappingWithStandard() + log.PanicIf(err) + ti := exif.NewTagIndex() // TODO(dustin): Refactor and support `exif.GetExifData()`. @@ -180,7 +182,7 @@ func (cs *ChunkSlice) SetExif(ib *exif.IfdBuilder) (err error) { exifChunk.Data = exifData exifChunk.Length = uint32(len(exifData)) } else { - if log.Is(err, ErrNoExif) != true { + if log.Is(err, exif.ErrNoExif) != true { log.Panic(err) } diff --git a/vendor/github.com/dsoprea/go-png-image-structure/v2/testing_common.go b/vendor/github.com/dsoprea/go-png-image-structure/v2/testing_common.go new file mode 100644 index 0000000000..9df13a8584 --- /dev/null +++ b/vendor/github.com/dsoprea/go-png-image-structure/v2/testing_common.go @@ -0,0 +1,64 @@ +package pngstructure + +import ( + "os" + "path" + + "github.com/dsoprea/go-logging" +) + +var ( + assetsPath = "" +) + +func getModuleRootPath() string { + moduleRootPath := os.Getenv("PNG_MODULE_ROOT_PATH") + if moduleRootPath != "" { + return moduleRootPath + } + + currentWd, err := os.Getwd() + log.PanicIf(err) + + currentPath := currentWd + visited := make([]string, 0) + + for { + tryStampFilepath := path.Join(currentPath, ".MODULE_ROOT") + + _, err := os.Stat(tryStampFilepath) + if err != nil && os.IsNotExist(err) != true { + log.Panic(err) + } else if err == nil { + break + } + + visited = append(visited, tryStampFilepath) + + currentPath = path.Dir(currentPath) + if currentPath == "/" { + log.Panicf("could not find module-root: %v", visited) + } + } + + return currentPath +} + +func getTestAssetsPath() string { + if assetsPath == "" { + moduleRootPath := getModuleRootPath() + assetsPath = path.Join(moduleRootPath, "assets") + } + + return assetsPath +} + +func getTestBasicImageFilepath() string { + assetsPath := getTestAssetsPath() + return path.Join(assetsPath, "libpng.png") +} + +func getTestExifImageFilepath() string { + assetsPath := getTestAssetsPath() + return path.Join(assetsPath, "exif.png") +} diff --git a/vendor/github.com/dsoprea/go-exif/v2/common/utility.go b/vendor/github.com/dsoprea/go-png-image-structure/v2/utility.go similarity index 58% rename from vendor/github.com/dsoprea/go-exif/v2/common/utility.go rename to vendor/github.com/dsoprea/go-png-image-structure/v2/utility.go index 65165bf026..dbff145a67 100644 --- a/vendor/github.com/dsoprea/go-exif/v2/common/utility.go +++ b/vendor/github.com/dsoprea/go-png-image-structure/v2/utility.go @@ -1,14 +1,12 @@ -package exifcommon +package pngstructure import ( "bytes" "fmt" - "time" "github.com/dsoprea/go-logging" ) -// DumpBytes prints a list of hex-encoded bytes. func DumpBytes(data []byte) { fmt.Printf("DUMP: ") for _, x := range data { @@ -18,8 +16,6 @@ func DumpBytes(data []byte) { fmt.Printf("\n") } -// DumpBytesClause prints a list like DumpBytes(), but encapsulated in -// "[]byte { ... }". func DumpBytesClause(data []byte) { fmt.Printf("DUMP: ") @@ -36,7 +32,6 @@ func DumpBytesClause(data []byte) { fmt.Printf(" }\n") } -// DumpBytesToString returns a stringified list of hex-encoded bytes. func DumpBytesToString(data []byte) string { b := new(bytes.Buffer) @@ -53,7 +48,6 @@ func DumpBytesToString(data []byte) string { return b.String() } -// DumpBytesClauseToString returns a comma-separated list of hex-encoded bytes. func DumpBytesClauseToString(data []byte) string { b := new(bytes.Buffer) @@ -69,11 +63,3 @@ func DumpBytesClauseToString(data []byte) string { return b.String() } - -// ExifFullTimestampString produces a string like "2018:11:30 13:01:49" from a -// `time.Time` struct. It will attempt to convert to UTC first. -func ExifFullTimestampString(t time.Time) (fullTimestampPhrase string) { - t = t.UTC() - - return fmt.Sprintf("%04d:%02d:%02d %02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()) -} diff --git a/vendor/github.com/dsoprea/go-utility/LICENSE b/vendor/github.com/dsoprea/go-utility/v2/LICENSE similarity index 100% rename from vendor/github.com/dsoprea/go-utility/LICENSE rename to vendor/github.com/dsoprea/go-utility/v2/LICENSE diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/README.md b/vendor/github.com/dsoprea/go-utility/v2/filesystem/README.md new file mode 100644 index 0000000000..eb03fea7c9 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/README.md @@ -0,0 +1,64 @@ +[![GoDoc](https://godoc.org/github.com/dsoprea/go-utility/filesystem?status.svg)](https://godoc.org/github.com/dsoprea/go-utility/filesystem) +[![Build Status](https://travis-ci.org/dsoprea/go-utility.svg?branch=master)](https://travis-ci.org/dsoprea/go-utility) +[![Coverage Status](https://coveralls.io/repos/github/dsoprea/go-utility/badge.svg?branch=master)](https://coveralls.io/github/dsoprea/go-utility?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/dsoprea/go-utility)](https://goreportcard.com/report/github.com/dsoprea/go-utility) + +# bounceback + +An `io.ReadSeeker` and `io.WriteSeeker` that returns to the right place before +reading or writing. Useful when the same file resource is being reused for reads +or writes throughout that file. + +# list_files + +A recursive path walker that supports filters. + +# seekable_buffer + +A memory structure that satisfies `io.ReadWriteSeeker`. + +# copy_bytes_between_positions + +Given an `io.ReadWriteSeeker`, copy N bytes from one position to an earlier +position. + +# read_counter, write_counter + +Wrap `io.Reader` and `io.Writer` structs in order to report how many bytes were +transferred. + +# readseekwritecloser + +Provides the ReadWriteSeekCloser interface that combines a RWS and a Closer. +Also provides a no-op wrapper to augment a plain RWS with a closer. + +# boundedreadwriteseek + +Wraps a ReadWriteSeeker such that no seeks can be at an offset less than a +specific-offset. + +# calculateseek + +Provides a reusable function with which to calculate seek offsets. + +# progress_wrapper + +Provides `io.Reader` and `io.Writer` wrappers that also trigger callbacks after +each call. The reader wrapper also invokes the callback upon EOF. + +# does_exist + +Check whether a file/directory exists using a file-path. + +# graceful_copy + +Do a copy but correctly handle short-writes and reads that might return a non- +zero read count *and* EOF. + +# readseeker_to_readerat + +A wrapper that allows an `io.ReadSeeker` to be used as a `io.ReaderAt`. + +# simplefileinfo + +An implementation of `os.FileInfo` to support testing. diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/bounceback.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/bounceback.go new file mode 100644 index 0000000000..1112a10ef1 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/bounceback.go @@ -0,0 +1,273 @@ +package rifs + +import ( + "fmt" + "io" + + "github.com/dsoprea/go-logging" +) + +// BouncebackStats describes operation counts. +type BouncebackStats struct { + reads int + writes int + seeks int + syncs int +} + +func (bbs BouncebackStats) String() string { + return fmt.Sprintf( + "BouncebackStats", + bbs.reads, bbs.writes, bbs.seeks, bbs.syncs) +} + +type bouncebackBase struct { + currentPosition int64 + + stats BouncebackStats +} + +// Position returns the position that we're supposed to be at. +func (bb *bouncebackBase) Position() int64 { + + // TODO(dustin): Add test + + return bb.currentPosition +} + +// StatsReads returns the number of reads that have been attempted. +func (bb *bouncebackBase) StatsReads() int { + + // TODO(dustin): Add test + + return bb.stats.reads +} + +// StatsWrites returns the number of write operations. +func (bb *bouncebackBase) StatsWrites() int { + + // TODO(dustin): Add test + + return bb.stats.writes +} + +// StatsSeeks returns the number of seeks. +func (bb *bouncebackBase) StatsSeeks() int { + + // TODO(dustin): Add test + + return bb.stats.seeks +} + +// StatsSyncs returns the number of corrective seeks ("bounce-backs"). +func (bb *bouncebackBase) StatsSyncs() int { + + // TODO(dustin): Add test + + return bb.stats.syncs +} + +// Seek does a seek to an arbitrary place in the `io.ReadSeeker`. +func (bb *bouncebackBase) seek(s io.Seeker, offset int64, whence int) (newPosition int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + // If the seek is relative, make sure we're where we're supposed to be *first*. + if whence != io.SeekStart { + err = bb.checkPosition(s) + log.PanicIf(err) + } + + bb.stats.seeks++ + + newPosition, err = s.Seek(offset, whence) + log.PanicIf(err) + + // Update our internal tracking. + bb.currentPosition = newPosition + + return newPosition, nil +} + +func (bb *bouncebackBase) checkPosition(s io.Seeker) (err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + // Make sure we're where we're supposed to be. + + // This should have no overhead, and enables us to collect stats. + realCurrentPosition, err := s.Seek(0, io.SeekCurrent) + log.PanicIf(err) + + if realCurrentPosition != bb.currentPosition { + bb.stats.syncs++ + + _, err = s.Seek(bb.currentPosition, io.SeekStart) + log.PanicIf(err) + } + + return nil +} + +// BouncebackReader wraps a ReadSeeker, keeps track of our position, and +// seeks back to it before writing. This allows an underlying ReadWriteSeeker +// with an unstable position can still be used for a prolonged series of writes. +type BouncebackReader struct { + rs io.ReadSeeker + + bouncebackBase +} + +// NewBouncebackReader returns a `*BouncebackReader` struct. +func NewBouncebackReader(rs io.ReadSeeker) (br *BouncebackReader, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + initialPosition, err := rs.Seek(0, io.SeekCurrent) + log.PanicIf(err) + + bb := bouncebackBase{ + currentPosition: initialPosition, + } + + br = &BouncebackReader{ + rs: rs, + bouncebackBase: bb, + } + + return br, nil +} + +// Seek does a seek to an arbitrary place in the `io.ReadSeeker`. +func (br *BouncebackReader) Seek(offset int64, whence int) (newPosition int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + newPosition, err = br.bouncebackBase.seek(br.rs, offset, whence) + log.PanicIf(err) + + return newPosition, nil +} + +// Seek does a standard read. +func (br *BouncebackReader) Read(p []byte) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + br.bouncebackBase.stats.reads++ + + err = br.bouncebackBase.checkPosition(br.rs) + log.PanicIf(err) + + // Do read. + + n, err = br.rs.Read(p) + if err != nil { + if err == io.EOF { + return 0, io.EOF + } + + log.Panic(err) + } + + // Update our internal tracking. + br.bouncebackBase.currentPosition += int64(n) + + return n, nil +} + +// BouncebackWriter wraps a WriteSeeker, keeps track of our position, and +// seeks back to it before writing. This allows an underlying ReadWriteSeeker +// with an unstable position can still be used for a prolonged series of writes. +type BouncebackWriter struct { + ws io.WriteSeeker + + bouncebackBase +} + +// NewBouncebackWriter returns a new `BouncebackWriter` struct. +func NewBouncebackWriter(ws io.WriteSeeker) (bw *BouncebackWriter, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + initialPosition, err := ws.Seek(0, io.SeekCurrent) + log.PanicIf(err) + + bb := bouncebackBase{ + currentPosition: initialPosition, + } + + bw = &BouncebackWriter{ + ws: ws, + bouncebackBase: bb, + } + + return bw, nil +} + +// Seek puts us at a specific position in the internal writer for the next +// write/seek. +func (bw *BouncebackWriter) Seek(offset int64, whence int) (newPosition int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + newPosition, err = bw.bouncebackBase.seek(bw.ws, offset, whence) + log.PanicIf(err) + + return newPosition, nil +} + +// Write performs a write against the internal `WriteSeeker` starting at the +// position that we're supposed to be at. +func (bw *BouncebackWriter) Write(p []byte) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + bw.bouncebackBase.stats.writes++ + + // Make sure we're where we're supposed to be. + + realCurrentPosition, err := bw.ws.Seek(0, io.SeekCurrent) + log.PanicIf(err) + + if realCurrentPosition != bw.bouncebackBase.currentPosition { + bw.bouncebackBase.stats.seeks++ + + _, err = bw.ws.Seek(bw.bouncebackBase.currentPosition, io.SeekStart) + log.PanicIf(err) + } + + // Do write. + + n, err = bw.ws.Write(p) + log.PanicIf(err) + + // Update our internal tracking. + bw.bouncebackBase.currentPosition += int64(n) + + return n, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseekcloser.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseekcloser.go new file mode 100644 index 0000000000..3d2e840fa3 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseekcloser.go @@ -0,0 +1,95 @@ +package rifs + +import ( + "io" + + "github.com/dsoprea/go-logging" +) + +// BoundedReadWriteSeekCloser wraps a RWS that is also a closer with boundaries. +// This proxies the RWS methods to the inner BRWS inside. +type BoundedReadWriteSeekCloser struct { + io.Closer + *BoundedReadWriteSeeker +} + +// NewBoundedReadWriteSeekCloser returns a new BoundedReadWriteSeekCloser. +func NewBoundedReadWriteSeekCloser(rwsc ReadWriteSeekCloser, minimumOffset int64, staticFileSize int64) (brwsc *BoundedReadWriteSeekCloser, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + bs, err := NewBoundedReadWriteSeeker(rwsc, minimumOffset, staticFileSize) + log.PanicIf(err) + + brwsc = &BoundedReadWriteSeekCloser{ + Closer: rwsc, + BoundedReadWriteSeeker: bs, + } + + return brwsc, nil +} + +// Seek forwards calls to the inner RWS. +func (rwsc *BoundedReadWriteSeekCloser) Seek(offset int64, whence int) (newOffset int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + newOffset, err = rwsc.BoundedReadWriteSeeker.Seek(offset, whence) + log.PanicIf(err) + + return newOffset, nil +} + +// Read forwards calls to the inner RWS. +func (rwsc *BoundedReadWriteSeekCloser) Read(buffer []byte) (readCount int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + readCount, err = rwsc.BoundedReadWriteSeeker.Read(buffer) + if err != nil { + if err == io.EOF { + return 0, err + } + + log.Panic(err) + } + + return readCount, nil +} + +// Write forwards calls to the inner RWS. +func (rwsc *BoundedReadWriteSeekCloser) Write(buffer []byte) (writtenCount int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + writtenCount, err = rwsc.BoundedReadWriteSeeker.Write(buffer) + log.PanicIf(err) + + return writtenCount, nil +} + +// Close forwards calls to the inner RWS. +func (rwsc *BoundedReadWriteSeekCloser) Close() (err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + err = rwsc.Closer.Close() + log.PanicIf(err) + + return nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseeker.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseeker.go new file mode 100644 index 0000000000..d29657b05d --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/boundedreadwriteseeker.go @@ -0,0 +1,156 @@ +package rifs + +import ( + "errors" + "io" + "os" + + "github.com/dsoprea/go-logging" +) + +var ( + // ErrSeekBeyondBound is returned when a seek is requested beyond the + // statically-given file-size. No writes or seeks beyond boundaries are + // supported with a statically-given file size. + ErrSeekBeyondBound = errors.New("seek beyond boundary") +) + +// BoundedReadWriteSeeker is a thin filter that ensures that no seeks can be done +// to offsets smaller than the one we were given. This supports libraries that +// might be expecting to read from the front of the stream being used on data +// that is in the middle of a stream instead. +type BoundedReadWriteSeeker struct { + io.ReadWriteSeeker + + currentOffset int64 + minimumOffset int64 + + staticFileSize int64 +} + +// NewBoundedReadWriteSeeker returns a new BoundedReadWriteSeeker instance. +func NewBoundedReadWriteSeeker(rws io.ReadWriteSeeker, minimumOffset int64, staticFileSize int64) (brws *BoundedReadWriteSeeker, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + if minimumOffset < 0 { + log.Panicf("BoundedReadWriteSeeker minimum offset must be zero or larger: (%d)", minimumOffset) + } + + // We'll always started at a relative offset of zero. + _, err = rws.Seek(minimumOffset, os.SEEK_SET) + log.PanicIf(err) + + brws = &BoundedReadWriteSeeker{ + ReadWriteSeeker: rws, + + currentOffset: 0, + minimumOffset: minimumOffset, + + staticFileSize: staticFileSize, + } + + return brws, nil +} + +// Seek moves the offset to the given offset. Prevents offset from ever being +// moved left of `brws.minimumOffset`. +func (brws *BoundedReadWriteSeeker) Seek(offset int64, whence int) (updatedOffset int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + fileSize := brws.staticFileSize + + // If we weren't given a static file-size, look it up whenever it is needed. + if whence == os.SEEK_END && fileSize == 0 { + realFileSizeRaw, err := brws.ReadWriteSeeker.Seek(0, os.SEEK_END) + log.PanicIf(err) + + fileSize = realFileSizeRaw - brws.minimumOffset + } + + updatedOffset, err = CalculateSeek(brws.currentOffset, offset, whence, fileSize) + log.PanicIf(err) + + if brws.staticFileSize != 0 && updatedOffset > brws.staticFileSize { + //updatedOffset = int64(brws.staticFileSize) + + // NOTE(dustin): Presumably, this will only be disruptive to writes that are beyond the boundaries, which, if we're being used at all, should already account for the boundary and prevent this error from ever happening. So, time will tell how disruptive this is. + return 0, ErrSeekBeyondBound + } + + if updatedOffset != brws.currentOffset { + updatedRealOffset := updatedOffset + brws.minimumOffset + + _, err = brws.ReadWriteSeeker.Seek(updatedRealOffset, os.SEEK_SET) + log.PanicIf(err) + + brws.currentOffset = updatedOffset + } + + return updatedOffset, nil +} + +// Read forwards writes to the inner RWS. +func (brws *BoundedReadWriteSeeker) Read(buffer []byte) (readCount int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + if brws.staticFileSize != 0 { + availableCount := brws.staticFileSize - brws.currentOffset + if availableCount == 0 { + return 0, io.EOF + } + + if int64(len(buffer)) > availableCount { + buffer = buffer[:availableCount] + } + } + + readCount, err = brws.ReadWriteSeeker.Read(buffer) + brws.currentOffset += int64(readCount) + + if err != nil { + if err == io.EOF { + return 0, err + } + + log.Panic(err) + } + + return readCount, nil +} + +// Write forwards writes to the inner RWS. +func (brws *BoundedReadWriteSeeker) Write(buffer []byte) (writtenCount int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + if brws.staticFileSize != 0 { + log.Panicf("writes can not be performed if a static file-size was given") + } + + writtenCount, err = brws.ReadWriteSeeker.Write(buffer) + brws.currentOffset += int64(writtenCount) + + log.PanicIf(err) + + return writtenCount, nil +} + +// MinimumOffset returns the configured minimum-offset. +func (brws *BoundedReadWriteSeeker) MinimumOffset() int64 { + return brws.minimumOffset +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/calculate_seek.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/calculate_seek.go new file mode 100644 index 0000000000..cd59d727c1 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/calculate_seek.go @@ -0,0 +1,52 @@ +package rifs + +import ( + "io" + "os" + + "github.com/dsoprea/go-logging" +) + +// SeekType is a convenience type to associate the different seek-types with +// printable descriptions. +type SeekType int + +// String returns a descriptive string. +func (n SeekType) String() string { + if n == io.SeekCurrent { + return "SEEK-CURRENT" + } else if n == io.SeekEnd { + return "SEEK-END" + } else if n == io.SeekStart { + return "SEEK-START" + } + + log.Panicf("unknown seek-type: (%d)", n) + return "" +} + +// CalculateSeek calculates an offset in a file-stream given the parameters. +func CalculateSeek(currentOffset int64, delta int64, whence int, fileSize int64) (finalOffset int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + finalOffset = 0 + } + }() + + if whence == os.SEEK_SET { + finalOffset = delta + } else if whence == os.SEEK_CUR { + finalOffset = currentOffset + delta + } else if whence == os.SEEK_END { + finalOffset = fileSize + delta + } else { + log.Panicf("whence not valid: (%d)", whence) + } + + if finalOffset < 0 { + finalOffset = 0 + } + + return finalOffset, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/common.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/common.go new file mode 100644 index 0000000000..256333d40d --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/common.go @@ -0,0 +1,15 @@ +package rifs + +import ( + "os" + "path" +) + +var ( + appPath string +) + +func init() { + goPath := os.Getenv("GOPATH") + appPath = path.Join(goPath, "src", "github.com", "dsoprea", "go-utility", "filesystem") +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/copy_bytes_between_positions.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/copy_bytes_between_positions.go new file mode 100644 index 0000000000..89ee9a92cc --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/copy_bytes_between_positions.go @@ -0,0 +1,40 @@ +package rifs + +import ( + "io" + "os" + + "github.com/dsoprea/go-logging" +) + +// CopyBytesBetweenPositions will copy bytes from one position in the given RWS +// to an earlier position in the same RWS. +func CopyBytesBetweenPositions(rws io.ReadWriteSeeker, fromPosition, toPosition int64, count int) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + if fromPosition <= toPosition { + log.Panicf("from position (%d) must be larger than to position (%d)", fromPosition, toPosition) + } + + br, err := NewBouncebackReader(rws) + log.PanicIf(err) + + _, err = br.Seek(fromPosition, os.SEEK_SET) + log.PanicIf(err) + + bw, err := NewBouncebackWriter(rws) + log.PanicIf(err) + + _, err = bw.Seek(toPosition, os.SEEK_SET) + log.PanicIf(err) + + written, err := io.CopyN(bw, br, int64(count)) + log.PanicIf(err) + + n = int(written) + return n, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/does_exist.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/does_exist.go new file mode 100644 index 0000000000..f5e6cd20a0 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/does_exist.go @@ -0,0 +1,19 @@ +package rifs + +import ( + "os" +) + +// DoesExist returns true if we can open the given file/path without error. We +// can't simply use `os.IsNotExist()` because we'll get a different error when +// the parent directory doesn't exist, and really the only important thing is if +// it exists *and* it's readable. +func DoesExist(filepath string) bool { + f, err := os.Open(filepath) + if err != nil { + return false + } + + f.Close() + return true +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go new file mode 100644 index 0000000000..8705e5fe04 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go @@ -0,0 +1,54 @@ +package rifs + +import ( + "fmt" + "io" +) + +const ( + defaultCopyBufferSize = 1024 * 1024 +) + +// GracefulCopy willcopy while enduring lesser normal issues. +// +// - We'll ignore EOF if the read byte-count is more than zero. Only an EOF when +// zero bytes were read will terminate the loop. +// +// - Ignore short-writes. If less bytes were written than the bytes that were +// given, we'll keep trying until done. +func GracefulCopy(w io.Writer, r io.Reader, buffer []byte) (copyCount int, err error) { + if buffer == nil { + buffer = make([]byte, defaultCopyBufferSize) + } + + for { + readCount, err := r.Read(buffer) + if err != nil { + if err != io.EOF { + err = fmt.Errorf("read error: %s", err.Error()) + return 0, err + } + + // Only break on EOF if no bytes were actually read. + if readCount == 0 { + break + } + } + + writeBuffer := buffer[:readCount] + + for len(writeBuffer) > 0 { + writtenCount, err := w.Write(writeBuffer) + if err != nil { + err = fmt.Errorf("write error: %s", err.Error()) + return 0, err + } + + writeBuffer = writeBuffer[writtenCount:] + } + + copyCount += readCount + } + + return copyCount, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/list_files.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/list_files.go new file mode 100644 index 0000000000..bcdbd67cbb --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/list_files.go @@ -0,0 +1,143 @@ +package rifs + +import ( + "io" + "os" + "path" + + "github.com/dsoprea/go-logging" +) + +// FileListFilterPredicate is the callback predicate used for filtering. +type FileListFilterPredicate func(parent string, child os.FileInfo) (hit bool, err error) + +// VisitedFile is one visited file. +type VisitedFile struct { + Filepath string + Info os.FileInfo + Index int +} + +// ListFiles feeds a continuous list of files from a recursive folder scan. An +// optional predicate can be provided in order to filter. When done, the +// `filesC` channel is closed. If there's an error, the `errC` channel will +// receive it. +func ListFiles(rootPath string, cb FileListFilterPredicate) (filesC chan VisitedFile, count int, errC chan error) { + defer func() { + if state := recover(); state != nil { + err := log.Wrap(state.(error)) + log.Panic(err) + } + }() + + // Make sure the path exists. + + f, err := os.Open(rootPath) + log.PanicIf(err) + + f.Close() + + // Do our thing. + + filesC = make(chan VisitedFile, 100) + errC = make(chan error, 1) + index := 0 + + go func() { + defer func() { + if state := recover(); state != nil { + err := log.Wrap(state.(error)) + errC <- err + } + }() + + queue := []string{rootPath} + for len(queue) > 0 { + // Pop the next folder to process off the queue. + var thisPath string + thisPath, queue = queue[0], queue[1:] + + // Skip path if a symlink. + + fi, err := os.Lstat(thisPath) + log.PanicIf(err) + + if (fi.Mode() & os.ModeSymlink) > 0 { + continue + } + + // Read information. + + folderF, err := os.Open(thisPath) + if err != nil { + errC <- log.Wrap(err) + return + } + + // Iterate through children. + + for { + children, err := folderF.Readdir(1000) + if err == io.EOF { + break + } else if err != nil { + errC <- log.Wrap(err) + return + } + + for _, child := range children { + filepath := path.Join(thisPath, child.Name()) + + // Skip if a file symlink. + + fi, err := os.Lstat(filepath) + log.PanicIf(err) + + if (fi.Mode() & os.ModeSymlink) > 0 { + continue + } + + // If a predicate was given, determine if this child will be + // left behind. + if cb != nil { + hit, err := cb(thisPath, child) + + if err != nil { + errC <- log.Wrap(err) + return + } + + if hit == false { + continue + } + } + + index++ + + // Push file to channel. + + vf := VisitedFile{ + Filepath: filepath, + Info: child, + Index: index, + } + + filesC <- vf + + // If a folder, queue for later processing. + + if child.IsDir() == true { + queue = append(queue, filepath) + } + } + } + + folderF.Close() + } + + close(filesC) + close(errC) + }() + + return filesC, index, errC +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/progress_wrapper.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/progress_wrapper.go new file mode 100644 index 0000000000..0a064c53d1 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/progress_wrapper.go @@ -0,0 +1,93 @@ +package rifs + +import ( + "io" + "time" + + "github.com/dsoprea/go-logging" +) + +// ProgressFunc receives progress updates. +type ProgressFunc func(n int, duration time.Duration, isEof bool) error + +// WriteProgressWrapper wraps a reader and calls a callback after each read with +// count and duration info. +type WriteProgressWrapper struct { + w io.Writer + progressCb ProgressFunc +} + +// NewWriteProgressWrapper returns a new WPW instance. +func NewWriteProgressWrapper(w io.Writer, progressCb ProgressFunc) io.Writer { + return &WriteProgressWrapper{ + w: w, + progressCb: progressCb, + } +} + +// Write does a write and calls the callback. +func (wpw *WriteProgressWrapper) Write(buffer []byte) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + startAt := time.Now() + + n, err = wpw.w.Write(buffer) + log.PanicIf(err) + + duration := time.Since(startAt) + + err = wpw.progressCb(n, duration, false) + log.PanicIf(err) + + return n, nil +} + +// ReadProgressWrapper wraps a reader and calls a callback after each read with +// count and duration info. +type ReadProgressWrapper struct { + r io.Reader + progressCb ProgressFunc +} + +// NewReadProgressWrapper returns a new RPW instance. +func NewReadProgressWrapper(r io.Reader, progressCb ProgressFunc) io.Reader { + return &ReadProgressWrapper{ + r: r, + progressCb: progressCb, + } +} + +// Read reads data and calls the callback. +func (rpw *ReadProgressWrapper) Read(buffer []byte) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + startAt := time.Now() + + n, err = rpw.r.Read(buffer) + + duration := time.Since(startAt) + + if err != nil { + if err == io.EOF { + errInner := rpw.progressCb(n, duration, true) + log.PanicIf(errInner) + + return n, err + } + + log.Panic(err) + } + + err = rpw.progressCb(n, duration, false) + log.PanicIf(err) + + return n, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/read_counter.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/read_counter.go new file mode 100644 index 0000000000..d878ca4e65 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/read_counter.go @@ -0,0 +1,36 @@ +package rifs + +import ( + "io" +) + +// ReadCounter proxies read requests and maintains a counter of bytes read. +type ReadCounter struct { + r io.Reader + counter int +} + +// NewReadCounter returns a new `ReadCounter` struct wrapping a `Reader`. +func NewReadCounter(r io.Reader) *ReadCounter { + return &ReadCounter{ + r: r, + } +} + +// Count returns the total number of bytes read. +func (rc *ReadCounter) Count() int { + return rc.counter +} + +// Reset resets the counter to zero. +func (rc *ReadCounter) Reset() { + rc.counter = 0 +} + +// Read forwards a read to the underlying `Reader` while bumping the counter. +func (rc *ReadCounter) Read(b []byte) (n int, err error) { + n, err = rc.r.Read(b) + rc.counter += n + + return n, err +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/readseeker_to_readerat.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/readseeker_to_readerat.go new file mode 100644 index 0000000000..3f3ec44dd1 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/readseeker_to_readerat.go @@ -0,0 +1,63 @@ +package rifs + +import ( + "io" + + "github.com/dsoprea/go-logging" +) + +// ReadSeekerToReaderAt is a wrapper that allows a ReadSeeker to masquerade as a +// ReaderAt. +type ReadSeekerToReaderAt struct { + rs io.ReadSeeker +} + +// NewReadSeekerToReaderAt returns a new ReadSeekerToReaderAt instance. +func NewReadSeekerToReaderAt(rs io.ReadSeeker) *ReadSeekerToReaderAt { + return &ReadSeekerToReaderAt{ + rs: rs, + } +} + +// ReadAt is a wrapper that satisfies the ReaderAt interface. +// +// Note that a requirement of ReadAt is that it doesn't have an effect on the +// offset in the underlying resource as well as that concurrent calls can be +// made to it. Since we're capturing the current offset in the underlying +// resource and then seeking back to it before returning, it is the +// responsibility of the caller to serialize (i.e. use a mutex with) these +// requests in order to eliminate race-conditions in the parallel-usage +// scenario. +// +// Note also that, since ReadAt() is going to be called on a particular +// instance, that instance is going to internalize a file resource, that file- +// resource is provided by the OS, and [most] OSs are only gonna support one +// file-position per resource, locking is already going to be a necessary +// internal semantic of a ReaderAt implementation. +func (rstra *ReadSeekerToReaderAt) ReadAt(p []byte, offset int64) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + originalOffset, err := rstra.rs.Seek(0, io.SeekCurrent) + log.PanicIf(err) + + defer func() { + _, err := rstra.rs.Seek(originalOffset, io.SeekStart) + log.PanicIf(err) + }() + + _, err = rstra.rs.Seek(offset, io.SeekStart) + log.PanicIf(err) + + // Note that all errors will be wrapped, here. The usage of this method is + // such that typically no specific errors would be expected as part of + // normal operation (in which case we'd check for those first and return + // them directly). + n, err = io.ReadFull(rstra.rs, p) + log.PanicIf(err) + + return n, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/readwriteseekcloser.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/readwriteseekcloser.go new file mode 100644 index 0000000000..c583a80241 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/readwriteseekcloser.go @@ -0,0 +1,29 @@ +package rifs + +import ( + "io" +) + +// ReadWriteSeekCloser satisfies `io.ReadWriteSeeker` and `io.Closer` +// interfaces. +type ReadWriteSeekCloser interface { + io.ReadWriteSeeker + io.Closer +} + +type readWriteSeekNoopCloser struct { + io.ReadWriteSeeker +} + +// ReadWriteSeekNoopCloser wraps a `io.ReadWriteSeeker` with a no-op Close() +// call. +func ReadWriteSeekNoopCloser(rws io.ReadWriteSeeker) ReadWriteSeekCloser { + return readWriteSeekNoopCloser{ + ReadWriteSeeker: rws, + } +} + +// Close does nothing but allows the RWS to satisfy `io.Closer`.:wq +func (readWriteSeekNoopCloser) Close() (err error) { + return nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/seekable_buffer.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/seekable_buffer.go new file mode 100644 index 0000000000..5d41bb5df1 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/seekable_buffer.go @@ -0,0 +1,146 @@ +package rifs + +import ( + "io" + "os" + + "github.com/dsoprea/go-logging" +) + +// SeekableBuffer is a simple memory structure that satisfies +// `io.ReadWriteSeeker`. +type SeekableBuffer struct { + data []byte + position int64 +} + +// NewSeekableBuffer is a factory that returns a `*SeekableBuffer`. +func NewSeekableBuffer() *SeekableBuffer { + data := make([]byte, 0) + + return &SeekableBuffer{ + data: data, + } +} + +// NewSeekableBufferWithBytes is a factory that returns a `*SeekableBuffer`. +func NewSeekableBufferWithBytes(originalData []byte) *SeekableBuffer { + data := make([]byte, len(originalData)) + copy(data, originalData) + + return &SeekableBuffer{ + data: data, + } +} + +func len64(data []byte) int64 { + return int64(len(data)) +} + +// Bytes returns the underlying slice. +func (sb *SeekableBuffer) Bytes() []byte { + return sb.data +} + +// Len returns the number of bytes currently stored. +func (sb *SeekableBuffer) Len() int { + return len(sb.data) +} + +// Write does a standard write to the internal slice. +func (sb *SeekableBuffer) Write(p []byte) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + // The current position we're already at is past the end of the data we + // actually have. Extend our buffer up to our current position. + if sb.position > len64(sb.data) { + extra := make([]byte, sb.position-len64(sb.data)) + sb.data = append(sb.data, extra...) + } + + positionFromEnd := len64(sb.data) - sb.position + tailCount := positionFromEnd - len64(p) + + var tailBytes []byte + if tailCount > 0 { + tailBytes = sb.data[len64(sb.data)-tailCount:] + sb.data = append(sb.data[:sb.position], p...) + } else { + sb.data = append(sb.data[:sb.position], p...) + } + + if tailBytes != nil { + sb.data = append(sb.data, tailBytes...) + } + + dataSize := len64(p) + sb.position += dataSize + + return int(dataSize), nil +} + +// Read does a standard read against the internal slice. +func (sb *SeekableBuffer) Read(p []byte) (n int, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + if sb.position >= len64(sb.data) { + return 0, io.EOF + } + + n = copy(p, sb.data[sb.position:]) + sb.position += int64(n) + + return n, nil +} + +// Truncate either chops or extends the internal buffer. +func (sb *SeekableBuffer) Truncate(size int64) (err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + sizeInt := int(size) + if sizeInt < len(sb.data)-1 { + sb.data = sb.data[:sizeInt] + } else { + new := make([]byte, sizeInt-len(sb.data)) + sb.data = append(sb.data, new...) + } + + return nil +} + +// Seek does a standard seek on the internal slice. +func (sb *SeekableBuffer) Seek(offset int64, whence int) (n int64, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + if whence == os.SEEK_SET { + sb.position = offset + } else if whence == os.SEEK_END { + sb.position = len64(sb.data) + offset + } else if whence == os.SEEK_CUR { + sb.position += offset + } else { + log.Panicf("seek whence is not valid: (%d)", whence) + } + + if sb.position < 0 { + sb.position = 0 + } + + return sb.position, nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/simplefileinfo.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/simplefileinfo.go new file mode 100644 index 0000000000..a227b0b007 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/simplefileinfo.go @@ -0,0 +1,69 @@ +package rifs + +import ( + "os" + "time" +) + +// SimpleFileInfo is a simple `os.FileInfo` implementation useful for testing +// with the bare minimum. +type SimpleFileInfo struct { + filename string + isDir bool + size int64 + mode os.FileMode + modTime time.Time +} + +// NewSimpleFileInfoWithFile returns a new file-specific SimpleFileInfo. +func NewSimpleFileInfoWithFile(filename string, size int64, mode os.FileMode, modTime time.Time) *SimpleFileInfo { + return &SimpleFileInfo{ + filename: filename, + isDir: false, + size: size, + mode: mode, + modTime: modTime, + } +} + +// NewSimpleFileInfoWithDirectory returns a new directory-specific +// SimpleFileInfo. +func NewSimpleFileInfoWithDirectory(filename string, modTime time.Time) *SimpleFileInfo { + return &SimpleFileInfo{ + filename: filename, + isDir: true, + mode: os.ModeDir, + modTime: modTime, + } +} + +// Name returns the base name of the file. +func (sfi *SimpleFileInfo) Name() string { + return sfi.filename +} + +// Size returns the length in bytes for regular files; system-dependent for +// others. +func (sfi *SimpleFileInfo) Size() int64 { + return sfi.size +} + +// Mode returns the file mode bits. +func (sfi *SimpleFileInfo) Mode() os.FileMode { + return sfi.mode +} + +// ModTime returns the modification time. +func (sfi *SimpleFileInfo) ModTime() time.Time { + return sfi.modTime +} + +// IsDir returns true if a directory. +func (sfi *SimpleFileInfo) IsDir() bool { + return sfi.isDir +} + +// Sys returns internal state. +func (sfi *SimpleFileInfo) Sys() interface{} { + return nil +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/utility.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/utility.go new file mode 100644 index 0000000000..4b33b41a97 --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/utility.go @@ -0,0 +1,17 @@ +package rifs + +import ( + "io" + "os" + + "github.com/dsoprea/go-logging" +) + +// GetOffset returns the current offset of the Seeker and just panics if unable +// to find it. +func GetOffset(s io.Seeker) int64 { + offsetRaw, err := s.Seek(0, os.SEEK_CUR) + log.PanicIf(err) + + return offsetRaw +} diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/write_counter.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/write_counter.go new file mode 100644 index 0000000000..dc39901d5e --- /dev/null +++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/write_counter.go @@ -0,0 +1,36 @@ +package rifs + +import ( + "io" +) + +// WriteCounter proxies write requests and maintains a counter of bytes written. +type WriteCounter struct { + w io.Writer + counter int +} + +// NewWriteCounter returns a new `WriteCounter` struct wrapping a `Writer`. +func NewWriteCounter(w io.Writer) *WriteCounter { + return &WriteCounter{ + w: w, + } +} + +// Count returns the total number of bytes read. +func (wc *WriteCounter) Count() int { + return wc.counter +} + +// Reset resets the counter to zero. +func (wc *WriteCounter) Reset() { + wc.counter = 0 +} + +// Write forwards a write to the underlying `Writer` while bumping the counter. +func (wc *WriteCounter) Write(b []byte) (n int, err error) { + n, err = wc.w.Write(b) + wc.counter += n + + return n, err +} diff --git a/vendor/github.com/dsoprea/go-utility/image/README.md b/vendor/github.com/dsoprea/go-utility/v2/image/README.md similarity index 100% rename from vendor/github.com/dsoprea/go-utility/image/README.md rename to vendor/github.com/dsoprea/go-utility/v2/image/README.md diff --git a/vendor/github.com/dsoprea/go-utility/image/media_parser_type.go b/vendor/github.com/dsoprea/go-utility/v2/image/media_parser_type.go similarity index 96% rename from vendor/github.com/dsoprea/go-utility/image/media_parser_type.go rename to vendor/github.com/dsoprea/go-utility/v2/image/media_parser_type.go index b7956ea173..8776a1fdd2 100644 --- a/vendor/github.com/dsoprea/go-utility/image/media_parser_type.go +++ b/vendor/github.com/dsoprea/go-utility/v2/image/media_parser_type.go @@ -3,7 +3,7 @@ package riimage import ( "io" - "github.com/dsoprea/go-exif/v2" + "github.com/dsoprea/go-exif/v3" ) // MediaContext is an accessor that knows how to extract specific metadata from diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/LICENSE b/vendor/github.com/superseriousbusiness/exif-terminator/LICENSE new file mode 100644 index 0000000000..dba13ed2dd --- /dev/null +++ b/vendor/github.com/superseriousbusiness/exif-terminator/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/README.md b/vendor/github.com/superseriousbusiness/exif-terminator/README.md new file mode 100644 index 0000000000..8866202d5d --- /dev/null +++ b/vendor/github.com/superseriousbusiness/exif-terminator/README.md @@ -0,0 +1,116 @@ +# exif-terminator + +`exif-terminator` removes exif data from images (jpeg and png currently supported) in a streaming manner. All you need to do is provide a reader of the image in, and exif-terminator will provide a reader of the image out. + +Hasta la vista, baby! + +```text + .,lddxococ. + ..',lxO0Oo;'. + . .. .,coodO0klc:. + .,. ..','. .. .,..'. .':llxKXk' + .;c:cc;;,... .''.,l:cc. .....:l:,,:oo:.. + .,:ll'. .,;cox0OxOKKXX0kOOxlcld0X0d;,,,'. + .:xkl. .':cdKNWWWWMMMMMMMMMMWWNXK0KWNd. + .coxo,..:ollk0KKXNWMMMMMMMMMMWWXXXOoOM0; + ,oc,. .;cloxOKXXWWMMMMMMMMMMMWNXk;;OWO' + . ..;cdOKXNNWWMMMMMMMMMMMMWO,,ONO' + ...... ....;okOO000XWWMMMMMMMMMWXx;,ONNx. +.;c;. .:l'ckl. ..';looooolldolloooodolcc:;'.;oo:. +.oxl. ;:..OO. .. .. .,' .;. +.oko. .cc.'Ok. .:; .:,..';. +.cdc. .;;lc.,Ox. . .',,'..','. .dN0; .. .c:,,':. +.:oc. ,dxkl.,0x. . .. . .oNMMKc.. ...:l. +.:o:. cKXKl.,Ox. .. .lKWMMMXo,. ...''. +.:l; c0KKo.,0x. ...........';:lk0OKNNXKkl,..,;cxd' +.::' ;k00l.;0d. .. .,cloooddddxxddol;:ddloxdc,:odOWNc +.;,. ,ONKc.;0d. 'l,.. .:clllllllokKOl::cllclkKx'.lolxx' +.,. '0W0:.;0d. .:l,. .,:ccc:::oOXNXOkxdook0NWNx,,;c;. +... .kX0c.;0d. .loc' .,::;;;;lk0kddoooooddooO0o',ld; +.. .oOkk:cKd. .... .;:,',;cxK0o::ldkOkkOkxod:';oKx. +.. :dlOolKO, '::'.';:oOK0xdddoollooxOx::ccOx. +.. ';:o,.xKo. .,;'...';lddolooodkkkdol:,::lc. +.. ...:..oOl. ........';:codxxOXKKKk;':;:kl +.. .,..lOc. .. ....,codxkxxxxxo:,,;lKO. .,;'.. +... .. ck: ';,'. .;:cllloc,;;;colOK; .;odxxoc;. +...,.... . :x; .;:cc;'. .,;::c:'..,kXk:xNc .':oook00x:. + . cKx. .'.. ':clllc,...'';:::cc:;.,kOo:xNx. .'codddoox + .. ,xxl;',col:;. .:cccccc;;;:lxkkOOkdc,,lolcxWO' ;kNKc.' + .,. .c' ':dkO0O; .. .;ccccccc:::cldxkxoll:;oolcdN0:.. .xWNk; + .:' .c',xXNKkOXo .,. .,:cccccllc::lloooolc:;lo:;oXKc,::. .kWWX + ,' .cONMWMWkco, ', .';::ccclolc:llolollcccodo;:KXl..cl,. ;KWN + '. .xWWWWMKc;; ....;' ',;::::coolclloooollc:,:o;;0Xx, .,:;... ,0Ko + . ,kKNWWXd,cdd0NXKk:,;;;'';::::coollllllllllc;;ccl0Nkc. ..';loOx' + 'lxXWMXOOXNMMMMWWNNNWXkc;;;;;:cllccccccccc::lllkNWXd,. .cxO0Ol' + ,xKNWWXkkXWM0dxKNWWWMWNX0OOkl;;:c::cccc:,...:oONMMXOo;. :kOkOkl; + .;,;:;...,::. .;lokXKKNMMMWNOc,;;;,::;'...lOKNWNKkol:,..cKdcO0do + .:;... .. .,:okO0KNN0:.',,''''. ':xNMWKkxxOKXd,.cNk,:l:o +``` + +## Why? + +Exif removal is a pain in the arse. Most other libraries seem to parse the whole image into memory, then remove the exif data, then encode the image again. + +`exif-terminator` differs in that it removes exif data *while scanning through the image bytes*, and it doesn't do any reencoding of the image. Bytes of exif data are simply all set to 0, and the image data is piped back out again into the returned reader. + +## Example + +```go +package test + +import ( + "io" + "os" + + terminator "github.com/superseriousbusiness/exif-terminator" +) + +func main() { + // open a file + sloth, err := os.Open("./images/sloth.jpg") + if err != nil { + panic(err) + } + + // get the length of the file + stat, err := sloth.Stat() + if err != nil { + panic(err) + } + + // terminate! + out, err := terminator.Terminate(sloth, int(stat.Size()), "jpeg") + if err != nil { + panic(err) + } + + // read the bytes from the reader + b, err := io.ReadAll(out) + if err != nil { + panic(err) + } + + // save the file somewhere + if err := os.WriteFile("./images/sloth-clean.jpg", b, 0666); err != nil { + panic(err) + } +} +``` + +## Credits + +### Libraries + +`exif-terminator` borrows heavily from the two [`dsoprea`](https://github.com/dsoprea) libraries credited below. In fact, it's basically a hack on top of those libraries. Thanks `dsoprea`! + +- [dsoprea/go-jpeg-image-structure](https://github.com/dsoprea/go-jpeg-image-structure): jpeg structure parsing. [MIT License](https://spdx.org/licenses/MIT.html). +- [dsoprea/go-png-image-structure](https://github.com/dsoprea/go-png-image-structure): png structure parsing. [MIT License](https://spdx.org/licenses/MIT.html). +- [stretchr/testify](https://github.com/stretchr/testify); test framework. [MIT License](https://spdx.org/licenses/MIT.html). + +## License + +![the gnu AGPL logo](https://www.gnu.org/graphics/agplv3-155x51.png) + +`exif-terminator` is free software, licensed under the [GNU AGPL v3 LICENSE](LICENSE). + +Copyright (C) 2022 SuperSeriousBusiness. diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go b/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go new file mode 100644 index 0000000000..224a9b6468 --- /dev/null +++ b/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go @@ -0,0 +1,138 @@ +/* + exif-terminator + Copyright (C) 2022 SuperSeriousBusiness admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package terminator + +import ( + "encoding/binary" + "fmt" + "io" + + jpegstructure "github.com/dsoprea/go-jpeg-image-structure/v2" +) + +var markerLen = map[byte]int{ + 0x00: 0, + 0x01: 0, + 0xd0: 0, + 0xd1: 0, + 0xd2: 0, + 0xd3: 0, + 0xd4: 0, + 0xd5: 0, + 0xd6: 0, + 0xd7: 0, + 0xd8: 0, + 0xd9: 0, + 0xda: 0, + + // J2C + 0x30: 0, + 0x31: 0, + 0x32: 0, + 0x33: 0, + 0x34: 0, + 0x35: 0, + 0x36: 0, + 0x37: 0, + 0x38: 0, + 0x39: 0, + 0x3a: 0, + 0x3b: 0, + 0x3c: 0, + 0x3d: 0, + 0x3e: 0, + 0x3f: 0, + 0x4f: 0, + 0x92: 0, + 0x93: 0, + + // J2C extensions + 0x74: 4, + 0x75: 4, + 0x77: 4, +} + +type jpegVisitor struct { + js *jpegstructure.JpegSplitter + writer io.Writer +} + +// HandleSegment satisfies the visitor interface{} of the jpegstructure library. +// +// We don't really care about any of the parameters, since all we're interested +// in here is the very last segment that was scanned. +func (v *jpegVisitor) HandleSegment(_ byte, _ string, _ int, _ bool) error { + // all we want to do here is get the last segment that was scanned, and then manipulate it + segmentList := v.js.Segments() + segments := segmentList.Segments() + lastSegment := segments[len(segments)-1] + return v.writeSegment(lastSegment) +} + +func (v *jpegVisitor) writeSegment(s *jpegstructure.Segment) error { + w := v.writer + + defer func() { + // whatever happens, when we finished then evict data from the segment; + // once we've written it we don't want it in memory anymore + s.Data = s.Data[:0] + }() + + // The scan-data will have a marker-ID of (0) because it doesn't have a marker-ID or length. + if s.MarkerId != 0 { + if _, err := w.Write([]byte{0xff, s.MarkerId}); err != nil { + return err + } + + sizeLen, found := markerLen[s.MarkerId] + if !found || sizeLen == 2 { + sizeLen = 2 + l := uint16(len(s.Data) + sizeLen) + + if err := binary.Write(w, binary.BigEndian, &l); err != nil { + return err + } + + } else if sizeLen == 4 { + l := uint32(len(s.Data) + sizeLen) + + if err := binary.Write(w, binary.BigEndian, &l); err != nil { + return err + } + + } else if sizeLen != 0 { + return fmt.Errorf("not a supported marker-size: MARKER-ID=(0x%02x) MARKER-SIZE-LEN=(%d)", s.MarkerId, sizeLen) + } + } + + if s.IsExif() { + // if this segment is exif data, write blank bytes + blank := make([]byte, len(s.Data)) + if _, err := w.Write(blank); err != nil { + return err + } + } else { + // otherwise write the data + if _, err := w.Write(s.Data); err != nil { + return err + } + } + + return nil +} diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/png.go b/vendor/github.com/superseriousbusiness/exif-terminator/png.go new file mode 100644 index 0000000000..4a1ac5bf1b --- /dev/null +++ b/vendor/github.com/superseriousbusiness/exif-terminator/png.go @@ -0,0 +1,93 @@ +/* + exif-terminator + Copyright (C) 2022 SuperSeriousBusiness admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package terminator + +import ( + "encoding/binary" + "io" + + pngstructure "github.com/dsoprea/go-png-image-structure/v2" +) + +type pngVisitor struct { + ps *pngstructure.PngSplitter + writer io.Writer + lastWrittenChunk int +} + +func (v *pngVisitor) split(data []byte, atEOF bool) (int, []byte, error) { + // execute the ps split function to read in data + advance, token, err := v.ps.Split(data, atEOF) + if err != nil { + return advance, token, err + } + + // if we haven't written anything at all yet, then write the png header back into the writer first + if v.lastWrittenChunk == -1 { + if _, err := v.writer.Write(pngstructure.PngSignature[:]); err != nil { + return advance, token, err + } + } + + // check if the splitter has any new chunks in it that we haven't written yet + chunkSlice := v.ps.Chunks() + chunks := chunkSlice.Chunks() + for i, chunk := range chunks { + // look through all the chunks in the splitter + if i > v.lastWrittenChunk { + // we've got a chunk we haven't written yet! write it... + if err := v.writeChunk(chunk); err != nil { + return advance, token, err + } + // then remove the data + chunk.Data = chunk.Data[:0] + // and update + v.lastWrittenChunk = i + } + } + + return advance, token, err +} + +func (v *pngVisitor) writeChunk(chunk *pngstructure.Chunk) error { + if err := binary.Write(v.writer, binary.BigEndian, chunk.Length); err != nil { + return err + } + + if _, err := v.writer.Write([]byte(chunk.Type)); err != nil { + return err + } + + if chunk.Type == pngstructure.EXifChunkType { + blank := make([]byte, len(chunk.Data)) + if _, err := v.writer.Write(blank); err != nil { + return err + } + } else { + if _, err := v.writer.Write(chunk.Data); err != nil { + return err + } + } + + if err := binary.Write(v.writer, binary.BigEndian, chunk.Crc); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go b/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go new file mode 100644 index 0000000000..b6225f6dcf --- /dev/null +++ b/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go @@ -0,0 +1,116 @@ +/* + exif-terminator + Copyright (C) 2022 SuperSeriousBusiness admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package terminator + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + + jpegstructure "github.com/dsoprea/go-jpeg-image-structure/v2" + pngstructure "github.com/dsoprea/go-png-image-structure/v2" +) + +func Terminate(in io.Reader, fileSize int, mediaType string) (io.Reader, error) { + // to avoid keeping too much stuff in memory we want to pipe data directly + pipeReader, pipeWriter := io.Pipe() + + // we don't know ahead of time how long segments might be: they could be as large as + // the file itself, so unfortunately we need to allocate a buffer here that'scanner as large + // as the file + scanner := bufio.NewScanner(in) + scanner.Buffer([]byte{}, fileSize) + var err error + + switch mediaType { + case "image/jpeg", "jpeg", "jpg": + err = terminateJpeg(scanner, pipeWriter) + case "image/png", "png": + // for pngs we need to skip the header bytes, so read them in + // and check we're really dealing with a png here + header := make([]byte, len(pngstructure.PngSignature)) + if _, headerError := in.Read(header); headerError != nil { + err = headerError + break + } + + if !bytes.Equal(header, pngstructure.PngSignature[:]) { + err = errors.New("could not decode png: invalid header") + break + } + + err = terminatePng(scanner, pipeWriter) + default: + err = fmt.Errorf("mediaType %s cannot be processed", mediaType) + } + + return pipeReader, err +} + +func terminateJpeg(scanner *bufio.Scanner, writer io.WriteCloser) error { + // jpeg visitor is where the spicy hack of streaming the de-exifed data is contained + v := &jpegVisitor{ + writer: writer, + } + + // provide the visitor to the splitter so that it triggers on every section scan + js := jpegstructure.NewJpegSplitter(v) + + // the visitor also needs to read back the list of segments: for this it needs + // to know what jpeg splitter it's attached to, so give it a pointer to the splitter + v.js = js + + // use the jpeg splitters 'split' function, which satisfies the bufio.SplitFunc interface + scanner.Split(js.Split) + + scanAndClose(scanner, writer) + return nil +} + +func terminatePng(scanner *bufio.Scanner, writer io.WriteCloser) error { + ps := pngstructure.NewPngSplitter() + + v := &pngVisitor{ + ps: ps, + writer: writer, + lastWrittenChunk: -1, + } + + // use the png visitor's 'split' function, which satisfies the bufio.SplitFunc interface + scanner.Split(v.split) + + scanAndClose(scanner, writer) + return nil +} + +func scanAndClose(scanner *bufio.Scanner, writer io.WriteCloser) { + // scan asynchronously until there's nothing left to scan, and then close the writer + // so that the reader on the other side knows that we're done + // + // due to the nature of io.Pipe, writing won't actually work + // until the pipeReader starts being read by the caller, which + // is why we do this asynchronously + go func() { + for scanner.Scan() { + } + writer.Close() + }() +} diff --git a/vendor/github.com/superseriousbusiness/exifremove/LICENSE b/vendor/github.com/superseriousbusiness/exifremove/LICENSE deleted file mode 100644 index 3ba9c83c69..0000000000 --- a/vendor/github.com/superseriousbusiness/exifremove/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 scott lee davis - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/exifremove.go b/vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/exifremove.go deleted file mode 100644 index d9e7e2ad17..0000000000 --- a/vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/exifremove.go +++ /dev/null @@ -1,140 +0,0 @@ -package exifremove - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "image/jpeg" - "image/png" - - "github.com/dsoprea/go-exif" - jpegstructure "github.com/dsoprea/go-jpeg-image-structure" - pngstructure "github.com/dsoprea/go-png-image-structure" - "github.com/h2non/filetype" -) - -func Remove(data []byte) ([]byte, error) { - - const ( - JpegMediaType = "jpeg" - PngMediaType = "png" - OtherMediaType = "other" - StartBytes = 0 - EndBytes = 0 - ) - - type MediaContext struct { - MediaType string - RootIfd *exif.Ifd - RawExif []byte - Media interface{} - } - - filtered := []byte{} - - head := make([]byte, 261) - _, err := bytes.NewReader(data).Read(head) - if err != nil { - return nil, fmt.Errorf("could not read first 261 bytes of data: %s", err) - } - imagetype, err := filetype.Match(head) - if err != nil { - return nil, fmt.Errorf("error matching first 261 bytes of image to valid type: %s", err) - } - - switch imagetype.MIME.Subtype { - case "jpeg": - jmp := jpegstructure.NewJpegMediaParser() - sl, err := jmp.ParseBytes(data) - if err != nil { - return nil, err - } - - _, rawExif, err := sl.Exif() - if err != nil { - return data, nil - } - - startExifBytes := StartBytes - endExifBytes := EndBytes - - if bytes.Contains(data, rawExif) { - for i := 0; i < len(data)-len(rawExif); i++ { - if bytes.Compare(data[i:i+len(rawExif)], rawExif) == 0 { - startExifBytes = i - endExifBytes = i + len(rawExif) - break - } - } - fill := make([]byte, len(data[startExifBytes:endExifBytes])) - copy(data[startExifBytes:endExifBytes], fill) - } - - filtered = data - - _, err = jpeg.Decode(bytes.NewReader(filtered)) - if err != nil { - return nil, errors.New("EXIF removal corrupted " + err.Error()) - } - case "png": - pmp := pngstructure.NewPngMediaParser() - cs, err := pmp.ParseBytes(data) - if err != nil { - return nil, err - } - - _, rawExif, err := cs.Exif() - if err != nil { - return data, nil - } - - startExifBytes := StartBytes - endExifBytes := EndBytes - - if bytes.Contains(data, rawExif) { - for i := 0; i < len(data)-len(rawExif); i++ { - if bytes.Compare(data[i:i+len(rawExif)], rawExif) == 0 { - startExifBytes = i - endExifBytes = i + len(rawExif) - break - } - } - fill := make([]byte, len(data[startExifBytes:endExifBytes])) - copy(data[startExifBytes:endExifBytes], fill) - } - - filtered = data - - chunks := readPNGChunks(bytes.NewReader(filtered)) - - for _, chunk := range chunks { - if !chunk.CRCIsValid() { - offset := int(chunk.Offset) + 8 + int(chunk.Length) - crc := chunk.CalculateCRC() - - buf := new(bytes.Buffer) - binary.Write(buf, binary.BigEndian, crc) - crcBytes := buf.Bytes() - - copy(filtered[offset:], crcBytes) - } - } - - chunks = readPNGChunks(bytes.NewReader(filtered)) - for _, chunk := range chunks { - if !chunk.CRCIsValid() { - return nil, errors.New("EXIF removal failed CRC") - } - } - - _, err = png.Decode(bytes.NewReader(filtered)) - if err != nil { - return nil, errors.New("EXIF removal corrupted " + err.Error()) - } - default: - return nil, errors.New("filetype not recognised") - } - - return filtered, nil -} diff --git a/vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/png_crc_fix.go b/vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/png_crc_fix.go deleted file mode 100644 index 390e5e5156..0000000000 --- a/vendor/github.com/superseriousbusiness/exifremove/pkg/exifremove/png_crc_fix.go +++ /dev/null @@ -1,104 +0,0 @@ -package exifremove - -// borrowed heavily from https://github.com/landaire/png-crc-fix/blob/master/main.go - -import ( - "bytes" - "encoding/binary" - "fmt" - "hash/crc32" - "io" - "os" -) - -const chunkStartOffset = 8 -const endChunk = "IEND" - -type pngChunk struct { - Offset int64 - Length uint32 - Type [4]byte - Data []byte - CRC uint32 -} - -func (p pngChunk) String() string { - return fmt.Sprintf("%s@%x - %X - Valid CRC? %v", p.Type, p.Offset, p.CRC, p.CRCIsValid()) -} - -func (p pngChunk) Bytes() []byte { - var buffer bytes.Buffer - - binary.Write(&buffer, binary.BigEndian, p.Type) - buffer.Write(p.Data) - - return buffer.Bytes() -} - -func (p pngChunk) CRCIsValid() bool { - return p.CRC == p.CalculateCRC() -} - -func (p pngChunk) CalculateCRC() uint32 { - crcTable := crc32.MakeTable(crc32.IEEE) - - return crc32.Checksum(p.Bytes(), crcTable) -} - -func (p pngChunk) CRCOffset() int64 { - return p.Offset + int64(8+p.Length) -} - -func readPNGChunks(reader io.ReadSeeker) []pngChunk { - chunks := []pngChunk{} - - reader.Seek(chunkStartOffset, os.SEEK_SET) - - readChunk := func() (*pngChunk, error) { - var chunk pngChunk - chunk.Offset, _ = reader.Seek(0, os.SEEK_CUR) - - binary.Read(reader, binary.BigEndian, &chunk.Length) - - chunk.Data = make([]byte, chunk.Length) - - err := binary.Read(reader, binary.BigEndian, &chunk.Type) - if err != nil { - goto read_error - } - - if read, err := reader.Read(chunk.Data); read == 0 || err != nil { - goto read_error - } - - err = binary.Read(reader, binary.BigEndian, &chunk.CRC) - if err != nil { - goto read_error - } - - return &chunk, nil - - read_error: - return nil, fmt.Errorf("Read error") - } - - chunk, err := readChunk() - if err != nil { - return chunks - } - - chunks = append(chunks, *chunk) - - // Read the first chunk - for string(chunks[len(chunks)-1].Type[:]) != endChunk { - - chunk, err := readChunk() - if err != nil { - break - } - - chunks = append(chunks, *chunk) - } - - return chunks -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 8637feaec5..ff65f1ab78 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -13,8 +13,6 @@ codeberg.org/gruf/go-format # codeberg.org/gruf/go-hashenc v1.0.1 ## explicit; go 1.16 codeberg.org/gruf/go-hashenc -# codeberg.org/gruf/go-logger v1.3.2 -## explicit; go 1.14 # codeberg.org/gruf/go-mutexes v1.0.1 ## explicit; go 1.14 codeberg.org/gruf/go-mutexes @@ -49,32 +47,30 @@ github.com/coreos/go-oidc/v3/oidc # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew -# github.com/dsoprea/go-exif v0.0.0-20210625224831-a6301f85c82b -## explicit; go 1.13 -github.com/dsoprea/go-exif -# github.com/dsoprea/go-exif/v2 v2.0.0-20210625224831-a6301f85c82b -## explicit; go 1.13 -github.com/dsoprea/go-exif/v2 -github.com/dsoprea/go-exif/v2/common -github.com/dsoprea/go-exif/v2/undefined +# github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b +## explicit; go 1.12 +github.com/dsoprea/go-exif/v3 +github.com/dsoprea/go-exif/v3/common +github.com/dsoprea/go-exif/v3/undefined # github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 ## explicit; go 1.13 github.com/dsoprea/go-iptc -# github.com/dsoprea/go-jpeg-image-structure v0.0.0-20210512043942-b434301c6836 -## explicit; go 1.13 -github.com/dsoprea/go-jpeg-image-structure +# github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 +## explicit; go 1.12 +github.com/dsoprea/go-jpeg-image-structure/v2 # github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd ## explicit; go 1.13 github.com/dsoprea/go-logging # github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d ## explicit; go 1.13 github.com/dsoprea/go-photoshop-info-format -# github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d -## explicit; go 1.13 -github.com/dsoprea/go-png-image-structure -# github.com/dsoprea/go-utility v0.0.0-20200717064901-2fccff4aa15e +# github.com/dsoprea/go-png-image-structure/v2 v2.0.0-20210512210324-29b889a6093d +## explicit; go 1.12 +github.com/dsoprea/go-png-image-structure/v2 +# github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e ## explicit; go 1.12 -github.com/dsoprea/go-utility/image +github.com/dsoprea/go-utility/v2/filesystem +github.com/dsoprea/go-utility/v2/image # github.com/fsnotify/fsnotify v1.5.1 ## explicit; go 1.13 github.com/fsnotify/fsnotify @@ -469,9 +465,9 @@ github.com/superseriousbusiness/activity/streams/values/rfc2045 github.com/superseriousbusiness/activity/streams/values/rfc5988 github.com/superseriousbusiness/activity/streams/values/string github.com/superseriousbusiness/activity/streams/vocab -# github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203 -## explicit; go 1.16 -github.com/superseriousbusiness/exifremove/pkg/exifremove +# github.com/superseriousbusiness/exif-terminator v0.1.0 +## explicit; go 1.17 +github.com/superseriousbusiness/exif-terminator # github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB ## explicit; go 1.13 github.com/superseriousbusiness/oauth2/v4 From c157b1b20b38cc331cfd1673433d077719feef3f Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 23 Jan 2022 14:41:58 +0100 Subject: [PATCH 21/43] rework data function to provide filesize --- internal/federation/dereferencing/account.go | 4 +-- internal/federation/dereferencing/media.go | 2 +- internal/media/image.go | 20 ------------ internal/media/manager_test.go | 12 +++---- internal/media/processingemoji.go | 4 +-- internal/media/processingmedia.go | 33 ++++++++++++++------ internal/media/types.go | 2 +- internal/processing/account/update.go | 10 +++--- internal/processing/admin/emoji.go | 5 +-- internal/processing/media/create.go | 5 +-- internal/transport/derefmedia.go | 12 +++---- internal/transport/transport.go | 4 +-- 12 files changed, 56 insertions(+), 57 deletions(-) diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 6ea8256d5a..581c95de2c 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -252,7 +252,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - data := func(innerCtx context.Context) (io.Reader, error) { + data := func(innerCtx context.Context) (io.Reader, int, error) { return t.DereferenceMedia(innerCtx, avatarIRI) } @@ -274,7 +274,7 @@ func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount * return err } - data := func(innerCtx context.Context) (io.Reader, error) { + data := func(innerCtx context.Context) (io.Reader, int, error) { return t.DereferenceMedia(innerCtx, headerIRI) } diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go index c427f25073..0b19570f27 100644 --- a/internal/federation/dereferencing/media.go +++ b/internal/federation/dereferencing/media.go @@ -42,7 +42,7 @@ func (d *deref) GetRemoteMedia(ctx context.Context, requestingUsername string, a return nil, fmt.Errorf("GetRemoteMedia: error parsing url: %s", err) } - dataFunc := func(innerCtx context.Context) (io.Reader, error) { + dataFunc := func(innerCtx context.Context) (io.Reader, int, error) { return t.DereferenceMedia(innerCtx, derefURI) } diff --git a/internal/media/image.go b/internal/media/image.go index b8f00024fe..e5390cee51 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -30,7 +30,6 @@ import ( "github.com/buckket/go-blurhash" "github.com/nfnt/resize" - "github.com/superseriousbusiness/exifremove/pkg/exifremove" ) const ( @@ -197,22 +196,3 @@ func deriveStaticEmoji(r io.Reader, contentType string) (*imageMeta, error) { small: out.Bytes(), }, nil } - -// purgeExif is a little wrapper for the action of removing exif data from an image. -// Only pass pngs or jpegs to this function. -func purgeExif(data []byte) ([]byte, error) { - if len(data) == 0 { - return nil, errors.New("passed image was not valid") - } - - clean, err := exifremove.Remove(data) - if err != nil { - return nil, fmt.Errorf("could not purge exif from image: %s", err) - } - - if len(clean) == 0 { - return nil, errors.New("purged image was not valid") - } - - return clean, nil -} diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 5380b83b1c..960f348431 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -39,13 +39,13 @@ type ManagerTestSuite struct { func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { ctx := context.Background() - data := func(_ context.Context) (io.Reader, error) { + data := func(_ context.Context) (io.Reader, int, error) { // load bytes from a test image b, err := os.ReadFile("./test/test-jpeg.jpg") if err != nil { panic(err) } - return bytes.NewBuffer(b), nil + return bytes.NewBuffer(b), len(b), nil } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" @@ -109,13 +109,13 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { func (suite *ManagerTestSuite) TestSimpleJpegProcessAsync() { ctx := context.Background() - data := func(_ context.Context) (io.Reader, error) { + data := func(_ context.Context) (io.Reader, int, error) { // load bytes from a test image b, err := os.ReadFile("./test/test-jpeg.jpg") if err != nil { panic(err) } - return bytes.NewBuffer(b), nil + return bytes.NewBuffer(b), len(b), nil } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" @@ -192,9 +192,9 @@ func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { panic(err) } - data := func(_ context.Context) (io.Reader, error) { + data := func(_ context.Context) (io.Reader, int, error) { // load bytes from a test image - return bytes.NewReader(b), nil + return bytes.NewReader(b), len(b), nil } accountID := "01FS1X72SK9ZPW0J1QQ68BD264" diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index 147b6b5b3d..292712427b 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -163,7 +163,7 @@ func (p *ProcessingEmoji) store(ctx context.Context) error { } // execute the data function to get the reader out of it - reader, err := p.data(ctx) + reader, fileSize, err := p.data(ctx) if err != nil { return fmt.Errorf("store: error executing data function: %s", err) } @@ -194,6 +194,7 @@ func (p *ProcessingEmoji) store(ctx context.Context) error { p.emoji.ImageURL = uris.GenerateURIForAttachment(p.instanceAccountID, string(TypeEmoji), string(SizeOriginal), p.emoji.ID, extension) p.emoji.ImagePath = fmt.Sprintf("%s/%s/%s/%s.%s", p.instanceAccountID, TypeEmoji, SizeOriginal, p.emoji.ID, extension) p.emoji.ImageContentType = contentType + p.emoji.ImageFileSize = fileSize // concatenate the first bytes with the existing bytes still in the reader (thanks Mara) multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader) @@ -202,7 +203,6 @@ func (p *ProcessingEmoji) store(ctx context.Context) error { if err := p.storage.PutStream(p.emoji.ImagePath, multiReader); err != nil { return fmt.Errorf("store: error storing stream: %s", err) } - p.emoji.ImageFileSize = 36702 // TODO: set this based on the result of PutStream // if the original reader is a readcloser, close it since we're done with it now if rc, ok := reader.(io.ReadCloser); ok { diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 82db863e0e..0bbe35aeef 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -28,6 +28,7 @@ import ( "time" "codeberg.org/gruf/go-store/kv" + terminator "github.com/superseriousbusiness/exif-terminator" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" @@ -239,7 +240,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error { } // execute the data function to get the reader out of it - reader, err := p.data(ctx) + reader, fileSize, err := p.data(ctx) if err != nil { return fmt.Errorf("store: error executing data function: %s", err) } @@ -268,22 +269,36 @@ func (p *ProcessingMedia) store(ctx context.Context) error { } extension := split[1] // something like 'jpeg' - // set some additional fields on the attachment now that - // we know more about what the underlying media actually is - if extension == mimeGif { + // concatenate the cleaned up first bytes with the existing bytes still in the reader (thanks Mara) + multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader) + + // we'll need to clean exif data from the first bytes; while we're + // here, we can also use the extension to derive the attachment type + var clean io.Reader + switch extension { + case mimeGif: p.attachment.Type = gtsmodel.FileTypeGif - } else { + clean = multiReader // nothing to clean from a gif + case mimeJpeg, mimePng: p.attachment.Type = gtsmodel.FileTypeImage + purged, err := terminator.Terminate(multiReader, fileSize, extension) + if err != nil { + return fmt.Errorf("store: exif error: %s", err) + } + clean = purged + default: + return fmt.Errorf("store: couldn't process %s", extension) } + + // now set some additional fields on the attachment since + // we know more about what the underlying media actually is p.attachment.URL = uris.GenerateURIForAttachment(p.attachment.AccountID, string(TypeAttachment), string(SizeOriginal), p.attachment.ID, extension) p.attachment.File.Path = fmt.Sprintf("%s/%s/%s/%s.%s", p.attachment.AccountID, TypeAttachment, SizeOriginal, p.attachment.ID, extension) p.attachment.File.ContentType = contentType - - // concatenate the first bytes with the existing bytes still in the reader (thanks Mara) - multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader) + p.attachment.File.FileSize = fileSize // store this for now -- other processes can pull it out of storage as they please - if err := p.storage.PutStream(p.attachment.File.Path, multiReader); err != nil { + if err := p.storage.PutStream(p.attachment.File.Path, clean); err != nil { return fmt.Errorf("store: error storing stream: %s", err) } diff --git a/internal/media/types.go b/internal/media/types.go index 0a7f60d66a..b9c79d464f 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -118,4 +118,4 @@ type AdditionalEmojiInfo struct { } // DataFunc represents a function used to retrieve the raw bytes of a piece of media. -type DataFunc func(ctx context.Context) (io.Reader, error) +type DataFunc func(ctx context.Context) (reader io.Reader, fileSize int, err error) diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 5a0a3e5a11..758cc6600b 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -140,8 +140,9 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead return nil, fmt.Errorf("UpdateAvatar: avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) } - dataFunc := func(ctx context.Context) (io.Reader, error) { - return avatar.Open() + dataFunc := func(ctx context.Context) (io.Reader, int, error) { + f, err := avatar.Open() + return f, int(avatar.Size), err } isAvatar := true @@ -166,8 +167,9 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead return nil, fmt.Errorf("UpdateHeader: header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) } - dataFunc := func(ctx context.Context) (io.Reader, error) { - return header.Open() + dataFunc := func(ctx context.Context) (io.Reader, int, error) { + f, err := header.Open() + return f, int(header.Size), err } isHeader := true diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index e0068858bc..bb9f4ecb52 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -36,8 +36,9 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, return nil, gtserror.NewErrorNotAuthorized(fmt.Errorf("user %s not an admin", user.ID), "user is not an admin") } - data := func(innerCtx context.Context) (io.Reader, error) { - return form.Image.Open() + data := func(innerCtx context.Context) (io.Reader, int, error) { + f, err := form.Image.Open() + return f, int(form.Image.Size), err } emojiID, err := id.NewRandomULID() diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index 0fda4c27b5..4047278ebb 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -29,8 +29,9 @@ import ( ) func (p *processor) Create(ctx context.Context, account *gtsmodel.Account, form *apimodel.AttachmentRequest) (*apimodel.Attachment, error) { - data := func(innerCtx context.Context) (io.Reader, error) { - return form.File.Open() + data := func(innerCtx context.Context) (io.Reader, int, error) { + f, err := form.File.Open() + return f, int(form.File.Size), err } focusX, focusY, err := parseFocus(form.Focus) diff --git a/internal/transport/derefmedia.go b/internal/transport/derefmedia.go index ed32f20c6f..e3c86ce1e1 100644 --- a/internal/transport/derefmedia.go +++ b/internal/transport/derefmedia.go @@ -28,12 +28,12 @@ import ( "github.com/sirupsen/logrus" ) -func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) (io.ReadCloser, error) { +func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) (io.ReadCloser, int, error) { l := logrus.WithField("func", "DereferenceMedia") l.Debugf("performing GET to %s", iri.String()) req, err := http.NewRequestWithContext(ctx, "GET", iri.String(), nil) if err != nil { - return nil, err + return nil, 0, err } req.Header.Add("Accept", "*/*") // we don't know what kind of media we're going to get here @@ -44,14 +44,14 @@ func (t *transport) DereferenceMedia(ctx context.Context, iri *url.URL) (io.Read err = t.getSigner.SignRequest(t.privkey, t.pubKeyID, req, nil) t.getSignerMu.Unlock() if err != nil { - return nil, err + return nil, 0, err } resp, err := t.client.Do(req) if err != nil { - return nil, err + return nil, 0, err } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("GET request to %s failed (%d): %s", iri.String(), resp.StatusCode, resp.Status) + return nil, 0, fmt.Errorf("GET request to %s failed (%d): %s", iri.String(), resp.StatusCode, resp.Status) } - return resp.Body, nil + return resp.Body, int(resp.ContentLength), nil } diff --git a/internal/transport/transport.go b/internal/transport/transport.go index d9650d9526..9e8cd8213b 100644 --- a/internal/transport/transport.go +++ b/internal/transport/transport.go @@ -34,8 +34,8 @@ import ( // functionality for fetching remote media. type Transport interface { pub.Transport - // DereferenceMedia fetches the given media attachment IRI. - DereferenceMedia(ctx context.Context, iri *url.URL) (io.ReadCloser, error) + // DereferenceMedia fetches the given media attachment IRI, returning the reader and filesize. + DereferenceMedia(ctx context.Context, iri *url.URL) (io.ReadCloser, int, error) // DereferenceInstance dereferences remote instance information, first by checking /api/v1/instance, and then by checking /.well-known/nodeinfo. DereferenceInstance(ctx context.Context, iri *url.URL) (*gtsmodel.Instance, error) // Finger performs a webfinger request with the given username and domain, and returns the bytes from the response body. From 3c1eb155e482071dc8ae592519060321d347683b Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sun, 23 Jan 2022 15:52:18 +0100 Subject: [PATCH 22/43] add file size checks --- internal/media/manager_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 960f348431..a3eb0360cd 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -74,6 +74,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, }, attachment.FileMeta.Small) suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal(269739, attachment.File.FileSize) suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) // now make sure the attachment is in the database @@ -151,6 +152,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessAsync() { Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, }, attachment.FileMeta.Small) suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal(269739, attachment.File.FileSize) suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) // now make sure the attachment is in the database @@ -232,6 +234,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, }, attachment.FileMeta.Small) suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal(269739, attachment.File.FileSize) suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) // now make sure the attachment is in the database From 667e7f112ce7b5b7452c392bbbe393a4c998508d Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 13:12:17 +0100 Subject: [PATCH 23/43] update remote account get/deref logic --- internal/federation/dereference.go | 8 +- internal/federation/dereferencing/account.go | 286 +++++++++++------- .../federation/dereferencing/account_test.go | 3 +- .../federation/dereferencing/dereferencer.go | 33 +- internal/federation/dereferencing/status.go | 8 +- internal/federation/federatingprotocol.go | 2 +- internal/federation/federator.go | 3 +- internal/processing/account/get.go | 8 +- .../processing/federation/getfollowers.go | 2 +- .../processing/federation/getfollowing.go | 2 +- internal/processing/federation/getoutbox.go | 2 +- internal/processing/federation/getstatus.go | 2 +- .../processing/federation/getstatusreplies.go | 2 +- internal/processing/federation/getuser.go | 2 +- internal/processing/fromfederator.go | 8 +- internal/processing/search.go | 4 +- internal/typeutils/internaltofrontend.go | 23 +- 17 files changed, 241 insertions(+), 157 deletions(-) diff --git a/internal/federation/dereference.go b/internal/federation/dereference.go index 343ddadb71..8cb23a91f4 100644 --- a/internal/federation/dereference.go +++ b/internal/federation/dereference.go @@ -26,12 +26,8 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" ) -func (f *federator) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool) (*gtsmodel.Account, bool, error) { - return f.dereferencer.GetRemoteAccount(ctx, username, remoteAccountID, refresh) -} - -func (f *federator) EnrichRemoteAccount(ctx context.Context, username string, account *gtsmodel.Account) (*gtsmodel.Account, error) { - return f.dereferencer.EnrichRemoteAccount(ctx, username, account) +func (f *federator) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, blocking bool, refresh bool) (*gtsmodel.Account, error) { + return f.dereferencer.GetRemoteAccount(ctx, username, remoteAccountID, blocking, refresh) } func (f *federator) GetRemoteStatus(ctx context.Context, username string, remoteStatusID *url.URL, refresh, includeParent bool) (*gtsmodel.Status, ap.Statusable, bool, error) { diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 581c95de2c..27591d8572 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -26,6 +26,7 @@ import ( "io" "net/url" "strings" + "sync" "github.com/sirupsen/logrus" "github.com/superseriousbusiness/activity/streams" @@ -44,30 +45,6 @@ func instanceAccount(account *gtsmodel.Account) bool { (account.Username == "internal.fetch" && strings.Contains(account.Note, "internal service actor")) } -// EnrichRemoteAccount takes an account that's already been inserted into the database in a minimal form, -// and populates it with additional fields, media, etc. -// -// EnrichRemoteAccount is mostly useful for calling after an account has been initially created by -// the federatingDB's Create function, or during the federated authorization flow. -func (d *deref) EnrichRemoteAccount(ctx context.Context, username string, account *gtsmodel.Account) (*gtsmodel.Account, error) { - // if we're dealing with an instance account, we don't need to update anything - if instanceAccount(account) { - return account, nil - } - - if err := d.PopulateAccountFields(ctx, account, username, false); err != nil { - return nil, err - } - - updated, err := d.db.UpdateAccount(ctx, account) - if err != nil { - logrus.Errorf("EnrichRemoteAccount: error updating account: %s", err) - return account, nil - } - - return updated, nil -} - // GetRemoteAccount completely dereferences a remote account, converts it to a GtS model account, // puts it in the database, and returns it to a caller. The boolean indicates whether the account is new // to us or not. If we haven't seen the account before, bool will be true. If we have seen the account before, @@ -77,60 +54,73 @@ func (d *deref) EnrichRemoteAccount(ctx context.Context, username string, accoun // the remote instance again. // // SIDE EFFECTS: remote account will be stored in the database, or updated if it already exists (and refresh is true). -func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool) (*gtsmodel.Account, bool, error) { +func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool, blocking bool) (*gtsmodel.Account, error) { new := true - // check if we already have the account in our db - maybeAccount, err := d.db.GetAccountByURI(ctx, remoteAccountID.String()) + // check if we already have the account in our db, and just return it unless we'd doing a refresh + remoteAccount, err := d.db.GetAccountByURI(ctx, remoteAccountID.String()) if err == nil { - // we've seen this account before so it's not new new = false if !refresh { - // we're not being asked to refresh, but just in case we don't have the avatar/header cached yet.... - maybeAccount, err = d.EnrichRemoteAccount(ctx, username, maybeAccount) - return maybeAccount, new, err + // make sure the account fields are populated before returning: + // even if we're not doing a refresh, the caller might want to block + // until everything is loaded + err = d.populateAccountFields(ctx, remoteAccount, username, refresh, blocking) + return remoteAccount, err } } - accountable, err := d.dereferenceAccountable(ctx, username, remoteAccountID) - if err != nil { - return nil, new, fmt.Errorf("FullyDereferenceAccount: error dereferencing accountable: %s", err) - } - - gtsAccount, err := d.typeConverter.ASRepresentationToAccount(ctx, accountable, refresh) - if err != nil { - return nil, new, fmt.Errorf("FullyDereferenceAccount: error converting accountable to account: %s", err) - } - if new { - // generate a new id since we haven't seen this account before, and do a put - ulid, err := id.NewRandomULID() + // we haven't seen this account before: dereference it from remote + accountable, err := d.dereferenceAccountable(ctx, username, remoteAccountID) if err != nil { - return nil, new, fmt.Errorf("FullyDereferenceAccount: error generating new id for account: %s", err) + return nil, fmt.Errorf("GetRemoteAccount: error dereferencing accountable: %s", err) } - gtsAccount.ID = ulid - if err := d.PopulateAccountFields(ctx, gtsAccount, username, refresh); err != nil { - return nil, new, fmt.Errorf("FullyDereferenceAccount: error populating further account fields: %s", err) + newAccount, err := d.typeConverter.ASRepresentationToAccount(ctx, accountable, refresh) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error converting accountable to account: %s", err) } - if err := d.db.Put(ctx, gtsAccount); err != nil { - return nil, new, fmt.Errorf("FullyDereferenceAccount: error putting new account: %s", err) + ulid, err := id.NewRandomULID() + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error generating new id for account: %s", err) } - } else { - // take the id we already have and do an update - gtsAccount.ID = maybeAccount.ID - if err := d.PopulateAccountFields(ctx, gtsAccount, username, refresh); err != nil { - return nil, new, fmt.Errorf("FullyDereferenceAccount: error populating further account fields: %s", err) + newAccount.ID = ulid + + if err := d.populateAccountFields(ctx, newAccount, username, refresh, blocking); err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error populating further account fields: %s", err) } - gtsAccount, err = d.db.UpdateAccount(ctx, gtsAccount) - if err != nil { - return nil, false, fmt.Errorf("EnrichRemoteAccount: error updating account: %s", err) + if err := d.db.Put(ctx, newAccount); err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error putting new account: %s", err) } + + return newAccount, nil + } + + // we have seen this account before, but we have to refresh it + refreshedAccountable, err := d.dereferenceAccountable(ctx, username, remoteAccountID) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error dereferencing refreshedAccountable: %s", err) } - return gtsAccount, new, nil + refreshedAccount, err := d.typeConverter.ASRepresentationToAccount(ctx, refreshedAccountable, refresh) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error converting refreshedAccountable to refreshedAccount: %s", err) + } + refreshedAccount.ID = remoteAccount.ID + + if err := d.populateAccountFields(ctx, refreshedAccount, username, refresh, blocking); err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error populating further refreshedAccount fields: %s", err) + } + + updatedAccount, err := d.db.UpdateAccount(ctx, refreshedAccount) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error updating refreshedAccount: %s", err) + } + + return updatedAccount, nil } // dereferenceAccountable calls remoteAccountID with a GET request, and tries to parse whatever @@ -201,93 +191,177 @@ func (d *deref) dereferenceAccountable(ctx context.Context, username string, rem return nil, fmt.Errorf("DereferenceAccountable: type name %s not supported", t.GetTypeName()) } -// PopulateAccountFields populates any fields on the given account that weren't populated by the initial +// populateAccountFields populates any fields on the given account that weren't populated by the initial // dereferencing. This includes things like header and avatar etc. -func (d *deref) PopulateAccountFields(ctx context.Context, account *gtsmodel.Account, requestingUsername string, refresh bool) error { - l := logrus.WithFields(logrus.Fields{ - "func": "PopulateAccountFields", - "requestingUsername": requestingUsername, - }) +func (d *deref) populateAccountFields(ctx context.Context, account *gtsmodel.Account, requestingUsername string, refresh bool, blocking bool) error { + // if we're dealing with an instance account, just bail, we don't need to do anything + if instanceAccount(account) { + return nil + } accountURI, err := url.Parse(account.URI) if err != nil { - return fmt.Errorf("PopulateAccountFields: couldn't parse account URI %s: %s", account.URI, err) + return fmt.Errorf("populateAccountFields: couldn't parse account URI %s: %s", account.URI, err) } + if blocked, err := d.db.IsDomainBlocked(ctx, accountURI.Host); blocked || err != nil { - return fmt.Errorf("PopulateAccountFields: domain %s is blocked", accountURI.Host) + return fmt.Errorf("populateAccountFields: domain %s is blocked", accountURI.Host) } t, err := d.transportController.NewTransportForUsername(ctx, requestingUsername) if err != nil { - return fmt.Errorf("PopulateAccountFields: error getting transport for user: %s", err) + return fmt.Errorf("populateAccountFields: error getting transport for user: %s", err) } // fetch the header and avatar - if err := d.fetchHeaderAndAviForAccount(ctx, account, t, refresh); err != nil { - // if this doesn't work, just skip it -- we can do it later - l.Debugf("error fetching header/avi for account: %s", err) + if err := d.fetchRemoteAccountMedia(ctx, account, t, refresh, blocking); err != nil { + return fmt.Errorf("populateAccountFields: error fetching header/avi for account: %s", err) } return nil } -// fetchHeaderAndAviForAccount fetches the header and avatar for a remote account, using a transport -// on behalf of requestingUsername. +// fetchRemoteAccountMedia fetches and stores the header and avatar for a remote account, +// using a transport on behalf of requestingUsername. // // targetAccount's AvatarMediaAttachmentID and HeaderMediaAttachmentID will be updated as necessary. // -// SIDE EFFECTS: remote header and avatar will be stored in local storage. -func (d *deref) fetchHeaderAndAviForAccount(ctx context.Context, targetAccount *gtsmodel.Account, t transport.Transport, refresh bool) error { +// If refresh is true, then the media will be fetched again even if it's already been fetched before. +// +// If blocking is true, then the calls to the media manager made by this function will be blocking: +// in other words, the function won't return until the header and the avatar have been fully processed. +func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsmodel.Account, t transport.Transport, refresh bool, blocking bool) error { accountURI, err := url.Parse(targetAccount.URI) if err != nil { - return fmt.Errorf("fetchHeaderAndAviForAccount: couldn't parse account URI %s: %s", targetAccount.URI, err) + return fmt.Errorf("fetchRemoteAccountMedia: couldn't parse account URI %s: %s", targetAccount.URI, err) } + if blocked, err := d.db.IsDomainBlocked(ctx, accountURI.Host); blocked || err != nil { - return fmt.Errorf("fetchHeaderAndAviForAccount: domain %s is blocked", accountURI.Host) + return fmt.Errorf("fetchRemoteAccountMedia: domain %s is blocked", accountURI.Host) } if targetAccount.AvatarRemoteURL != "" && (targetAccount.AvatarMediaAttachmentID == "" || refresh) { - avatarIRI, err := url.Parse(targetAccount.AvatarRemoteURL) - if err != nil { - return err - } + var processingMedia *media.ProcessingMedia - data := func(innerCtx context.Context) (io.Reader, int, error) { - return t.DereferenceMedia(innerCtx, avatarIRI) + // first check if we're already processing this media + d.dereferencingAvatarsLock.Lock() + if alreadyProcessing, ok := d.dereferencingAvatars[targetAccount.ID]; ok { + // we're already on it, no worries + processingMedia = alreadyProcessing } - - avatar := true - processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalMediaInfo{ - RemoteURL: &targetAccount.AvatarRemoteURL, - Avatar: &avatar, - }) - if err != nil { - return err + d.dereferencingAvatarsLock.Unlock() + + if processingMedia == nil { + // we're not already processing it so start now + avatarIRI, err := url.Parse(targetAccount.AvatarRemoteURL) + if err != nil { + return err + } + + data := func(innerCtx context.Context) (io.Reader, int, error) { + return t.DereferenceMedia(innerCtx, avatarIRI) + } + + avatar := true + newProcessing, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalMediaInfo{ + RemoteURL: &targetAccount.AvatarRemoteURL, + Avatar: &avatar, + }) + if err != nil { + return err + } + targetAccount.AvatarMediaAttachmentID = newProcessing.AttachmentID() + + // store it in our map to indicate it's in process + d.dereferencingAvatarsLock.Lock() + d.dereferencingAvatars[targetAccount.ID] = newProcessing + d.dereferencingAvatarsLock.Unlock() + + processingMedia = newProcessing } - targetAccount.AvatarMediaAttachmentID = processingMedia.AttachmentID() + // block until loaded if required... + if blocking { + if err := lockAndLoad(ctx, d.dereferencingAvatarsLock, processingMedia, d.dereferencingAvatars, targetAccount.ID); err != nil { + return err + } + } else { + // ...otherwise do it async + go func() { + if err := lockAndLoad(ctx, d.dereferencingAvatarsLock, processingMedia, d.dereferencingAvatars, targetAccount.ID); err != nil { + logrus.Errorf("fetchRemoteAccountMedia: error during async lock and load of avatar: %s", err) + } + }() + } } if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { - headerIRI, err := url.Parse(targetAccount.HeaderRemoteURL) - if err != nil { - return err - } + var processingMedia *media.ProcessingMedia - data := func(innerCtx context.Context) (io.Reader, int, error) { - return t.DereferenceMedia(innerCtx, headerIRI) + // first check if we're already processing this media + d.dereferencingHeadersLock.Lock() + if alreadyProcessing, ok := d.dereferencingHeaders[targetAccount.ID]; ok { + // we're already on it, no worries + processingMedia = alreadyProcessing } - - header := true - processingMedia, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalMediaInfo{ - RemoteURL: &targetAccount.HeaderRemoteURL, - Header: &header, - }) - if err != nil { - return err + d.dereferencingHeadersLock.Unlock() + + if processingMedia == nil { + // we're not already processing it so start now + headerIRI, err := url.Parse(targetAccount.HeaderRemoteURL) + if err != nil { + return err + } + + data := func(innerCtx context.Context) (io.Reader, int, error) { + return t.DereferenceMedia(innerCtx, headerIRI) + } + + header := true + newProcessing, err := d.mediaManager.ProcessMedia(ctx, data, targetAccount.ID, &media.AdditionalMediaInfo{ + RemoteURL: &targetAccount.HeaderRemoteURL, + Header: &header, + }) + if err != nil { + return err + } + targetAccount.HeaderMediaAttachmentID = newProcessing.AttachmentID() + + // store it in our map to indicate it's in process + d.dereferencingHeadersLock.Lock() + d.dereferencingHeaders[targetAccount.ID] = newProcessing + d.dereferencingHeadersLock.Unlock() + + processingMedia = newProcessing } - targetAccount.HeaderMediaAttachmentID = processingMedia.AttachmentID() + // block until loaded if required... + if blocking { + if err := lockAndLoad(ctx, d.dereferencingHeadersLock, processingMedia, d.dereferencingHeaders, targetAccount.ID); err != nil { + return err + } + } else { + // ...otherwise do it async + go func() { + if err := lockAndLoad(ctx, d.dereferencingHeadersLock, processingMedia, d.dereferencingHeaders, targetAccount.ID); err != nil { + logrus.Errorf("fetchRemoteAccountMedia: error during async lock and load of header: %s", err) + } + }() + } } + return nil } + +func lockAndLoad(ctx context.Context, lock *sync.Mutex, processing *media.ProcessingMedia, processingMap map[string]*media.ProcessingMedia, accountID string) error { + // whatever happens, remove the in-process media from the map + defer func() { + lock.Lock() + delete(processingMap, accountID) + lock.Unlock() + }() + + // try and load it + _, err := processing.LoadAttachment(ctx) + return err +} diff --git a/internal/federation/dereferencing/account_test.go b/internal/federation/dereferencing/account_test.go index 593ad341cd..cb6f9588c4 100644 --- a/internal/federation/dereferencing/account_test.go +++ b/internal/federation/dereferencing/account_test.go @@ -35,11 +35,10 @@ func (suite *AccountTestSuite) TestDereferenceGroup() { fetchingAccount := suite.testAccounts["local_account_1"] groupURL := testrig.URLMustParse("https://unknown-instance.com/groups/some_group") - group, new, err := suite.dereferencer.GetRemoteAccount(context.Background(), fetchingAccount.Username, groupURL, false) + group, err := suite.dereferencer.GetRemoteAccount(context.Background(), fetchingAccount.Username, groupURL, false, false) suite.NoError(err) suite.NotNil(group) suite.NotNil(group) - suite.True(new) // group values should be set suite.Equal("https://unknown-instance.com/groups/some_group", group.URI) diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index 800da6c04d..daf82b91e5 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -33,8 +33,7 @@ import ( // Dereferencer wraps logic and functionality for doing dereferencing of remote accounts, statuses, etc, from federated instances. type Dereferencer interface { - GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool) (*gtsmodel.Account, bool, error) - EnrichRemoteAccount(ctx context.Context, username string, account *gtsmodel.Account) (*gtsmodel.Account, error) + GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool, blocking bool) (*gtsmodel.Account, error) GetRemoteStatus(ctx context.Context, username string, remoteStatusID *url.URL, refresh, includeParent bool) (*gtsmodel.Status, ap.Statusable, bool, error) EnrichRemoteStatus(ctx context.Context, username string, status *gtsmodel.Status, includeParent bool) (*gtsmodel.Status, error) @@ -50,21 +49,29 @@ type Dereferencer interface { } type deref struct { - db db.DB - typeConverter typeutils.TypeConverter - transportController transport.Controller - mediaManager media.Manager - handshakes map[string][]*url.URL - handshakeSync *sync.Mutex // mutex to lock/unlock when checking or updating the handshakes map + db db.DB + typeConverter typeutils.TypeConverter + transportController transport.Controller + mediaManager media.Manager + dereferencingAvatars map[string]*media.ProcessingMedia + dereferencingAvatarsLock *sync.Mutex + dereferencingHeaders map[string]*media.ProcessingMedia + dereferencingHeadersLock *sync.Mutex + handshakes map[string][]*url.URL + handshakeSync *sync.Mutex // mutex to lock/unlock when checking or updating the handshakes map } // NewDereferencer returns a Dereferencer initialized with the given parameters. func NewDereferencer(db db.DB, typeConverter typeutils.TypeConverter, transportController transport.Controller, mediaManager media.Manager) Dereferencer { return &deref{ - db: db, - typeConverter: typeConverter, - transportController: transportController, - mediaManager: mediaManager, - handshakeSync: &sync.Mutex{}, + db: db, + typeConverter: typeConverter, + transportController: transportController, + mediaManager: mediaManager, + dereferencingAvatars: make(map[string]*media.ProcessingMedia), + dereferencingAvatarsLock: &sync.Mutex{}, + dereferencingHeaders: make(map[string]*media.ProcessingMedia), + dereferencingHeadersLock: &sync.Mutex{}, + handshakeSync: &sync.Mutex{}, } } diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index 004d648b58..34310f4aab 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -89,7 +89,7 @@ func (d *deref) GetRemoteStatus(ctx context.Context, username string, remoteStat } // do this so we know we have the remote account of the status in the db - _, _, err = d.GetRemoteAccount(ctx, username, accountURI, false) + _, err = d.GetRemoteAccount(ctx, username, accountURI, false, false) if err != nil { return nil, statusable, new, fmt.Errorf("GetRemoteStatus: couldn't derive status author: %s", err) } @@ -332,7 +332,7 @@ func (d *deref) populateStatusMentions(ctx context.Context, status *gtsmodel.Sta if targetAccount == nil { // we didn't find the account in our database already // check if we can get the account remotely (dereference it) - if a, _, err := d.GetRemoteAccount(ctx, requestingUsername, targetAccountURI, false); err != nil { + if a, err := d.GetRemoteAccount(ctx, requestingUsername, targetAccountURI, false, false); err != nil { errs = append(errs, err.Error()) } else { logrus.Debugf("populateStatusMentions: got target account %s with id %s through GetRemoteAccount", targetAccountURI, a.ID) @@ -394,7 +394,7 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. a.AccountID = status.AccountID a.StatusID = status.ID - media, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL, &media.AdditionalMediaInfo{ + processingMedia, err := d.GetRemoteMedia(ctx, requestingUsername, a.AccountID, a.RemoteURL, &media.AdditionalMediaInfo{ CreatedAt: &a.CreatedAt, StatusID: &a.StatusID, RemoteURL: &a.RemoteURL, @@ -406,7 +406,7 @@ func (d *deref) populateStatusAttachments(ctx context.Context, status *gtsmodel. continue } - attachment, err := media.LoadAttachment(ctx) + attachment, err := processingMedia.LoadAttachment(ctx) if err != nil { logrus.Errorf("populateStatusAttachments: couldn't load remote attachment %s: %s", a.RemoteURL, err) continue diff --git a/internal/federation/federatingprotocol.go b/internal/federation/federatingprotocol.go index f5d42a8e30..789959810a 100644 --- a/internal/federation/federatingprotocol.go +++ b/internal/federation/federatingprotocol.go @@ -153,7 +153,7 @@ func (f *federator) AuthenticatePostInbox(ctx context.Context, w http.ResponseWr } } - requestingAccount, _, err := f.GetRemoteAccount(ctx, username, publicKeyOwnerURI, false) + requestingAccount, err := f.GetRemoteAccount(ctx, username, publicKeyOwnerURI, false, false) if err != nil { return nil, false, fmt.Errorf("couldn't get requesting account %s: %s", publicKeyOwnerURI, err) } diff --git a/internal/federation/federator.go b/internal/federation/federator.go index 7edff1118f..cb63084dbe 100644 --- a/internal/federation/federator.go +++ b/internal/federation/federator.go @@ -57,8 +57,7 @@ type Federator interface { DereferenceRemoteThread(ctx context.Context, username string, statusURI *url.URL) error DereferenceAnnounce(ctx context.Context, announce *gtsmodel.Status, requestingUsername string) error - GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool) (*gtsmodel.Account, bool, error) - EnrichRemoteAccount(ctx context.Context, username string, account *gtsmodel.Account) (*gtsmodel.Account, error) + GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, blocking bool, refresh bool) (*gtsmodel.Account, error) GetRemoteStatus(ctx context.Context, username string, remoteStatusID *url.URL, refresh, includeParent bool) (*gtsmodel.Status, ap.Statusable, bool, error) EnrichRemoteStatus(ctx context.Context, username string, status *gtsmodel.Status, includeParent bool) (*gtsmodel.Status, error) diff --git a/internal/processing/account/get.go b/internal/processing/account/get.go index e96040db78..2571d7af16 100644 --- a/internal/processing/account/get.go +++ b/internal/processing/account/get.go @@ -22,6 +22,7 @@ import ( "context" "errors" "fmt" + "net/url" apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/db" @@ -56,7 +57,12 @@ func (p *processor) Get(ctx context.Context, requestingAccount *gtsmodel.Account // last-minute check to make sure we have remote account header/avi cached if targetAccount.Domain != "" { - a, err := p.federator.EnrichRemoteAccount(ctx, requestingAccount.Username, targetAccount) + targetAccountURI, err := url.Parse(targetAccount.URI) + if err != nil { + return nil, fmt.Errorf("error parsing url %s: %s", targetAccount.URI, err) + } + + a, err := p.federator.GetRemoteAccount(ctx, requestingAccount.Username, targetAccountURI, true, false) if err == nil { targetAccount = a } diff --git a/internal/processing/federation/getfollowers.go b/internal/processing/federation/getfollowers.go index 9153cde1ec..c15b2b6c45 100644 --- a/internal/processing/federation/getfollowers.go +++ b/internal/processing/federation/getfollowers.go @@ -41,7 +41,7 @@ func (p *processor) GetFollowers(ctx context.Context, requestedUsername string, return nil, gtserror.NewErrorNotAuthorized(errors.New("not authorized"), "not authorized") } - requestingAccount, _, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false) + requestingAccount, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false, false) if err != nil { return nil, gtserror.NewErrorNotAuthorized(err) } diff --git a/internal/processing/federation/getfollowing.go b/internal/processing/federation/getfollowing.go index 8a3025154b..d2beaada0a 100644 --- a/internal/processing/federation/getfollowing.go +++ b/internal/processing/federation/getfollowing.go @@ -41,7 +41,7 @@ func (p *processor) GetFollowing(ctx context.Context, requestedUsername string, return nil, gtserror.NewErrorNotAuthorized(errors.New("not authorized"), "not authorized") } - requestingAccount, _, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false) + requestingAccount, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false, false) if err != nil { return nil, gtserror.NewErrorNotAuthorized(err) } diff --git a/internal/processing/federation/getoutbox.go b/internal/processing/federation/getoutbox.go index 0f20434479..944c0b571c 100644 --- a/internal/processing/federation/getoutbox.go +++ b/internal/processing/federation/getoutbox.go @@ -42,7 +42,7 @@ func (p *processor) GetOutbox(ctx context.Context, requestedUsername string, pag return nil, gtserror.NewErrorNotAuthorized(errors.New("not authorized"), "not authorized") } - requestingAccount, _, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false) + requestingAccount, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false, false) if err != nil { return nil, gtserror.NewErrorNotAuthorized(err) } diff --git a/internal/processing/federation/getstatus.go b/internal/processing/federation/getstatus.go index f065eaa718..1651516b57 100644 --- a/internal/processing/federation/getstatus.go +++ b/internal/processing/federation/getstatus.go @@ -43,7 +43,7 @@ func (p *processor) GetStatus(ctx context.Context, requestedUsername string, req return nil, gtserror.NewErrorNotAuthorized(errors.New("not authorized"), "not authorized") } - requestingAccount, _, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false) + requestingAccount, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false, false) if err != nil { return nil, gtserror.NewErrorNotAuthorized(err) } diff --git a/internal/processing/federation/getstatusreplies.go b/internal/processing/federation/getstatusreplies.go index 4fc21e3ade..c6db4dd3e3 100644 --- a/internal/processing/federation/getstatusreplies.go +++ b/internal/processing/federation/getstatusreplies.go @@ -43,7 +43,7 @@ func (p *processor) GetStatusReplies(ctx context.Context, requestedUsername stri return nil, gtserror.NewErrorNotAuthorized(errors.New("not authorized"), "not authorized") } - requestingAccount, _, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false) + requestingAccount, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false, false) if err != nil { return nil, gtserror.NewErrorNotAuthorized(err) } diff --git a/internal/processing/federation/getuser.go b/internal/processing/federation/getuser.go index a8d6bcf38d..6d5b8463f1 100644 --- a/internal/processing/federation/getuser.go +++ b/internal/processing/federation/getuser.go @@ -54,7 +54,7 @@ func (p *processor) GetUser(ctx context.Context, requestedUsername string, reque // if we're not already handshaking/dereferencing a remote account, dereference it now if !p.federator.Handshaking(ctx, requestedUsername, requestingAccountURI) { - requestingAccount, _, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false) + requestingAccount, err := p.federator.GetRemoteAccount(ctx, requestedUsername, requestingAccountURI, false, false) if err != nil { return nil, gtserror.NewErrorNotAuthorized(err) } diff --git a/internal/processing/fromfederator.go b/internal/processing/fromfederator.go index 533d002427..8b575dda87 100644 --- a/internal/processing/fromfederator.go +++ b/internal/processing/fromfederator.go @@ -22,6 +22,7 @@ import ( "context" "errors" "fmt" + "net/url" "github.com/sirupsen/logrus" "github.com/superseriousbusiness/gotosocial/internal/ap" @@ -232,7 +233,12 @@ func (p *processor) processUpdateAccountFromFederator(ctx context.Context, feder return errors.New("profile was not parseable as *gtsmodel.Account") } - if _, err := p.federator.EnrichRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, incomingAccount); err != nil { + incomingAccountURL, err := url.Parse(incomingAccount.URI) + if err != nil { + return err + } + + if _, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, incomingAccountURL, false, true); err != nil { return fmt.Errorf("error enriching updated account from federator: %s", err) } diff --git a/internal/processing/search.go b/internal/processing/search.go index b03ced8310..c8c302857b 100644 --- a/internal/processing/search.go +++ b/internal/processing/search.go @@ -148,7 +148,7 @@ func (p *processor) searchAccountByURI(ctx context.Context, authed *oauth.Auth, if resolve { // we don't have it locally so try and dereference it - account, _, err := p.federator.GetRemoteAccount(ctx, authed.Account.Username, uri, true) + account, err := p.federator.GetRemoteAccount(ctx, authed.Account.Username, uri, true, true) if err != nil { return nil, fmt.Errorf("searchAccountByURI: error dereferencing account with uri %s: %s", uri.String(), err) } @@ -203,7 +203,7 @@ func (p *processor) searchAccountByMention(ctx context.Context, authed *oauth.Au } // we don't have it locally so try and dereference it - account, _, err := p.federator.GetRemoteAccount(ctx, authed.Account.Username, acctURI, true) + account, err := p.federator.GetRemoteAccount(ctx, authed.Account.Username, acctURI, true, true) if err != nil { return nil, fmt.Errorf("searchAccountByMention: error dereferencing account with uri %s: %s", acctURI.String(), err) } diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 8236fb3ae0..52e89b7d2b 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -96,35 +96,32 @@ func (c *converter) AccountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A lastStatusAt = lastPosted.Format(time.RFC3339) } - // build the avatar and header URLs + // set account avatar fields if available var aviURL string var aviURLStatic string if a.AvatarMediaAttachmentID != "" { - // make sure avi is pinned to this account if a.AvatarMediaAttachment == nil { avi, err := c.db.GetAttachmentByID(ctx, a.AvatarMediaAttachmentID) - if err != nil { - return nil, fmt.Errorf("error retrieving avatar: %s", err) + if err == nil { + a.AvatarMediaAttachment = avi + aviURL = a.AvatarMediaAttachment.URL + aviURLStatic = a.AvatarMediaAttachment.Thumbnail.URL } - a.AvatarMediaAttachment = avi } - aviURL = a.AvatarMediaAttachment.URL - aviURLStatic = a.AvatarMediaAttachment.Thumbnail.URL } + // set account header fields if available var headerURL string var headerURLStatic string if a.HeaderMediaAttachmentID != "" { - // make sure header is pinned to this account if a.HeaderMediaAttachment == nil { avi, err := c.db.GetAttachmentByID(ctx, a.HeaderMediaAttachmentID) - if err != nil { - return nil, fmt.Errorf("error retrieving avatar: %s", err) + if err == nil { + a.HeaderMediaAttachment = avi + headerURL = a.HeaderMediaAttachment.URL + headerURLStatic = a.HeaderMediaAttachment.Thumbnail.URL } - a.HeaderMediaAttachment = avi } - headerURL = a.HeaderMediaAttachment.URL - headerURLStatic = a.HeaderMediaAttachment.Thumbnail.URL } // get the fields set on this account From f28cf793ee53e8391c9eabbfba93afbc5b59936b Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 17:35:13 +0100 Subject: [PATCH 24/43] upgrade go-store --- go.mod | 4 +- go.sum | 4 + vendor/codeberg.org/gruf/go-mutexes/map.go | 335 ++- .../gruf/go-mutexes/mutex_timeout.go | 67 +- vendor/codeberg.org/gruf/go-nowish/LICENSE | 9 - vendor/codeberg.org/gruf/go-nowish/README.md | 3 - vendor/codeberg.org/gruf/go-nowish/clock.go | 132 - vendor/codeberg.org/gruf/go-nowish/timeout.go | 233 -- vendor/codeberg.org/gruf/go-nowish/util.go | 10 - .../codeberg.org/gruf/go-store/kv/iterator.go | 10 +- vendor/codeberg.org/gruf/go-store/kv/state.go | 82 +- vendor/codeberg.org/gruf/go-store/kv/store.go | 40 +- .../gruf/go-store/storage/block.go | 86 +- .../gruf/go-store/storage/disk.go | 67 +- .../gruf/go-store/storage/errors.go | 14 + .../codeberg.org/gruf/go-store/storage/fs.go | 9 +- .../gruf/go-store/storage/lock.go | 75 +- .../gruf/go-store/storage/memory.go | 78 +- vendor/github.com/zeebo/blake3/.gitignore | 6 - vendor/github.com/zeebo/blake3/LICENSE | 125 - vendor/github.com/zeebo/blake3/Makefile | 11 - vendor/github.com/zeebo/blake3/README.md | 77 - vendor/github.com/zeebo/blake3/api.go | 166 -- vendor/github.com/zeebo/blake3/blake3.go | 285 -- vendor/github.com/zeebo/blake3/digest.go | 100 - .../zeebo/blake3/internal/alg/alg.go | 18 - .../blake3/internal/alg/compress/compress.go | 15 - .../alg/compress/compress_pure/compress.go | 135 - .../alg/compress/compress_sse41/impl_amd64.s | 560 ---- .../alg/compress/compress_sse41/impl_other.go | 9 - .../alg/compress/compress_sse41/stubs.go | 6 - .../zeebo/blake3/internal/alg/hash/hash.go | 23 - .../internal/alg/hash/hash_avx2/impl_amd64.s | 2561 ----------------- .../internal/alg/hash/hash_avx2/impl_other.go | 13 - .../internal/alg/hash/hash_avx2/stubs.go | 9 - .../internal/alg/hash/hash_pure/hashf.go | 56 - .../internal/alg/hash/hash_pure/hashp.go | 38 - .../zeebo/blake3/internal/consts/consts.go | 29 - .../zeebo/blake3/internal/consts/cpu.go | 17 - .../zeebo/blake3/internal/consts/cpu_big.go | 5 - .../blake3/internal/consts/cpu_little.go | 5 - .../zeebo/blake3/internal/consts/cpu_other.go | 7 - .../zeebo/blake3/internal/utils/utils.go | 60 - vendor/modules.txt | 15 +- 44 files changed, 645 insertions(+), 4964 deletions(-) delete mode 100644 vendor/codeberg.org/gruf/go-nowish/LICENSE delete mode 100644 vendor/codeberg.org/gruf/go-nowish/README.md delete mode 100644 vendor/codeberg.org/gruf/go-nowish/clock.go delete mode 100644 vendor/codeberg.org/gruf/go-nowish/timeout.go delete mode 100644 vendor/codeberg.org/gruf/go-nowish/util.go delete mode 100644 vendor/github.com/zeebo/blake3/.gitignore delete mode 100644 vendor/github.com/zeebo/blake3/LICENSE delete mode 100644 vendor/github.com/zeebo/blake3/Makefile delete mode 100644 vendor/github.com/zeebo/blake3/README.md delete mode 100644 vendor/github.com/zeebo/blake3/api.go delete mode 100644 vendor/github.com/zeebo/blake3/blake3.go delete mode 100644 vendor/github.com/zeebo/blake3/digest.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/alg.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/consts/consts.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go delete mode 100644 vendor/github.com/zeebo/blake3/internal/utils/utils.go diff --git a/go.mod b/go.mod index b2ceb76aa3..9c33f7f36c 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( codeberg.org/gruf/go-runners v1.2.0 - codeberg.org/gruf/go-store v1.2.2 + codeberg.org/gruf/go-store v1.3.2 github.com/ReneKroon/ttlcache v1.7.0 github.com/buckket/go-blurhash v1.1.0 github.com/coreos/go-oidc/v3 v3.1.0 @@ -50,7 +50,7 @@ require ( codeberg.org/gruf/go-fastpath v1.0.2 // indirect codeberg.org/gruf/go-format v1.0.3 // indirect codeberg.org/gruf/go-hashenc v1.0.1 // indirect - codeberg.org/gruf/go-mutexes v1.0.1 // indirect + codeberg.org/gruf/go-mutexes v1.1.0 // indirect codeberg.org/gruf/go-nowish v1.1.0 // indirect codeberg.org/gruf/go-pools v1.0.2 // indirect github.com/aymerick/douceur v0.2.0 // indirect diff --git a/go.sum b/go.sum index cc773bbfba..ccfb51a1c4 100644 --- a/go.sum +++ b/go.sum @@ -62,6 +62,8 @@ codeberg.org/gruf/go-hashenc v1.0.1 h1:EBvNe2wW8IPMUqT1XihB6/IM6KMJDLMFBxIUvmsy1 codeberg.org/gruf/go-hashenc v1.0.1/go.mod h1:IfHhPCVScOiYmJLqdCQT9bYVS1nxNTV4ewMUvFWDPtc= codeberg.org/gruf/go-mutexes v1.0.1 h1:X9bZW74YSEplWWdCrVXAvue5ztw3w5hh+INdXTENu88= codeberg.org/gruf/go-mutexes v1.0.1/go.mod h1:y2hbGLkWVHhNyxBOIVsA3/y2QMm6RSrYsC3sLVZ4EXM= +codeberg.org/gruf/go-mutexes v1.1.0 h1:kMVWHLxdfGEZTetNVRncdBMeqS4M8dSJxSGbRYXyvKk= +codeberg.org/gruf/go-mutexes v1.1.0/go.mod h1:1j/6/MBeBQUedAtAtysLLnBKogfOZAxdym0E3wlaBD8= codeberg.org/gruf/go-nowish v1.0.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= codeberg.org/gruf/go-nowish v1.1.0 h1:rj1z0AXDhLvnxs/DazWFxYAugs6rv5vhgWJkRCgrESg= codeberg.org/gruf/go-nowish v1.1.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= @@ -72,6 +74,8 @@ codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBs codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-store v1.2.2 h1:YJPzJpZv/D3t9hQC00/u76eQDScQw4++OWjfobnjHAA= codeberg.org/gruf/go-store v1.2.2/go.mod h1:Xjw1U098th0yXF2CCx6jThQ+9FIPWAX9OGjYslO+UtE= +codeberg.org/gruf/go-store v1.3.2 h1:cLTMEqyK0uF/bt1ULkRR4h41Pdgxwvw3uxSpLUublHo= +codeberg.org/gruf/go-store v1.3.2/go.mod h1:g4+9h3wbwZ6IW0uhpw57xywcqiy4CIj0zQLqqtjEU1M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= diff --git a/vendor/codeberg.org/gruf/go-mutexes/map.go b/vendor/codeberg.org/gruf/go-mutexes/map.go index ea917ee5ee..cb31a95435 100644 --- a/vendor/codeberg.org/gruf/go-mutexes/map.go +++ b/vendor/codeberg.org/gruf/go-mutexes/map.go @@ -1,105 +1,322 @@ package mutexes import ( + "runtime" "sync" + "sync/atomic" ) +// locktype defines maskable mutexmap lock types. +type locktype uint8 + +const ( + // possible lock types. + lockTypeRead = locktype(1) << 0 + lockTypeWrite = locktype(1) << 1 + lockTypeMap = locktype(1) << 2 + + // possible mutexmap states. + stateUnlockd = uint8(0) + stateRLocked = uint8(1) + stateLocked = uint8(2) + stateInUse = uint8(3) +) + +// permitLockType returns if provided locktype is permitted to go ahead in current state. +func permitLockType(state uint8, lt locktype) bool { + switch state { + // Unlocked state + // (all allowed) + case stateUnlockd: + return true + + // Keys locked, no state lock. + // (don't allow map locks) + case stateInUse: + return lt&lockTypeMap == 0 + + // Read locked + // (only allow read locks) + case stateRLocked: + return lt&lockTypeRead != 0 + + // Write locked + // (none allowed) + case stateLocked: + return false + + // shouldn't reach here + default: + panic("unexpected state") + } +} + // MutexMap is a structure that allows having a map of self-evicting mutexes // by key. You do not need to worry about managing the contents of the map, // only requesting RLock/Lock for keys, and ensuring to call the returned // unlock functions. type MutexMap struct { - // NOTE: - // Individual keyed mutexes should ONLY ever - // be locked within the protection of the outer - // mapMu lock. If you lock these outside the - // protection of this, there is a chance for - // deadlocks - mus map[string]RWMutex mapMu sync.Mutex pool sync.Pool + queue []func() + evict []func() + count int32 + maxmu int32 + state uint8 } -// NewMap returns a new MutexMap instance based on supplied -// RWMutex allocator function, nil implies use default -func NewMap(newFn func() RWMutex) MutexMap { - if newFn == nil { - newFn = NewRW +// NewMap returns a new MutexMap instance with provided max no. open mutexes. +func NewMap(max int32) MutexMap { + if max < 1 { + // Default = 128 * GOMAXPROCS + procs := runtime.GOMAXPROCS(0) + max = int32(procs * 128) } return MutexMap{ - mus: make(map[string]RWMutex), - mapMu: sync.Mutex{}, + mus: make(map[string]RWMutex), pool: sync.Pool{ New: func() interface{} { - return newFn() + return NewRW() }, }, + maxmu: max, + } +} + +// acquire will either acquire a mutex from pool or alloc. +func (mm *MutexMap) acquire() RWMutex { + return mm.pool.Get().(RWMutex) +} + +// release will release provided mutex to pool. +func (mm *MutexMap) release(mu RWMutex) { + mm.pool.Put(mu) +} + +// spinLock will wait (using a mutex to sleep thread) until 'cond()' returns true, +// returning with map lock. Note that 'cond' is performed within a map lock. +func (mm *MutexMap) spinLock(cond func() bool) { + mu := mm.acquire() + defer mm.release(mu) + + for { + // Get map lock + mm.mapMu.Lock() + + // Check if return + if cond() { + return + } + + // Queue ourselves + unlock := mu.Lock() + mm.queue = append(mm.queue, unlock) + mm.mapMu.Unlock() + + // Wait on notify + mu.Lock()() + } +} + +// lockMutex will acquire a lock on the mutex at provided key, handling earlier allocated mutex if provided. Unlocks map on return. +func (mm *MutexMap) lockMutex(key string, lt locktype) func() { + var unlock func() + + // Incr counter + mm.count++ + + // Check for existing mutex at key + mu, ok := mm.mus[key] + if !ok { + // Alloc from pool + mu = mm.acquire() + mm.mus[key] = mu + + // Queue mutex for eviction + mm.evict = append(mm.evict, func() { + delete(mm.mus, key) + mm.pool.Put(mu) + }) + } + + // If no state, set in use. + // State will already have been + // set if this is from LockState{} + if mm.state == stateUnlockd { + mm.state = stateInUse + } + + switch { + // Read lock + case lt&lockTypeRead != 0: + unlock = mu.RLock() + + // Write lock + case lt&lockTypeWrite != 0: + unlock = mu.Lock() + + // shouldn't reach here + default: + panic("unexpected lock type") + } + + // Unlock map + return + mm.mapMu.Unlock() + return func() { + mm.mapMu.Lock() + unlock() + go mm.onUnlock() } } -func (mm *MutexMap) evict(key string, mu RWMutex) { - // Acquire map lock - mm.mapMu.Lock() +// onUnlock is performed as the final (async) stage of releasing an acquired key / map mutex. +func (mm *MutexMap) onUnlock() { + // Decr counter + mm.count-- + + if mm.count < 1 { + // Perform all queued evictions + for i := 0; i < len(mm.evict); i++ { + mm.evict[i]() + } - // Toggle mutex lock to - // ensure it is unused - unlock := mu.Lock() - unlock() + // Notify all waiting goroutines + for i := 0; i < len(mm.queue); i++ { + mm.queue[i]() + } - // Delete mutex key - delete(mm.mus, key) + // Reset the map state + mm.evict = nil + mm.queue = nil + mm.state = stateUnlockd + } + + // Finally, unlock mm.mapMu.Unlock() +} - // Release to pool - mm.pool.Put(mu) +// RLockMap acquires a read lock over the entire map, returning a lock state for acquiring key read locks. +// Please note that the 'unlock()' function will block until all keys locked from this state are unlocked. +func (mm *MutexMap) RLockMap() *LockState { + return mm.getMapLock(lockTypeRead) } -// RLock acquires a mutex read lock for supplied key, returning an RUnlock function -func (mm *MutexMap) RLock(key string) func() { - return mm.getLock(key, func(mu RWMutex) func() { - return mu.RLock() +// LockMap acquires a write lock over the entire map, returning a lock state for acquiring key read/write locks. +// Please note that the 'unlock()' function will block until all keys locked from this state are unlocked. +func (mm *MutexMap) LockMap() *LockState { + return mm.getMapLock(lockTypeWrite) +} + +// RLock acquires a mutex read lock for supplied key, returning an RUnlock function. +func (mm *MutexMap) RLock(key string) (runlock func()) { + return mm.getLock(key, lockTypeRead) +} + +// Lock acquires a mutex write lock for supplied key, returning an Unlock function. +func (mm *MutexMap) Lock(key string) (unlock func()) { + return mm.getLock(key, lockTypeWrite) +} + +// getLock will fetch lock of provided type, for given key, returning unlock function. +func (mm *MutexMap) getLock(key string, lt locktype) func() { + // Spin until achieve lock + mm.spinLock(func() bool { + return permitLockType(mm.state, lt) && + mm.count < mm.maxmu // not overloaded }) + + // Perform actual mutex lock + return mm.lockMutex(key, lt) } -// Lock acquires a mutex lock for supplied key, returning an Unlock function -func (mm *MutexMap) Lock(key string) func() { - return mm.getLock(key, func(mu RWMutex) func() { - return mu.Lock() +// getMapLock will acquire a map lock of provided type, returning a LockState session. +func (mm *MutexMap) getMapLock(lt locktype) *LockState { + // Spin until achieve lock + mm.spinLock(func() bool { + return permitLockType(mm.state, lt|lockTypeMap) && + mm.count < mm.maxmu // not overloaded }) + + // Incr counter + mm.count++ + + switch { + // Set read lock state + case lt&lockTypeRead != 0: + mm.state = stateRLocked + + // Set write lock state + case lt&lockTypeWrite != 0: + mm.state = stateLocked + + default: + panic("unexpected lock type") + } + + // Unlock + return + mm.mapMu.Unlock() + return &LockState{ + mmap: mm, + ltyp: lt, + } } -func (mm *MutexMap) getLock(key string, doLock func(RWMutex) func()) func() { - // Get map lock - mm.mapMu.Lock() +// LockState represents a window to a locked MutexMap. +type LockState struct { + wait sync.WaitGroup + mmap *MutexMap + done uint32 + ltyp locktype +} - // Look for mutex - mu, ok := mm.mus[key] - if ok { - // Lock and return - // its unlocker func - unlock := doLock(mu) - mm.mapMu.Unlock() - return unlock +// Lock: see MutexMap.Lock() definition. Will panic if map only read locked. +func (st *LockState) Lock(key string) (unlock func()) { + return st.getLock(key, lockTypeWrite) +} + +// RLock: see MutexMap.RLock() definition. +func (st *LockState) RLock(key string) (runlock func()) { + return st.getLock(key, lockTypeRead) +} + +// UnlockMap will close this state and release the currently locked map. +func (st *LockState) UnlockMap() { + // Set state to finished (or panic if already done) + if !atomic.CompareAndSwapUint32(&st.done, 0, 1) { + panic("called UnlockMap() on expired state") } - // Note: even though the mutex data structure is - // small, benchmarking does actually show that pooled - // alloc of mutexes here is faster + // Wait until done + st.wait.Wait() - // Acquire mu + add - mu = mm.pool.Get().(RWMutex) - mm.mus[key] = mu + // Async reset map + st.mmap.mapMu.Lock() + go st.mmap.onUnlock() +} - // Lock mutex + unlock map - unlockFn := doLock(mu) - mm.mapMu.Unlock() +// getLock: see MutexMap.getLock() definition. +func (st *LockState) getLock(key string, lt locktype) func() { + st.wait.Add(1) // track lock - return func() { - // Unlock mutex - unlockFn() + // Check if closed, or if write lock is allowed + if atomic.LoadUint32(&st.done) == 1 { + panic("map lock closed") + } else if lt&lockTypeWrite != 0 && + st.ltyp&lockTypeWrite == 0 { + panic("called .Lock() on rlocked map") + } + + // Spin until achieve map lock + st.mmap.spinLock(func() bool { + return st.mmap.count < st.mmap.maxmu + }) // i.e. not overloaded - // Release function - go mm.evict(key, mu) + // Perform actual mutex lock + unlock := st.mmap.lockMutex(key, lt) + + return func() { + unlock() + st.wait.Done() } } diff --git a/vendor/codeberg.org/gruf/go-mutexes/mutex_timeout.go b/vendor/codeberg.org/gruf/go-mutexes/mutex_timeout.go index 5da69ef25b..2e7b8f8026 100644 --- a/vendor/codeberg.org/gruf/go-mutexes/mutex_timeout.go +++ b/vendor/codeberg.org/gruf/go-mutexes/mutex_timeout.go @@ -3,8 +3,6 @@ package mutexes import ( "sync" "time" - - "codeberg.org/gruf/go-nowish" ) // TimeoutMutex defines a Mutex with timeouts on locks @@ -73,14 +71,6 @@ func (mu *timeoutRWMutex) RLockFunc(fn func()) func() { return mutexTimeout(mu.rd, mu.mu.RLock(), fn) } -// timeoutPool provides nowish.Timeout objects for timeout mutexes -var timeoutPool = sync.Pool{ - New: func() interface{} { - t := nowish.NewTimeout() - return &t - }, -} - // mutexTimeout performs a timed unlock, calling supplied fn if timeout is reached func mutexTimeout(d time.Duration, unlock func(), fn func()) func() { if d < 1 { @@ -88,18 +78,65 @@ func mutexTimeout(d time.Duration, unlock func(), fn func()) func() { return unlock } - // Acquire timeout obj - t := timeoutPool.Get().(*nowish.Timeout) + // Acquire timer from pool + t := timerPool.Get().(*timer) - // Start the timeout with hook - t.Start(d, fn) + // Start the timer + go t.Start(d, fn) // Return func cancelling timeout, // replacing Timeout in pool and // finally unlocking mutex return func() { + defer timerPool.Put(t) t.Cancel() - timeoutPool.Put(t) unlock() } } + +// timerPool is the global &timer{} pool. +var timerPool = sync.Pool{ + New: func() interface{} { + return newtimer() + }, +} + +// timer represents a reusable cancellable timer. +type timer struct { + t *time.Timer + c chan struct{} +} + +// newtimer returns a new timer instance. +func newtimer() *timer { + t := time.NewTimer(time.Minute) + t.Stop() + return &timer{t: t, c: make(chan struct{})} +} + +// Start will start the timer with duration 'd', performing 'fn' on timeout. +func (t *timer) Start(d time.Duration, fn func()) { + t.t.Reset(d) + select { + // Timed out + case <-t.t.C: + fn() + + // Cancelled + case <-t.c: + } +} + +// Cancel will attempt to cancel the running timer. +func (t *timer) Cancel() { + select { + // cancel successful + case t.c <- struct{}{}: + if !t.t.Stop() { + <-t.t.C + } // stop timer + + // already stopped + default: + } +} diff --git a/vendor/codeberg.org/gruf/go-nowish/LICENSE b/vendor/codeberg.org/gruf/go-nowish/LICENSE deleted file mode 100644 index b7c4417ac5..0000000000 --- a/vendor/codeberg.org/gruf/go-nowish/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) 2021 gruf - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/codeberg.org/gruf/go-nowish/README.md b/vendor/codeberg.org/gruf/go-nowish/README.md deleted file mode 100644 index 4070e5013b..0000000000 --- a/vendor/codeberg.org/gruf/go-nowish/README.md +++ /dev/null @@ -1,3 +0,0 @@ -a simple Go library with useful time utiities: -- Clock: a high performance clock giving a good "ish" representation of "now" (hence the name!) -- Timeout: a reusable structure for enforcing timeouts with a cancel diff --git a/vendor/codeberg.org/gruf/go-nowish/clock.go b/vendor/codeberg.org/gruf/go-nowish/clock.go deleted file mode 100644 index 781e59f182..0000000000 --- a/vendor/codeberg.org/gruf/go-nowish/clock.go +++ /dev/null @@ -1,132 +0,0 @@ -package nowish - -import ( - "sync" - "sync/atomic" - "time" - "unsafe" -) - -// Start returns a new Clock instance initialized and -// started with the provided precision, along with the -// stop function for it's underlying timer -func Start(precision time.Duration) (*Clock, func()) { - c := Clock{} - return &c, c.Start(precision) -} - -type Clock struct { - // format stores the time formatting style string - format string - - // valid indicates whether the current value stored in .Format is valid - valid uint32 - - // mutex protects writes to .Format, not because it would be unsafe, but - // because we want to minimize unnnecessary allocations - mutex sync.Mutex - - // nowfmt is an unsafe pointer to the last-updated time format string - nowfmt unsafe.Pointer - - // now is an unsafe pointer to the last-updated time.Time object - now unsafe.Pointer -} - -// Start starts the clock with the provided precision, the returned -// function is the stop function for the underlying timer. For >= 2ms, -// actual precision is usually within AT LEAST 10% of requested precision, -// less than this and the actual precision very quickly deteriorates. -func (c *Clock) Start(precision time.Duration) func() { - // Create ticker from duration - tick := time.NewTicker(precision / 10) - - // Set initial time - t := time.Now() - atomic.StorePointer(&c.now, unsafe.Pointer(&t)) - - // Set initial format - s := "" - atomic.StorePointer(&c.nowfmt, unsafe.Pointer(&s)) - - // If formatting string unset, set default - c.mutex.Lock() - if c.format == "" { - c.format = time.RFC822 - } - c.mutex.Unlock() - - // Start main routine - go c.run(tick) - - // Return stop fn - return tick.Stop -} - -// run is the internal clock ticking loop. -func (c *Clock) run(tick *time.Ticker) { - for { - // Wait on tick - _, ok := <-tick.C - - // Channel closed - if !ok { - break - } - - // Update time - t := time.Now() - atomic.StorePointer(&c.now, unsafe.Pointer(&t)) - - // Invalidate format string - atomic.StoreUint32(&c.valid, 0) - } -} - -// Now returns a good (ish) estimate of the current 'now' time. -func (c *Clock) Now() time.Time { - return *(*time.Time)(atomic.LoadPointer(&c.now)) -} - -// NowFormat returns the formatted "now" time, cached until next tick and "now" updates. -func (c *Clock) NowFormat() string { - // If format still valid, return this - if atomic.LoadUint32(&c.valid) == 1 { - return *(*string)(atomic.LoadPointer(&c.nowfmt)) - } - - // Get mutex lock - c.mutex.Lock() - - // Double check still invalid - if atomic.LoadUint32(&c.valid) == 1 { - c.mutex.Unlock() - return *(*string)(atomic.LoadPointer(&c.nowfmt)) - } - - // Calculate time format - nowfmt := c.Now().Format(c.format) - - // Update the stored value and set valid! - atomic.StorePointer(&c.nowfmt, unsafe.Pointer(&nowfmt)) - atomic.StoreUint32(&c.valid, 1) - - // Unlock and return - c.mutex.Unlock() - return nowfmt -} - -// SetFormat sets the time format string used by .NowFormat(). -func (c *Clock) SetFormat(format string) { - // Get mutex lock - c.mutex.Lock() - - // Update time format - c.format = format - - // Invalidate current format string - atomic.StoreUint32(&c.valid, 0) - - // Unlock - c.mutex.Unlock() -} diff --git a/vendor/codeberg.org/gruf/go-nowish/timeout.go b/vendor/codeberg.org/gruf/go-nowish/timeout.go deleted file mode 100644 index 7fe3e1d1d7..0000000000 --- a/vendor/codeberg.org/gruf/go-nowish/timeout.go +++ /dev/null @@ -1,233 +0,0 @@ -package nowish - -import ( - "sync" - "sync/atomic" - "time" -) - -// Timeout provides a reusable structure for enforcing timeouts with a cancel. -type Timeout struct { - timer *time.Timer // timer is the underlying timeout-timer - cncl syncer // cncl is the cancel synchronization channel - next int64 // next is the next timeout duration to run on - state uint32 // state stores the current timeout state - mu sync.Mutex // mu protects state, and helps synchronize return of .Start() -} - -// NewTimeout returns a new Timeout instance. -func NewTimeout() Timeout { - timer := time.NewTimer(time.Minute) - timer.Stop() // don't keep it running - return Timeout{ - timer: timer, - cncl: make(syncer), - } -} - -// startTimeout is the main timeout routine, handling starting the -// timeout runner at first and upon any time extensions, and handling -// any received cancels by stopping the running timer. -func (t *Timeout) startTimeout(hook func()) { - var cancelled bool - - // Receive first timeout duration - d := atomic.SwapInt64(&t.next, 0) - - // Indicate finished starting, this - // was left locked by t.start(). - t.mu.Unlock() - - for { - // Run supplied timeout - cancelled = t.runTimeout(d) - if cancelled { - break - } - - // Check for extension or set timed out - d = atomic.SwapInt64(&t.next, 0) - if d < 1 { - if t.timedOut() { - // timeout reached - hook() - break - } else { - // already cancelled - t.cncl.wait() - cancelled = true - break - } - } - - if !t.extend() { - // already cancelled - t.cncl.wait() - cancelled = true - break - } - } - - if cancelled { - // Release the .Cancel() - defer t.cncl.notify() - } - - // Mark as done - t.reset() -} - -// runTimeout will until supplied timeout or cancel called. -func (t *Timeout) runTimeout(d int64) (cancelled bool) { - // Start the timer for 'd' - t.timer.Reset(time.Duration(d)) - - select { - // Timeout reached - case <-t.timer.C: - if !t.timingOut() { - // a sneaky cancel! - t.cncl.wait() - cancelled = true - } - - // Cancel called - case <-t.cncl.wait(): - cancelled = true - if !t.timer.Stop() { - <-t.timer.C - } - } - - return cancelled -} - -// Start starts the timer with supplied timeout. If timeout is reached before -// cancel then supplied timeout hook will be called. Panic will be called if -// Timeout is already running when calling this function. -func (t *Timeout) Start(d time.Duration, hook func()) { - if !t.start() { - t.mu.Unlock() // need to unlock - panic("timeout already started") - } - - // Start the timeout - atomic.StoreInt64(&t.next, int64(d)) - go t.startTimeout(hook) - - // Wait until start - t.mu.Lock() - t.mu.Unlock() -} - -// Extend will attempt to extend the timeout runner's time, returns false if not running. -func (t *Timeout) Extend(d time.Duration) bool { - var ok bool - if ok = t.running(); ok { - atomic.AddInt64(&t.next, int64(d)) - } - return ok -} - -// Cancel cancels the currently running timer. If a cancel is achieved, then -// this function will return after the timeout goroutine is finished. -func (t *Timeout) Cancel() { - if !t.cancel() { - return - } - t.cncl.notify() - <-t.cncl.wait() -} - -// possible timeout states. -const ( - stopped = 0 - started = 1 - timingOut = 2 - cancelled = 3 - timedOut = 4 -) - -// cas will perform a compare and swap where the compare is a provided function. -func (t *Timeout) cas(check func(uint32) bool, swap uint32) bool { - var cas bool - - t.mu.Lock() - if cas = check(t.state); cas { - t.state = swap - } - t.mu.Unlock() - - return cas -} - -// start attempts to mark the timeout state as 'started', note DOES NOT unlock Timeout.mu. -func (t *Timeout) start() bool { - var ok bool - - t.mu.Lock() - if ok = (t.state == stopped); ok { - t.state = started - } - - // don't unlock - return ok -} - -// timingOut attempts to mark the timeout state as 'timing out'. -func (t *Timeout) timingOut() bool { - return t.cas(func(u uint32) bool { - return (u == started) - }, timingOut) -} - -// timedOut attempts mark the 'timing out' state as 'timed out'. -func (t *Timeout) timedOut() bool { - return t.cas(func(u uint32) bool { - return (u == timingOut) - }, timedOut) -} - -// extend attempts to extend a 'timing out' state by moving it back to 'started'. -func (t *Timeout) extend() bool { - return t.cas(func(u uint32) bool { - return (u == started) || - (u == timingOut) - }, started) -} - -// running returns whether the state is anything other than 'stopped'. -func (t *Timeout) running() bool { - t.mu.Lock() - running := (t.state != stopped) - t.mu.Unlock() - return running -} - -// cancel attempts to mark the timeout state as 'cancelled'. -func (t *Timeout) cancel() bool { - return t.cas(func(u uint32) bool { - return (u == started) || - (u == timingOut) - }, cancelled) -} - -// reset marks the timeout state as 'stopped'. -func (t *Timeout) reset() { - t.mu.Lock() - t.state = stopped - t.mu.Unlock() -} - -// syncer provides helpful receiver methods for a synchronization channel. -type syncer (chan struct{}) - -// notify blocks on sending an empty value down channel. -func (s syncer) notify() { - s <- struct{}{} -} - -// wait returns the underlying channel for blocking until '.notify()'. -func (s syncer) wait() <-chan struct{} { - return s -} diff --git a/vendor/codeberg.org/gruf/go-nowish/util.go b/vendor/codeberg.org/gruf/go-nowish/util.go deleted file mode 100644 index 31fe9050ef..0000000000 --- a/vendor/codeberg.org/gruf/go-nowish/util.go +++ /dev/null @@ -1,10 +0,0 @@ -package nowish - -//nolint -type noCopy struct{} - -//nolint -func (*noCopy) Lock() {} - -//nolint -func (*noCopy) Unlock() {} diff --git a/vendor/codeberg.org/gruf/go-store/kv/iterator.go b/vendor/codeberg.org/gruf/go-store/kv/iterator.go index ddaaf60cf8..da743ead1d 100644 --- a/vendor/codeberg.org/gruf/go-store/kv/iterator.go +++ b/vendor/codeberg.org/gruf/go-store/kv/iterator.go @@ -2,6 +2,7 @@ package kv import ( "codeberg.org/gruf/go-errors" + "codeberg.org/gruf/go-mutexes" "codeberg.org/gruf/go-store/storage" ) @@ -17,10 +18,10 @@ var ErrIteratorClosed = errors.New("store/kv: iterator closed") // have multiple iterators running concurrently type KVIterator struct { store *KVStore // store is the linked KVStore + state *mutexes.LockState entries []storage.StorageEntry index int key string - onClose func() } // Next attempts to set the next key-value pair, the @@ -43,13 +44,10 @@ func (i *KVIterator) Key() string { // Release releases the KVIterator and KVStore's read lock func (i *KVIterator) Release() { - // Reset key, path, entries + i.state.UnlockMap() i.store = nil i.key = "" i.entries = nil - - // Perform requested callback - i.onClose() } // Value returns the next value from the KVStore @@ -60,5 +58,5 @@ func (i *KVIterator) Value() ([]byte, error) { } // Attempt to fetch from store - return i.store.get(i.store.mutexMap.RLock, i.key) + return i.store.get(i.state.RLock, i.key) } diff --git a/vendor/codeberg.org/gruf/go-store/kv/state.go b/vendor/codeberg.org/gruf/go-store/kv/state.go index 330928bce5..0b226e107c 100644 --- a/vendor/codeberg.org/gruf/go-store/kv/state.go +++ b/vendor/codeberg.org/gruf/go-store/kv/state.go @@ -2,9 +2,9 @@ package kv import ( "io" - "sync" "codeberg.org/gruf/go-errors" + "codeberg.org/gruf/go-mutexes" ) var ErrStateClosed = errors.New("store/kv: state closed") @@ -16,61 +16,42 @@ var ErrStateClosed = errors.New("store/kv: state closed") // then the state has zero guarantees type StateRO struct { store *KVStore - mutex sync.RWMutex + state *mutexes.LockState } func (st *StateRO) Get(key string) ([]byte, error) { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return nil, ErrStateClosed } // Pass request to store - return st.store.get(st.store.mutexMap.RLock, key) + return st.store.get(st.state.RLock, key) } func (st *StateRO) GetStream(key string) (io.ReadCloser, error) { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return nil, ErrStateClosed } // Pass request to store - return st.store.getStream(st.store.mutexMap.RLock, key) + return st.store.getStream(st.state.RLock, key) } func (st *StateRO) Has(key string) (bool, error) { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return false, ErrStateClosed } // Pass request to store - return st.store.has(st.store.mutexMap.RLock, key) + return st.store.has(st.state.RLock, key) } func (st *StateRO) Release() { - // Get state write lock - st.mutex.Lock() - defer st.mutex.Unlock() - - // Release the store - if st.store != nil { - st.store.mutex.RUnlock() - st.store = nil - } + st.state.UnlockMap() + st.store = nil } // StateRW provides a read-write window to the store. While this @@ -80,101 +61,70 @@ func (st *StateRO) Release() { // then the state has zero guarantees type StateRW struct { store *KVStore - mutex sync.RWMutex + state *mutexes.LockState } func (st *StateRW) Get(key string) ([]byte, error) { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return nil, ErrStateClosed } // Pass request to store - return st.store.get(st.store.mutexMap.RLock, key) + return st.store.get(st.state.RLock, key) } func (st *StateRW) GetStream(key string) (io.ReadCloser, error) { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return nil, ErrStateClosed } // Pass request to store - return st.store.getStream(st.store.mutexMap.RLock, key) + return st.store.getStream(st.state.RLock, key) } func (st *StateRW) Put(key string, value []byte) error { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return ErrStateClosed } // Pass request to store - return st.store.put(st.store.mutexMap.Lock, key, value) + return st.store.put(st.state.Lock, key, value) } func (st *StateRW) PutStream(key string, r io.Reader) error { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return ErrStateClosed } // Pass request to store - return st.store.putStream(st.store.mutexMap.Lock, key, r) + return st.store.putStream(st.state.Lock, key, r) } func (st *StateRW) Has(key string) (bool, error) { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return false, ErrStateClosed } // Pass request to store - return st.store.has(st.store.mutexMap.RLock, key) + return st.store.has(st.state.RLock, key) } func (st *StateRW) Delete(key string) error { - // Get state read lock - st.mutex.RLock() - defer st.mutex.RUnlock() - // Check not closed if st.store == nil { return ErrStateClosed } // Pass request to store - return st.store.delete(st.store.mutexMap.Lock, key) + return st.store.delete(st.state.Lock, key) } func (st *StateRW) Release() { - // Get state write lock - st.mutex.Lock() - defer st.mutex.Unlock() - - // Release the store - if st.store != nil { - st.store.mutex.Unlock() - st.store = nil - } + st.state.UnlockMap() + st.store = nil } diff --git a/vendor/codeberg.org/gruf/go-store/kv/store.go b/vendor/codeberg.org/gruf/go-store/kv/store.go index 4c3a311408..a8741afe00 100644 --- a/vendor/codeberg.org/gruf/go-store/kv/store.go +++ b/vendor/codeberg.org/gruf/go-store/kv/store.go @@ -2,7 +2,6 @@ package kv import ( "io" - "sync" "codeberg.org/gruf/go-mutexes" "codeberg.org/gruf/go-store/storage" @@ -11,9 +10,8 @@ import ( // KVStore is a very simple, yet performant key-value store type KVStore struct { - mutexMap mutexes.MutexMap // mutexMap is a map of keys to mutexes to protect file access - mutex sync.RWMutex // mutex is the total store mutex - storage storage.Storage // storage is the underlying storage + mutex mutexes.MutexMap // mutex is a map of keys to mutexes to protect file access + storage storage.Storage // storage is the underlying storage } func OpenFile(path string, cfg *storage.DiskConfig) (*KVStore, error) { @@ -47,26 +45,19 @@ func OpenStorage(storage storage.Storage) (*KVStore, error) { // Return new KVStore return &KVStore{ - mutexMap: mutexes.NewMap(mutexes.NewRW), - mutex: sync.RWMutex{}, - storage: storage, + mutex: mutexes.NewMap(-1), + storage: storage, }, nil } // RLock acquires a read-lock on supplied key, returning unlock function. func (st *KVStore) RLock(key string) (runlock func()) { - st.mutex.RLock() - runlock = st.mutexMap.RLock(key) - st.mutex.RUnlock() - return runlock + return st.mutex.RLock(key) } // Lock acquires a write-lock on supplied key, returning unlock function. func (st *KVStore) Lock(key string) (unlock func()) { - st.mutex.Lock() - unlock = st.mutexMap.Lock(key) - st.mutex.Unlock() - return unlock + return st.mutex.Lock(key) } // Get fetches the bytes for supplied key in the store @@ -167,7 +158,7 @@ func (st *KVStore) Iterator(matchFn func(string) bool) (*KVIterator, error) { } // Get store read lock - st.mutex.RLock() + state := st.mutex.RLockMap() // Setup the walk keys function entries := []storage.StorageEntry{} @@ -184,24 +175,24 @@ func (st *KVStore) Iterator(matchFn func(string) bool) (*KVIterator, error) { // Walk keys in the storage err := st.storage.WalkKeys(storage.WalkKeysOptions{WalkFn: walkFn}) if err != nil { - st.mutex.RUnlock() + state.UnlockMap() return nil, err } // Return new iterator return &KVIterator{ store: st, + state: state, entries: entries, index: -1, key: "", - onClose: st.mutex.RUnlock, }, nil } // Read provides a read-only window to the store, holding it in a read-locked state until release func (st *KVStore) Read() *StateRO { - st.mutex.RLock() - return &StateRO{store: st} + state := st.mutex.RLockMap() + return &StateRO{store: st, state: state} } // ReadFn provides a read-only window to the store, holding it in a read-locked state until fn return. @@ -216,8 +207,8 @@ func (st *KVStore) ReadFn(fn func(*StateRO)) { // Update provides a read-write window to the store, holding it in a write-locked state until release func (st *KVStore) Update() *StateRW { - st.mutex.Lock() - return &StateRW{store: st} + state := st.mutex.LockMap() + return &StateRW{store: st, state: state} } // UpdateFn provides a read-write window to the store, holding it in a write-locked state until fn return. @@ -229,3 +220,8 @@ func (st *KVStore) UpdateFn(fn func(*StateRW)) { // Pass to fn fn(state) } + +// Close will close the underlying storage, the mutex map locking (e.g. RLock(), Lock() will still work). +func (st *KVStore) Close() error { + return st.storage.Close() +} diff --git a/vendor/codeberg.org/gruf/go-store/storage/block.go b/vendor/codeberg.org/gruf/go-store/storage/block.go index bc35b07acf..5075c7d177 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/block.go +++ b/vendor/codeberg.org/gruf/go-store/storage/block.go @@ -1,6 +1,7 @@ package storage import ( + "crypto/sha256" "io" "io/fs" "os" @@ -13,7 +14,6 @@ import ( "codeberg.org/gruf/go-hashenc" "codeberg.org/gruf/go-pools" "codeberg.org/gruf/go-store/util" - "github.com/zeebo/blake3" ) var ( @@ -77,7 +77,7 @@ func getBlockConfig(cfg *BlockConfig) BlockConfig { // BlockStorage is a Storage implementation that stores input data as chunks on // a filesystem. Each value is chunked into blocks of configured size and these -// blocks are stored with name equal to their base64-encoded BLAKE3 hash-sum. A +// blocks are stored with name equal to their base64-encoded SHA256 hash-sum. A // "node" file is finally created containing an array of hashes contained within // this value type BlockStorage struct { @@ -87,7 +87,7 @@ type BlockStorage struct { config BlockConfig // cfg is the supplied configuration for this store hashPool sync.Pool // hashPool is this store's hashEncoder pool bufpool pools.BufferPool // bufpool is this store's bytes.Buffer pool - lock *LockableFile // lock is the opened lockfile for this storage instance + lock *Lock // lock is the opened lockfile for this storage instance // NOTE: // BlockStorage does not need to lock each of the underlying block files @@ -140,11 +140,9 @@ func OpenBlock(path string, cfg *BlockConfig) (*BlockStorage, error) { } // Open and acquire storage lock for path - lock, err := OpenLock(pb.Join(path, LockFile)) + lock, err := OpenLock(pb.Join(path, lockFile)) if err != nil { return nil, err - } else if err := lock.Lock(); err != nil { - return nil, err } // Figure out the largest size for bufpool slices @@ -174,14 +172,23 @@ func OpenBlock(path string, cfg *BlockConfig) (*BlockStorage, error) { // Clean implements storage.Clean() func (st *BlockStorage) Clean() error { - nodes := map[string]*node{} + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } // Acquire path builder pb := util.GetPathBuilder() defer util.PutPathBuilder(pb) - // Walk nodes dir for entries + nodes := map[string]*node{} onceErr := errors.OnceError{} + + // Walk nodes dir for entries err := util.WalkDir(pb, st.nodePath, func(npath string, fsentry fs.DirEntry) { // Only deal with regular files if !fsentry.Type().IsRegular() { @@ -303,6 +310,7 @@ func (st *BlockStorage) ReadBytes(key string) ([]byte, error) { if err != nil { return nil, err } + defer rc.Close() // Read all bytes and return return io.ReadAll(rc) @@ -316,9 +324,19 @@ func (st *BlockStorage) ReadStream(key string) (io.ReadCloser, error) { return nil, err } + // Track open + st.lock.Add() + + // Check if open + if st.lock.Closed() { + st.lock.Done() + return nil, ErrClosed + } + // Attempt to open RO file file, err := open(npath, defaultFileROFlags) if err != nil { + st.lock.Done() return nil, err } defer file.Close() @@ -338,14 +356,16 @@ func (st *BlockStorage) ReadStream(key string) (io.ReadCloser, error) { nil, ) if err != nil { + st.lock.Done() return nil, err } - // Return new block reader - return util.NopReadCloser(&blockReader{ + // Prepare block reader and return + rc := util.NopReadCloser(&blockReader{ storage: st, node: &node, - }), nil + }) // we wrap the blockreader to decr lockfile waitgroup + return util.ReadCloserWithCallback(rc, st.lock.Done), nil } func (st *BlockStorage) readBlock(key string) ([]byte, error) { @@ -383,6 +403,15 @@ func (st *BlockStorage) WriteStream(key string, r io.Reader) error { return err } + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } + // Check if this exists ok, err := stat(key) if err != nil { @@ -567,6 +596,15 @@ func (st *BlockStorage) Stat(key string) (bool, error) { return false, err } + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return false, ErrClosed + } + // Check for file on disk return stat(kpath) } @@ -579,18 +617,35 @@ func (st *BlockStorage) Remove(key string) error { return err } + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } + // Attempt to remove file return os.Remove(kpath) } // Close implements Storage.Close() func (st *BlockStorage) Close() error { - defer st.lock.Close() - return st.lock.Unlock() + return st.lock.Close() } // WalkKeys implements Storage.WalkKeys() func (st *BlockStorage) WalkKeys(opts WalkKeysOptions) error { + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } + // Acquire path builder pb := util.GetPathBuilder() defer util.PutPathBuilder(pb) @@ -800,7 +855,7 @@ var ( // encodedHashLen is the once-calculated encoded hash-sum length encodedHashLen = base64Encoding.EncodedLen( - blake3.New().Size(), + sha256.New().Size(), ) ) @@ -812,9 +867,8 @@ type hashEncoder struct { // newHashEncoder returns a new hashEncoder instance func newHashEncoder() *hashEncoder { - hash := blake3.New() return &hashEncoder{ - henc: hashenc.New(hash, base64Encoding), + henc: hashenc.New(sha256.New(), base64Encoding), ebuf: make([]byte, encodedHashLen), } } diff --git a/vendor/codeberg.org/gruf/go-store/storage/disk.go b/vendor/codeberg.org/gruf/go-store/storage/disk.go index 9b5430437c..2ee00ddee6 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/disk.go +++ b/vendor/codeberg.org/gruf/go-store/storage/disk.go @@ -71,7 +71,7 @@ type DiskStorage struct { path string // path is the root path of this store bufp pools.BufferPool // bufp is the buffer pool for this DiskStorage config DiskConfig // cfg is the supplied configuration for this store - lock *LockableFile // lock is the opened lockfile for this storage instance + lock *Lock // lock is the opened lockfile for this storage instance } // OpenFile opens a DiskStorage instance for given folder path and configuration @@ -118,11 +118,9 @@ func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { } // Open and acquire storage lock for path - lock, err := OpenLock(pb.Join(path, LockFile)) + lock, err := OpenLock(pb.Join(path, lockFile)) if err != nil { return nil, err - } else if err := lock.Lock(); err != nil { - return nil, err } // Return new DiskStorage @@ -136,6 +134,11 @@ func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { // Clean implements Storage.Clean() func (st *DiskStorage) Clean() error { + st.lock.Add() + defer st.lock.Done() + if st.lock.Closed() { + return ErrClosed + } return util.CleanDirs(st.path) } @@ -160,9 +163,18 @@ func (st *DiskStorage) ReadStream(key string) (io.ReadCloser, error) { return nil, err } + // Track open + st.lock.Add() + + // Check if open + if st.lock.Closed() { + return nil, ErrClosed + } + // Attempt to open file (replace ENOENT with our own) file, err := open(kpath, defaultFileROFlags) if err != nil { + st.lock.Done() return nil, errSwapNotFound(err) } @@ -170,12 +182,14 @@ func (st *DiskStorage) ReadStream(key string) (io.ReadCloser, error) { cFile, err := st.config.Compression.Reader(file) if err != nil { file.Close() // close this here, ignore error + st.lock.Done() return nil, err } // Wrap compressor to ensure file close return util.ReadCloserWithCallback(cFile, func() { file.Close() + st.lock.Done() }), nil } @@ -192,6 +206,15 @@ func (st *DiskStorage) WriteStream(key string, r io.Reader) error { return err } + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } + // Ensure dirs leading up to file exist err = os.MkdirAll(path.Dir(kpath), defaultDirPerms) if err != nil { @@ -242,6 +265,15 @@ func (st *DiskStorage) Stat(key string) (bool, error) { return false, err } + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return false, ErrClosed + } + // Check for file on disk return stat(kpath) } @@ -254,18 +286,35 @@ func (st *DiskStorage) Remove(key string) error { return err } + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } + // Attempt to remove file return os.Remove(kpath) } // Close implements Storage.Close() func (st *DiskStorage) Close() error { - defer st.lock.Close() - return st.lock.Unlock() + return st.lock.Close() } // WalkKeys implements Storage.WalkKeys() func (st *DiskStorage) WalkKeys(opts WalkKeysOptions) error { + // Track open + st.lock.Add() + defer st.lock.Done() + + // Check if open + if st.lock.Closed() { + return ErrClosed + } + // Acquire path builder pb := util.GetPathBuilder() defer util.PutPathBuilder(pb) @@ -286,13 +335,13 @@ func (st *DiskStorage) WalkKeys(opts WalkKeysOptions) error { // filepath checks and returns a formatted filepath for given key func (st *DiskStorage) filepath(key string) (string, error) { + // Calculate transformed key path + key = st.config.Transform.KeyToPath(key) + // Acquire path builder pb := util.GetPathBuilder() defer util.PutPathBuilder(pb) - // Calculate transformed key path - key = st.config.Transform.KeyToPath(key) - // Generated joined root path pb.AppendString(st.path) pb.AppendString(key) diff --git a/vendor/codeberg.org/gruf/go-store/storage/errors.go b/vendor/codeberg.org/gruf/go-store/storage/errors.go index 0165935966..ad2b742e64 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/errors.go +++ b/vendor/codeberg.org/gruf/go-store/storage/errors.go @@ -19,6 +19,9 @@ func (e errorString) Extend(s string, a ...interface{}) errorString { } var ( + // ErrClosed is returned on operations on a closed storage + ErrClosed = errorString("store/storage: closed") + // ErrNotFound is the error returned when a key cannot be found in storage ErrNotFound = errorString("store/storage: key not found") @@ -39,6 +42,9 @@ var ( // errCorruptNodes is returned when nodes with missing blocks are found during a BlockStorage clean errCorruptNodes = errorString("store/storage: corrupted nodes") + + // ErrAlreadyLocked is returned on fail opening a storage lockfile + ErrAlreadyLocked = errorString("store/storage: storage lock already open") ) // errSwapNoop performs no error swaps @@ -61,3 +67,11 @@ func errSwapExist(err error) error { } return err } + +// errSwapUnavailable swaps syscall.EAGAIN for ErrAlreadyLocked +func errSwapUnavailable(err error) error { + if err == syscall.EAGAIN { + return ErrAlreadyLocked + } + return err +} diff --git a/vendor/codeberg.org/gruf/go-store/storage/fs.go b/vendor/codeberg.org/gruf/go-store/storage/fs.go index ff4c857c31..b1c3560d26 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/fs.go +++ b/vendor/codeberg.org/gruf/go-store/storage/fs.go @@ -8,11 +8,14 @@ import ( ) const ( - defaultDirPerms = 0755 - defaultFilePerms = 0644 + // default file permission bits + defaultDirPerms = 0755 + defaultFilePerms = 0644 + + // default file open flags defaultFileROFlags = syscall.O_RDONLY defaultFileRWFlags = syscall.O_CREAT | syscall.O_RDWR - defaultFileLockFlags = syscall.O_RDONLY | syscall.O_EXCL | syscall.O_CREAT + defaultFileLockFlags = syscall.O_RDONLY | syscall.O_CREAT ) // NOTE: diff --git a/vendor/codeberg.org/gruf/go-store/storage/lock.go b/vendor/codeberg.org/gruf/go-store/storage/lock.go index a757830cc3..fae4351bf7 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/lock.go +++ b/vendor/codeberg.org/gruf/go-store/storage/lock.go @@ -1,38 +1,81 @@ package storage import ( - "os" + "sync" + "sync/atomic" "syscall" "codeberg.org/gruf/go-store/util" ) -// LockFile is our standard lockfile name. -const LockFile = "store.lock" +// lockFile is our standard lockfile name. +var lockFile = "store.lock" -type LockableFile struct { - *os.File +// IsLockKey returns whether storage key is our lockfile. +func IsLockKey(key string) bool { + return key == lockFile +} + +// Lock represents a filesystem lock to ensure only one storage instance open per path. +type Lock struct { + fd int + wg sync.WaitGroup + st uint32 } // OpenLock opens a lockfile at path. -func OpenLock(path string) (*LockableFile, error) { - file, err := open(path, defaultFileLockFlags) +func OpenLock(path string) (*Lock, error) { + var fd int + + // Open the file descriptor at path + err := util.RetryOnEINTR(func() (err error) { + fd, err = syscall.Open(path, defaultFileLockFlags, defaultFilePerms) + return + }) if err != nil { return nil, err } - return &LockableFile{file}, nil + + // Get a flock on the file descriptor + err = util.RetryOnEINTR(func() error { + return syscall.Flock(fd, syscall.LOCK_EX|syscall.LOCK_NB) + }) + if err != nil { + return nil, errSwapUnavailable(err) + } + + return &Lock{fd: fd}, nil } -func (f *LockableFile) Lock() error { - return f.flock(syscall.LOCK_EX | syscall.LOCK_NB) +// Add will add '1' to the underlying sync.WaitGroup. +func (f *Lock) Add() { + f.wg.Add(1) } -func (f *LockableFile) Unlock() error { - return f.flock(syscall.LOCK_UN | syscall.LOCK_NB) +// Done will decrememnt '1' from the underlying sync.WaitGroup. +func (f *Lock) Done() { + f.wg.Done() } -func (f *LockableFile) flock(how int) error { - return util.RetryOnEINTR(func() error { - return syscall.Flock(int(f.Fd()), how) - }) +// Close will attempt to close the lockfile and file descriptor. +func (f *Lock) Close() error { + var err error + if atomic.CompareAndSwapUint32(&f.st, 0, 1) { + // Wait until done + f.wg.Wait() + + // Ensure gets closed + defer syscall.Close(f.fd) + + // Call funlock on the file descriptor + err = util.RetryOnEINTR(func() error { + return syscall.Flock(f.fd, syscall.LOCK_UN|syscall.LOCK_NB) + }) + } + return err +} + +// Closed will return whether this lockfile has been closed (and unlocked). +func (f *Lock) Closed() bool { + return (atomic.LoadUint32(&f.st) == 1) } diff --git a/vendor/codeberg.org/gruf/go-store/storage/memory.go b/vendor/codeberg.org/gruf/go-store/storage/memory.go index 7daa4a4833..2dab562d67 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/memory.go +++ b/vendor/codeberg.org/gruf/go-store/storage/memory.go @@ -14,6 +14,7 @@ type MemoryStorage struct { ow bool // overwrites fs map[string][]byte mu sync.Mutex + st uint32 } // OpenMemory opens a new MemoryStorage instance with internal map of 'size'. @@ -27,13 +28,26 @@ func OpenMemory(size int, overwrites bool) *MemoryStorage { // Clean implements Storage.Clean(). func (st *MemoryStorage) Clean() error { + st.mu.Lock() + defer st.mu.Unlock() + if st.st == 1 { + return ErrClosed + } return nil } // ReadBytes implements Storage.ReadBytes(). func (st *MemoryStorage) ReadBytes(key string) ([]byte, error) { - // Safely check store + // Lock storage st.mu.Lock() + + // Check store open + if st.st == 1 { + st.mu.Unlock() + return nil, ErrClosed + } + + // Check for key b, ok := st.fs[key] st.mu.Unlock() @@ -48,8 +62,16 @@ func (st *MemoryStorage) ReadBytes(key string) ([]byte, error) { // ReadStream implements Storage.ReadStream(). func (st *MemoryStorage) ReadStream(key string) (io.ReadCloser, error) { - // Safely check store + // Lock storage st.mu.Lock() + + // Check store open + if st.st == 1 { + st.mu.Unlock() + return nil, ErrClosed + } + + // Check for key b, ok := st.fs[key] st.mu.Unlock() @@ -66,19 +88,24 @@ func (st *MemoryStorage) ReadStream(key string) (io.ReadCloser, error) { // WriteBytes implements Storage.WriteBytes(). func (st *MemoryStorage) WriteBytes(key string, b []byte) error { - // Safely check store + // Lock storage st.mu.Lock() + defer st.mu.Unlock() + + // Check store open + if st.st == 1 { + return ErrClosed + } + _, ok := st.fs[key] // Check for already exist if ok && !st.ow { - st.mu.Unlock() return ErrAlreadyExists } // Write + unlock st.fs[key] = bytes.Copy(b) - st.mu.Unlock() return nil } @@ -96,43 +123,66 @@ func (st *MemoryStorage) WriteStream(key string, r io.Reader) error { // Stat implements Storage.Stat(). func (st *MemoryStorage) Stat(key string) (bool, error) { + // Lock storage st.mu.Lock() + defer st.mu.Unlock() + + // Check store open + if st.st == 1 { + return false, ErrClosed + } + + // Check for key _, ok := st.fs[key] - st.mu.Unlock() return ok, nil } // Remove implements Storage.Remove(). func (st *MemoryStorage) Remove(key string) error { - // Safely check store + // Lock storage st.mu.Lock() - _, ok := st.fs[key] + defer st.mu.Unlock() - // Check in store + // Check store open + if st.st == 1 { + return ErrClosed + } + + // Check for key + _, ok := st.fs[key] if !ok { - st.mu.Unlock() return ErrNotFound } - // Delete + unlock + // Remove from store delete(st.fs, key) - st.mu.Unlock() + return nil } // Close implements Storage.Close(). func (st *MemoryStorage) Close() error { + st.mu.Lock() + st.st = 1 + st.mu.Unlock() return nil } // WalkKeys implements Storage.WalkKeys(). func (st *MemoryStorage) WalkKeys(opts WalkKeysOptions) error { - // Safely walk storage keys + // Lock storage st.mu.Lock() + defer st.mu.Unlock() + + // Check store open + if st.st == 1 { + return ErrClosed + } + + // Walk store keys for key := range st.fs { opts.WalkFn(entry(key)) } - st.mu.Unlock() return nil } diff --git a/vendor/github.com/zeebo/blake3/.gitignore b/vendor/github.com/zeebo/blake3/.gitignore deleted file mode 100644 index c6bfdf2c36..0000000000 --- a/vendor/github.com/zeebo/blake3/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*.pprof -*.test -*.txt -*.out - -/upstream diff --git a/vendor/github.com/zeebo/blake3/LICENSE b/vendor/github.com/zeebo/blake3/LICENSE deleted file mode 100644 index 3a63575d3a..0000000000 --- a/vendor/github.com/zeebo/blake3/LICENSE +++ /dev/null @@ -1,125 +0,0 @@ -This work is released into the public domain with CC0 1.0. - -------------------------------------------------------------------------------- - -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/vendor/github.com/zeebo/blake3/Makefile b/vendor/github.com/zeebo/blake3/Makefile deleted file mode 100644 index f98f0f093b..0000000000 --- a/vendor/github.com/zeebo/blake3/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -asm: internal/alg/hash/hash_avx2/impl_amd64.s internal/alg/compress/compress_sse41/impl_amd64.s - -internal/alg/hash/hash_avx2/impl_amd64.s: avo/avx2/*.go - ( cd avo; go run ./avx2 ) > internal/alg/hash/hash_avx2/impl_amd64.s - -internal/alg/compress/compress_sse41/impl_amd64.s: avo/sse41/*.go - ( cd avo; go run ./sse41 ) > internal/alg/compress/compress_sse41/impl_amd64.s - -.PHONY: test -test: - go test -race -bench=. -benchtime=1x diff --git a/vendor/github.com/zeebo/blake3/README.md b/vendor/github.com/zeebo/blake3/README.md deleted file mode 100644 index 0a0f2e1865..0000000000 --- a/vendor/github.com/zeebo/blake3/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# BLAKE3 - -

- go.dev - Go Report Card - SourceGraph -

- -Pure Go implementation of [BLAKE3](https://blake3.io) with AVX2 and SSE4.1 acceleration. - -Special thanks to the excellent [avo](https://github.com/mmcloughlin/avo) making writing vectorized version much easier. - -# Benchmarks - -## Caveats - -This library makes some different design decisions than the upstream Rust crate around internal buffering. Specifically, because it does not target the embedded system space, nor does it support multithreading, it elects to do its own internal buffering. This means that a user does not have to worry about providing large enough buffers to get the best possible performance, but it does worse on smaller input sizes. So some notes: - -- The Rust benchmarks below are all single-threaded to match this Go implementation. -- I make no attempt to get precise measurements (cpu throttling, noisy environment, etc.) so please benchmark on your own systems. -- These benchmarks are run on an i7-6700K which does not support AVX-512, so Rust is limited to use AVX2 at sizes above 8 kib. -- I tried my best to make them benchmark the same thing, but who knows? :smile: - -## Charts - -In this case, both libraries are able to avoid a lot of data copying and will use vectorized instructions to hash as fast as possible, and perform similarly. - -![Large Full Buffer](/assets/large-full-buffer.svg) - -For incremental writes, you must provide the Rust version large enough buffers so that it can use vectorized instructions. This Go library performs consistently regardless of the size being sent into the update function. - -![Incremental](/assets/incremental.svg) - -The downside of internal buffering is most apparent with small sizes as most time is spent initializing the hasher state. In terms of hashing rate, the difference is 3-4x, but in an absolute sense it's ~100ns (see tables below). If you wish to hash a large number of very small strings and you care about those nanoseconds, be sure to use the Reset method to avoid re-initializing the state. - -![Small Full Buffer](/assets/small-full-buffer.svg) - -## Timing Tables - -### Small - -| Size | Full Buffer | Reset | | Full Buffer Rate | Reset Rate | -|--------|-------------|------------|-|------------------|--------------| -| 64 b | `205ns` | `86.5ns` | | `312MB/s` | `740MB/s` | -| 256 b | `364ns` | `250ns` | | `703MB/s` | `1.03GB/s` | -| 512 b | `575ns` | `468ns` | | `892MB/s` | `1.10GB/s` | -| 768 b | `795ns` | `682ns` | | `967MB/s` | `1.13GB/s` | - -### Large - -| Size | Incremental | Full Buffer | Reset | | Incremental Rate | Full Buffer Rate | Reset Rate | -|----------|-------------|-------------|------------|-|------------------|------------------|--------------| -| 1 kib | `1.02µs` | `1.01µs` | `891ns` | | `1.00GB/s` | `1.01GB/s` | `1.15GB/s` | -| 2 kib | `2.11µs` | `2.07µs` | `1.95µs` | | `968MB/s` | `990MB/s` | `1.05GB/s` | -| 4 kib | `2.28µs` | `2.15µs` | `2.05µs` | | `1.80GB/s` | `1.90GB/s` | `2.00GB/s` | -| 8 kib | `2.64µs` | `2.52µs` | `2.44µs` | | `3.11GB/s` | `3.25GB/s` | `3.36GB/s` | -| 16 kib | `4.93µs` | `4.54µs` | `4.48µs` | | `3.33GB/s` | `3.61GB/s` | `3.66GB/s` | -| 32 kib | `9.41µs` | `8.62µs` | `8.54µs` | | `3.48GB/s` | `3.80GB/s` | `3.84GB/s` | -| 64 kib | `18.2µs` | `16.7µs` | `16.6µs` | | `3.59GB/s` | `3.91GB/s` | `3.94GB/s` | -| 128 kib | `36.3µs` | `32.9µs` | `33.1µs` | | `3.61GB/s` | `3.99GB/s` | `3.96GB/s` | -| 256 kib | `72.5µs` | `65.7µs` | `66.0µs` | | `3.62GB/s` | `3.99GB/s` | `3.97GB/s` | -| 512 kib | `145µs` | `131µs` | `132µs` | | `3.60GB/s` | `4.00GB/s` | `3.97GB/s` | -| 1024 kib | `290µs` | `262µs` | `262µs` | | `3.62GB/s` | `4.00GB/s` | `4.00GB/s` | - -### No ASM - -| Size | Incremental | Full Buffer | Reset | | Incremental Rate | Full Buffer Rate | Reset Rate | -|----------|-------------|-------------|------------|-|------------------|------------------|-------------| -| 64 b | `253ns` | `254ns` | `134ns` | | `253MB/s` | `252MB/s` | `478MB/s` | -| 256 b | `553ns` | `557ns` | `441ns` | | `463MB/s` | `459MB/s` | `580MB/s` | -| 512 b | `948ns` | `953ns` | `841ns` | | `540MB/s` | `538MB/s` | `609MB/s` | -| 768 b | `1.38µs` | `1.40µs` | `1.35µs` | | `558MB/s` | `547MB/s` | `570MB/s` | -| 1 kib | `1.77µs` | `1.77µs` | `1.70µs` | | `577MB/s` | `580MB/s` | `602MB/s` | -| | | | | | | | | -| 1024 kib | `880µs` | `883µs` | `878µs` | | `596MB/s` | `595MB/s` | `598MB/s` | - -The speed caps out at around 1 kib, so most rows have been elided from the presentation. diff --git a/vendor/github.com/zeebo/blake3/api.go b/vendor/github.com/zeebo/blake3/api.go deleted file mode 100644 index 5de263f08d..0000000000 --- a/vendor/github.com/zeebo/blake3/api.go +++ /dev/null @@ -1,166 +0,0 @@ -// Package blake3 provides an SSE4.1/AVX2 accelerated BLAKE3 implementation. -package blake3 - -import ( - "errors" - - "github.com/zeebo/blake3/internal/consts" - "github.com/zeebo/blake3/internal/utils" -) - -// Hasher is a hash.Hash for BLAKE3. -type Hasher struct { - size int - h hasher -} - -// New returns a new Hasher that has a digest size of 32 bytes. -// -// If you need more or less output bytes than that, use Digest method. -func New() *Hasher { - return &Hasher{ - size: 32, - h: hasher{ - key: consts.IV, - }, - } -} - -// NewKeyed returns a new Hasher that uses the 32 byte input key and has -// a digest size of 32 bytes. -// -// If you need more or less output bytes than that, use the Digest method. -func NewKeyed(key []byte) (*Hasher, error) { - if len(key) != 32 { - return nil, errors.New("invalid key size") - } - - h := &Hasher{ - size: 32, - h: hasher{ - flags: consts.Flag_Keyed, - }, - } - utils.KeyFromBytes(key, &h.h.key) - - return h, nil -} - -// DeriveKey derives a key based on reusable key material of any -// length, in the given context. The key will be stored in out, using -// all of its current length. -// -// Context strings must be hardcoded constants, and the recommended -// format is "[application] [commit timestamp] [purpose]", e.g., -// "example.com 2019-12-25 16:18:03 session tokens v1". -func DeriveKey(context string, material []byte, out []byte) { - h := NewDeriveKey(context) - _, _ = h.Write(material) - _, _ = h.Digest().Read(out) -} - -// NewDeriveKey returns a Hasher that is initialized with the context -// string. See DeriveKey for details. It has a digest size of 32 bytes. -// -// If you need more or less output bytes than that, use the Digest method. -func NewDeriveKey(context string) *Hasher { - // hash the context string and use that instead of IV - h := &Hasher{ - size: 32, - h: hasher{ - key: consts.IV, - flags: consts.Flag_DeriveKeyContext, - }, - } - - var buf [32]byte - _, _ = h.WriteString(context) - _, _ = h.Digest().Read(buf[:]) - - h.Reset() - utils.KeyFromBytes(buf[:], &h.h.key) - h.h.flags = consts.Flag_DeriveKeyMaterial - - return h -} - -// Write implements part of the hash.Hash interface. It never returns an error. -func (h *Hasher) Write(p []byte) (int, error) { - h.h.update(p) - return len(p), nil -} - -// WriteString is like Write but specialized to strings to avoid allocations. -func (h *Hasher) WriteString(p string) (int, error) { - h.h.updateString(p) - return len(p), nil -} - -// Reset implements part of the hash.Hash interface. It causes the Hasher to -// act as if it was newly created. -func (h *Hasher) Reset() { - h.h.reset() -} - -// Clone returns a new Hasher with the same internal state. -// -// Modifying the resulting Hasher will not modify the original Hasher, and vice versa. -func (h *Hasher) Clone() *Hasher { - return &Hasher{size: h.size, h: h.h} -} - -// Size implements part of the hash.Hash interface. It returns the number of -// bytes the hash will output in Sum. -func (h *Hasher) Size() int { - return h.size -} - -// BlockSize implements part of the hash.Hash interface. It returns the most -// natural size to write to the Hasher. -func (h *Hasher) BlockSize() int { - // TODO: is there a downside to picking this large size? - return 8192 -} - -// Sum implements part of the hash.Hash interface. It appends the digest of -// the Hasher to the provided buffer and returns it. -func (h *Hasher) Sum(b []byte) []byte { - if top := len(b) + h.size; top <= cap(b) && top >= len(b) { - h.h.finalize(b[len(b):top]) - return b[:top] - } - - tmp := make([]byte, h.size) - h.h.finalize(tmp) - return append(b, tmp...) -} - -// Digest takes a snapshot of the hash state and returns an object that can -// be used to read and seek through 2^64 bytes of digest output. -func (h *Hasher) Digest() *Digest { - var d Digest - h.h.finalizeDigest(&d) - return &d -} - -// Sum256 returns the first 256 bits of the unkeyed digest of the data. -func Sum256(data []byte) (sum [32]byte) { - out := Sum512(data) - copy(sum[:], out[:32]) - return sum -} - -// Sum512 returns the first 512 bits of the unkeyed digest of the data. -func Sum512(data []byte) (sum [64]byte) { - if len(data) <= consts.ChunkLen { - var d Digest - compressAll(&d, data, 0, consts.IV) - _, _ = d.Read(sum[:]) - return sum - } else { - h := hasher{key: consts.IV} - h.update(data) - h.finalize(sum[:]) - return sum - } -} diff --git a/vendor/github.com/zeebo/blake3/blake3.go b/vendor/github.com/zeebo/blake3/blake3.go deleted file mode 100644 index 98dedcabe9..0000000000 --- a/vendor/github.com/zeebo/blake3/blake3.go +++ /dev/null @@ -1,285 +0,0 @@ -package blake3 - -import ( - "math/bits" - "unsafe" - - "github.com/zeebo/blake3/internal/alg" - "github.com/zeebo/blake3/internal/consts" - "github.com/zeebo/blake3/internal/utils" -) - -// -// hasher contains state for a blake3 hash -// - -type hasher struct { - len uint64 - chunks uint64 - flags uint32 - key [8]uint32 - stack cvstack - buf [8192]byte -} - -func (a *hasher) reset() { - a.len = 0 - a.chunks = 0 - a.stack.occ = 0 - a.stack.lvls = [8]uint8{} - a.stack.bufn = 0 -} - -func (a *hasher) update(buf []byte) { - // relies on the first two words of a string being the same as a slice - a.updateString(*(*string)(unsafe.Pointer(&buf))) -} - -func (a *hasher) updateString(buf string) { - var input *[8192]byte - - for len(buf) > 0 { - if a.len == 0 && len(buf) > 8192 { - // relies on the data pointer being the first word in the string header - input = (*[8192]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&buf))) - buf = buf[8192:] - } else if a.len < 8192 { - n := copy(a.buf[a.len:], buf) - a.len += uint64(n) - buf = buf[n:] - continue - } else { - input = &a.buf - } - - a.consume(input) - a.len = 0 - a.chunks += 8 - } -} - -func (a *hasher) consume(input *[8192]byte) { - var out chainVector - var chain [8]uint32 - alg.HashF(input, 8192, a.chunks, a.flags, &a.key, &out, &chain) - a.stack.pushN(0, &out, 8, a.flags, &a.key) -} - -func (a *hasher) finalize(p []byte) { - var d Digest - a.finalizeDigest(&d) - _, _ = d.Read(p) -} - -func (a *hasher) finalizeDigest(d *Digest) { - if a.chunks == 0 && a.len <= consts.ChunkLen { - compressAll(d, a.buf[:a.len], a.flags, a.key) - return - } - - d.chain = a.key - d.flags = a.flags | consts.Flag_ChunkEnd - - if a.len > 64 { - var buf chainVector - alg.HashF(&a.buf, a.len, a.chunks, a.flags, &a.key, &buf, &d.chain) - - if a.len > consts.ChunkLen { - complete := (a.len - 1) / consts.ChunkLen - a.stack.pushN(0, &buf, int(complete), a.flags, &a.key) - a.chunks += complete - a.len = uint64(copy(a.buf[:], a.buf[complete*consts.ChunkLen:a.len])) - } - } - - if a.len <= 64 { - d.flags |= consts.Flag_ChunkStart - } - - d.counter = a.chunks - d.blen = uint32(a.len) % 64 - - base := a.len / 64 * 64 - if a.len > 0 && d.blen == 0 { - d.blen = 64 - base -= 64 - } - - if consts.IsLittleEndian { - copy((*[64]byte)(unsafe.Pointer(&d.block[0]))[:], a.buf[base:a.len]) - } else { - var tmp [64]byte - copy(tmp[:], a.buf[base:a.len]) - utils.BytesToWords(&tmp, &d.block) - } - - for a.stack.bufn > 0 { - a.stack.flush(a.flags, &a.key) - } - - var tmp [16]uint32 - for occ := a.stack.occ; occ != 0; occ &= occ - 1 { - col := uint(bits.TrailingZeros64(occ)) % 64 - - alg.Compress(&d.chain, &d.block, d.counter, d.blen, d.flags, &tmp) - - *(*[8]uint32)(unsafe.Pointer(&d.block[0])) = a.stack.stack[col] - *(*[8]uint32)(unsafe.Pointer(&d.block[8])) = *(*[8]uint32)(unsafe.Pointer(&tmp[0])) - - if occ == a.stack.occ { - d.chain = a.key - d.counter = 0 - d.blen = consts.BlockLen - d.flags = a.flags | consts.Flag_Parent - } - } - - d.flags |= consts.Flag_Root -} - -// -// chain value stack -// - -type chainVector = [64]uint32 - -type cvstack struct { - occ uint64 // which levels in stack are occupied - lvls [8]uint8 // what level the buf input was in - bufn int // how many pairs are loaded into buf - buf [2]chainVector - stack [64][8]uint32 -} - -func (a *cvstack) pushN(l uint8, cv *chainVector, n int, flags uint32, key *[8]uint32) { - for i := 0; i < n; i++ { - a.pushL(l, cv, i) - for a.bufn == 8 { - a.flush(flags, key) - } - } -} - -func (a *cvstack) pushL(l uint8, cv *chainVector, n int) { - bit := uint64(1) << (l & 63) - if a.occ&bit == 0 { - readChain(cv, n, &a.stack[l&63]) - a.occ ^= bit - return - } - - a.lvls[a.bufn&7] = l - writeChain(&a.stack[l&63], &a.buf[0], a.bufn) - copyChain(cv, n, &a.buf[1], a.bufn) - a.bufn++ - a.occ ^= bit -} - -func (a *cvstack) flush(flags uint32, key *[8]uint32) { - var out chainVector - alg.HashP(&a.buf[0], &a.buf[1], flags|consts.Flag_Parent, key, &out, a.bufn) - - bufn, lvls := a.bufn, a.lvls - a.bufn, a.lvls = 0, [8]uint8{} - - for i := 0; i < bufn; i++ { - a.pushL(lvls[i]+1, &out, i) - } -} - -// -// helpers to deal with reading/writing transposed values -// - -func copyChain(in *chainVector, icol int, out *chainVector, ocol int) { - type u = uintptr - type p = unsafe.Pointer - type a = *uint32 - - i := p(u(p(in)) + u(icol*4)) - o := p(u(p(out)) + u(ocol*4)) - - *a(p(u(o) + 0*32)) = *a(p(u(i) + 0*32)) - *a(p(u(o) + 1*32)) = *a(p(u(i) + 1*32)) - *a(p(u(o) + 2*32)) = *a(p(u(i) + 2*32)) - *a(p(u(o) + 3*32)) = *a(p(u(i) + 3*32)) - *a(p(u(o) + 4*32)) = *a(p(u(i) + 4*32)) - *a(p(u(o) + 5*32)) = *a(p(u(i) + 5*32)) - *a(p(u(o) + 6*32)) = *a(p(u(i) + 6*32)) - *a(p(u(o) + 7*32)) = *a(p(u(i) + 7*32)) -} - -func readChain(in *chainVector, col int, out *[8]uint32) { - type u = uintptr - type p = unsafe.Pointer - type a = *uint32 - - i := p(u(p(in)) + u(col*4)) - - out[0] = *a(p(u(i) + 0*32)) - out[1] = *a(p(u(i) + 1*32)) - out[2] = *a(p(u(i) + 2*32)) - out[3] = *a(p(u(i) + 3*32)) - out[4] = *a(p(u(i) + 4*32)) - out[5] = *a(p(u(i) + 5*32)) - out[6] = *a(p(u(i) + 6*32)) - out[7] = *a(p(u(i) + 7*32)) -} - -func writeChain(in *[8]uint32, out *chainVector, col int) { - type u = uintptr - type p = unsafe.Pointer - type a = *uint32 - - o := p(u(p(out)) + u(col*4)) - - *a(p(u(o) + 0*32)) = in[0] - *a(p(u(o) + 1*32)) = in[1] - *a(p(u(o) + 2*32)) = in[2] - *a(p(u(o) + 3*32)) = in[3] - *a(p(u(o) + 4*32)) = in[4] - *a(p(u(o) + 5*32)) = in[5] - *a(p(u(o) + 6*32)) = in[6] - *a(p(u(o) + 7*32)) = in[7] -} - -// -// compress <= chunkLen bytes in one shot -// - -func compressAll(d *Digest, in []byte, flags uint32, key [8]uint32) { - var compressed [16]uint32 - - d.chain = key - d.flags = flags | consts.Flag_ChunkStart - - for len(in) > 64 { - buf := (*[64]byte)(unsafe.Pointer(&in[0])) - - var block *[16]uint32 - if consts.IsLittleEndian { - block = (*[16]uint32)(unsafe.Pointer(buf)) - } else { - block = &d.block - utils.BytesToWords(buf, block) - } - - alg.Compress(&d.chain, block, 0, consts.BlockLen, d.flags, &compressed) - - d.chain = *(*[8]uint32)(unsafe.Pointer(&compressed[0])) - d.flags &^= consts.Flag_ChunkStart - - in = in[64:] - } - - if consts.IsLittleEndian { - copy((*[64]byte)(unsafe.Pointer(&d.block[0]))[:], in) - } else { - var tmp [64]byte - copy(tmp[:], in) - utils.BytesToWords(&tmp, &d.block) - } - - d.blen = uint32(len(in)) - d.flags |= consts.Flag_ChunkEnd | consts.Flag_Root -} diff --git a/vendor/github.com/zeebo/blake3/digest.go b/vendor/github.com/zeebo/blake3/digest.go deleted file mode 100644 index 58365d5abd..0000000000 --- a/vendor/github.com/zeebo/blake3/digest.go +++ /dev/null @@ -1,100 +0,0 @@ -package blake3 - -import ( - "fmt" - "io" - "unsafe" - - "github.com/zeebo/blake3/internal/alg" - "github.com/zeebo/blake3/internal/consts" - "github.com/zeebo/blake3/internal/utils" -) - -// Digest captures the state of a Hasher allowing reading and seeking through -// the output stream. -type Digest struct { - counter uint64 - chain [8]uint32 - block [16]uint32 - blen uint32 - flags uint32 - buf [16]uint32 - bufn int -} - -// Read reads data frm the hasher into out. It always fills the entire buffer and -// never errors. The stream will wrap around when reading past 2^64 bytes. -func (d *Digest) Read(p []byte) (n int, err error) { - n = len(p) - - if d.bufn > 0 { - n := d.slowCopy(p) - p = p[n:] - d.bufn -= n - } - - for len(p) >= 64 { - d.fillBuf() - - if consts.IsLittleEndian { - *(*[64]byte)(unsafe.Pointer(&p[0])) = *(*[64]byte)(unsafe.Pointer(&d.buf[0])) - } else { - utils.WordsToBytes(&d.buf, p) - } - - p = p[64:] - d.bufn = 0 - } - - if len(p) == 0 { - return n, nil - } - - d.fillBuf() - d.bufn -= d.slowCopy(p) - - return n, nil -} - -// Seek sets the position to the provided location. Only SeekStart and -// SeekCurrent are allowed. -func (d *Digest) Seek(offset int64, whence int) (int64, error) { - switch whence { - case io.SeekStart: - case io.SeekEnd: - return 0, fmt.Errorf("seek from end not supported") - case io.SeekCurrent: - offset += int64(consts.BlockLen*d.counter) - int64(d.bufn) - default: - return 0, fmt.Errorf("invalid whence: %d", whence) - } - if offset < 0 { - return 0, fmt.Errorf("seek before start") - } - d.setPosition(uint64(offset)) - return offset, nil -} - -func (d *Digest) setPosition(pos uint64) { - d.counter = pos / consts.BlockLen - d.fillBuf() - d.bufn -= int(pos % consts.BlockLen) -} - -func (d *Digest) slowCopy(p []byte) (n int) { - off := uint(consts.BlockLen-d.bufn) % consts.BlockLen - if consts.IsLittleEndian { - n = copy(p, (*[consts.BlockLen]byte)(unsafe.Pointer(&d.buf[0]))[off:]) - } else { - var tmp [consts.BlockLen]byte - utils.WordsToBytes(&d.buf, tmp[:]) - n = copy(p, tmp[off:]) - } - return n -} - -func (d *Digest) fillBuf() { - alg.Compress(&d.chain, &d.block, d.counter, d.blen, d.flags, &d.buf) - d.counter++ - d.bufn = consts.BlockLen -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/alg.go b/vendor/github.com/zeebo/blake3/internal/alg/alg.go deleted file mode 100644 index 239fdec5b2..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/alg.go +++ /dev/null @@ -1,18 +0,0 @@ -package alg - -import ( - "github.com/zeebo/blake3/internal/alg/compress" - "github.com/zeebo/blake3/internal/alg/hash" -) - -func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { - hash.HashF(input, length, counter, flags, key, out, chain) -} - -func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { - hash.HashP(left, right, flags, key, out, n) -} - -func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) { - compress.Compress(chain, block, counter, blen, flags, out) -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go deleted file mode 100644 index 0b26854081..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress.go +++ /dev/null @@ -1,15 +0,0 @@ -package compress - -import ( - "github.com/zeebo/blake3/internal/alg/compress/compress_pure" - "github.com/zeebo/blake3/internal/alg/compress/compress_sse41" - "github.com/zeebo/blake3/internal/consts" -) - -func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) { - if consts.HasSSE41 { - compress_sse41.Compress(chain, block, counter, blen, flags, out) - } else { - compress_pure.Compress(chain, block, counter, blen, flags, out) - } -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go deleted file mode 100644 index 66ea1fb751..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_pure/compress.go +++ /dev/null @@ -1,135 +0,0 @@ -package compress_pure - -import ( - "math/bits" - - "github.com/zeebo/blake3/internal/consts" -) - -func Compress( - chain *[8]uint32, - block *[16]uint32, - counter uint64, - blen uint32, - flags uint32, - out *[16]uint32, -) { - - *out = [16]uint32{ - chain[0], chain[1], chain[2], chain[3], - chain[4], chain[5], chain[6], chain[7], - consts.IV0, consts.IV1, consts.IV2, consts.IV3, - uint32(counter), uint32(counter >> 32), blen, flags, - } - - rcompress(out, block) -} - -func g(a, b, c, d, mx, my uint32) (uint32, uint32, uint32, uint32) { - a += b + mx - d = bits.RotateLeft32(d^a, -16) - c += d - b = bits.RotateLeft32(b^c, -12) - a += b + my - d = bits.RotateLeft32(d^a, -8) - c += d - b = bits.RotateLeft32(b^c, -7) - return a, b, c, d -} - -func rcompress(s *[16]uint32, m *[16]uint32) { - const ( - a = 10 - b = 11 - c = 12 - d = 13 - e = 14 - f = 15 - ) - - s0, s1, s2, s3 := s[0+0], s[0+1], s[0+2], s[0+3] - s4, s5, s6, s7 := s[0+4], s[0+5], s[0+6], s[0+7] - s8, s9, sa, sb := s[8+0], s[8+1], s[8+2], s[8+3] - sc, sd, se, sf := s[8+4], s[8+5], s[8+6], s[8+7] - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[0], m[1]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[2], m[3]) - s2, s6, sa, se = g(s2, s6, sa, se, m[4], m[5]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[6], m[7]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[8], m[9]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[a], m[b]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[c], m[d]) - s3, s4, s9, se = g(s3, s4, s9, se, m[e], m[f]) - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[2], m[6]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[3], m[a]) - s2, s6, sa, se = g(s2, s6, sa, se, m[7], m[0]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[4], m[d]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[1], m[b]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[c], m[5]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[9], m[e]) - s3, s4, s9, se = g(s3, s4, s9, se, m[f], m[8]) - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[3], m[4]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[a], m[c]) - s2, s6, sa, se = g(s2, s6, sa, se, m[d], m[2]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[7], m[e]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[6], m[5]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[9], m[0]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[b], m[f]) - s3, s4, s9, se = g(s3, s4, s9, se, m[8], m[1]) - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[a], m[7]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[c], m[9]) - s2, s6, sa, se = g(s2, s6, sa, se, m[e], m[3]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[d], m[f]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[4], m[0]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[b], m[2]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[5], m[8]) - s3, s4, s9, se = g(s3, s4, s9, se, m[1], m[6]) - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[c], m[d]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[9], m[b]) - s2, s6, sa, se = g(s2, s6, sa, se, m[f], m[a]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[e], m[8]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[7], m[2]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[5], m[3]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[0], m[1]) - s3, s4, s9, se = g(s3, s4, s9, se, m[6], m[4]) - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[9], m[e]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[b], m[5]) - s2, s6, sa, se = g(s2, s6, sa, se, m[8], m[c]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[f], m[1]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[d], m[3]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[0], m[a]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[2], m[6]) - s3, s4, s9, se = g(s3, s4, s9, se, m[4], m[7]) - - s0, s4, s8, sc = g(s0, s4, s8, sc, m[b], m[f]) - s1, s5, s9, sd = g(s1, s5, s9, sd, m[5], m[0]) - s2, s6, sa, se = g(s2, s6, sa, se, m[1], m[9]) - s3, s7, sb, sf = g(s3, s7, sb, sf, m[8], m[6]) - s0, s5, sa, sf = g(s0, s5, sa, sf, m[e], m[a]) - s1, s6, sb, sc = g(s1, s6, sb, sc, m[2], m[c]) - s2, s7, s8, sd = g(s2, s7, s8, sd, m[3], m[4]) - s3, s4, s9, se = g(s3, s4, s9, se, m[7], m[d]) - - s[8+0] = s8 ^ s[0] - s[8+1] = s9 ^ s[1] - s[8+2] = sa ^ s[2] - s[8+3] = sb ^ s[3] - s[8+4] = sc ^ s[4] - s[8+5] = sd ^ s[5] - s[8+6] = se ^ s[6] - s[8+7] = sf ^ s[7] - - s[0] = s0 ^ s8 - s[1] = s1 ^ s9 - s[2] = s2 ^ sa - s[3] = s3 ^ sb - s[4] = s4 ^ sc - s[5] = s5 ^ sd - s[6] = s6 ^ se - s[7] = s7 ^ sf -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s deleted file mode 100644 index 0fedf0b3ad..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_amd64.s +++ /dev/null @@ -1,560 +0,0 @@ -// Code generated by command: go run compress.go. DO NOT EDIT. - -#include "textflag.h" - -DATA iv<>+0(SB)/4, $0x6a09e667 -DATA iv<>+4(SB)/4, $0xbb67ae85 -DATA iv<>+8(SB)/4, $0x3c6ef372 -DATA iv<>+12(SB)/4, $0xa54ff53a -DATA iv<>+16(SB)/4, $0x510e527f -DATA iv<>+20(SB)/4, $0x9b05688c -DATA iv<>+24(SB)/4, $0x1f83d9ab -DATA iv<>+28(SB)/4, $0x5be0cd19 -GLOBL iv<>(SB), RODATA|NOPTR, $32 - -DATA rot16_shuf<>+0(SB)/1, $0x02 -DATA rot16_shuf<>+1(SB)/1, $0x03 -DATA rot16_shuf<>+2(SB)/1, $0x00 -DATA rot16_shuf<>+3(SB)/1, $0x01 -DATA rot16_shuf<>+4(SB)/1, $0x06 -DATA rot16_shuf<>+5(SB)/1, $0x07 -DATA rot16_shuf<>+6(SB)/1, $0x04 -DATA rot16_shuf<>+7(SB)/1, $0x05 -DATA rot16_shuf<>+8(SB)/1, $0x0a -DATA rot16_shuf<>+9(SB)/1, $0x0b -DATA rot16_shuf<>+10(SB)/1, $0x08 -DATA rot16_shuf<>+11(SB)/1, $0x09 -DATA rot16_shuf<>+12(SB)/1, $0x0e -DATA rot16_shuf<>+13(SB)/1, $0x0f -DATA rot16_shuf<>+14(SB)/1, $0x0c -DATA rot16_shuf<>+15(SB)/1, $0x0d -DATA rot16_shuf<>+16(SB)/1, $0x12 -DATA rot16_shuf<>+17(SB)/1, $0x13 -DATA rot16_shuf<>+18(SB)/1, $0x10 -DATA rot16_shuf<>+19(SB)/1, $0x11 -DATA rot16_shuf<>+20(SB)/1, $0x16 -DATA rot16_shuf<>+21(SB)/1, $0x17 -DATA rot16_shuf<>+22(SB)/1, $0x14 -DATA rot16_shuf<>+23(SB)/1, $0x15 -DATA rot16_shuf<>+24(SB)/1, $0x1a -DATA rot16_shuf<>+25(SB)/1, $0x1b -DATA rot16_shuf<>+26(SB)/1, $0x18 -DATA rot16_shuf<>+27(SB)/1, $0x19 -DATA rot16_shuf<>+28(SB)/1, $0x1e -DATA rot16_shuf<>+29(SB)/1, $0x1f -DATA rot16_shuf<>+30(SB)/1, $0x1c -DATA rot16_shuf<>+31(SB)/1, $0x1d -GLOBL rot16_shuf<>(SB), RODATA|NOPTR, $32 - -DATA rot8_shuf<>+0(SB)/1, $0x01 -DATA rot8_shuf<>+1(SB)/1, $0x02 -DATA rot8_shuf<>+2(SB)/1, $0x03 -DATA rot8_shuf<>+3(SB)/1, $0x00 -DATA rot8_shuf<>+4(SB)/1, $0x05 -DATA rot8_shuf<>+5(SB)/1, $0x06 -DATA rot8_shuf<>+6(SB)/1, $0x07 -DATA rot8_shuf<>+7(SB)/1, $0x04 -DATA rot8_shuf<>+8(SB)/1, $0x09 -DATA rot8_shuf<>+9(SB)/1, $0x0a -DATA rot8_shuf<>+10(SB)/1, $0x0b -DATA rot8_shuf<>+11(SB)/1, $0x08 -DATA rot8_shuf<>+12(SB)/1, $0x0d -DATA rot8_shuf<>+13(SB)/1, $0x0e -DATA rot8_shuf<>+14(SB)/1, $0x0f -DATA rot8_shuf<>+15(SB)/1, $0x0c -DATA rot8_shuf<>+16(SB)/1, $0x11 -DATA rot8_shuf<>+17(SB)/1, $0x12 -DATA rot8_shuf<>+18(SB)/1, $0x13 -DATA rot8_shuf<>+19(SB)/1, $0x10 -DATA rot8_shuf<>+20(SB)/1, $0x15 -DATA rot8_shuf<>+21(SB)/1, $0x16 -DATA rot8_shuf<>+22(SB)/1, $0x17 -DATA rot8_shuf<>+23(SB)/1, $0x14 -DATA rot8_shuf<>+24(SB)/1, $0x19 -DATA rot8_shuf<>+25(SB)/1, $0x1a -DATA rot8_shuf<>+26(SB)/1, $0x1b -DATA rot8_shuf<>+27(SB)/1, $0x18 -DATA rot8_shuf<>+28(SB)/1, $0x1d -DATA rot8_shuf<>+29(SB)/1, $0x1e -DATA rot8_shuf<>+30(SB)/1, $0x1f -DATA rot8_shuf<>+31(SB)/1, $0x1c -GLOBL rot8_shuf<>(SB), RODATA|NOPTR, $32 - -// func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) -// Requires: SSE, SSE2, SSE4.1, SSSE3 -TEXT ·Compress(SB), NOSPLIT, $0-40 - MOVQ chain+0(FP), AX - MOVQ block+8(FP), CX - MOVQ counter+16(FP), DX - MOVL blen+24(FP), BX - MOVL flags+28(FP), BP - MOVQ out+32(FP), SI - MOVUPS (AX), X0 - MOVUPS 16(AX), X1 - MOVUPS iv<>+0(SB), X2 - PINSRD $0x00, DX, X3 - SHRQ $0x20, DX - PINSRD $0x01, DX, X3 - PINSRD $0x02, BX, X3 - PINSRD $0x03, BP, X3 - MOVUPS (CX), X4 - MOVUPS 16(CX), X5 - MOVUPS 32(CX), X6 - MOVUPS 48(CX), X7 - MOVUPS rot16_shuf<>+0(SB), X8 - MOVUPS rot8_shuf<>+0(SB), X9 - - // round 1 - MOVAPS X4, X10 - SHUFPS $0x88, X5, X10 - PADDD X10, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X11 - PSRLL $0x0c, X1 - PSLLL $0x14, X11 - POR X11, X1 - MOVAPS X4, X4 - SHUFPS $0xdd, X5, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X6, X5 - SHUFPS $0x88, X7, X5 - SHUFPS $0x93, X5, X5 - PADDD X5, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X11 - PSRLL $0x0c, X1 - PSLLL $0x14, X11 - POR X11, X1 - MOVAPS X6, X6 - SHUFPS $0xdd, X7, X6 - SHUFPS $0x93, X6, X6 - PADDD X6, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x07, X1 - PSLLL $0x19, X7 - POR X7, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // round 2 - MOVAPS X10, X7 - SHUFPS $0xd6, X4, X7 - SHUFPS $0x39, X7, X7 - PADDD X7, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X11 - PSRLL $0x0c, X1 - PSLLL $0x14, X11 - POR X11, X1 - MOVAPS X5, X11 - SHUFPS $0xfa, X6, X11 - PSHUFD $0x0f, X10, X10 - PBLENDW $0x33, X10, X11 - PADDD X11, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X10 - PSRLL $0x07, X1 - PSLLL $0x19, X10 - POR X10, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X6, X12 - PUNPCKLLQ X4, X12 - PBLENDW $0xc0, X5, X12 - SHUFPS $0xb4, X12, X12 - PADDD X12, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X10 - PSRLL $0x0c, X1 - PSLLL $0x14, X10 - POR X10, X1 - MOVAPS X4, X10 - PUNPCKHLQ X6, X10 - MOVAPS X5, X4 - PUNPCKLLQ X10, X4 - SHUFPS $0x1e, X4, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // round 3 - MOVAPS X7, X5 - SHUFPS $0xd6, X11, X5 - SHUFPS $0x39, X5, X5 - PADDD X5, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X6 - PSRLL $0x0c, X1 - PSLLL $0x14, X6 - POR X6, X1 - MOVAPS X12, X6 - SHUFPS $0xfa, X4, X6 - PSHUFD $0x0f, X7, X7 - PBLENDW $0x33, X7, X6 - PADDD X6, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x07, X1 - PSLLL $0x19, X7 - POR X7, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X4, X10 - PUNPCKLLQ X11, X10 - PBLENDW $0xc0, X12, X10 - SHUFPS $0xb4, X10, X10 - PADDD X10, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x0c, X1 - PSLLL $0x14, X7 - POR X7, X1 - MOVAPS X11, X7 - PUNPCKHLQ X4, X7 - MOVAPS X12, X4 - PUNPCKLLQ X7, X4 - SHUFPS $0x1e, X4, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x07, X1 - PSLLL $0x19, X7 - POR X7, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // round 4 - MOVAPS X5, X7 - SHUFPS $0xd6, X6, X7 - SHUFPS $0x39, X7, X7 - PADDD X7, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X11 - PSRLL $0x0c, X1 - PSLLL $0x14, X11 - POR X11, X1 - MOVAPS X10, X11 - SHUFPS $0xfa, X4, X11 - PSHUFD $0x0f, X5, X5 - PBLENDW $0x33, X5, X11 - PADDD X11, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X4, X12 - PUNPCKLLQ X6, X12 - PBLENDW $0xc0, X10, X12 - SHUFPS $0xb4, X12, X12 - PADDD X12, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x0c, X1 - PSLLL $0x14, X5 - POR X5, X1 - MOVAPS X6, X5 - PUNPCKHLQ X4, X5 - MOVAPS X10, X4 - PUNPCKLLQ X5, X4 - SHUFPS $0x1e, X4, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // round 5 - MOVAPS X7, X5 - SHUFPS $0xd6, X11, X5 - SHUFPS $0x39, X5, X5 - PADDD X5, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X6 - PSRLL $0x0c, X1 - PSLLL $0x14, X6 - POR X6, X1 - MOVAPS X12, X6 - SHUFPS $0xfa, X4, X6 - PSHUFD $0x0f, X7, X7 - PBLENDW $0x33, X7, X6 - PADDD X6, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x07, X1 - PSLLL $0x19, X7 - POR X7, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X4, X10 - PUNPCKLLQ X11, X10 - PBLENDW $0xc0, X12, X10 - SHUFPS $0xb4, X10, X10 - PADDD X10, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x0c, X1 - PSLLL $0x14, X7 - POR X7, X1 - MOVAPS X11, X7 - PUNPCKHLQ X4, X7 - MOVAPS X12, X4 - PUNPCKLLQ X7, X4 - SHUFPS $0x1e, X4, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X7 - PSRLL $0x07, X1 - PSLLL $0x19, X7 - POR X7, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // round 6 - MOVAPS X5, X7 - SHUFPS $0xd6, X6, X7 - SHUFPS $0x39, X7, X7 - PADDD X7, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X11 - PSRLL $0x0c, X1 - PSLLL $0x14, X11 - POR X11, X1 - MOVAPS X10, X11 - SHUFPS $0xfa, X4, X11 - PSHUFD $0x0f, X5, X5 - PBLENDW $0x33, X5, X11 - PADDD X11, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X4, X12 - PUNPCKLLQ X6, X12 - PBLENDW $0xc0, X10, X12 - SHUFPS $0xb4, X12, X12 - PADDD X12, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x0c, X1 - PSLLL $0x14, X5 - POR X5, X1 - MOVAPS X6, X5 - PUNPCKHLQ X4, X5 - MOVAPS X10, X4 - PUNPCKLLQ X5, X4 - SHUFPS $0x1e, X4, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // round 7 - MOVAPS X7, X5 - SHUFPS $0xd6, X11, X5 - SHUFPS $0x39, X5, X5 - PADDD X5, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x0c, X1 - PSLLL $0x14, X5 - POR X5, X1 - MOVAPS X12, X5 - SHUFPS $0xfa, X4, X5 - PSHUFD $0x0f, X7, X6 - PBLENDW $0x33, X6, X5 - PADDD X5, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x07, X1 - PSLLL $0x19, X5 - POR X5, X1 - PSHUFD $0x93, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x39, X2, X2 - MOVAPS X4, X5 - PUNPCKLLQ X11, X5 - PBLENDW $0xc0, X12, X5 - SHUFPS $0xb4, X5, X5 - PADDD X5, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X8, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X5 - PSRLL $0x0c, X1 - PSLLL $0x14, X5 - POR X5, X1 - MOVAPS X11, X6 - PUNPCKHLQ X4, X6 - MOVAPS X12, X4 - PUNPCKLLQ X6, X4 - SHUFPS $0x1e, X4, X4 - PADDD X4, X0 - PADDD X1, X0 - PXOR X0, X3 - PSHUFB X9, X3 - PADDD X3, X2 - PXOR X2, X1 - MOVAPS X1, X4 - PSRLL $0x07, X1 - PSLLL $0x19, X4 - POR X4, X1 - PSHUFD $0x39, X0, X0 - PSHUFD $0x4e, X3, X3 - PSHUFD $0x93, X2, X2 - - // finalize - PXOR X2, X0 - PXOR X3, X1 - MOVUPS (AX), X4 - PXOR X4, X2 - MOVUPS 16(AX), X4 - PXOR X4, X3 - MOVUPS X0, (SI) - MOVUPS X1, 16(SI) - MOVUPS X2, 32(SI) - MOVUPS X3, 48(SI) - RET diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go deleted file mode 100644 index cd63e97400..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/impl_other.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !amd64 - -package compress_sse41 - -import "github.com/zeebo/blake3/internal/alg/compress/compress_pure" - -func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) { - compress_pure.Compress(chain, block, counter, blen, flags, out) -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go b/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go deleted file mode 100644 index ffd932d3c9..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/compress/compress_sse41/stubs.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build amd64 - -package compress_sse41 - -//go:noescape -func Compress(chain *[8]uint32, block *[16]uint32, counter uint64, blen uint32, flags uint32, out *[16]uint32) diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go deleted file mode 100644 index ac43abb695..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash.go +++ /dev/null @@ -1,23 +0,0 @@ -package hash - -import ( - "github.com/zeebo/blake3/internal/alg/hash/hash_avx2" - "github.com/zeebo/blake3/internal/alg/hash/hash_pure" - "github.com/zeebo/blake3/internal/consts" -) - -func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { - if consts.HasAVX2 && length > 2*consts.ChunkLen { - hash_avx2.HashF(input, length, counter, flags, key, out, chain) - } else { - hash_pure.HashF(input, length, counter, flags, key, out, chain) - } -} - -func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { - if consts.HasAVX2 && n >= 2 { - hash_avx2.HashP(left, right, flags, key, out, n) - } else { - hash_pure.HashP(left, right, flags, key, out, n) - } -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s deleted file mode 100644 index d7531664b2..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_amd64.s +++ /dev/null @@ -1,2561 +0,0 @@ -// Code generated by command: go run main.go. DO NOT EDIT. - -#include "textflag.h" - -DATA iv<>+0(SB)/4, $0x6a09e667 -DATA iv<>+4(SB)/4, $0xbb67ae85 -DATA iv<>+8(SB)/4, $0x3c6ef372 -DATA iv<>+12(SB)/4, $0xa54ff53a -DATA iv<>+16(SB)/4, $0x510e527f -DATA iv<>+20(SB)/4, $0x9b05688c -DATA iv<>+24(SB)/4, $0x1f83d9ab -DATA iv<>+28(SB)/4, $0x5be0cd19 -GLOBL iv<>(SB), RODATA|NOPTR, $32 - -DATA rot16_shuf<>+0(SB)/1, $0x02 -DATA rot16_shuf<>+1(SB)/1, $0x03 -DATA rot16_shuf<>+2(SB)/1, $0x00 -DATA rot16_shuf<>+3(SB)/1, $0x01 -DATA rot16_shuf<>+4(SB)/1, $0x06 -DATA rot16_shuf<>+5(SB)/1, $0x07 -DATA rot16_shuf<>+6(SB)/1, $0x04 -DATA rot16_shuf<>+7(SB)/1, $0x05 -DATA rot16_shuf<>+8(SB)/1, $0x0a -DATA rot16_shuf<>+9(SB)/1, $0x0b -DATA rot16_shuf<>+10(SB)/1, $0x08 -DATA rot16_shuf<>+11(SB)/1, $0x09 -DATA rot16_shuf<>+12(SB)/1, $0x0e -DATA rot16_shuf<>+13(SB)/1, $0x0f -DATA rot16_shuf<>+14(SB)/1, $0x0c -DATA rot16_shuf<>+15(SB)/1, $0x0d -DATA rot16_shuf<>+16(SB)/1, $0x12 -DATA rot16_shuf<>+17(SB)/1, $0x13 -DATA rot16_shuf<>+18(SB)/1, $0x10 -DATA rot16_shuf<>+19(SB)/1, $0x11 -DATA rot16_shuf<>+20(SB)/1, $0x16 -DATA rot16_shuf<>+21(SB)/1, $0x17 -DATA rot16_shuf<>+22(SB)/1, $0x14 -DATA rot16_shuf<>+23(SB)/1, $0x15 -DATA rot16_shuf<>+24(SB)/1, $0x1a -DATA rot16_shuf<>+25(SB)/1, $0x1b -DATA rot16_shuf<>+26(SB)/1, $0x18 -DATA rot16_shuf<>+27(SB)/1, $0x19 -DATA rot16_shuf<>+28(SB)/1, $0x1e -DATA rot16_shuf<>+29(SB)/1, $0x1f -DATA rot16_shuf<>+30(SB)/1, $0x1c -DATA rot16_shuf<>+31(SB)/1, $0x1d -GLOBL rot16_shuf<>(SB), RODATA|NOPTR, $32 - -DATA rot8_shuf<>+0(SB)/1, $0x01 -DATA rot8_shuf<>+1(SB)/1, $0x02 -DATA rot8_shuf<>+2(SB)/1, $0x03 -DATA rot8_shuf<>+3(SB)/1, $0x00 -DATA rot8_shuf<>+4(SB)/1, $0x05 -DATA rot8_shuf<>+5(SB)/1, $0x06 -DATA rot8_shuf<>+6(SB)/1, $0x07 -DATA rot8_shuf<>+7(SB)/1, $0x04 -DATA rot8_shuf<>+8(SB)/1, $0x09 -DATA rot8_shuf<>+9(SB)/1, $0x0a -DATA rot8_shuf<>+10(SB)/1, $0x0b -DATA rot8_shuf<>+11(SB)/1, $0x08 -DATA rot8_shuf<>+12(SB)/1, $0x0d -DATA rot8_shuf<>+13(SB)/1, $0x0e -DATA rot8_shuf<>+14(SB)/1, $0x0f -DATA rot8_shuf<>+15(SB)/1, $0x0c -DATA rot8_shuf<>+16(SB)/1, $0x11 -DATA rot8_shuf<>+17(SB)/1, $0x12 -DATA rot8_shuf<>+18(SB)/1, $0x13 -DATA rot8_shuf<>+19(SB)/1, $0x10 -DATA rot8_shuf<>+20(SB)/1, $0x15 -DATA rot8_shuf<>+21(SB)/1, $0x16 -DATA rot8_shuf<>+22(SB)/1, $0x17 -DATA rot8_shuf<>+23(SB)/1, $0x14 -DATA rot8_shuf<>+24(SB)/1, $0x19 -DATA rot8_shuf<>+25(SB)/1, $0x1a -DATA rot8_shuf<>+26(SB)/1, $0x1b -DATA rot8_shuf<>+27(SB)/1, $0x18 -DATA rot8_shuf<>+28(SB)/1, $0x1d -DATA rot8_shuf<>+29(SB)/1, $0x1e -DATA rot8_shuf<>+30(SB)/1, $0x1f -DATA rot8_shuf<>+31(SB)/1, $0x1c -GLOBL rot8_shuf<>(SB), RODATA|NOPTR, $32 - -DATA block_len<>+0(SB)/4, $0x00000040 -DATA block_len<>+4(SB)/4, $0x00000040 -DATA block_len<>+8(SB)/4, $0x00000040 -DATA block_len<>+12(SB)/4, $0x00000040 -DATA block_len<>+16(SB)/4, $0x00000040 -DATA block_len<>+20(SB)/4, $0x00000040 -DATA block_len<>+24(SB)/4, $0x00000040 -DATA block_len<>+28(SB)/4, $0x00000040 -GLOBL block_len<>(SB), RODATA|NOPTR, $32 - -DATA zero<>+0(SB)/4, $0x00000000 -DATA zero<>+4(SB)/4, $0x00000000 -DATA zero<>+8(SB)/4, $0x00000000 -DATA zero<>+12(SB)/4, $0x00000000 -DATA zero<>+16(SB)/4, $0x00000000 -DATA zero<>+20(SB)/4, $0x00000000 -DATA zero<>+24(SB)/4, $0x00000000 -DATA zero<>+28(SB)/4, $0x00000000 -GLOBL zero<>(SB), RODATA|NOPTR, $32 - -DATA counter<>+0(SB)/8, $0x0000000000000000 -DATA counter<>+8(SB)/8, $0x0000000000000001 -DATA counter<>+16(SB)/8, $0x0000000000000002 -DATA counter<>+24(SB)/8, $0x0000000000000003 -DATA counter<>+32(SB)/8, $0x0000000000000004 -DATA counter<>+40(SB)/8, $0x0000000000000005 -DATA counter<>+48(SB)/8, $0x0000000000000006 -DATA counter<>+56(SB)/8, $0x0000000000000007 -GLOBL counter<>(SB), RODATA|NOPTR, $64 - -// func HashF(input *[8192]byte, length uint64, counter uint64, flags uint32, key *[8]uint32, out *[32]uint32, chain *[8]uint32) -// Requires: AVX, AVX2 -TEXT ·HashF(SB), $688-56 - MOVQ input+0(FP), AX - MOVQ length+8(FP), CX - MOVQ counter+16(FP), DX - MOVL flags+24(FP), BX - MOVQ key+32(FP), BP - MOVQ out+40(FP), SI - MOVQ chain+48(FP), DI - - // Allocate local space and align it - LEAQ 31(SP), R10 - MOVQ $0x000000000000001f, R8 - NOTQ R8 - ANDQ R8, R10 - - // Skip if the length is zero - XORQ R8, R8 - XORQ R9, R9 - TESTQ CX, CX - JZ skip_compute - - // Compute complete chunks and blocks - SUBQ $0x01, CX - MOVQ CX, R8 - SHRQ $0x0a, R8 - MOVQ CX, R9 - ANDQ $0x000003c0, R9 - -skip_compute: - // Load some params into the stack (avo improvment?) - MOVL BX, 64(SP) - MOVQ DX, 72(SP) - - // Load IV into vectors - VPBROADCASTD (BP), Y0 - VPBROADCASTD 4(BP), Y1 - VPBROADCASTD 8(BP), Y2 - VPBROADCASTD 12(BP), Y3 - VPBROADCASTD 16(BP), Y4 - VPBROADCASTD 20(BP), Y5 - VPBROADCASTD 24(BP), Y6 - VPBROADCASTD 28(BP), Y7 - - // Build and store counter data on the stack - VPBROADCASTQ 72(SP), Y8 - VPADDQ counter<>+0(SB), Y8, Y8 - VPBROADCASTQ 72(SP), Y9 - VPADDQ counter<>+32(SB), Y9, Y9 - VPUNPCKLDQ Y9, Y8, Y10 - VPUNPCKHDQ Y9, Y8, Y8 - VPUNPCKLDQ Y8, Y10, Y9 - VPUNPCKHDQ Y8, Y10, Y8 - VPERMQ $0xd8, Y9, Y9 - VPERMQ $0xd8, Y8, Y8 - VMOVDQU Y9, 112(SP) - VMOVDQU Y8, 144(SP) - - // Set up block flags and variables for iteration - XORQ CX, CX - ORL $0x01, 64(SP) - -loop: - // Include end flags if last block - CMPQ CX, $0x000003c0 - JNE round_setup - ORL $0x02, 64(SP) - -round_setup: - // Load and transpose message vectors - VMOVDQU (AX)(CX*1), Y8 - VMOVDQU 1024(AX)(CX*1), Y9 - VMOVDQU 2048(AX)(CX*1), Y10 - VMOVDQU 3072(AX)(CX*1), Y11 - VMOVDQU 4096(AX)(CX*1), Y12 - VMOVDQU 5120(AX)(CX*1), Y13 - VMOVDQU 6144(AX)(CX*1), Y14 - VMOVDQU 7168(AX)(CX*1), Y15 - VMOVDQA Y0, (R10) - VPUNPCKLDQ Y9, Y8, Y0 - VPUNPCKHDQ Y9, Y8, Y8 - VPUNPCKLDQ Y11, Y10, Y9 - VPUNPCKHDQ Y11, Y10, Y10 - VPUNPCKLDQ Y13, Y12, Y11 - VPUNPCKHDQ Y13, Y12, Y12 - VPUNPCKLDQ Y15, Y14, Y13 - VPUNPCKHDQ Y15, Y14, Y14 - VPUNPCKLQDQ Y9, Y0, Y15 - VPUNPCKHQDQ Y9, Y0, Y0 - VPUNPCKLQDQ Y10, Y8, Y9 - VPUNPCKHQDQ Y10, Y8, Y8 - VPUNPCKLQDQ Y13, Y11, Y10 - VPUNPCKHQDQ Y13, Y11, Y11 - VPUNPCKLQDQ Y14, Y12, Y13 - VPUNPCKHQDQ Y14, Y12, Y12 - VINSERTI128 $0x01, X10, Y15, Y14 - VPERM2I128 $0x31, Y10, Y15, Y10 - VINSERTI128 $0x01, X11, Y0, Y15 - VPERM2I128 $0x31, Y11, Y0, Y0 - VINSERTI128 $0x01, X13, Y9, Y11 - VPERM2I128 $0x31, Y13, Y9, Y9 - VINSERTI128 $0x01, X12, Y8, Y13 - VPERM2I128 $0x31, Y12, Y8, Y8 - VMOVDQU Y14, 176(SP) - VMOVDQU Y15, 208(SP) - VMOVDQU Y11, 240(SP) - VMOVDQU Y13, 272(SP) - VMOVDQU Y10, 304(SP) - VMOVDQU Y0, 336(SP) - VMOVDQU Y9, 368(SP) - VMOVDQU Y8, 400(SP) - VMOVDQU 32(AX)(CX*1), Y0 - VMOVDQU 1056(AX)(CX*1), Y8 - VMOVDQU 2080(AX)(CX*1), Y9 - VMOVDQU 3104(AX)(CX*1), Y10 - VMOVDQU 4128(AX)(CX*1), Y11 - VMOVDQU 5152(AX)(CX*1), Y12 - VMOVDQU 6176(AX)(CX*1), Y13 - VMOVDQU 7200(AX)(CX*1), Y14 - VPUNPCKLDQ Y8, Y0, Y15 - VPUNPCKHDQ Y8, Y0, Y0 - VPUNPCKLDQ Y10, Y9, Y8 - VPUNPCKHDQ Y10, Y9, Y9 - VPUNPCKLDQ Y12, Y11, Y10 - VPUNPCKHDQ Y12, Y11, Y11 - VPUNPCKLDQ Y14, Y13, Y12 - VPUNPCKHDQ Y14, Y13, Y13 - VPUNPCKLQDQ Y8, Y15, Y14 - VPUNPCKHQDQ Y8, Y15, Y8 - VPUNPCKLQDQ Y9, Y0, Y15 - VPUNPCKHQDQ Y9, Y0, Y0 - VPUNPCKLQDQ Y12, Y10, Y9 - VPUNPCKHQDQ Y12, Y10, Y10 - VPUNPCKLQDQ Y13, Y11, Y12 - VPUNPCKHQDQ Y13, Y11, Y11 - VINSERTI128 $0x01, X9, Y14, Y13 - VPERM2I128 $0x31, Y9, Y14, Y9 - VINSERTI128 $0x01, X10, Y8, Y14 - VPERM2I128 $0x31, Y10, Y8, Y8 - VINSERTI128 $0x01, X12, Y15, Y10 - VPERM2I128 $0x31, Y12, Y15, Y12 - VINSERTI128 $0x01, X11, Y0, Y15 - VPERM2I128 $0x31, Y11, Y0, Y0 - VMOVDQU Y13, 432(SP) - VMOVDQU Y14, 464(SP) - VMOVDQU Y10, 496(SP) - VMOVDQU Y15, 528(SP) - VMOVDQU Y9, 560(SP) - VMOVDQU Y8, 592(SP) - VMOVDQU Y12, 624(SP) - VMOVDQU Y0, 656(SP) - - // Load constants for the round - VMOVDQA (R10), Y0 - VMOVDQU block_len<>+0(SB), Y8 - VPBROADCASTD 64(SP), Y9 - VPBROADCASTD iv<>+0(SB), Y10 - VPBROADCASTD iv<>+4(SB), Y11 - VPBROADCASTD iv<>+8(SB), Y12 - VPBROADCASTD iv<>+12(SB), Y13 - VMOVDQU 112(SP), Y14 - VMOVDQU 144(SP), Y15 - - // Save state for partial chunk if necessary - CMPQ CX, R9 - JNE begin_rounds - VMOVDQU Y0, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, (DI) - VMOVDQU Y1, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 4(DI) - VMOVDQU Y2, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 8(DI) - VMOVDQU Y3, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 12(DI) - VMOVDQU Y4, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 16(DI) - VMOVDQU Y5, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 20(DI) - VMOVDQU Y6, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 24(DI) - VMOVDQU Y7, 80(SP) - MOVL 80(SP)(R8*4), DX - MOVL DX, 28(DI) - -begin_rounds: - // Perform the rounds - // Round 1 - VPADDD 176(SP), Y0, Y0 - VPADDD 240(SP), Y1, Y1 - VPADDD 304(SP), Y2, Y2 - VPADDD 368(SP), Y3, Y3 - VPADDD Y4, Y0, Y0 - VPXOR Y0, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y7, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y4, Y4 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y5, Y5 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y6, Y6 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y7, Y7 - VMOVDQA Y0, (R10) - VPSRLD $0x0c, Y4, Y0 - VPSLLD $0x14, Y4, Y4 - VPOR Y0, Y4, Y0 - VPSRLD $0x0c, Y5, Y4 - VPSLLD $0x14, Y5, Y5 - VPOR Y4, Y5, Y4 - VPSRLD $0x0c, Y6, Y5 - VPSLLD $0x14, Y6, Y6 - VPOR Y5, Y6, Y5 - VPSRLD $0x0c, Y7, Y6 - VPSLLD $0x14, Y7, Y7 - VPOR Y6, Y7, Y6 - VMOVDQA (R10), Y7 - VPADDD 208(SP), Y7, Y7 - VPADDD 272(SP), Y1, Y1 - VPADDD 336(SP), Y2, Y2 - VPADDD 400(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 432(SP), Y7, Y7 - VPADDD 496(SP), Y1, Y1 - VPADDD 560(SP), Y2, Y2 - VPADDD 624(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 464(SP), Y7, Y7 - VPADDD 528(SP), Y1, Y1 - VPADDD 592(SP), Y2, Y2 - VPADDD 656(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Round 2 - VMOVDQA (R10), Y7 - VPADDD 240(SP), Y7, Y7 - VPADDD 272(SP), Y1, Y1 - VPADDD 400(SP), Y2, Y2 - VPADDD 304(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 368(SP), Y7, Y7 - VPADDD 496(SP), Y1, Y1 - VPADDD 176(SP), Y2, Y2 - VPADDD 592(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 208(SP), Y7, Y7 - VPADDD 560(SP), Y1, Y1 - VPADDD 464(SP), Y2, Y2 - VPADDD 656(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 528(SP), Y7, Y7 - VPADDD 336(SP), Y1, Y1 - VPADDD 624(SP), Y2, Y2 - VPADDD 432(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Round 3 - VMOVDQA (R10), Y7 - VPADDD 272(SP), Y7, Y7 - VPADDD 496(SP), Y1, Y1 - VPADDD 592(SP), Y2, Y2 - VPADDD 400(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 304(SP), Y7, Y7 - VPADDD 560(SP), Y1, Y1 - VPADDD 240(SP), Y2, Y2 - VPADDD 624(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 368(SP), Y7, Y7 - VPADDD 464(SP), Y1, Y1 - VPADDD 528(SP), Y2, Y2 - VPADDD 432(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 336(SP), Y7, Y7 - VPADDD 176(SP), Y1, Y1 - VPADDD 656(SP), Y2, Y2 - VPADDD 208(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Round 4 - VMOVDQA (R10), Y7 - VPADDD 496(SP), Y7, Y7 - VPADDD 560(SP), Y1, Y1 - VPADDD 624(SP), Y2, Y2 - VPADDD 592(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 400(SP), Y7, Y7 - VPADDD 464(SP), Y1, Y1 - VPADDD 272(SP), Y2, Y2 - VPADDD 656(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 304(SP), Y7, Y7 - VPADDD 528(SP), Y1, Y1 - VPADDD 336(SP), Y2, Y2 - VPADDD 208(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 176(SP), Y7, Y7 - VPADDD 240(SP), Y1, Y1 - VPADDD 432(SP), Y2, Y2 - VPADDD 368(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Round 5 - VMOVDQA (R10), Y7 - VPADDD 560(SP), Y7, Y7 - VPADDD 464(SP), Y1, Y1 - VPADDD 656(SP), Y2, Y2 - VPADDD 624(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 592(SP), Y7, Y7 - VPADDD 528(SP), Y1, Y1 - VPADDD 496(SP), Y2, Y2 - VPADDD 432(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 400(SP), Y7, Y7 - VPADDD 336(SP), Y1, Y1 - VPADDD 176(SP), Y2, Y2 - VPADDD 368(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 240(SP), Y7, Y7 - VPADDD 272(SP), Y1, Y1 - VPADDD 208(SP), Y2, Y2 - VPADDD 304(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Round 6 - VMOVDQA (R10), Y7 - VPADDD 464(SP), Y7, Y7 - VPADDD 528(SP), Y1, Y1 - VPADDD 432(SP), Y2, Y2 - VPADDD 656(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 624(SP), Y7, Y7 - VPADDD 336(SP), Y1, Y1 - VPADDD 560(SP), Y2, Y2 - VPADDD 208(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 592(SP), Y7, Y7 - VPADDD 176(SP), Y1, Y1 - VPADDD 240(SP), Y2, Y2 - VPADDD 304(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 272(SP), Y7, Y7 - VPADDD 496(SP), Y1, Y1 - VPADDD 368(SP), Y2, Y2 - VPADDD 400(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Round 7 - VMOVDQA (R10), Y7 - VPADDD 528(SP), Y7, Y7 - VPADDD 336(SP), Y1, Y1 - VPADDD 208(SP), Y2, Y2 - VPADDD 432(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 656(SP), Y7, Y7 - VPADDD 176(SP), Y1, Y1 - VPADDD 464(SP), Y2, Y2 - VPADDD 368(SP), Y3, Y3 - VPADDD Y0, Y7, Y7 - VPXOR Y7, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y5, Y2, Y2 - VPXOR Y2, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y6, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y14, Y10, Y10 - VPXOR Y10, Y0, Y0 - VPADDD Y15, Y11, Y11 - VPXOR Y11, Y4, Y4 - VPADDD Y8, Y12, Y12 - VPXOR Y12, Y5, Y5 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y6, Y6 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VMOVDQA (R10), Y7 - VPADDD 624(SP), Y7, Y7 - VPADDD 240(SP), Y1, Y1 - VPADDD 272(SP), Y2, Y2 - VPADDD 400(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot16_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot16_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot16_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x0c, Y4, Y7 - VPSLLD $0x14, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x0c, Y5, Y7 - VPSLLD $0x14, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x0c, Y6, Y7 - VPSLLD $0x14, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x0c, Y0, Y7 - VPSLLD $0x14, Y0, Y0 - VPOR Y7, Y0, Y0 - VMOVDQA (R10), Y7 - VPADDD 496(SP), Y7, Y7 - VPADDD 560(SP), Y1, Y1 - VPADDD 304(SP), Y2, Y2 - VPADDD 592(SP), Y3, Y3 - VPADDD Y4, Y7, Y7 - VPXOR Y7, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y5, Y1, Y1 - VPXOR Y1, Y14, Y14 - VPSHUFB rot8_shuf<>+0(SB), Y14, Y14 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y15, Y15 - VPSHUFB rot8_shuf<>+0(SB), Y15, Y15 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y8, Y8 - VPSHUFB rot8_shuf<>+0(SB), Y8, Y8 - VPADDD Y9, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPADDD Y14, Y13, Y13 - VPXOR Y13, Y5, Y5 - VPADDD Y15, Y10, Y10 - VPXOR Y10, Y6, Y6 - VPADDD Y8, Y11, Y11 - VPXOR Y11, Y0, Y0 - VMOVDQA Y7, (R10) - VPSRLD $0x07, Y4, Y7 - VPSLLD $0x19, Y4, Y4 - VPOR Y7, Y4, Y4 - VPSRLD $0x07, Y5, Y7 - VPSLLD $0x19, Y5, Y5 - VPOR Y7, Y5, Y5 - VPSRLD $0x07, Y6, Y7 - VPSLLD $0x19, Y6, Y6 - VPOR Y7, Y6, Y6 - VPSRLD $0x07, Y0, Y7 - VPSLLD $0x19, Y0, Y0 - VPOR Y7, Y0, Y0 - - // Finalize rounds - VPXOR Y9, Y6, Y6 - VPXOR (R10), Y10, Y7 - VPXOR Y11, Y1, Y1 - VPXOR Y12, Y2, Y2 - VPXOR Y13, Y3, Y3 - VPXOR Y14, Y0, Y0 - VPXOR Y15, Y4, Y4 - VPXOR Y8, Y5, Y5 - - // Fix up registers for next iteration - VMOVDQU Y7, Y8 - VMOVDQU Y6, Y7 - VMOVDQU Y5, Y6 - VMOVDQU Y4, Y5 - VMOVDQU Y0, Y4 - VMOVDQU Y8, Y0 - - // If we have zero complete chunks, we're done - CMPQ R8, $0x00 - JNE loop_trailer - CMPQ R9, CX - JEQ finalize - -loop_trailer: - // Increment, reset flags, and loop - CMPQ CX, $0x000003c0 - JEQ finalize - ADDQ $0x40, CX - MOVL BX, 64(SP) - JMP loop - -finalize: - // Store result into out - VMOVDQU Y0, (SI) - VMOVDQU Y1, 32(SI) - VMOVDQU Y2, 64(SI) - VMOVDQU Y3, 96(SI) - VMOVDQU Y4, 128(SI) - VMOVDQU Y5, 160(SI) - VMOVDQU Y6, 192(SI) - VMOVDQU Y7, 224(SI) - VZEROUPPER - RET - -// func HashP(left *[32]uint32, right *[32]uint32, flags uint8, key *[8]uint32, out *[32]uint32, n int) -// Requires: AVX, AVX2 -TEXT ·HashP(SB), NOSPLIT, $72-48 - MOVQ left+0(FP), AX - MOVQ right+8(FP), CX - MOVBLZX flags+16(FP), DX - MOVQ key+24(FP), BX - MOVQ out+32(FP), BP - - // Allocate local space and align it - LEAQ 31(SP), SI - MOVQ $0x000000000000001f, DI - NOTQ DI - ANDQ DI, SI - - // Set up flags value - MOVL DX, 64(SP) - - // Perform the rounds - // Round 1 - VPBROADCASTD (BX), Y0 - VPADDD (AX), Y0, Y0 - VPBROADCASTD 4(BX), Y1 - VPADDD 64(AX), Y1, Y1 - VPBROADCASTD 8(BX), Y2 - VPADDD 128(AX), Y2, Y2 - VPBROADCASTD 12(BX), Y3 - VPADDD 192(AX), Y3, Y3 - VPBROADCASTD 16(BX), Y4 - VPADDD Y4, Y0, Y0 - VMOVDQU zero<>+0(SB), Y5 - VPXOR Y0, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPBROADCASTD 20(BX), Y6 - VPADDD Y6, Y1, Y1 - VMOVDQU zero<>+0(SB), Y7 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPBROADCASTD 24(BX), Y8 - VPADDD Y8, Y2, Y2 - VMOVDQU block_len<>+0(SB), Y9 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPBROADCASTD 28(BX), Y10 - VPADDD Y10, Y3, Y3 - VPBROADCASTD 64(SP), Y11 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPBROADCASTD iv<>+0(SB), Y12 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y4, Y4 - VPBROADCASTD iv<>+4(SB), Y13 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y6, Y6 - VPBROADCASTD iv<>+8(SB), Y14 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y8, Y8 - VPBROADCASTD iv<>+12(SB), Y15 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y10, Y10 - VMOVDQA Y0, (SI) - VPSRLD $0x0c, Y4, Y0 - VPSLLD $0x14, Y4, Y4 - VPOR Y0, Y4, Y0 - VPSRLD $0x0c, Y6, Y4 - VPSLLD $0x14, Y6, Y6 - VPOR Y4, Y6, Y4 - VPSRLD $0x0c, Y8, Y6 - VPSLLD $0x14, Y8, Y8 - VPOR Y6, Y8, Y6 - VPSRLD $0x0c, Y10, Y8 - VPSLLD $0x14, Y10, Y10 - VPOR Y8, Y10, Y8 - VMOVDQA (SI), Y10 - VPADDD 32(AX), Y10, Y10 - VPADDD 96(AX), Y1, Y1 - VPADDD 160(AX), Y2, Y2 - VPADDD 224(AX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD (CX), Y10, Y10 - VPADDD 64(CX), Y1, Y1 - VPADDD 128(CX), Y2, Y2 - VPADDD 192(CX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD 32(CX), Y10, Y10 - VPADDD 96(CX), Y1, Y1 - VPADDD 160(CX), Y2, Y2 - VPADDD 224(CX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Round 2 - VMOVDQA (SI), Y10 - VPADDD 64(AX), Y10, Y10 - VPADDD 96(AX), Y1, Y1 - VPADDD 224(AX), Y2, Y2 - VPADDD 128(AX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 192(AX), Y10, Y10 - VPADDD 64(CX), Y1, Y1 - VPADDD (AX), Y2, Y2 - VPADDD 160(CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 32(AX), Y10, Y10 - VPADDD 128(CX), Y1, Y1 - VPADDD 32(CX), Y2, Y2 - VPADDD 224(CX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD 96(CX), Y10, Y10 - VPADDD 160(AX), Y1, Y1 - VPADDD 192(CX), Y2, Y2 - VPADDD (CX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Round 3 - VMOVDQA (SI), Y10 - VPADDD 96(AX), Y10, Y10 - VPADDD 64(CX), Y1, Y1 - VPADDD 160(CX), Y2, Y2 - VPADDD 224(AX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 128(AX), Y10, Y10 - VPADDD 128(CX), Y1, Y1 - VPADDD 64(AX), Y2, Y2 - VPADDD 192(CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 192(AX), Y10, Y10 - VPADDD 32(CX), Y1, Y1 - VPADDD 96(CX), Y2, Y2 - VPADDD (CX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD 160(AX), Y10, Y10 - VPADDD (AX), Y1, Y1 - VPADDD 224(CX), Y2, Y2 - VPADDD 32(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Round 4 - VMOVDQA (SI), Y10 - VPADDD 64(CX), Y10, Y10 - VPADDD 128(CX), Y1, Y1 - VPADDD 192(CX), Y2, Y2 - VPADDD 160(CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 224(AX), Y10, Y10 - VPADDD 32(CX), Y1, Y1 - VPADDD 96(AX), Y2, Y2 - VPADDD 224(CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 128(AX), Y10, Y10 - VPADDD 96(CX), Y1, Y1 - VPADDD 160(AX), Y2, Y2 - VPADDD 32(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD (AX), Y10, Y10 - VPADDD 64(AX), Y1, Y1 - VPADDD (CX), Y2, Y2 - VPADDD 192(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Round 5 - VMOVDQA (SI), Y10 - VPADDD 128(CX), Y10, Y10 - VPADDD 32(CX), Y1, Y1 - VPADDD 224(CX), Y2, Y2 - VPADDD 192(CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 160(CX), Y10, Y10 - VPADDD 96(CX), Y1, Y1 - VPADDD 64(CX), Y2, Y2 - VPADDD (CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 224(AX), Y10, Y10 - VPADDD 160(AX), Y1, Y1 - VPADDD (AX), Y2, Y2 - VPADDD 192(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD 64(AX), Y10, Y10 - VPADDD 96(AX), Y1, Y1 - VPADDD 32(AX), Y2, Y2 - VPADDD 128(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Round 6 - VMOVDQA (SI), Y10 - VPADDD 32(CX), Y10, Y10 - VPADDD 96(CX), Y1, Y1 - VPADDD (CX), Y2, Y2 - VPADDD 224(CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 192(CX), Y10, Y10 - VPADDD 160(AX), Y1, Y1 - VPADDD 128(CX), Y2, Y2 - VPADDD 32(AX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 160(CX), Y10, Y10 - VPADDD (AX), Y1, Y1 - VPADDD 64(AX), Y2, Y2 - VPADDD 128(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD 96(AX), Y10, Y10 - VPADDD 64(CX), Y1, Y1 - VPADDD 192(AX), Y2, Y2 - VPADDD 224(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Round 7 - VMOVDQA (SI), Y10 - VPADDD 96(CX), Y10, Y10 - VPADDD 160(AX), Y1, Y1 - VPADDD 32(AX), Y2, Y2 - VPADDD (CX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 224(CX), Y10, Y10 - VPADDD (AX), Y1, Y1 - VPADDD 32(CX), Y2, Y2 - VPADDD 192(AX), Y3, Y3 - VPADDD Y0, Y10, Y10 - VPXOR Y10, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y4, Y1, Y1 - VPXOR Y1, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y6, Y2, Y2 - VPXOR Y2, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y8, Y3, Y3 - VPXOR Y3, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y5, Y12, Y12 - VPXOR Y12, Y0, Y0 - VPADDD Y7, Y13, Y13 - VPXOR Y13, Y4, Y4 - VPADDD Y9, Y14, Y14 - VPXOR Y14, Y6, Y6 - VPADDD Y11, Y15, Y15 - VPXOR Y15, Y8, Y8 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VMOVDQA (SI), Y10 - VPADDD 192(CX), Y10, Y10 - VPADDD 64(AX), Y1, Y1 - VPADDD 96(AX), Y2, Y2 - VPADDD 224(AX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot16_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot16_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot16_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot16_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x0c, Y4, Y10 - VPSLLD $0x14, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x0c, Y6, Y10 - VPSLLD $0x14, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x0c, Y8, Y10 - VPSLLD $0x14, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x0c, Y0, Y10 - VPSLLD $0x14, Y0, Y0 - VPOR Y10, Y0, Y0 - VMOVDQA (SI), Y10 - VPADDD 64(CX), Y10, Y10 - VPADDD 128(CX), Y1, Y1 - VPADDD 128(AX), Y2, Y2 - VPADDD 160(CX), Y3, Y3 - VPADDD Y4, Y10, Y10 - VPXOR Y10, Y11, Y11 - VPSHUFB rot8_shuf<>+0(SB), Y11, Y11 - VPADDD Y6, Y1, Y1 - VPXOR Y1, Y5, Y5 - VPSHUFB rot8_shuf<>+0(SB), Y5, Y5 - VPADDD Y8, Y2, Y2 - VPXOR Y2, Y7, Y7 - VPSHUFB rot8_shuf<>+0(SB), Y7, Y7 - VPADDD Y0, Y3, Y3 - VPXOR Y3, Y9, Y9 - VPSHUFB rot8_shuf<>+0(SB), Y9, Y9 - VPADDD Y11, Y14, Y14 - VPXOR Y14, Y4, Y4 - VPADDD Y5, Y15, Y15 - VPXOR Y15, Y6, Y6 - VPADDD Y7, Y12, Y12 - VPXOR Y12, Y8, Y8 - VPADDD Y9, Y13, Y13 - VPXOR Y13, Y0, Y0 - VMOVDQA Y10, (SI) - VPSRLD $0x07, Y4, Y10 - VPSLLD $0x19, Y4, Y4 - VPOR Y10, Y4, Y4 - VPSRLD $0x07, Y6, Y10 - VPSLLD $0x19, Y6, Y6 - VPOR Y10, Y6, Y6 - VPSRLD $0x07, Y8, Y10 - VPSLLD $0x19, Y8, Y8 - VPOR Y10, Y8, Y8 - VPSRLD $0x07, Y0, Y10 - VPSLLD $0x19, Y0, Y0 - VPOR Y10, Y0, Y0 - - // Finalize - VPXOR (SI), Y12, Y10 - VPXOR Y13, Y1, Y1 - VPXOR Y14, Y2, Y2 - VPXOR Y15, Y3, Y3 - VPXOR Y5, Y0, Y0 - VPXOR Y7, Y4, Y4 - VPXOR Y9, Y6, Y5 - VPXOR Y11, Y8, Y6 - - // Store result into out - VMOVDQU Y10, (BP) - VMOVDQU Y1, 32(BP) - VMOVDQU Y2, 64(BP) - VMOVDQU Y3, 96(BP) - VMOVDQU Y0, 128(BP) - VMOVDQU Y4, 160(BP) - VMOVDQU Y5, 192(BP) - VMOVDQU Y6, 224(BP) - VZEROUPPER - RET diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go deleted file mode 100644 index 6139728147..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/impl_other.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !amd64 - -package hash_avx2 - -import "github.com/zeebo/blake3/internal/alg/hash/hash_pure" - -func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { - hash_pure.HashF(input, length, counter, flags, key, out, chain) -} - -func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { - hash_pure.HashP(left, right, flags, key, out, n) -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go deleted file mode 100644 index 10e949550f..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_avx2/stubs.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build amd64 - -package hash_avx2 - -//go:noescape -func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) - -//go:noescape -func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go deleted file mode 100644 index 0c6fd63cd5..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashf.go +++ /dev/null @@ -1,56 +0,0 @@ -package hash_pure - -import ( - "unsafe" - - "github.com/zeebo/blake3/internal/alg/compress" - "github.com/zeebo/blake3/internal/consts" - "github.com/zeebo/blake3/internal/utils" -) - -func HashF(input *[8192]byte, length, counter uint64, flags uint32, key *[8]uint32, out *[64]uint32, chain *[8]uint32) { - var tmp [16]uint32 - - for i := uint64(0); consts.ChunkLen*i < length && i < 8; i++ { - bchain := *key - bflags := flags | consts.Flag_ChunkStart - start := consts.ChunkLen * i - - for n := uint64(0); n < 16; n++ { - if n == 15 { - bflags |= consts.Flag_ChunkEnd - } - if start+64*n >= length { - break - } - if start+64+64*n >= length { - *chain = bchain - } - - var blockPtr *[16]uint32 - if consts.IsLittleEndian { - blockPtr = (*[16]uint32)(unsafe.Pointer(&input[consts.ChunkLen*i+consts.BlockLen*n])) - } else { - var block [16]uint32 - utils.BytesToWords((*[64]uint8)(unsafe.Pointer(&input[consts.ChunkLen*i+consts.BlockLen*n])), &block) - blockPtr = &block - } - - compress.Compress(&bchain, blockPtr, counter, consts.BlockLen, bflags, &tmp) - - bchain = *(*[8]uint32)(unsafe.Pointer(&tmp[0])) - bflags = flags - } - - out[i+0] = bchain[0] - out[i+8] = bchain[1] - out[i+16] = bchain[2] - out[i+24] = bchain[3] - out[i+32] = bchain[4] - out[i+40] = bchain[5] - out[i+48] = bchain[6] - out[i+56] = bchain[7] - - counter++ - } -} diff --git a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go b/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go deleted file mode 100644 index bee5d8dd05..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/alg/hash/hash_pure/hashp.go +++ /dev/null @@ -1,38 +0,0 @@ -package hash_pure - -import "github.com/zeebo/blake3/internal/alg/compress" - -func HashP(left, right *[64]uint32, flags uint32, key *[8]uint32, out *[64]uint32, n int) { - var tmp [16]uint32 - var block [16]uint32 - - for i := 0; i < n && i < 8; i++ { - block[0] = left[i+0] - block[1] = left[i+8] - block[2] = left[i+16] - block[3] = left[i+24] - block[4] = left[i+32] - block[5] = left[i+40] - block[6] = left[i+48] - block[7] = left[i+56] - block[8] = right[i+0] - block[9] = right[i+8] - block[10] = right[i+16] - block[11] = right[i+24] - block[12] = right[i+32] - block[13] = right[i+40] - block[14] = right[i+48] - block[15] = right[i+56] - - compress.Compress(key, &block, 0, 64, flags, &tmp) - - out[i+0] = tmp[0] - out[i+8] = tmp[1] - out[i+16] = tmp[2] - out[i+24] = tmp[3] - out[i+32] = tmp[4] - out[i+40] = tmp[5] - out[i+48] = tmp[6] - out[i+56] = tmp[7] - } -} diff --git a/vendor/github.com/zeebo/blake3/internal/consts/consts.go b/vendor/github.com/zeebo/blake3/internal/consts/consts.go deleted file mode 100644 index 89f08fe109..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/consts/consts.go +++ /dev/null @@ -1,29 +0,0 @@ -package consts - -var IV = [...]uint32{IV0, IV1, IV2, IV3, IV4, IV5, IV6, IV7} - -const ( - IV0 = 0x6A09E667 - IV1 = 0xBB67AE85 - IV2 = 0x3C6EF372 - IV3 = 0xA54FF53A - IV4 = 0x510E527F - IV5 = 0x9B05688C - IV6 = 0x1F83D9AB - IV7 = 0x5BE0CD19 -) - -const ( - Flag_ChunkStart uint32 = 1 << 0 - Flag_ChunkEnd uint32 = 1 << 1 - Flag_Parent uint32 = 1 << 2 - Flag_Root uint32 = 1 << 3 - Flag_Keyed uint32 = 1 << 4 - Flag_DeriveKeyContext uint32 = 1 << 5 - Flag_DeriveKeyMaterial uint32 = 1 << 6 -) - -const ( - BlockLen = 64 - ChunkLen = 1024 -) diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu.go deleted file mode 100644 index 1eebff9439..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/consts/cpu.go +++ /dev/null @@ -1,17 +0,0 @@ -package consts - -import ( - "os" - - "golang.org/x/sys/cpu" -) - -var ( - HasAVX2 = cpu.X86.HasAVX2 && - os.Getenv("BLAKE3_DISABLE_AVX2") == "" && - os.Getenv("BLAKE3_PUREGO") == "" - - HasSSE41 = cpu.X86.HasSSE41 && - os.Getenv("BLAKE3_DISABLE_SSE41") == "" && - os.Getenv("BLAKE3_PUREGO") == "" -) diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go deleted file mode 100644 index fb730464f2..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/consts/cpu_big.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build mips mips64 ppc64 s390x - -package consts - -const IsLittleEndian = false diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go deleted file mode 100644 index 1bae02a74c..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/consts/cpu_little.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build amd64 386 arm arm64 mipsle mips64le ppc64le riscv64 wasm - -package consts - -const IsLittleEndian = true diff --git a/vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go b/vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go deleted file mode 100644 index 5f7407a6a2..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/consts/cpu_other.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !mips,!mips64,!ppc64,!s390x,!amd64,!386,!arm,!arm64,!mipsle,!mips64le,!ppc64le,!riscv64,!wasm - -package consts - -import "unsafe" - -var IsLittleEndian = *(*uint16)(unsafe.Pointer(&[2]byte{0, 1})) != 1 diff --git a/vendor/github.com/zeebo/blake3/internal/utils/utils.go b/vendor/github.com/zeebo/blake3/internal/utils/utils.go deleted file mode 100644 index 0b36f0f0ff..0000000000 --- a/vendor/github.com/zeebo/blake3/internal/utils/utils.go +++ /dev/null @@ -1,60 +0,0 @@ -package utils - -import ( - "encoding/binary" - "unsafe" -) - -func SliceToArray32(bytes []byte) *[32]uint8 { return (*[32]uint8)(unsafe.Pointer(&bytes[0])) } -func SliceToArray64(bytes []byte) *[64]uint8 { return (*[64]uint8)(unsafe.Pointer(&bytes[0])) } - -func BytesToWords(bytes *[64]uint8, words *[16]uint32) { - words[0] = binary.LittleEndian.Uint32(bytes[0*4:]) - words[1] = binary.LittleEndian.Uint32(bytes[1*4:]) - words[2] = binary.LittleEndian.Uint32(bytes[2*4:]) - words[3] = binary.LittleEndian.Uint32(bytes[3*4:]) - words[4] = binary.LittleEndian.Uint32(bytes[4*4:]) - words[5] = binary.LittleEndian.Uint32(bytes[5*4:]) - words[6] = binary.LittleEndian.Uint32(bytes[6*4:]) - words[7] = binary.LittleEndian.Uint32(bytes[7*4:]) - words[8] = binary.LittleEndian.Uint32(bytes[8*4:]) - words[9] = binary.LittleEndian.Uint32(bytes[9*4:]) - words[10] = binary.LittleEndian.Uint32(bytes[10*4:]) - words[11] = binary.LittleEndian.Uint32(bytes[11*4:]) - words[12] = binary.LittleEndian.Uint32(bytes[12*4:]) - words[13] = binary.LittleEndian.Uint32(bytes[13*4:]) - words[14] = binary.LittleEndian.Uint32(bytes[14*4:]) - words[15] = binary.LittleEndian.Uint32(bytes[15*4:]) -} - -func WordsToBytes(words *[16]uint32, bytes []byte) { - bytes = bytes[:64] - binary.LittleEndian.PutUint32(bytes[0*4:1*4], words[0]) - binary.LittleEndian.PutUint32(bytes[1*4:2*4], words[1]) - binary.LittleEndian.PutUint32(bytes[2*4:3*4], words[2]) - binary.LittleEndian.PutUint32(bytes[3*4:4*4], words[3]) - binary.LittleEndian.PutUint32(bytes[4*4:5*4], words[4]) - binary.LittleEndian.PutUint32(bytes[5*4:6*4], words[5]) - binary.LittleEndian.PutUint32(bytes[6*4:7*4], words[6]) - binary.LittleEndian.PutUint32(bytes[7*4:8*4], words[7]) - binary.LittleEndian.PutUint32(bytes[8*4:9*4], words[8]) - binary.LittleEndian.PutUint32(bytes[9*4:10*4], words[9]) - binary.LittleEndian.PutUint32(bytes[10*4:11*4], words[10]) - binary.LittleEndian.PutUint32(bytes[11*4:12*4], words[11]) - binary.LittleEndian.PutUint32(bytes[12*4:13*4], words[12]) - binary.LittleEndian.PutUint32(bytes[13*4:14*4], words[13]) - binary.LittleEndian.PutUint32(bytes[14*4:15*4], words[14]) - binary.LittleEndian.PutUint32(bytes[15*4:16*4], words[15]) -} - -func KeyFromBytes(key []byte, out *[8]uint32) { - key = key[:32] - out[0] = binary.LittleEndian.Uint32(key[0:]) - out[1] = binary.LittleEndian.Uint32(key[4:]) - out[2] = binary.LittleEndian.Uint32(key[8:]) - out[3] = binary.LittleEndian.Uint32(key[12:]) - out[4] = binary.LittleEndian.Uint32(key[16:]) - out[5] = binary.LittleEndian.Uint32(key[20:]) - out[6] = binary.LittleEndian.Uint32(key[24:]) - out[7] = binary.LittleEndian.Uint32(key[28:]) -} diff --git a/vendor/modules.txt b/vendor/modules.txt index ff65f1ab78..f856e2f544 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -13,19 +13,18 @@ codeberg.org/gruf/go-format # codeberg.org/gruf/go-hashenc v1.0.1 ## explicit; go 1.16 codeberg.org/gruf/go-hashenc -# codeberg.org/gruf/go-mutexes v1.0.1 +# codeberg.org/gruf/go-mutexes v1.1.0 ## explicit; go 1.14 codeberg.org/gruf/go-mutexes # codeberg.org/gruf/go-nowish v1.1.0 ## explicit; go 1.14 -codeberg.org/gruf/go-nowish # codeberg.org/gruf/go-pools v1.0.2 ## explicit; go 1.16 codeberg.org/gruf/go-pools # codeberg.org/gruf/go-runners v1.2.0 ## explicit; go 1.14 codeberg.org/gruf/go-runners -# codeberg.org/gruf/go-store v1.2.2 +# codeberg.org/gruf/go-store v1.3.2 ## explicit; go 1.14 codeberg.org/gruf/go-store/kv codeberg.org/gruf/go-store/storage @@ -524,16 +523,6 @@ github.com/vmihailenco/tagparser/v2/internal/parser github.com/wagslane/go-password-validator # github.com/zeebo/blake3 v0.2.1 ## explicit; go 1.13 -github.com/zeebo/blake3 -github.com/zeebo/blake3/internal/alg -github.com/zeebo/blake3/internal/alg/compress -github.com/zeebo/blake3/internal/alg/compress/compress_pure -github.com/zeebo/blake3/internal/alg/compress/compress_sse41 -github.com/zeebo/blake3/internal/alg/hash -github.com/zeebo/blake3/internal/alg/hash/hash_avx2 -github.com/zeebo/blake3/internal/alg/hash/hash_pure -github.com/zeebo/blake3/internal/consts -github.com/zeebo/blake3/internal/utils # golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b ## explicit; go 1.17 golang.org/x/crypto/acme From 0e7f24ff268599d08a8f7122cfdfe495d9a560e4 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 18:11:27 +0100 Subject: [PATCH 25/43] test with disk storage as well --- internal/media/manager_test.go | 87 ++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index a3eb0360cd..caba1dd36e 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -27,6 +27,8 @@ import ( "testing" "time" + "codeberg.org/gruf/go-store/kv" + "codeberg.org/gruf/go-store/storage" "github.com/stretchr/testify/suite" gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20211113114307_init" "github.com/superseriousbusiness/gotosocial/internal/media" @@ -268,6 +270,91 @@ func (suite *ManagerTestSuite) TestSimpleJpegQueueSpamming() { } } +func (suite *ManagerTestSuite) TestSimpleJpegProcessBlockingWithDiskStorage() { + ctx := context.Background() + + data := func(_ context.Context) (io.Reader, int, error) { + // load bytes from a test image + b, err := os.ReadFile("./test/test-jpeg.jpg") + if err != nil { + panic(err) + } + return bytes.NewBuffer(b), len(b), nil + } + + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" + + temp := fmt.Sprintf("%s/store", os.TempDir()) + defer os.RemoveAll(temp) + + diskStorage, err := kv.OpenFile(temp, &storage.DiskConfig{}) + if err != nil { + panic(err) + } + + diskManager, err := media.NewManager(suite.db, diskStorage) + if err != nil { + panic(err) + } + suite.manager = diskManager + + // process the media with no additional info provided + processingMedia, err := diskManager.ProcessMedia(ctx, data, accountID, nil) + suite.NoError(err) + // fetch the attachment id from the processing media + attachmentID := processingMedia.AttachmentID() + + // do a blocking call to fetch the attachment + attachment, err := processingMedia.LoadAttachment(ctx) + suite.NoError(err) + suite.NotNil(attachment) + + // make sure it's got the stuff set on it that we expect + // the attachment ID and accountID we expect + suite.Equal(attachmentID, attachment.ID) + suite.Equal(accountID, attachment.AccountID) + + // file meta should be correctly derived from the image + suite.EqualValues(gtsmodel.Original{ + Width: 1920, Height: 1080, Size: 2073600, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Original) + suite.EqualValues(gtsmodel.Small{ + Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, + }, attachment.FileMeta.Small) + suite.Equal("image/jpeg", attachment.File.ContentType) + suite.Equal(269739, attachment.File.FileSize) + suite.Equal("LjBzUo#6RQR._NvzRjWF?urqV@a$", attachment.Blurhash) + + // now make sure the attachment is in the database + dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(dbAttachment) + + // make sure the processed file is in storage + processedFullBytes, err := diskStorage.Get(attachment.File.Path) + suite.NoError(err) + suite.NotEmpty(processedFullBytes) + + // load the processed bytes from our test folder, to compare + processedFullBytesExpected, err := os.ReadFile("./test/test-jpeg-processed.jpg") + suite.NoError(err) + suite.NotEmpty(processedFullBytesExpected) + + // the bytes in storage should be what we expected + suite.Equal(processedFullBytesExpected, processedFullBytes) + + // now do the same for the thumbnail and make sure it's what we expected + processedThumbnailBytes, err := diskStorage.Get(attachment.Thumbnail.Path) + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytes) + + processedThumbnailBytesExpected, err := os.ReadFile("./test/test-jpeg-thumbnail.jpg") + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytesExpected) + + suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) +} + func TestManagerTestSuite(t *testing.T) { suite.Run(t, &ManagerTestSuite{}) } From 8e6ba1de5228f999830416667124867983e4721b Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 18:11:38 +0100 Subject: [PATCH 26/43] start trying to figure out why this test is failing --- internal/api/client/account/accountverify_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/api/client/account/accountverify_test.go b/internal/api/client/account/accountverify_test.go index 702eb08362..1b59897045 100644 --- a/internal/api/client/account/accountverify_test.go +++ b/internal/api/client/account/accountverify_test.go @@ -42,7 +42,7 @@ func (suite *AccountVerifyTestSuite) TestAccountVerifyGet() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, nil, account.UpdateCredentialsPath, "") + ctx := suite.newContext(recorder, http.MethodGet, nil, account.VerifyPath, "") // call the handler suite.accountModule.AccountVerifyGETHandler(ctx) @@ -67,7 +67,7 @@ func (suite *AccountVerifyTestSuite) TestAccountVerifyGet() { suite.NoError(err) lastStatusAt, err := time.Parse(time.RFC3339, apimodelAccount.LastStatusAt) suite.NoError(err) - +aaaaaaaaaaaaaaaaaaa suite.Equal(testAccount.ID, apimodelAccount.ID) suite.Equal(testAccount.Username, apimodelAccount.Username) suite.Equal(testAccount.Username, apimodelAccount.Acct) From c12520167dc68284e2af4dd93a7723f86a413e42 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 18:12:04 +0100 Subject: [PATCH 27/43] use background context w/deadline --- internal/federation/dereferencing/account.go | 33 ++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 27591d8572..9ff829579a 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -27,6 +27,7 @@ import ( "net/url" "strings" "sync" + "time" "github.com/sirupsen/logrus" "github.com/superseriousbusiness/activity/streams" @@ -54,7 +55,7 @@ func instanceAccount(account *gtsmodel.Account) bool { // the remote instance again. // // SIDE EFFECTS: remote account will be stored in the database, or updated if it already exists (and refresh is true). -func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool, blocking bool) (*gtsmodel.Account, error) { +func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, blocking bool, refresh bool) (*gtsmodel.Account, error) { new := true // check if we already have the account in our db, and just return it unless we'd doing a refresh @@ -65,8 +66,16 @@ func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAcc // make sure the account fields are populated before returning: // even if we're not doing a refresh, the caller might want to block // until everything is loaded - err = d.populateAccountFields(ctx, remoteAccount, username, refresh, blocking) - return remoteAccount, err + if err := d.populateAccountFields(ctx, remoteAccount, username, refresh, blocking); err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error populating remoteAccount fields: %s", err) + } + + updatedAccount, err := d.db.UpdateAccount(ctx, remoteAccount) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error updating remoteAccount: %s", err) + } + + return updatedAccount, err } } @@ -193,7 +202,7 @@ func (d *deref) dereferenceAccountable(ctx context.Context, username string, rem // populateAccountFields populates any fields on the given account that weren't populated by the initial // dereferencing. This includes things like header and avatar etc. -func (d *deref) populateAccountFields(ctx context.Context, account *gtsmodel.Account, requestingUsername string, refresh bool, blocking bool) error { +func (d *deref) populateAccountFields(ctx context.Context, account *gtsmodel.Account, requestingUsername string, blocking bool, refresh bool) error { // if we're dealing with an instance account, just bail, we don't need to do anything if instanceAccount(account) { return nil @@ -230,7 +239,7 @@ func (d *deref) populateAccountFields(ctx context.Context, account *gtsmodel.Acc // // If blocking is true, then the calls to the media manager made by this function will be blocking: // in other words, the function won't return until the header and the avatar have been fully processed. -func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsmodel.Account, t transport.Transport, refresh bool, blocking bool) error { +func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsmodel.Account, t transport.Transport, blocking bool, refresh bool) error { accountURI, err := url.Parse(targetAccount.URI) if err != nil { return fmt.Errorf("fetchRemoteAccountMedia: couldn't parse account URI %s: %s", targetAccount.URI, err) @@ -270,7 +279,6 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm if err != nil { return err } - targetAccount.AvatarMediaAttachmentID = newProcessing.AttachmentID() // store it in our map to indicate it's in process d.dereferencingAvatarsLock.Lock() @@ -288,11 +296,15 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm } else { // ...otherwise do it async go func() { - if err := lockAndLoad(ctx, d.dereferencingAvatarsLock, processingMedia, d.dereferencingAvatars, targetAccount.ID); err != nil { + dlCtx, done := context.WithDeadline(context.Background(), time.Now().Add(1*time.Minute)) + if err := lockAndLoad(dlCtx, d.dereferencingAvatarsLock, processingMedia, d.dereferencingAvatars, targetAccount.ID); err != nil { logrus.Errorf("fetchRemoteAccountMedia: error during async lock and load of avatar: %s", err) } + done() }() } + + targetAccount.AvatarMediaAttachmentID = processingMedia.AttachmentID() } if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { @@ -325,7 +337,6 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm if err != nil { return err } - targetAccount.HeaderMediaAttachmentID = newProcessing.AttachmentID() // store it in our map to indicate it's in process d.dereferencingHeadersLock.Lock() @@ -343,11 +354,15 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm } else { // ...otherwise do it async go func() { - if err := lockAndLoad(ctx, d.dereferencingHeadersLock, processingMedia, d.dereferencingHeaders, targetAccount.ID); err != nil { + dlCtx, done := context.WithDeadline(context.Background(), time.Now().Add(1*time.Minute)) + if err := lockAndLoad(dlCtx, d.dereferencingHeadersLock, processingMedia, d.dereferencingHeaders, targetAccount.ID); err != nil { logrus.Errorf("fetchRemoteAccountMedia: error during async lock and load of header: %s", err) } + done() }() } + + targetAccount.HeaderMediaAttachmentID = processingMedia.AttachmentID() } return nil From a6fb93ae2ab14e43985fa45be479a0ed312e14df Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 18:12:28 +0100 Subject: [PATCH 28/43] ctx => innerctx --- internal/processing/account/update.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 758cc6600b..4d10f1d0c0 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -140,7 +140,7 @@ func (p *processor) UpdateAvatar(ctx context.Context, avatar *multipart.FileHead return nil, fmt.Errorf("UpdateAvatar: avatar with size %d exceeded max image size of %d bytes", avatar.Size, maxImageSize) } - dataFunc := func(ctx context.Context) (io.Reader, int, error) { + dataFunc := func(innerCtx context.Context) (io.Reader, int, error) { f, err := avatar.Open() return f, int(avatar.Size), err } @@ -167,7 +167,7 @@ func (p *processor) UpdateHeader(ctx context.Context, header *multipart.FileHead return nil, fmt.Errorf("UpdateHeader: header with size %d exceeded max image size of %d bytes", header.Size, maxImageSize) } - dataFunc := func(ctx context.Context) (io.Reader, int, error) { + dataFunc := func(innerCtx context.Context) (io.Reader, int, error) { f, err := header.Open() return f, int(header.Size), err } From 926b37e271f993625183935a5ba29705b280b0d1 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Mon, 24 Jan 2022 18:12:42 +0100 Subject: [PATCH 29/43] change getaccount function signature --- internal/federation/dereferencing/dereferencer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/federation/dereferencing/dereferencer.go b/internal/federation/dereferencing/dereferencer.go index daf82b91e5..855c4baf85 100644 --- a/internal/federation/dereferencing/dereferencer.go +++ b/internal/federation/dereferencing/dereferencer.go @@ -33,7 +33,7 @@ import ( // Dereferencer wraps logic and functionality for doing dereferencing of remote accounts, statuses, etc, from federated instances. type Dereferencer interface { - GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, refresh bool, blocking bool) (*gtsmodel.Account, error) + GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, blocking bool, refresh bool) (*gtsmodel.Account, error) GetRemoteStatus(ctx context.Context, username string, remoteStatusID *url.URL, refresh, includeParent bool) (*gtsmodel.Status, ap.Statusable, bool, error) EnrichRemoteStatus(ctx context.Context, username string, status *gtsmodel.Status, includeParent bool) (*gtsmodel.Status, error) From eba66d3a88880d3a4023ecb57f0ad410426f3bc1 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 25 Jan 2022 11:21:22 +0100 Subject: [PATCH 30/43] only update account in db if changed --- internal/federation/dereferencing/account.go | 74 ++++++++++++-------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 9ff829579a..0b7265723b 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -66,16 +66,20 @@ func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAcc // make sure the account fields are populated before returning: // even if we're not doing a refresh, the caller might want to block // until everything is loaded - if err := d.populateAccountFields(ctx, remoteAccount, username, refresh, blocking); err != nil { + changed, err := d.populateAccountFields(ctx, remoteAccount, username, refresh, blocking) + if err != nil { return nil, fmt.Errorf("GetRemoteAccount: error populating remoteAccount fields: %s", err) } - updatedAccount, err := d.db.UpdateAccount(ctx, remoteAccount) - if err != nil { - return nil, fmt.Errorf("GetRemoteAccount: error updating remoteAccount: %s", err) + if changed { + updatedAccount, err := d.db.UpdateAccount(ctx, remoteAccount) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error updating remoteAccount: %s", err) + } + return updatedAccount, err } - return updatedAccount, err + return remoteAccount, nil } } @@ -97,7 +101,7 @@ func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAcc } newAccount.ID = ulid - if err := d.populateAccountFields(ctx, newAccount, username, refresh, blocking); err != nil { + if _, err := d.populateAccountFields(ctx, newAccount, username, refresh, blocking); err != nil { return nil, fmt.Errorf("GetRemoteAccount: error populating further account fields: %s", err) } @@ -120,16 +124,20 @@ func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAcc } refreshedAccount.ID = remoteAccount.ID - if err := d.populateAccountFields(ctx, refreshedAccount, username, refresh, blocking); err != nil { + changed, err := d.populateAccountFields(ctx, refreshedAccount, username, refresh, blocking) + if err != nil { return nil, fmt.Errorf("GetRemoteAccount: error populating further refreshedAccount fields: %s", err) } - updatedAccount, err := d.db.UpdateAccount(ctx, refreshedAccount) - if err != nil { - return nil, fmt.Errorf("GetRemoteAccount: error updating refreshedAccount: %s", err) + if changed { + updatedAccount, err := d.db.UpdateAccount(ctx, refreshedAccount) + if err != nil { + return nil, fmt.Errorf("GetRemoteAccount: error updating refreshedAccount: %s", err) + } + return updatedAccount, nil } - return updatedAccount, nil + return refreshedAccount, nil } // dereferenceAccountable calls remoteAccountID with a GET request, and tries to parse whatever @@ -202,51 +210,57 @@ func (d *deref) dereferenceAccountable(ctx context.Context, username string, rem // populateAccountFields populates any fields on the given account that weren't populated by the initial // dereferencing. This includes things like header and avatar etc. -func (d *deref) populateAccountFields(ctx context.Context, account *gtsmodel.Account, requestingUsername string, blocking bool, refresh bool) error { +func (d *deref) populateAccountFields(ctx context.Context, account *gtsmodel.Account, requestingUsername string, blocking bool, refresh bool) (bool, error) { // if we're dealing with an instance account, just bail, we don't need to do anything if instanceAccount(account) { - return nil + return false, nil } accountURI, err := url.Parse(account.URI) if err != nil { - return fmt.Errorf("populateAccountFields: couldn't parse account URI %s: %s", account.URI, err) + return false, fmt.Errorf("populateAccountFields: couldn't parse account URI %s: %s", account.URI, err) } if blocked, err := d.db.IsDomainBlocked(ctx, accountURI.Host); blocked || err != nil { - return fmt.Errorf("populateAccountFields: domain %s is blocked", accountURI.Host) + return false, fmt.Errorf("populateAccountFields: domain %s is blocked", accountURI.Host) } t, err := d.transportController.NewTransportForUsername(ctx, requestingUsername) if err != nil { - return fmt.Errorf("populateAccountFields: error getting transport for user: %s", err) + return false, fmt.Errorf("populateAccountFields: error getting transport for user: %s", err) } // fetch the header and avatar - if err := d.fetchRemoteAccountMedia(ctx, account, t, refresh, blocking); err != nil { - return fmt.Errorf("populateAccountFields: error fetching header/avi for account: %s", err) + changed, err := d.fetchRemoteAccountMedia(ctx, account, t, refresh, blocking) + if err != nil { + return false, fmt.Errorf("populateAccountFields: error fetching header/avi for account: %s", err) } - return nil + return changed, nil } // fetchRemoteAccountMedia fetches and stores the header and avatar for a remote account, // using a transport on behalf of requestingUsername. // +// The returned boolean indicates whether anything changed -- in other words, whether the +// account should be updated in the database. +// // targetAccount's AvatarMediaAttachmentID and HeaderMediaAttachmentID will be updated as necessary. // // If refresh is true, then the media will be fetched again even if it's already been fetched before. // // If blocking is true, then the calls to the media manager made by this function will be blocking: // in other words, the function won't return until the header and the avatar have been fully processed. -func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsmodel.Account, t transport.Transport, blocking bool, refresh bool) error { +func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsmodel.Account, t transport.Transport, blocking bool, refresh bool) (bool, error) { + changed := false + accountURI, err := url.Parse(targetAccount.URI) if err != nil { - return fmt.Errorf("fetchRemoteAccountMedia: couldn't parse account URI %s: %s", targetAccount.URI, err) + return changed, fmt.Errorf("fetchRemoteAccountMedia: couldn't parse account URI %s: %s", targetAccount.URI, err) } if blocked, err := d.db.IsDomainBlocked(ctx, accountURI.Host); blocked || err != nil { - return fmt.Errorf("fetchRemoteAccountMedia: domain %s is blocked", accountURI.Host) + return changed, fmt.Errorf("fetchRemoteAccountMedia: domain %s is blocked", accountURI.Host) } if targetAccount.AvatarRemoteURL != "" && (targetAccount.AvatarMediaAttachmentID == "" || refresh) { @@ -264,7 +278,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm // we're not already processing it so start now avatarIRI, err := url.Parse(targetAccount.AvatarRemoteURL) if err != nil { - return err + return changed, err } data := func(innerCtx context.Context) (io.Reader, int, error) { @@ -277,7 +291,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm Avatar: &avatar, }) if err != nil { - return err + return changed, err } // store it in our map to indicate it's in process @@ -291,7 +305,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm // block until loaded if required... if blocking { if err := lockAndLoad(ctx, d.dereferencingAvatarsLock, processingMedia, d.dereferencingAvatars, targetAccount.ID); err != nil { - return err + return changed, err } } else { // ...otherwise do it async @@ -305,6 +319,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm } targetAccount.AvatarMediaAttachmentID = processingMedia.AttachmentID() + changed = true } if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { @@ -322,7 +337,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm // we're not already processing it so start now headerIRI, err := url.Parse(targetAccount.HeaderRemoteURL) if err != nil { - return err + return changed, err } data := func(innerCtx context.Context) (io.Reader, int, error) { @@ -335,7 +350,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm Header: &header, }) if err != nil { - return err + return changed, err } // store it in our map to indicate it's in process @@ -349,7 +364,7 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm // block until loaded if required... if blocking { if err := lockAndLoad(ctx, d.dereferencingHeadersLock, processingMedia, d.dereferencingHeaders, targetAccount.ID); err != nil { - return err + return changed, err } } else { // ...otherwise do it async @@ -363,9 +378,10 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm } targetAccount.HeaderMediaAttachmentID = processingMedia.AttachmentID() + changed = true } - return nil + return changed, nil } func lockAndLoad(ctx context.Context, lock *sync.Mutex, processing *media.ProcessingMedia, processingMap map[string]*media.ProcessingMedia, accountID string) error { From 5d9e9e0e7f7e026677e843a5897283faecfb2874 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 25 Jan 2022 12:03:25 +0100 Subject: [PATCH 31/43] fix up some account conversion logic --- .../api/client/account/accountverify_test.go | 2 +- internal/typeutils/internaltoas.go | 74 ++++++++++--------- internal/typeutils/internaltofrontend.go | 12 ++- 3 files changed, 47 insertions(+), 41 deletions(-) diff --git a/internal/api/client/account/accountverify_test.go b/internal/api/client/account/accountverify_test.go index 1b59897045..b5dfdd5e87 100644 --- a/internal/api/client/account/accountverify_test.go +++ b/internal/api/client/account/accountverify_test.go @@ -67,7 +67,7 @@ func (suite *AccountVerifyTestSuite) TestAccountVerifyGet() { suite.NoError(err) lastStatusAt, err := time.Parse(time.RFC3339, apimodelAccount.LastStatusAt) suite.NoError(err) -aaaaaaaaaaaaaaaaaaa + suite.Equal(testAccount.ID, apimodelAccount.ID) suite.Equal(testAccount.Username, apimodelAccount.Username) suite.Equal(testAccount.Username, apimodelAccount.Acct) diff --git a/internal/typeutils/internaltoas.go b/internal/typeutils/internaltoas.go index b3aaafff0d..8e28bf0f00 100644 --- a/internal/typeutils/internaltoas.go +++ b/internal/typeutils/internaltoas.go @@ -215,62 +215,64 @@ func (c *converter) AccountToAS(ctx context.Context, a *gtsmodel.Account) (vocab // Used as profile avatar. if a.AvatarMediaAttachmentID != "" { if a.AvatarMediaAttachment == nil { - avatar := >smodel.MediaAttachment{} - if err := c.db.GetByID(ctx, a.AvatarMediaAttachmentID, avatar); err != nil { - return nil, err + avatar, err := c.db.GetAttachmentByID(ctx, a.AvatarMediaAttachmentID) + if err == nil { + a.AvatarMediaAttachment = avatar } - a.AvatarMediaAttachment = avatar } - iconProperty := streams.NewActivityStreamsIconProperty() + if a.AvatarMediaAttachment != nil { + iconProperty := streams.NewActivityStreamsIconProperty() - iconImage := streams.NewActivityStreamsImage() + iconImage := streams.NewActivityStreamsImage() - mediaType := streams.NewActivityStreamsMediaTypeProperty() - mediaType.Set(a.AvatarMediaAttachment.File.ContentType) - iconImage.SetActivityStreamsMediaType(mediaType) + mediaType := streams.NewActivityStreamsMediaTypeProperty() + mediaType.Set(a.AvatarMediaAttachment.File.ContentType) + iconImage.SetActivityStreamsMediaType(mediaType) - avatarURLProperty := streams.NewActivityStreamsUrlProperty() - avatarURL, err := url.Parse(a.AvatarMediaAttachment.URL) - if err != nil { - return nil, err - } - avatarURLProperty.AppendIRI(avatarURL) - iconImage.SetActivityStreamsUrl(avatarURLProperty) + avatarURLProperty := streams.NewActivityStreamsUrlProperty() + avatarURL, err := url.Parse(a.AvatarMediaAttachment.URL) + if err != nil { + return nil, err + } + avatarURLProperty.AppendIRI(avatarURL) + iconImage.SetActivityStreamsUrl(avatarURLProperty) - iconProperty.AppendActivityStreamsImage(iconImage) - person.SetActivityStreamsIcon(iconProperty) + iconProperty.AppendActivityStreamsImage(iconImage) + person.SetActivityStreamsIcon(iconProperty) + } } // image // Used as profile header. if a.HeaderMediaAttachmentID != "" { if a.HeaderMediaAttachment == nil { - header := >smodel.MediaAttachment{} - if err := c.db.GetByID(ctx, a.HeaderMediaAttachmentID, header); err != nil { - return nil, err + header, err := c.db.GetAttachmentByID(ctx, a.HeaderMediaAttachmentID) + if err == nil { + a.HeaderMediaAttachment = header } - a.HeaderMediaAttachment = header } - headerProperty := streams.NewActivityStreamsImageProperty() + if a.HeaderMediaAttachment != nil { + headerProperty := streams.NewActivityStreamsImageProperty() - headerImage := streams.NewActivityStreamsImage() + headerImage := streams.NewActivityStreamsImage() - mediaType := streams.NewActivityStreamsMediaTypeProperty() - mediaType.Set(a.HeaderMediaAttachment.File.ContentType) - headerImage.SetActivityStreamsMediaType(mediaType) + mediaType := streams.NewActivityStreamsMediaTypeProperty() + mediaType.Set(a.HeaderMediaAttachment.File.ContentType) + headerImage.SetActivityStreamsMediaType(mediaType) - headerURLProperty := streams.NewActivityStreamsUrlProperty() - headerURL, err := url.Parse(a.HeaderMediaAttachment.URL) - if err != nil { - return nil, err - } - headerURLProperty.AppendIRI(headerURL) - headerImage.SetActivityStreamsUrl(headerURLProperty) + headerURLProperty := streams.NewActivityStreamsUrlProperty() + headerURL, err := url.Parse(a.HeaderMediaAttachment.URL) + if err != nil { + return nil, err + } + headerURLProperty.AppendIRI(headerURL) + headerImage.SetActivityStreamsUrl(headerURLProperty) - headerProperty.AppendActivityStreamsImage(headerImage) - person.SetActivityStreamsImage(headerProperty) + headerProperty.AppendActivityStreamsImage(headerImage) + person.SetActivityStreamsImage(headerProperty) + } } return person, nil diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 52e89b7d2b..989bf4a1e0 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -104,10 +104,12 @@ func (c *converter) AccountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A avi, err := c.db.GetAttachmentByID(ctx, a.AvatarMediaAttachmentID) if err == nil { a.AvatarMediaAttachment = avi - aviURL = a.AvatarMediaAttachment.URL - aviURLStatic = a.AvatarMediaAttachment.Thumbnail.URL } } + if a.AvatarMediaAttachment != nil { + aviURL = a.AvatarMediaAttachment.URL + aviURLStatic = a.AvatarMediaAttachment.Thumbnail.URL + } } // set account header fields if available @@ -118,10 +120,12 @@ func (c *converter) AccountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A avi, err := c.db.GetAttachmentByID(ctx, a.HeaderMediaAttachmentID) if err == nil { a.HeaderMediaAttachment = avi - headerURL = a.HeaderMediaAttachment.URL - headerURLStatic = a.HeaderMediaAttachment.Thumbnail.URL } } + if a.HeaderMediaAttachment != nil { + headerURL = a.HeaderMediaAttachment.URL + headerURLStatic = a.HeaderMediaAttachment.Thumbnail.URL + } } // get the fields set on this account From c156602c6679224fe48b325674022f768aa74d27 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 25 Jan 2022 13:48:13 +0100 Subject: [PATCH 32/43] ensure blocking calls to getRemoteAccount before showing stuff to client --- internal/federation/dereferencing/status.go | 2 +- internal/processing/fromfederator.go | 101 +++++++++++++++++++- 2 files changed, 99 insertions(+), 4 deletions(-) diff --git a/internal/federation/dereferencing/status.go b/internal/federation/dereferencing/status.go index 34310f4aab..cacca91b29 100644 --- a/internal/federation/dereferencing/status.go +++ b/internal/federation/dereferencing/status.go @@ -89,7 +89,7 @@ func (d *deref) GetRemoteStatus(ctx context.Context, username string, remoteStat } // do this so we know we have the remote account of the status in the db - _, err = d.GetRemoteAccount(ctx, username, accountURI, false, false) + _, err = d.GetRemoteAccount(ctx, username, accountURI, true, false) if err != nil { return nil, statusable, new, fmt.Errorf("GetRemoteStatus: couldn't derive status author: %s", err) } diff --git a/internal/processing/fromfederator.go b/internal/processing/fromfederator.go index 8b575dda87..3514614b5c 100644 --- a/internal/processing/fromfederator.go +++ b/internal/processing/fromfederator.go @@ -115,6 +115,30 @@ func (p *processor) processCreateStatusFromFederator(ctx context.Context, federa } } + // make sure the account is pinned + if status.Account == nil { + a, err := p.db.GetAccountByID(ctx, status.AccountID) + if err != nil { + return err + } + status.Account = a + } + + // do a BLOCKING get of the remote account to make sure the avi and header are cached + if status.Account.Domain != "" { + remoteAccountID, err := url.Parse(status.Account.URI) + if err != nil { + return err + } + + a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false) + if err != nil { + return err + } + + status.Account = a + } + if err := p.timelineStatus(ctx, status); err != nil { return err } @@ -133,6 +157,30 @@ func (p *processor) processCreateFaveFromFederator(ctx context.Context, federato return errors.New("like was not parseable as *gtsmodel.StatusFave") } + // make sure the account is pinned + if incomingFave.Account == nil { + a, err := p.db.GetAccountByID(ctx, incomingFave.AccountID) + if err != nil { + return err + } + incomingFave.Account = a + } + + // do a BLOCKING get of the remote account to make sure the avi and header are cached + if incomingFave.Account.Domain != "" { + remoteAccountID, err := url.Parse(incomingFave.Account.URI) + if err != nil { + return err + } + + a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false) + if err != nil { + return err + } + + incomingFave.Account = a + } + if err := p.notifyFave(ctx, incomingFave); err != nil { return err } @@ -147,6 +195,30 @@ func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context, return errors.New("incomingFollowRequest was not parseable as *gtsmodel.FollowRequest") } + // make sure the account is pinned + if followRequest.Account == nil { + a, err := p.db.GetAccountByID(ctx, followRequest.AccountID) + if err != nil { + return err + } + followRequest.Account = a + } + + // do a BLOCKING get of the remote account to make sure the avi and header are cached + if followRequest.Account.Domain != "" { + remoteAccountID, err := url.Parse(followRequest.Account.URI) + if err != nil { + return err + } + + a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false) + if err != nil { + return err + } + + followRequest.Account = a + } + if followRequest.TargetAccount == nil { a, err := p.db.GetAccountByID(ctx, followRequest.TargetAccountID) if err != nil { @@ -154,9 +226,8 @@ func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context, } followRequest.TargetAccount = a } - targetAccount := followRequest.TargetAccount - if targetAccount.Locked { + if followRequest.TargetAccount.Locked { // if the account is locked just notify the follow request and nothing else return p.notifyFollowRequest(ctx, followRequest) } @@ -171,7 +242,7 @@ func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context, return err } - return p.notifyFollow(ctx, follow, targetAccount) + return p.notifyFollow(ctx, follow, followRequest.TargetAccount) } // processCreateAnnounceFromFederator handles Activity Create and Object Announce @@ -181,6 +252,30 @@ func (p *processor) processCreateAnnounceFromFederator(ctx context.Context, fede return errors.New("announce was not parseable as *gtsmodel.Status") } + // make sure the account is pinned + if incomingAnnounce.Account == nil { + a, err := p.db.GetAccountByID(ctx, incomingAnnounce.AccountID) + if err != nil { + return err + } + incomingAnnounce.Account = a + } + + // do a BLOCKING get of the remote account to make sure the avi and header are cached + if incomingAnnounce.Account.Domain != "" { + remoteAccountID, err := url.Parse(incomingAnnounce.Account.URI) + if err != nil { + return err + } + + a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false) + if err != nil { + return err + } + + incomingAnnounce.Account = a + } + if err := p.federator.DereferenceAnnounce(ctx, incomingAnnounce, federatorMsg.ReceivingAccount.Username); err != nil { return fmt.Errorf("error dereferencing announce from federator: %s", err) } From 9aa364f1eb686be51fc31c54209b41514cbd8f8b Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 25 Jan 2022 14:33:23 +0100 Subject: [PATCH 33/43] go mod tidy --- go.mod | 2 -- go.sum | 12 ------------ 2 files changed, 14 deletions(-) diff --git a/go.mod b/go.mod index 9c33f7f36c..b2b9cb5c79 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,6 @@ require ( codeberg.org/gruf/go-format v1.0.3 // indirect codeberg.org/gruf/go-hashenc v1.0.1 // indirect codeberg.org/gruf/go-mutexes v1.1.0 // indirect - codeberg.org/gruf/go-nowish v1.1.0 // indirect codeberg.org/gruf/go-pools v1.0.2 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -106,7 +105,6 @@ require ( github.com/ugorji/go/codec v1.2.6 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/zeebo/blake3 v0.2.1 // indirect golang.org/x/mod v0.5.1 // indirect golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect diff --git a/go.sum b/go.sum index ccfb51a1c4..8980a55513 100644 --- a/go.sum +++ b/go.sum @@ -60,20 +60,15 @@ codeberg.org/gruf/go-format v1.0.3 h1:WoUGzTwZe6SIhILNvtr0qNIA7BOOCgdBlk5bUrfeii codeberg.org/gruf/go-format v1.0.3/go.mod h1:k3TLXp1dqAXdDqxlon0yEM+3FFHdNn0D6BVJTwTy5As= codeberg.org/gruf/go-hashenc v1.0.1 h1:EBvNe2wW8IPMUqT1XihB6/IM6KMJDLMFBxIUvmsy1f8= codeberg.org/gruf/go-hashenc v1.0.1/go.mod h1:IfHhPCVScOiYmJLqdCQT9bYVS1nxNTV4ewMUvFWDPtc= -codeberg.org/gruf/go-mutexes v1.0.1 h1:X9bZW74YSEplWWdCrVXAvue5ztw3w5hh+INdXTENu88= -codeberg.org/gruf/go-mutexes v1.0.1/go.mod h1:y2hbGLkWVHhNyxBOIVsA3/y2QMm6RSrYsC3sLVZ4EXM= codeberg.org/gruf/go-mutexes v1.1.0 h1:kMVWHLxdfGEZTetNVRncdBMeqS4M8dSJxSGbRYXyvKk= codeberg.org/gruf/go-mutexes v1.1.0/go.mod h1:1j/6/MBeBQUedAtAtysLLnBKogfOZAxdym0E3wlaBD8= codeberg.org/gruf/go-nowish v1.0.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= -codeberg.org/gruf/go-nowish v1.1.0 h1:rj1z0AXDhLvnxs/DazWFxYAugs6rv5vhgWJkRCgrESg= codeberg.org/gruf/go-nowish v1.1.0/go.mod h1:70nvICNcqQ9OHpF07N614Dyk7cpL5ToWU1K1ZVCec2s= codeberg.org/gruf/go-pools v1.0.2 h1:B0X6yoCL9FVmnvyoizb1SYRwMYPWwEJBjPnBMM5ILos= codeberg.org/gruf/go-pools v1.0.2/go.mod h1:MjUV3H6IASyBeBPCyCr7wjPpSNu8E2N87LG4r4TAyok= codeberg.org/gruf/go-runners v1.1.1/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBsH4= codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= -codeberg.org/gruf/go-store v1.2.2 h1:YJPzJpZv/D3t9hQC00/u76eQDScQw4++OWjfobnjHAA= -codeberg.org/gruf/go-store v1.2.2/go.mod h1:Xjw1U098th0yXF2CCx6jThQ+9FIPWAX9OGjYslO+UtE= codeberg.org/gruf/go-store v1.3.2 h1:cLTMEqyK0uF/bt1ULkRR4h41Pdgxwvw3uxSpLUublHo= codeberg.org/gruf/go-store v1.3.2/go.mod h1:g4+9h3wbwZ6IW0uhpw57xywcqiy4CIj0zQLqqtjEU1M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -728,12 +723,6 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= -github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/blake3 v0.2.1 h1:O+N0Y8Re2XAYjp0adlZDA2juyRguhMfPCgh8YIf7vyE= -github.com/zeebo/blake3 v0.2.1/go.mod h1:TSQ0KjMH+pht+bRyvVooJ1rBpvvngSGaPISafq9MxJk= -github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= -github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= @@ -949,7 +938,6 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 4e74c84148cf3a1e19e5e957122dede5b403648a Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 29 Jan 2022 12:15:51 +0100 Subject: [PATCH 34/43] update go-store to latest --- go.mod | 2 +- go.sum | 2 + .../gruf/go-store/storage/block.go | 2 +- .../gruf/go-store/storage/disk.go | 56 ++++++++++++++++--- .../gruf/go-store/storage/lock.go | 9 +-- vendor/codeberg.org/gruf/go-store/util/fs.go | 31 ---------- vendor/codeberg.org/gruf/go-store/util/sys.go | 14 +++++ vendor/modules.txt | 6 +- 8 files changed, 70 insertions(+), 52 deletions(-) create mode 100644 vendor/codeberg.org/gruf/go-store/util/sys.go diff --git a/go.mod b/go.mod index b2b9cb5c79..e157203097 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( codeberg.org/gruf/go-runners v1.2.0 - codeberg.org/gruf/go-store v1.3.2 + codeberg.org/gruf/go-store v1.3.3 github.com/ReneKroon/ttlcache v1.7.0 github.com/buckket/go-blurhash v1.1.0 github.com/coreos/go-oidc/v3 v3.1.0 diff --git a/go.sum b/go.sum index 8980a55513..85d10b2a55 100644 --- a/go.sum +++ b/go.sum @@ -71,6 +71,8 @@ codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBs codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-store v1.3.2 h1:cLTMEqyK0uF/bt1ULkRR4h41Pdgxwvw3uxSpLUublHo= codeberg.org/gruf/go-store v1.3.2/go.mod h1:g4+9h3wbwZ6IW0uhpw57xywcqiy4CIj0zQLqqtjEU1M= +codeberg.org/gruf/go-store v1.3.3 h1:fAP9FXy6HiLPxdD7cmpSzyfKXmVvZLjqn0m7HhxVT5M= +codeberg.org/gruf/go-store v1.3.3/go.mod h1:g4+9h3wbwZ6IW0uhpw57xywcqiy4CIj0zQLqqtjEU1M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= diff --git a/vendor/codeberg.org/gruf/go-store/storage/block.go b/vendor/codeberg.org/gruf/go-store/storage/block.go index 5075c7d177..c50faa10b8 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/block.go +++ b/vendor/codeberg.org/gruf/go-store/storage/block.go @@ -140,7 +140,7 @@ func OpenBlock(path string, cfg *BlockConfig) (*BlockStorage, error) { } // Open and acquire storage lock for path - lock, err := OpenLock(pb.Join(path, lockFile)) + lock, err := OpenLock(pb.Join(path, LockFile)) if err != nil { return nil, err } diff --git a/vendor/codeberg.org/gruf/go-store/storage/disk.go b/vendor/codeberg.org/gruf/go-store/storage/disk.go index 2ee00ddee6..287042886f 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/disk.go +++ b/vendor/codeberg.org/gruf/go-store/storage/disk.go @@ -5,6 +5,8 @@ import ( "io/fs" "os" "path" + _path "path" + "strings" "syscall" "codeberg.org/gruf/go-bytes" @@ -31,6 +33,11 @@ type DiskConfig struct { // Overwrite allows overwriting values of stored keys in the storage Overwrite bool + // LockFile allows specifying the filesystem path to use for the lockfile, + // providing only a filename it will store the lockfile within provided store + // path and nest the store under `path/store` to prevent access to lockfile + LockFile string + // Compression is the Compressor to use when reading / writing files, default is no compression Compression Compressor } @@ -57,11 +64,17 @@ func getDiskConfig(cfg *DiskConfig) DiskConfig { cfg.WriteBufSize = DefaultDiskConfig.WriteBufSize } + // Assume empty lockfile path == use default + if len(cfg.LockFile) < 1 { + cfg.LockFile = LockFile + } + // Return owned config copy return DiskConfig{ Transform: cfg.Transform, WriteBufSize: cfg.WriteBufSize, Overwrite: cfg.Overwrite, + LockFile: cfg.LockFile, Compression: cfg.Compression, } } @@ -76,16 +89,27 @@ type DiskStorage struct { // OpenFile opens a DiskStorage instance for given folder path and configuration func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { + // Get checked config + config := getDiskConfig(cfg) + // Acquire path builder pb := util.GetPathBuilder() defer util.PutPathBuilder(pb) - // Clean provided path, ensure ends in '/' (should - // be dir, this helps with file path trimming later) - storePath := pb.Join(path, "store") + "/" + // Clean provided store path, ensure + // ends in '/' to help later path trimming + storePath := pb.Clean(path) + "/" - // Get checked config - config := getDiskConfig(cfg) + // Clean provided lockfile path + lockfile := pb.Clean(config.LockFile) + + // Check if lockfile is an *actual* path or just filename + if lockDir, _ := _path.Split(lockfile); len(lockDir) < 1 { + // Lockfile is a filename, store must be nested under + // $storePath/store to prevent access to the lockfile + storePath += "store/" + lockfile = pb.Join(path, lockfile) + } // Attempt to open dir path file, err := os.OpenFile(storePath, defaultFileROFlags, defaultDirPerms) @@ -118,7 +142,7 @@ func OpenFile(path string, cfg *DiskConfig) (*DiskStorage, error) { } // Open and acquire storage lock for path - lock, err := OpenLock(pb.Join(path, lockFile)) + lock, err := OpenLock(lockfile) if err != nil { return nil, err } @@ -347,9 +371,27 @@ func (st *DiskStorage) filepath(key string) (string, error) { pb.AppendString(key) // Check for dir traversal outside of root - if util.IsDirTraversal(st.path, pb.StringPtr()) { + if isDirTraversal(st.path, pb.StringPtr()) { return "", ErrInvalidKey } return pb.String(), nil } + +// isDirTraversal will check if rootPlusPath is a dir traversal outside of root, +// assuming that both are cleaned and that rootPlusPath is path.Join(root, somePath) +func isDirTraversal(root, rootPlusPath string) bool { + switch { + // Root is $PWD, check for traversal out of + case root == ".": + return strings.HasPrefix(rootPlusPath, "../") + + // The path MUST be prefixed by root + case !strings.HasPrefix(rootPlusPath, root): + return true + + // In all other cases, check not equal + default: + return len(root) == len(rootPlusPath) + } +} diff --git a/vendor/codeberg.org/gruf/go-store/storage/lock.go b/vendor/codeberg.org/gruf/go-store/storage/lock.go index fae4351bf7..8a6c4c5e81 100644 --- a/vendor/codeberg.org/gruf/go-store/storage/lock.go +++ b/vendor/codeberg.org/gruf/go-store/storage/lock.go @@ -8,13 +8,8 @@ import ( "codeberg.org/gruf/go-store/util" ) -// lockFile is our standard lockfile name. -var lockFile = "store.lock" - -// IsLockKey returns whether storage key is our lockfile. -func IsLockKey(key string) bool { - return key == lockFile -} +// LockFile is our standard lockfile name. +const LockFile = "store.lock" // Lock represents a filesystem lock to ensure only one storage instance open per path. type Lock struct { diff --git a/vendor/codeberg.org/gruf/go-store/util/fs.go b/vendor/codeberg.org/gruf/go-store/util/fs.go index 93b37a2610..53fef77508 100644 --- a/vendor/codeberg.org/gruf/go-store/util/fs.go +++ b/vendor/codeberg.org/gruf/go-store/util/fs.go @@ -3,30 +3,10 @@ package util import ( "io/fs" "os" - "strings" - "syscall" "codeberg.org/gruf/go-fastpath" ) -// IsDirTraversal will check if rootPlusPath is a dir traversal outside of root, -// assuming that both are cleaned and that rootPlusPath is path.Join(root, somePath) -func IsDirTraversal(root string, rootPlusPath string) bool { - switch { - // Root is $PWD, check for traversal out of - case root == ".": - return strings.HasPrefix(rootPlusPath, "../") - - // The path MUST be prefixed by root - case !strings.HasPrefix(rootPlusPath, root): - return true - - // In all other cases, check not equal - default: - return len(root) == len(rootPlusPath) - } -} - // WalkDir traverses the dir tree of the supplied path, performing the supplied walkFn on each entry func WalkDir(pb *fastpath.Builder, path string, walkFn func(string, fs.DirEntry)) error { // Read supplied dir path @@ -100,14 +80,3 @@ func cleanDirs(pb *fastpath.Builder, path string) error { } return nil } - -// RetryOnEINTR is a low-level filesystem function for retrying syscalls on O_EINTR received -func RetryOnEINTR(do func() error) error { - for { - err := do() - if err == syscall.EINTR { - continue - } - return err - } -} diff --git a/vendor/codeberg.org/gruf/go-store/util/sys.go b/vendor/codeberg.org/gruf/go-store/util/sys.go new file mode 100644 index 0000000000..6661029e59 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-store/util/sys.go @@ -0,0 +1,14 @@ +package util + +import "syscall" + +// RetryOnEINTR is a low-level filesystem function for retrying syscalls on O_EINTR received +func RetryOnEINTR(do func() error) error { + for { + err := do() + if err == syscall.EINTR { + continue + } + return err + } +} diff --git a/vendor/modules.txt b/vendor/modules.txt index f856e2f544..2ef54775b1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -16,15 +16,13 @@ codeberg.org/gruf/go-hashenc # codeberg.org/gruf/go-mutexes v1.1.0 ## explicit; go 1.14 codeberg.org/gruf/go-mutexes -# codeberg.org/gruf/go-nowish v1.1.0 -## explicit; go 1.14 # codeberg.org/gruf/go-pools v1.0.2 ## explicit; go 1.16 codeberg.org/gruf/go-pools # codeberg.org/gruf/go-runners v1.2.0 ## explicit; go 1.14 codeberg.org/gruf/go-runners -# codeberg.org/gruf/go-store v1.3.2 +# codeberg.org/gruf/go-store v1.3.3 ## explicit; go 1.14 codeberg.org/gruf/go-store/kv codeberg.org/gruf/go-store/storage @@ -521,8 +519,6 @@ github.com/vmihailenco/tagparser/v2/internal/parser # github.com/wagslane/go-password-validator v0.3.0 ## explicit; go 1.16 github.com/wagslane/go-password-validator -# github.com/zeebo/blake3 v0.2.1 -## explicit; go 1.13 # golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b ## explicit; go 1.17 golang.org/x/crypto/acme From d9a778a795fe8c235077bc0e8d904ba5695c5191 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Sat, 29 Jan 2022 12:16:12 +0100 Subject: [PATCH 35/43] put store lock file in base of storage --- cmd/gotosocial/action/server/server.go | 6 +++++- internal/media/manager_test.go | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index 5c1192b561..ae43995e58 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -24,9 +24,11 @@ import ( "net/http" "os" "os/signal" + "path" "syscall" "codeberg.org/gruf/go-store/kv" + "codeberg.org/gruf/go-store/storage" "github.com/sirupsen/logrus" "github.com/spf13/viper" "github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action" @@ -99,7 +101,9 @@ var Start action.GTSAction = func(ctx context.Context) error { // Open the storage backend storageBasePath := viper.GetString(config.Keys.StorageLocalBasePath) - storage, err := kv.OpenFile(storageBasePath, nil) + storage, err := kv.OpenFile(storageBasePath, &storage.DiskConfig{ + LockFile: path.Join(storageBasePath, "store.lock"), // put the store lockfile in the storage dir itself + }) if err != nil { return fmt.Errorf("error creating storage backend: %s", err) } diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index caba1dd36e..a9419754c0 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -24,6 +24,7 @@ import ( "fmt" "io" "os" + "path" "testing" "time" @@ -284,10 +285,12 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessBlockingWithDiskStorage() { accountID := "01FS1X72SK9ZPW0J1QQ68BD264" - temp := fmt.Sprintf("%s/store", os.TempDir()) + temp := fmt.Sprintf("%s/gotosocial-test", os.TempDir()) defer os.RemoveAll(temp) - diskStorage, err := kv.OpenFile(temp, &storage.DiskConfig{}) + diskStorage, err := kv.OpenFile(temp, &storage.DiskConfig{ + LockFile: path.Join(temp, "store.lock"), + }) if err != nil { panic(err) } From 9db58dfd57784dee15c96b630bfbe74c991f518a Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 10:06:43 +0100 Subject: [PATCH 36/43] add comment explaining store.lock --- cmd/gotosocial/action/server/server.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index ae43995e58..d71ef5b4f4 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -102,7 +102,12 @@ var Start action.GTSAction = func(ctx context.Context) error { // Open the storage backend storageBasePath := viper.GetString(config.Keys.StorageLocalBasePath) storage, err := kv.OpenFile(storageBasePath, &storage.DiskConfig{ - LockFile: path.Join(storageBasePath, "store.lock"), // put the store lockfile in the storage dir itself + // Put the store lockfile in the storage dir itself. + // Normally this would not be safe, since we could end up + // overwriting the lockfile if we store a file called 'store.lock'. + // However, in this case it's OK because the keys are set by + // GtS and not the user, so we know we're never going to overwrite it. + LockFile: path.Join(storageBasePath, "store.lock"), }) if err != nil { return fmt.Errorf("error creating storage backend: %s", err) From e811d03cc94f42ea5aa0b4eb8d468d01fdf6d31c Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 10:08:27 +0100 Subject: [PATCH 37/43] update outdated comment --- internal/federation/dereferencing/account.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index 0b7265723b..d87192d3a8 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -47,12 +47,11 @@ func instanceAccount(account *gtsmodel.Account) bool { } // GetRemoteAccount completely dereferences a remote account, converts it to a GtS model account, -// puts it in the database, and returns it to a caller. The boolean indicates whether the account is new -// to us or not. If we haven't seen the account before, bool will be true. If we have seen the account before, -// it will be false. +// puts it in the database, and returns it to a caller. // // Refresh indicates whether--if the account exists in our db already--it should be refreshed by calling -// the remote instance again. +// the remote instance again. Blocking indicates whether the function should block until processing of +// the fetched account is complete. // // SIDE EFFECTS: remote account will be stored in the database, or updated if it already exists (and refresh is true). func (d *deref) GetRemoteAccount(ctx context.Context, username string, remoteAccountID *url.URL, blocking bool, refresh bool) (*gtsmodel.Account, error) { From 3301148bb73a0f5f32c49417daed6d914c9ec05e Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 12:17:53 +0100 Subject: [PATCH 38/43] merge fixup --- cmd/gotosocial/action/server/server.go | 2 +- internal/api/client/media/mediaupdate_test.go | 8 ++++---- internal/api/s2s/webfinger/webfingerget_test.go | 4 ++-- internal/processing/admin/emoji.go | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index b8bf622742..8686f6a7fa 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -138,7 +138,7 @@ var Start action.GTSAction = func(ctx context.Context) error { } // create and start the message processor using the other services we've created so far - processor := processing.NewProcessor(typeConverter, federator, oauthServer, mediaHandler, storage, dbService, emailSender) + processor := processing.NewProcessor(typeConverter, federator, oauthServer, mediaManager, storage, dbService, emailSender) if err := processor.Start(ctx); err != nil { return fmt.Errorf("error starting processor: %s", err) } diff --git a/internal/api/client/media/mediaupdate_test.go b/internal/api/client/media/mediaupdate_test.go index cac6c304e6..b99c89c06b 100644 --- a/internal/api/client/media/mediaupdate_test.go +++ b/internal/api/client/media/mediaupdate_test.go @@ -54,7 +54,7 @@ type MediaUpdateTestSuite struct { storage *kv.KVStore federator federation.Federator tc typeutils.TypeConverter - mediaHandler media.Handler + mediaManager media.Manager oauthServer oauth.Server emailSender email.Sender processor processing.Processor @@ -82,11 +82,11 @@ func (suite *MediaUpdateTestSuite) SetupSuite() { suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() suite.tc = testrig.NewTestTypeConverter(suite.db) - suite.mediaHandler = testrig.NewTestMediaHandler(suite.db, suite.storage) + suite.mediaManager = testrig.NewTestMediaManager(suite.db, suite.storage) suite.oauthServer = testrig.NewTestOauthServer(suite.db) - suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) + suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage, suite.mediaManager) suite.emailSender = testrig.NewEmailSender("../../../../web/template/", nil) - suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender) + suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator, suite.emailSender, suite.mediaManager) // setup module being tested suite.mediaModule = mediamodule.New(suite.processor).(*mediamodule.Module) diff --git a/internal/api/s2s/webfinger/webfingerget_test.go b/internal/api/s2s/webfinger/webfingerget_test.go index d3b0c32e89..3d271a260c 100644 --- a/internal/api/s2s/webfinger/webfingerget_test.go +++ b/internal/api/s2s/webfinger/webfingerget_test.go @@ -69,7 +69,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUser() { func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByHost() { viper.Set(config.Keys.Host, "gts.example.org") viper.Set(config.Keys.AccountDomain, "example.org") - suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaHandler(suite.db, suite.storage), suite.storage, suite.db, suite.emailSender) + suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaManager(suite.db, suite.storage), suite.storage, suite.db, suite.emailSender) suite.webfingerModule = webfinger.New(suite.processor).(*webfinger.Module) targetAccount := accountDomainAccount() @@ -103,7 +103,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByHo func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByAccountDomain() { viper.Set(config.Keys.Host, "gts.example.org") viper.Set(config.Keys.AccountDomain, "example.org") - suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaHandler(suite.db, suite.storage), suite.storage, suite.db, suite.emailSender) + suite.processor = processing.NewProcessor(suite.tc, suite.federator, testrig.NewTestOauthServer(suite.db), testrig.NewTestMediaManager(suite.db, suite.storage), suite.storage, suite.db, suite.emailSender) suite.webfingerModule = webfinger.New(suite.processor).(*webfinger.Module) targetAccount := accountDomainAccount() diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index bb9f4ecb52..6ef78aa658 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -20,6 +20,7 @@ package admin import ( "context" + "errors" "fmt" "io" @@ -55,7 +56,8 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account, emoji, err := processingEmoji.LoadEmoji(ctx) if err != nil { - if err == db.ErrAlreadyExists { + var alreadyExistsError *db.ErrAlreadyExists + if errors.As(err, &alreadyExistsError) { return nil, gtserror.NewErrorConflict(fmt.Errorf("emoji with shortcode %s already exists", form.Shortcode), fmt.Sprintf("emoji with shortcode %s already exists", form.Shortcode)) } return nil, gtserror.NewErrorInternalError(fmt.Errorf("error loading emoji: %s", err), "error loading emoji") From b42b0a667ef8c3287919a4b7f379e49683f13077 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 12:19:54 +0100 Subject: [PATCH 39/43] go fmt --- cmd/gotosocial/action/server/server.go | 2 +- internal/db/bundb/errors.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index 8686f6a7fa..8d447c59f4 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -105,7 +105,7 @@ var Start action.GTSAction = func(ctx context.Context) error { // overwriting the lockfile if we store a file called 'store.lock'. // However, in this case it's OK because the keys are set by // GtS and not the user, so we know we're never going to overwrite it. - LockFile: path.Join(storageBasePath, "store.lock"), + LockFile: path.Join(storageBasePath, "store.lock"), }) if err != nil { return fmt.Errorf("error creating storage backend: %s", err) diff --git a/internal/db/bundb/errors.go b/internal/db/bundb/errors.go index 113679226e..67a673e15a 100644 --- a/internal/db/bundb/errors.go +++ b/internal/db/bundb/errors.go @@ -36,7 +36,7 @@ func processSQLiteError(err error) db.Error { // Handle supplied error code: switch sqliteErr.Code() { case sqlite3.SQLITE_CONSTRAINT_UNIQUE, sqlite3.SQLITE_CONSTRAINT_PRIMARYKEY: - return db.NewErrAlreadyExists(err.Error()) + return db.NewErrAlreadyExists(err.Error()) default: return err } From c4ece24654e195dbff06c1d7363c5fe92e1fd4c4 Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 12:37:58 +0100 Subject: [PATCH 40/43] log error on header/avatar fetch fail --- internal/typeutils/internaltoas.go | 5 +++++ internal/typeutils/internaltofrontend.go | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/internal/typeutils/internaltoas.go b/internal/typeutils/internaltoas.go index a22b926d66..f154398cec 100644 --- a/internal/typeutils/internaltoas.go +++ b/internal/typeutils/internaltoas.go @@ -25,6 +25,7 @@ import ( "fmt" "net/url" + "github.com/sirupsen/logrus" "github.com/spf13/viper" "github.com/superseriousbusiness/activity/pub" "github.com/superseriousbusiness/activity/streams" @@ -218,6 +219,8 @@ func (c *converter) AccountToAS(ctx context.Context, a *gtsmodel.Account) (vocab avatar, err := c.db.GetAttachmentByID(ctx, a.AvatarMediaAttachmentID) if err == nil { a.AvatarMediaAttachment = avatar + } else { + logrus.Errorf("AccountToAS: error getting Avatar with id %s: %s", a.AvatarMediaAttachmentID, err) } } @@ -250,6 +253,8 @@ func (c *converter) AccountToAS(ctx context.Context, a *gtsmodel.Account) (vocab header, err := c.db.GetAttachmentByID(ctx, a.HeaderMediaAttachmentID) if err == nil { a.HeaderMediaAttachment = header + } else { + logrus.Errorf("AccountToAS: error getting Header with id %s: %s", a.HeaderMediaAttachmentID, err) } } diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 989bf4a1e0..39a2861fbc 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -104,6 +104,8 @@ func (c *converter) AccountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A avi, err := c.db.GetAttachmentByID(ctx, a.AvatarMediaAttachmentID) if err == nil { a.AvatarMediaAttachment = avi + } else { + logrus.Errorf("AccountToAPIAccountPublic: error getting Avatar with id %s: %s", a.AvatarMediaAttachmentID, err) } } if a.AvatarMediaAttachment != nil { @@ -120,6 +122,8 @@ func (c *converter) AccountToAPIAccountPublic(ctx context.Context, a *gtsmodel.A avi, err := c.db.GetAttachmentByID(ctx, a.HeaderMediaAttachmentID) if err == nil { a.HeaderMediaAttachment = avi + } else { + logrus.Errorf("AccountToAPIAccountPublic: error getting Header with id %s: %s", a.HeaderMediaAttachmentID, err) } } if a.HeaderMediaAttachment != nil { From dba9ad434885603b85938386a4681350698decac Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 13:17:10 +0100 Subject: [PATCH 41/43] hopefully fix potential race condition --- internal/federation/dereferencing/account.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/internal/federation/dereferencing/account.go b/internal/federation/dereferencing/account.go index d87192d3a8..02afd9a9cf 100644 --- a/internal/federation/dereferencing/account.go +++ b/internal/federation/dereferencing/account.go @@ -265,18 +265,18 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm if targetAccount.AvatarRemoteURL != "" && (targetAccount.AvatarMediaAttachmentID == "" || refresh) { var processingMedia *media.ProcessingMedia + d.dereferencingAvatarsLock.Lock() // LOCK HERE // first check if we're already processing this media - d.dereferencingAvatarsLock.Lock() if alreadyProcessing, ok := d.dereferencingAvatars[targetAccount.ID]; ok { // we're already on it, no worries processingMedia = alreadyProcessing } - d.dereferencingAvatarsLock.Unlock() if processingMedia == nil { // we're not already processing it so start now avatarIRI, err := url.Parse(targetAccount.AvatarRemoteURL) if err != nil { + d.dereferencingAvatarsLock.Unlock() return changed, err } @@ -290,16 +290,15 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm Avatar: &avatar, }) if err != nil { + d.dereferencingAvatarsLock.Unlock() return changed, err } // store it in our map to indicate it's in process - d.dereferencingAvatarsLock.Lock() d.dereferencingAvatars[targetAccount.ID] = newProcessing - d.dereferencingAvatarsLock.Unlock() - processingMedia = newProcessing } + d.dereferencingAvatarsLock.Unlock() // UNLOCK HERE // block until loaded if required... if blocking { @@ -324,18 +323,18 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm if targetAccount.HeaderRemoteURL != "" && (targetAccount.HeaderMediaAttachmentID == "" || refresh) { var processingMedia *media.ProcessingMedia + d.dereferencingHeadersLock.Lock() // LOCK HERE // first check if we're already processing this media - d.dereferencingHeadersLock.Lock() if alreadyProcessing, ok := d.dereferencingHeaders[targetAccount.ID]; ok { // we're already on it, no worries processingMedia = alreadyProcessing } - d.dereferencingHeadersLock.Unlock() if processingMedia == nil { // we're not already processing it so start now headerIRI, err := url.Parse(targetAccount.HeaderRemoteURL) if err != nil { + d.dereferencingAvatarsLock.Unlock() return changed, err } @@ -349,16 +348,15 @@ func (d *deref) fetchRemoteAccountMedia(ctx context.Context, targetAccount *gtsm Header: &header, }) if err != nil { + d.dereferencingAvatarsLock.Unlock() return changed, err } // store it in our map to indicate it's in process - d.dereferencingHeadersLock.Lock() d.dereferencingHeaders[targetAccount.ID] = newProcessing - d.dereferencingHeadersLock.Unlock() - processingMedia = newProcessing } + d.dereferencingHeadersLock.Unlock() // UNLOCK HERE // block until loaded if required... if blocking { From 8c0141d103cb70fdbe74f1d5a936860707da973f Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 13:38:44 +0100 Subject: [PATCH 42/43] store and retrieve processState atomically --- internal/media/processingemoji.go | 23 +++++++++---------- internal/media/processingmedia.go | 37 +++++++++++++++++-------------- internal/media/types.go | 2 +- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index 292712427b..741854b9b9 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -25,6 +25,7 @@ import ( "io" "strings" "sync" + "sync/atomic" "time" "codeberg.org/gruf/go-store/kv" @@ -53,9 +54,7 @@ type ProcessingEmoji struct { /* below fields represent the processing state of the static of the emoji */ - - staticState processState - fullSizeState processState + staticState int32 /* below pointers to database and storage are maintained so that @@ -104,17 +103,18 @@ func (p *ProcessingEmoji) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error // Finished returns true if processing has finished for both the thumbnail // and full fized version of this piece of media. func (p *ProcessingEmoji) Finished() bool { - return p.staticState == complete && p.fullSizeState == complete + return atomic.LoadInt32(&p.staticState) == int32(complete) } func (p *ProcessingEmoji) loadStatic(ctx context.Context) error { - switch p.staticState { + staticState := atomic.LoadInt32(&p.staticState) + switch processState(staticState) { case received: // stream the original file out of storage... stored, err := p.storage.GetStream(p.emoji.ImagePath) if err != nil { p.err = fmt.Errorf("loadStatic: error fetching file from storage: %s", err) - p.staticState = errored + atomic.StoreInt32(&p.staticState, int32(errored)) return p.err } @@ -122,27 +122,27 @@ func (p *ProcessingEmoji) loadStatic(ctx context.Context) error { static, err := deriveStaticEmoji(stored, p.emoji.ImageContentType) if err != nil { p.err = fmt.Errorf("loadStatic: error deriving static: %s", err) - p.staticState = errored + atomic.StoreInt32(&p.staticState, int32(errored)) return p.err } if err := stored.Close(); err != nil { p.err = fmt.Errorf("loadStatic: error closing stored full size: %s", err) - p.staticState = errored + atomic.StoreInt32(&p.staticState, int32(errored)) return p.err } // put the static in storage if err := p.storage.Put(p.emoji.ImageStaticPath, static.small); err != nil { p.err = fmt.Errorf("loadStatic: error storing static: %s", err) - p.staticState = errored + atomic.StoreInt32(&p.staticState, int32(errored)) return p.err } p.emoji.ImageStaticFileSize = len(static.small) // we're done processing the static version of the emoji! - p.staticState = complete + atomic.StoreInt32(&p.staticState, int32(complete)) fallthrough case complete: return nil @@ -281,8 +281,7 @@ func (m *manager) preProcessEmoji(ctx context.Context, data DataFunc, shortcode instanceAccountID: instanceAccount.ID, emoji: emoji, data: data, - staticState: received, - fullSizeState: received, + staticState: int32(received), database: m.db, storage: m.storage, } diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 0bbe35aeef..0f47ee4e61 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -25,6 +25,7 @@ import ( "io" "strings" "sync" + "sync/atomic" "time" "codeberg.org/gruf/go-store/kv" @@ -49,8 +50,8 @@ type ProcessingMedia struct { data DataFunc read bool // bool indicating that data function has been triggered already - thumbstate processState // the processing state of the media thumbnail - fullSizeState processState // the processing state of the full-sized media + thumbState int32 // the processing state of the media thumbnail + fullSizeState int32 // the processing state of the full-sized media /* below pointers to database and storage are maintained so that @@ -103,11 +104,12 @@ func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAt // Finished returns true if processing has finished for both the thumbnail // and full fized version of this piece of media. func (p *ProcessingMedia) Finished() bool { - return p.thumbstate == complete && p.fullSizeState == complete + return atomic.LoadInt32(&p.thumbState) == int32(complete) && atomic.LoadInt32(&p.fullSizeState) == int32(complete) } func (p *ProcessingMedia) loadThumb(ctx context.Context) error { - switch p.thumbstate { + thumbState := atomic.LoadInt32(&p.thumbState) + switch processState(thumbState) { case received: // we haven't processed a thumbnail for this media yet so do it now @@ -122,7 +124,7 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) error { stored, err := p.storage.GetStream(p.attachment.File.Path) if err != nil { p.err = fmt.Errorf("loadThumb: error fetching file from storage: %s", err) - p.thumbstate = errored + atomic.StoreInt32(&p.thumbState, int32(errored)) return p.err } @@ -130,20 +132,20 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) error { thumb, err := deriveThumbnail(stored, p.attachment.File.ContentType, createBlurhash) if err != nil { p.err = fmt.Errorf("loadThumb: error deriving thumbnail: %s", err) - p.thumbstate = errored + atomic.StoreInt32(&p.thumbState, int32(errored)) return p.err } if err := stored.Close(); err != nil { p.err = fmt.Errorf("loadThumb: error closing stored full size: %s", err) - p.thumbstate = errored + atomic.StoreInt32(&p.thumbState, int32(errored)) return p.err } // put the thumbnail in storage if err := p.storage.Put(p.attachment.Thumbnail.Path, thumb.small); err != nil { p.err = fmt.Errorf("loadThumb: error storing thumbnail: %s", err) - p.thumbstate = errored + atomic.StoreInt32(&p.thumbState, int32(errored)) return p.err } @@ -160,7 +162,7 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) error { p.attachment.Thumbnail.FileSize = len(thumb.small) // we're done processing the thumbnail! - p.thumbstate = complete + atomic.StoreInt32(&p.thumbState, int32(complete)) fallthrough case complete: return nil @@ -168,11 +170,12 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) error { return p.err } - return fmt.Errorf("loadThumb: thumbnail processing status %d unknown", p.thumbstate) + return fmt.Errorf("loadThumb: thumbnail processing status %d unknown", p.thumbState) } func (p *ProcessingMedia) loadFullSize(ctx context.Context) error { - switch p.fullSizeState { + fullSizeState := atomic.LoadInt32(&p.fullSizeState) + switch processState(fullSizeState) { case received: var err error var decoded *imageMeta @@ -181,7 +184,7 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) error { stored, err := p.storage.GetStream(p.attachment.File.Path) if err != nil { p.err = fmt.Errorf("loadFullSize: error fetching file from storage: %s", err) - p.fullSizeState = errored + atomic.StoreInt32(&p.fullSizeState, int32(errored)) return p.err } @@ -198,13 +201,13 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) error { if err != nil { p.err = err - p.fullSizeState = errored + atomic.StoreInt32(&p.fullSizeState, int32(errored)) return p.err } if err := stored.Close(); err != nil { p.err = fmt.Errorf("loadFullSize: error closing stored full size: %s", err) - p.thumbstate = errored + atomic.StoreInt32(&p.fullSizeState, int32(errored)) return p.err } @@ -219,7 +222,7 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) error { p.attachment.Processing = gtsmodel.ProcessingStatusProcessed // we're done processing the full-size image - p.fullSizeState = complete + atomic.StoreInt32(&p.fullSizeState, int32(complete)) fallthrough case complete: return nil @@ -400,8 +403,8 @@ func (m *manager) preProcessMedia(ctx context.Context, data DataFunc, accountID processingMedia := &ProcessingMedia{ attachment: attachment, data: data, - thumbstate: received, - fullSizeState: received, + thumbState: int32(received), + fullSizeState: int32(received), database: m.db, storage: m.storage, } diff --git a/internal/media/types.go b/internal/media/types.go index b9c79d464f..a6b38b467b 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -45,7 +45,7 @@ const ( mimeImagePng = mimeImage + "/" + mimePng ) -type processState int +type processState int32 const ( received processState = iota // processing order has been received but not done yet From a766b9265beab5f1a4f50ae7ce0fa325ea2d90ec Mon Sep 17 00:00:00 2001 From: tsmethurst Date: Tue, 8 Feb 2022 13:39:47 +0100 Subject: [PATCH 43/43] Go mod tidy --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 85d10b2a55..a878363c52 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,6 @@ codeberg.org/gruf/go-pools v1.0.2/go.mod h1:MjUV3H6IASyBeBPCyCr7wjPpSNu8E2N87LG4 codeberg.org/gruf/go-runners v1.1.1/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= codeberg.org/gruf/go-runners v1.2.0 h1:tkoPrwYMkVg1o/C4PGTR1YbC11XX4r06uLPOYajBsH4= codeberg.org/gruf/go-runners v1.2.0/go.mod h1:9gTrmMnO3d+50C+hVzcmGBf+zTuswReS278E2EMvnmw= -codeberg.org/gruf/go-store v1.3.2 h1:cLTMEqyK0uF/bt1ULkRR4h41Pdgxwvw3uxSpLUublHo= -codeberg.org/gruf/go-store v1.3.2/go.mod h1:g4+9h3wbwZ6IW0uhpw57xywcqiy4CIj0zQLqqtjEU1M= codeberg.org/gruf/go-store v1.3.3 h1:fAP9FXy6HiLPxdD7cmpSzyfKXmVvZLjqn0m7HhxVT5M= codeberg.org/gruf/go-store v1.3.3/go.mod h1:g4+9h3wbwZ6IW0uhpw57xywcqiy4CIj0zQLqqtjEU1M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=

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¬dZ%s56P=eo>j$^1~m#LxQU*7Wy>o(!qv9aLa}v-yU*-2#w-e2r4k;b)Y0o z-~RrEcjg_W9@eSM5SzV;2p+$2_me_7VB!0(NCL+GJME*p8o{y;K-va;^aT;cxld^} zgIA=5dcgyutg<%QuuyPnrQoX!vZ6@$31q0lw*9g3?P7kK>t@T?j~0Ct;im2tUv>}8 z8CBSVs;5LUs6*MCJrUO7J1!Nd*999aJ}->$10J10^^d0gr!HpJkpOhkMtx$v4bXRz zeu{~vsPn+S-eRJ3y&BQBcbyKiXitY0Ki;Oc6cj&ik>F*p9;kai94|bkSgLqX!|R}9 zwuyWXNNoAFOlYk6<^rfIUKJ%c?`EExdJWBAy;V9A_<|z5oaDdCdI*}ER5tAl;fdO*@Pmg|MAbGqCC7I-E51W# z-t+7JSInk{5*v1wOCIxn_^fVG?b94zO88)}7Sp4NP&Hg0r9Y2}uoLbU9&abKO7f8k zdsM`_IM?Iae(BeyGTdXK@k9Q^$yxJ>g9MYS zqP8EgH3C$im-dwbqadQg`$4br@?MgccSK!At_5;6B?=^Ms2l zDa<0S20yKa4$+C`jp=|TqC_*ip7qv#SVvVoY=7FI+UMgE_O7;88MR*#N*V~3RYGZS z%IUMm@H&hfOc*=fqbRZd6*sOjtArJo6QPx%={2{H3&Gd5P%7<;Y&9!X@V0c7AJ4?K zTCCz1Yz<9%3mJ8!Rnv{#{fqWm5A6*f$c7lwj&Cnia56he)YeLMu&mlqY0tk-&65Mx z?YYhJhCP~gr<{tAF&1LC#Xp09b&>I$z zEpRsasV0gGm{W9FBl%4fQ{kpK?cQ_en)pDC6YcmX@L#GG&p_?*#Gx=lJ?}$33xO(| zuz9?Hdj3l+J))x(&l}#Wp|Y-(e-I#Nkw78X*&B8nwLpJSAIvv|uoSyswO~?o9WOVg zXHfC!wok=kR2WrLTAcVS6sZL97edkerqr{gbt!kMz9$H#0Sm^xpry@}c9-QJECTee zd=((paj7%PlB@DRHYuX+CxKKQFtjhp5F2(^ZS~ycsbvphhWWujbr+F&hKI`FdjsVj zA3GEw*sQz`qL&mvV%yUF%{5B92xa>C>MPg_nSoz4&nHTf-y+Np%Cny1QA6{PKK>Ox zo%nfC&cSd;V)9qMt1PSU9{`WNiz0>{UUuPC6$n>Z?a-4IFD2zf2I+2UQ}|8A8lEN_ zG9?wN3yB`Aou;|h9lj{$s+olS{xlKNo&NKJSIEpWO_|lN_jVx<7?|tbsc&7&{j5BK zA}AfZaXB9ZAiSs#=oWy)cxD>C7)HE|>7>5Iy@WWHw1#l})En1#GbHO8ui?6DxVFw| zG}@nNEImq6)8Zcw0| zeW8P#W|(?*s0yO+8vGs z%(63|$B|ezV>7sDVk?G`lmU3&gLj6;Vs)5GkvS|jVBs6ATOpPiV_RJsRbo zws=QvANOL{#>IJ1+W=~xs61cDOpHaSS`*Y&PTsCwH_y#J&b@zPJ5w(~x%)NOA~wB) zA0v5r4~`u@cRMR(XpK#XPGlAaeRWmeV+kNj{RoAJHguLvIT-jx^jY>wH?!io0cwFl z+3Ms)J8@_Q4GS^ZQSJ;H+NN>}G%{G-A*B0J2H#(*)=s`DpOhFtG3YWJ_~_wWSLCqT zz^PZte38X) zl}>$4jE^N}lImRB4Vp6{Q=SMc|K}N^tH>U&D%ac{Yc8 zRNZHc^;ot!m+@L$kK!7gSRcU}RJD2tAerPFC5);b8}57z5~B&H_MxrHCsJL+2)6z) zVdZJFX8v93C&DRmn?0|R4IZLG{q!WVy`!u0RYWslH)6h1iYf|@?7?p|)OqWWMx9DM z)ScNfBF9Jf&YDFhzE_8~{%J)A-dzQhs9zajq-(@l zn944r`Q@ow-Nr$?GZGj-7L*+EuF{rO-w#l{c>MUgO3*PMzuK7Yy*;xK(MX`Q-1oW* zJK4H~^ZpB7iBT5(T%^i+cMj6!z+?2R+BMH<0HUCS(oLU?ur2WRk=}3hXqPogS)gSo z2t$3O!&=W*&XaA16lQc#iys#lWYuYt>;kwcc8rUHN29p_biy@J8>ekzWc08=*RBd) zC9RJm?qdIS@J+b4DKLb={Ji0F#wkSu_p$_^M`{Qw_8 z?L|qfHnHGsQVK1)LvDFqEk&^{vQDvW3n`m15>pj1&g)KvXNF$2I)vN?;#E^5WUU20 z+ibZFhv?zLbx=#an_c>{{?`SnyZNLu{*^t>J<^HYd9gNQ@z7oQ5Pr;g&d9DrrNbB( zn)78S*y>>}5fm$Eb0_!y5$#Wyy)kh9#wPA+iLdKr9-J!S*=Hm5OntUd_jW!x3Cc+P zwGlxwpQgwT%gTPj!X@ zogS5B<8bJKK%E6k_0%hH za_lL8lEBZUr!Br2(-M!SO>h5?ZTrz=y|xazp?KbijcmmN_;l2VeG0V#Zie}6z5agS zM@T3-Xrg2vKTlmcvsJb!Zz|xebBi?&9eh*OE6&OjvXHRgBXWBIVH_MM((Y-avgIE! zigYklT)Po;boNs)$dbFmHg)dMX2a{Sqn<-+hqSV?2E287rG8#wfj%Ye51^C0o%C$t zidbCg6`o8x>inyj`Bt3`!)aR3;qC+^itc?a*{`2%>}@I3D_~3-R&zN><;eJq_FCy( z;oc67pEuel>tCI05~YCJfcD~uG??ZD~sAvTM4sJw#c|iyI+@DK8gdfG6 zu@{S`sRmqBq!V7A65X1o)xLx|RCXlu8F zU0ZA?PRqV(x86dYc;O0_j>Qc@BJR*nVHWJ-t|j|zJ8+4J8Vyz6^9KL^U0TK*1dti! zE4O|_*Yh{npEaaGSQE>{>+q9@9f)}z7nOS?6LjrrIbFz@`NA3A2`MQ$CHAnsJ8c~G zV$h7Nbd1Usy_xBTWylr);$l838_Jax0)yVXvVCsv(9l`R(n$4_;^f(ERp;bFzGRF$oOg zK0$va>O97F@GoR$BnH~ezYm~e8K3715WTK2qKRJX=yF?!_VEDKGMe?g$?TNP%jzSq zmzDli*AW7NbRkHHrSmdW28%xe1};=0AQt#FpBMuI1ytL5plCt<7wq$FvB#_}-r8_j z)d5aO2PoF!m1USQv|gYw)rP_l*`>kDG9c>+iisfcth?`odr{rh38fN?IgG(@oR=n4_hbisa(#3IOdiN9M2Edo?n~tvpWa zmzklD9CjUnZ1zslu?(UYJD{ugMXD=3RwfT1=H77*%g@EHy#EPNMpPn+7Cl0`(V$v8 zQ@l;d=~gKf_z8rH=qI+_g-U5KHo(s}A#A%!6EVQR>L+|X=_bY4|obznk8@4dw7CuRgsxYgw zc!C{B#y2AZ#|5G*eDgN&_f4EdvKYqr2NQu3?sH9iyv<@{w#x;MQw&pXLNR{u0! z%-D7JT0L8m(N2=~`(G1@tL)VEtp)lPE1Doj6I zF3ypCL=GZ4hS%pT*NSasEAwcX7}_WY=b*6dYTF0E`7}ed?SNJGKYc~gefw1pMnvgv z=aqzm3M*)-!kowH=iHBmIK8ofvNOY-pv(HTG`#Ve39lW04nIv3(&F#Jxp$XrNp^%K z{!8i_waV8L4E5GCveX@=cQYMvIB#ELnch^e=$v0T5!b;5e+jc=%KhMoo`Ix=LD%Kr z`&w3f_y8gxm+qInsGRyn-+!vJz@WzK+-CiW6l7>WRBVgGmn04@q5%tR<3nw*U|Bm~ z-f43Ex7uA*)D3PIX8p-HSk9qYb}KaQyFi`8aj-QN?qfibwqrQtVTeX`?`-}mrTL^@ zLg?u>QkNiWTbIxfXW#pz^zY)4Ta_%pEar&#wyh`H60@;v)S8mxkBW4xYpIb-DsDdm zjLsGAsL@e?gKZNe5m>T`Eu8COZigCp09c~ru68Uhj&jyj9lQ8^I%602{xO?=)qlD{FcRQ01LBVlbjB;d1U(|q2f*hvdonp0e8@Q&$uVC^M{;D!H$sP!)GxXMcV~zYa_m8EU zl6*FO_sPq3X^+ipzPWKE<>GvhR8*vO5(29<**!~BGYlAIWgd-NUzit4)2^Z*^jt+F zrm%B6ncuD)j))nll-Ig?ZD(T8`iO@sWu)a))3Mh02wj1C{73Dp4slUBBiK_dUig)@r3MvXR3 z25Z)=V%x^NDQnkn6fV~J5fz)0joFi1bPwBQ{hjxMcKLZ(v3h+W{$078m)$j7KD2Vn ztwAkI4OsSwA4~m;w4vHRmk}G=NA6%4p}#*ww=Kd6V96|R2kXB_Op~zre5+vWvf;wP zv)2WUU%I*~#F-aqSa$pQ+1!b&Yi;sB8>#J`bLbDUGmWe?wa@lHV7I3L{RGXc9hf;j z54%EzCAhVs_FF`}UKHK0U9iO)ovn6>oSzkqw(KH}<z__6aDGPEBJcZ{Mjgax(g|ArR;15 z8N<19ney|xA46zalwk*5h3bsFaZ5X#%#xzSgQ84MN|v@oQuKtsN`RNjAj089{sW<- zENLA*>jUn?-KCa#fH1rbg!|}es9K#%CDKsbu#zjWKu33)BBJ~;-D%=xs*G|>J`wBA zMc!#XlKMtg3>jf_U#=iL^}dB3?nFZ?x2$zOIk(*2a8Y_~`a2-F4C=#$BO*7H*}A7? zT~@aDTYSpgjMA;nRqc;B)`#<`I)fIDL+FB=YJb-ijYtXQhuPS@EsaX>eVYBC)y^dP zQ>yqjjWp%EbDKNoeN^i@`M<(2dq^6kTrX-p-MA0VD6rq!SbbMi`lh`j!Z1>Ml)NOg z&g^I4`8#ZlA}IXf6~m3R7`R!hvNT|#leS3CEe6F#iGEcmkVW%kF2E0+uIB8!C1Cq+ ze6b0yxG6CFaex1bX&|r#GodaFp1Q}8p#D3MS#iZ@3NtUx-tLihQ6o_lVKad=k;D8H zOp;H}J*LpDhBh-Qxcl5?bkFAF3vsc+eDTZ()y+A#Nfg}hT^q73x3 z_8ewYf>!*mJ8)X!J4i_=U3Nvq;h?l^TmZYZSyu=&mEZ_9J+gP1K?bGn)G9Lz>g8L_ z$5xFAQSj?F-7oVDU+O+M%m}OLpt5o7^)JXUF|Fn$D8x!sx*05=bYTwKy$)N(1^2LQ zmiKE_3?uI7q`-%8ZI=dCR5ay*_!}W#mfZ;Jvm%%Ls@|H^UBsv2^K!ubO^e6BzB#|l zEAcVVt9wcKQkpE2&`nuZ>f1TDJA)kTaAhWc7e-z!QrVv!9Ky@~Nt#k=?qNm;I3P8&VtRys;=#;y*_ z270C8fKW=vca=qdA$zs~V9&6r)L&SZqz%W94JE zBpYBu{Uf_!bwAEq_AW-lPdS$rXfCS9qZ@kk4tP2)Fi(_3u4^yJ8L8O4$fellG&z=r zXe0Q-1HQn-eQNs$m@64qQ;@>S061q<<4dWFAF zMFmLt=O>0f2$ULmdw7t|DKJjkND2M4Y31!~Ab%~D3UDRQEXl16UsyI{_n&eqPiknDNFSdN9>gVydB9^d~&MojZ!(!2*fREkZ*R-my<+ zvu`aypi>Q$I_BABlF{DC2*4KT{j8=J1({Xv(Jqd5Y!Si3c8Le>I>dw>!GCYLdW_0?#)!A)d)$ky0$0g`O`xb1R(TX#2%L3 zT@PEJ-*;j&m4p=suz&A6t2?qy+Ik}&^lK=cN$#?c|FWv-o37EnA??oO=x{VDP#vfQ zxN~5t)IeW>c^n?`*`79cHm+H?P%AH|$gZ+R$-5Z5z#T2*$?A#8`RBkf!$rjNH%hBl z_2KMG0S$@f8aa-&Qq!zk-Sv=QY_W0fw)E~=HXm&KAAMWRuEOxh6Z^U+61O_d<|Ncc z2eLq{|AOT`0~mOo4^(wzeswKoG()~hY#w<4p1VP5Z}@iJEXVJ^clE@U7&xdlAA#4h zGYpeu_l{DpAupMCNZ7H*?!2a!_|j-F0@KR(Dj^g+XWM$QVa_|GpGwPKR+F=@P8V72 zMM#!$*56#d2f7l$PJy&rO#&r5w)MFGX+Eydf#$!fF zT8;!Hjj>MLvKHlJTT;Cb-tiI7!nPkqy4+7))9E|ydm;C-C;pdXK`Q^5akQ@DtAJ-1 z5+&U|C^;p4Ov+4sd05cqT_NSnEVr=rTxjqbC#e4GYI#MD$-)a>T%<%SOWr}1vRl~y zr+0sVSC97TF^_1s3L>~U3w`8+>!6KoOjI3b zz}))yKHvByNlP-8qvD__Y}%%$$RyNL<8yy?4PUm!af9y1&)>`TBOR`VDE*sezw-(! zW0$1wrMVOcg+_N}e~qIxEmhNu5jMrqgVS$xuA8-9RAyZ2>$K`o66JG0Ks!omj_syGgZwnxl!W~7iZ#J|T=x&? z)aadFs%I7{p+~p&i~r`Tvzs0;UWJ zFMC_N@2m&i<@75KbNFD26mi;nDTrQ+^)`+Kh_-aF3$45x44mz=ZqrlvU0pb>@~_oi+93U(Yyt}Kavkm?Bse(6~b3V?LGAG z@k8i5;1TiS*6j=?By--3Nx>0wtff+{bLw|0L8zp>TGP*^{Dzc1d5nUVZ)LI(r-6^q zT6v+>9e-PL-_M=u4ROiqA)rp~QGgJky9y!NG$$+f-kX$d>GUd9=w9B+@7GJueID?9 zy9)ZDvEN20bC9~%v$9lfNRhM{wqp5t8EF~RkrnN0>zM2@#_ns&2_+3sW1 z-3+)0jQ08_n#B@#>MSI`pOY|o_Cj^;@MSi3VNzOw5%DzA-01!q>^|Q^@5I<=s9r(| zmZs%36ClDq;{tETpIn^F|9HwkFwan#?u?nJ8>)E|Q6vW2S`uHokvsAPw^b65L2=x8 zV|Q@5ZNMZW{Jl|{l9zD&zjE@YVEEIN{QU;p_!2AB({OugTKIy%lqMo(52 zFXIxp^k^P@i9ol9E}uxRgvL`s04>s?IKb)n3!=`C9)g_sFYR~%3P*zSsAkifD$bGu z@;zy%@%rDV^??xmUdN>OJi?qZ+)+F%EuH+ksz|H$;;>hL=4{Q5l&*}v*K0;D3=0`N z(YA3~A7=R_5n^I%(T3KLx+d=Z69-2s4c92o4ApAWpw4)|4b`mx1fQiN&t=rNZN`3| z_vxTWw4$As&OB7yFE;2WONS!6D0n%y4X>HTJM#1AhQzh25ofRT)>WU^2UC# zFZF#t#tsxzphC2H{MKiS>lCF6Bo}OJ$enirYd830)Df6jRsDu7$dOUw6Qha%#{i7V zRQU7$-1nckncs6BD_2n*OKs@XB_Aqotg%PiYoq)es+{2f7jxhn832gH#rwEz(N2Ru zcROmVo}1s#T1|=GQmxQ?`A23S@*T0UUhuh?QnfPS#{Xcm1 z{$ERKcFIlJQ2uH2w{nZM_W^Tb4Go&#r*+mW(Gx2=hmyYc`#mkAz=q0U8#V~H$!xQE z`DIk*+~a&ZHcd_eeepYs@b!2o*V zRYgG$(izTy+|y=t&EEaV`bUml#kZb#SMaH1icj388LP7i2S+e-(t-}{#LJ*z^BH+c zY;~G;sum^hyad$B$i)nxoFU%F^XEFfpxcH51F5Y**Q$hCXqa9~l8R=Ns z>)zy})5=3X1*)mq0g)FW4!YgnNXCx3gv9~gLRWm27r$KxoGchkXS~g{|7X2htl{Aj^l(MHzX&F-&H6$2j%*} z@t&gUqNffeiLM;8V)X1Lst)F+IhUm`!|5$)q0M~D5ndW5ls{CU z(-H@dm$_;LDo}-9e+WKZC|3Ih^U2iW?hdC5-~m0n8n%5E+SvnmVClphMw1%VuWGf+ zV$pIol4JBnX|uAuckw^xQ0nt4l-lX~gh$p_Rkn&mwXX^Rw-3Vi#>bCL%UonDZflDP zL+BwFU#63(X{%7}#ig2DKz`l;dF^*=OqGE-A;H)GXZU!P`NEGuVkEX|V_23SN@+MW zWk9C5xfDg1-786VJ_y3S6}%dHU=EPbb*9?hB{t#`*}vrwZEM!GeI8v83HUlNj{|er z_d2uU)g|m&=s(7)Mw`w(V?~Ox3I;sZc1J`G!!4JqS(VXw#^WKv?l%0?!;1gGv{LmB ztzy3dubu+at^I~|iz-=yP#B!Z z^DHqeI}SE2G|D&ZDwnX?7=H;g0k7{;#%ma;@Y0_3V7bKE%}TjXWgRCuSo-+vx_X73 z&#zegh%#4+*oZCxF26kC>zORnh_d@SQgjUgUH_;FClX$Gdgu_6UYfnXBZdgq0=)6HB>kTE=pI7-#h8YX_ns`2X z3y)>FdQ3Z?3!%_u9`Ya{KH078Aeydq5SgpxvF-+ZxT}!PbhOenC1~4jiUCEM)E6%h z5Bn}$>$EIOnRFtoV3n3eJu*D1_*TyJdY_J>sqpHVg_XKC%w7!3G1nMzSDlbm8`LTr z82Z|4`*x+;7Jq3@9D6)5f#r=4tMv!#v$rN)065T3+$1}AhPp;>Kh;zK2ta2;N~xvl zXR?O|pxq(grvxDTJY9rxg0Ag?c+NPMqvi<(ruSK=Tz;HtBY+fq&7=#fWxtY_=9LGn zgu}0xhh1J@6Q^a#T&XyVU;;zv`A$tIsSq`?y7S`M`)~o3RZl+$mO=hqV(y)yDyh(l z=xHUoaq0O;RW?2f_x%UMjH#`eVjti^K#o0ttDqnPs9|he-PL(yc+Z zwUqLgLjOA~@pz_8Ix>=9ys_dGuDYFf zn>o+LxKKHD_v<6c%qGrmF7BDoKy4$7-Qp+21tu@5^02LE<4vb@->AaQYR9W4IKDd4 z!Fyb)sA?pLFTycjoaDq2(rv*K2knUVJ7O#&3T5Tc&DNy1OG(k=e0@E7pD1lJfU1z{ zsOWr%!Q^w2K4AUn1SmOnza!CfS1Fk8I-(w^2xU!C7_6d4$gF&OP@m99>CyPTp9!E% zIdt?G9PF^2MfuyMcf-6Fn?~kYIUl)memM(2ml-n^g2!A`kFY@WTyIWP_yZw8`3KTj zN*$|-_G`p11AoTmKTzli-+47RjJ4w{w2^3+3@G{WD6Yr>7IbR5*F1qGG}xq9rMPv9 zUOfQelK91eS9P{x5IXkjs31IDF29L;8A$?)Gu5t(CQv$MKKkTheg3gn+CzglTC)m8 z2*z@YV?&)JHl9`A3G(`wIqN~M>3v!M^)gDQcYYFC$o2=X(opTqnN{6$HmB78ZGP8G z7e4g(uoQ#`b}eid&#dSn$IeI1wpHQ_dt4GvG1A(AcO?No8=i6;gl{6LQH~WZID4=}2iC@v% z+|wcJ>+2OBet3343!><-I;rW)sND}TG`eszs|HBH%A4zy9FyYf^NT{ zRfUdq^Q7Db!heJ$xkJE(!7yqQ_0mdCqwsFsHlF;>8wWFV#q`ddJ<1sBBj=8}!Ya`h zjLU7J>7>_iURg@0dEsI)wEmH;rRLX)&K$6n@Urf4?cGw)c!%8qD7aj9TGAvp^pV%~XJ~V1}zA z&)8Z?2yKL_=0k-%QDAW%!88a*lu>AynSol1rI2o9mQx3?!mq-r**O?tz*k zD!OK0tWXsnf6SiM<4xPu1?mF+DUc9z&wUbzNfr}vvtr&SWVA-SU3|>JeoU|DD`jgVmP-?Hu^LD?k}mIQgu)8kJHK{#(w_ zJ1ftLEM)eddL1bQR=|USeNbZZ8HSvyz3&~47^A$MFP+y2GiwN6Rc%aTIl|0rMpm!& zSG9TPywxi+f+?Xrv6*XgMo9MwRUW7US}QynqI~_$ z*{{>i*XZ;-nZRVlO+c3vFB*?my-@!-$!~*8oH?oC`y`o{qd6OqHDU65THUNA_1tj2 z@uCokN@qe^E`xA@MZ@D7fLGOEw}CMEauK!HQK zuNGiZdVbE!QaB+CdqrA7?raLe7=>`l1Z!noOlwHhoe4bZY-09I@$dvz0xaUT=+1*G zZ7kKYk6`YxhI>xCWY|IdoU*@KM(jJB{hr<^zB;7ryGEj&z{{!wrq8!L%gf$m%?M?Q zqDP5b-I&`V?Pc(m_OExc8CJuAp~LCf-uus$)B35xAIR7V8Dpok>(iMU4oU0u<0nokcDTRq7Sad1 z=_4M^poF?Gn9wd>f5=?Nw&qfNPx34JKQiC6Zu$xE?k0+DSep^=q|7XySa#+rA5Ms5^ z*Us@I!u4xwb{Bz}PDJL#9Oh|gO+h#esk%xRzUZ^q<}5+?A_N7sacM~#U9P$&?Ur~t zpT^A<95#zOM5|Y=w)@=|)2le$YJ(Nr00(jk;8IO^LxlcdI3iVBOtdN3sGr798N&cD zCFw8>Y$ky`5q4x_x_=9GHMnSzG@7ffGV(ke*K;#dy)>Ke-}yRA0qtsin`yq1W7C6P zG3j1K;^T=agL#6Dau0F9VoA*KD1rDqmN_q^-H9-^0g_arqG3f3PYgTt-cxr?wqm1k zYcyL@%`e;a;g}$kMb5Q{U1~$TX1bAREC_p)76~;c zIv{V`?3eN*>jJ#$UMp;ALNPS%r{mB!kw2LlVhSAnNk1th9HnF5hVz%%&x;nD#>{f5o#Ebp_Z&~AzIs@XW+Q1w~F%&V6e2qbnCaX^3s@)(DOnt$0W zj;Z|i%$~X)R6Uiy`C~!8ot6cu(EynKUxw;f>Q$x?b@$1%`X{Xswf|HzWSGm9D7%=G zo7t3uZJ+AZ=4>N$Mfrrjpb7kJqfZ{T$= zDiSO9sNL2sF%x_5Eq08ewYS=8SIwemDXR5p?|kq7AV0hxxn9?G&Uv27jXJtftVL(R zkbQjVNS$gH;3=MZk^W7W`>M`&Bl1HiOYIY$*ok)ClA$>T8Y>kJd}*!`iFMbeK`h5f zSFGh9bN3N`;4Wt*e%wfnd5ZNcB=!8>Da&}9Zn0J*g-!<~YnoU`o@x1#ih&otLNnGR zn{bX>8uN%JJnc`2ro0nSlU>en45R!NrRgdE7A{905M^lY_CocKc;T!LLj%BZ1U7CTioJF5OEP;(Kd* zbsOdUxm|;$BFu9brtf4f`r)dUG=mT!CzW~QhlpoO-dMb(ohx3TfUn6*JKUc~GXg* zp_c;68NT!Kd?wbY#DTF@RrH4W5pS&rF~b~4bEQz{ui6HrdP6dj%#DYvU?UTbe;CLV%~dnd0zNQ0vP~g+;DR>W}$y+*@J?&R3-FiLBC@$GS!bVWf=D z&zPJP{m%{PGQcd!NNFJgzOHHa7<