Skip to content

Commit

Permalink
Merge branch 'main' into feature/better-processors
Browse files Browse the repository at this point in the history
  • Loading branch information
hariso committed Mar 7, 2024
2 parents d2c1b77 + f872e9d commit e3845c3
Show file tree
Hide file tree
Showing 25 changed files with 1,630 additions and 75 deletions.
4 changes: 3 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ linters-settings:
- pkg: golang.org/x/xerrors
desc: To accommodate for custom error creation and handling use Conduit's 'cerrors' package instead.
- pkg: github.com/golang/mock
desc: github.com/golang/mock is deprecated, use go.uber.org/mock instead
desc: github.com/golang/mock is deprecated, use go.uber.org/mock instead.
- pkg: encoding/json
desc: github.com/goccy/go-json is preferred for performance reasons.
gofmt:
simplify: false
govet:
Expand Down
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ require (
github.com/hamba/avro/v2 v2.19.0
github.com/hashicorp/go-hclog v1.6.2
github.com/hashicorp/go-plugin v1.6.0
github.com/jackc/pgx/v5 v5.5.2
github.com/jackc/pgx/v5 v5.5.4
github.com/jpillora/backoff v1.0.0
github.com/lovromazgon/franz-go/pkg/sr v0.0.0-20230630140346-bb9ce3f90f4a
github.com/matryer/is v1.4.1
github.com/modern-go/reflect2 v1.0.2
github.com/peterbourgon/ff/v3 v3.4.0
github.com/piotrkowalczuk/promgrpc/v4 v4.1.2
github.com/prometheus/client_golang v1.18.0
github.com/prometheus/client_model v0.5.0
github.com/prometheus/common v0.46.0
github.com/prometheus/client_model v0.6.0
github.com/prometheus/common v0.47.0
github.com/rs/zerolog v1.32.0
github.com/stealthrocket/wazergo v0.19.1
github.com/tetratelabs/wazero v1.6.0
Expand All @@ -52,7 +52,7 @@ require (
golang.org/x/tools v0.19.0
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028
google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe
google.golang.org/grpc v1.61.0
google.golang.org/grpc v1.62.1
google.golang.org/protobuf v1.32.0
gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637
)
Expand Down Expand Up @@ -165,7 +165,7 @@ require (
github.com/gofrs/uuid v4.4.0+incompatible // indirect
github.com/gofrs/uuid/v5 v5.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/glog v1.1.2 // indirect
github.com/golang/glog v1.2.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.4 // indirect
Expand Down Expand Up @@ -334,7 +334,7 @@ require (
golang.org/x/term v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
Expand Down
23 changes: 12 additions & 11 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1320,8 +1320,8 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68=
github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
Expand Down Expand Up @@ -1580,8 +1580,8 @@ github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgS
github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw=
github.com/jackc/pgx/v4 v4.18.1 h1:YP7G1KABtKpB5IHrO9vYwSrCOhs7p3uqhvhhQBptya0=
github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE=
github.com/jackc/pgx/v5 v5.5.2 h1:iLlpgp4Cp/gC9Xuscl7lFL1PhhW+ZLtXZcrfCt4C3tA=
github.com/jackc/pgx/v5 v5.5.2/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8=
github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
Expand Down Expand Up @@ -1852,17 +1852,18 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos=
github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y=
github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ=
github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k=
github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
Expand Down Expand Up @@ -2870,8 +2871,8 @@ google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02
google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk=
google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg=
google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ=
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro=
google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8=
google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
Expand Down Expand Up @@ -2946,8 +2947,8 @@ google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpX
google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=
google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk=
google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
Expand Down
2 changes: 1 addition & 1 deletion pkg/foundation/grpcutil/interceptor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ package grpcutil
import (
"bytes"
"context"
"encoding/json"
"testing"

"github.com/conduitio/conduit/pkg/foundation/ctxutil"
"github.com/conduitio/conduit/pkg/foundation/log"
"github.com/goccy/go-json"
"github.com/google/uuid"
"github.com/matryer/is"
"github.com/rs/zerolog"
Expand Down
2 changes: 1 addition & 1 deletion pkg/pipeline/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ package pipeline
import (
"bytes"
"context"
"encoding/json"
"strings"

"github.com/conduitio/conduit/pkg/foundation/cerrors"
"github.com/conduitio/conduit/pkg/foundation/database"
"github.com/goccy/go-json"
)

const (
Expand Down
97 changes: 97 additions & 0 deletions pkg/plugin/builtin/v1/internal/fromplugin/specifier.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
// Copyright © 2022 Meroxa, Inc.

Check failure on line 1 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

: # github.com/conduitio/conduit/pkg/plugin/builtin/v1/internal/fromplugin
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package fromplugin

import (
"github.com/conduitio/conduit-connector-protocol/cpluginv1"
"github.com/conduitio/conduit/pkg/plugin"
)

func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
var vTypes [1]struct{}
_ = vTypes[int(cpluginv1.ValidationTypeRequired)-int(plugin.ValidationTypeRequired)]

Check failure on line 25 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ValidationTypeRequired

Check failure on line 25 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ValidationTypeRequired
_ = vTypes[int(cpluginv1.ValidationTypeLessThan)-int(plugin.ValidationTypeLessThan)]

Check failure on line 26 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ValidationTypeLessThan

Check failure on line 26 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ValidationTypeLessThan
_ = vTypes[int(cpluginv1.ValidationTypeGreaterThan)-int(plugin.ValidationTypeGreaterThan)]

Check failure on line 27 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ValidationTypeGreaterThan

Check failure on line 27 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ValidationTypeGreaterThan
_ = vTypes[int(cpluginv1.ValidationTypeInclusion)-int(plugin.ValidationTypeInclusion)]

Check failure on line 28 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ValidationTypeInclusion

Check failure on line 28 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ValidationTypeInclusion
_ = vTypes[int(cpluginv1.ValidationTypeExclusion)-int(plugin.ValidationTypeExclusion)]

Check failure on line 29 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ValidationTypeExclusion

Check failure on line 29 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ValidationTypeExclusion
_ = vTypes[int(cpluginv1.ValidationTypeRegex)-int(plugin.ValidationTypeRegex)]

Check failure on line 30 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ValidationTypeRegex

Check failure on line 30 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ValidationTypeRegex
// parameter types
_ = vTypes[int(cpluginv1.ParameterTypeString)-int(plugin.ParameterTypeString)]

Check failure on line 32 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ParameterTypeString

Check failure on line 32 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.ParameterTypeString
_ = vTypes[int(cpluginv1.ParameterTypeInt)-int(plugin.ParameterTypeInt)]
_ = vTypes[int(cpluginv1.ParameterTypeFloat)-int(plugin.ParameterTypeFloat)]
_ = vTypes[int(cpluginv1.ParameterTypeBool)-int(plugin.ParameterTypeBool)]
_ = vTypes[int(cpluginv1.ParameterTypeFile)-int(plugin.ParameterTypeFile)]
_ = vTypes[int(cpluginv1.ParameterTypeDuration)-int(plugin.ParameterTypeDuration)]
}

func SpecifierSpecifyResponse(in cpluginv1.SpecifierSpecifyResponse) (plugin.Specification, error) {

Check failure on line 40 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.Specification

Check failure on line 40 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.Specification
specMap := func(params map[string]cpluginv1.SpecifierParameter) map[string]plugin.Parameter {
out := make(map[string]plugin.Parameter)
for k, v := range params {
out[k] = SpecifierParameter(v)
}
return out
}

return plugin.Specification{
Name: in.Name,
Summary: in.Summary,
Description: in.Description,
Version: in.Version,
Author: in.Author,
DestinationParams: specMap(in.DestinationParams),
SourceParams: specMap(in.SourceParams),
}, nil
}

func SpecifierParameter(in cpluginv1.SpecifierParameter) plugin.Parameter {

Check failure on line 60 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.Parameter

Check failure on line 60 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / golangci-lint

undefined: plugin.Parameter
validations := make([]plugin.Validation, len(in.Validations))

requiredExists := false
for i, v := range in.Validations {
validations[i] = plugin.Validation{
Type: plugin.ValidationType(v.Type),
Value: v.Value,
}
if v.Type == cpluginv1.ValidationTypeRequired {
requiredExists = true
}
}
//nolint:staticcheck // needed for backward compatibility, in.Required is
// converted to a validation of type ValidationTypeRequired making sure not
// to duplicate the required validation
if in.Required && !requiredExists {
//nolint:makezero // false positive, we actually want to append here
validations = append(validations, plugin.Validation{
Type: plugin.ValidationTypeRequired,
})
}

return plugin.Parameter{
Default: in.Default,
Type: cpluginv1ParamTypeToPluginParamType(in.Type),
Description: in.Description,
Validations: validations,
}
}

func cpluginv1ParamTypeToPluginParamType(t cpluginv1.ParameterType) plugin.ParameterType {

Check failure on line 91 in pkg/plugin/builtin/v1/internal/fromplugin/specifier.go

View workflow job for this annotation

GitHub Actions / test

undefined: plugin.ParameterType
// default type should be string
if t == 0 {
return plugin.ParameterTypeString
}
return plugin.ParameterType(t)
}
Loading

0 comments on commit e3845c3

Please sign in to comment.