Skip to content

Commit

Permalink
fix lint issues (#2242)
Browse files Browse the repository at this point in the history
* fix lint issues

Signed-off-by: sriv <[email protected]>

* update golangci lint gh workflow

Signed-off-by: sriv <[email protected]>

* fix lint workflow syntax

Signed-off-by: sriv <[email protected]>
  • Loading branch information
sriv authored May 5, 2022
1 parent 5eaa2c9 commit 363eb96
Show file tree
Hide file tree
Showing 17 changed files with 50 additions and 103 deletions.
10 changes: 5 additions & 5 deletions .github/workflows/golangci-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
with:
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
version: v1.40.1
uses: golangci/golangci-lint-action@v3
# with:
# Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
# version: v1.40.1

# Optional: working directory, useful for monorepos
# working-directory: somedir

# Optional: golangci-lint command line arguments.
args: --disable=staticcheck
# args: --disable=staticcheck

# Optional: show only new issues if it's a pull request. The default value is `false`.
# only-new-issues: true
20 changes: 10 additions & 10 deletions build/make.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func runProcess(command string, arg ...string) {
func runCommand(command string, arg ...string) (string, error) {
cmd := exec.Command(command, arg...)
bytes, err := cmd.Output()
return strings.TrimSpace(fmt.Sprintf("%s", bytes)), err
return strings.TrimSpace(string(bytes)), err
}

var buildMetadata string
Expand Down Expand Up @@ -152,15 +152,15 @@ var certFile = flag.String("certFile", "", "Should be passed for signing the win
// Each target name is the directory name
var (
platformEnvs = []map[string]string{
map[string]string{GOARCH: ARM64, GOOS: darwin, CGO_ENABLED: "0"},
map[string]string{GOARCH: X86_64, GOOS: darwin, CGO_ENABLED: "0"},
map[string]string{GOARCH: X86, GOOS: linux, CGO_ENABLED: "0"},
map[string]string{GOARCH: X86_64, GOOS: linux, CGO_ENABLED: "0"},
map[string]string{GOARCH: ARM64, GOOS: linux, CGO_ENABLED: "0"},
map[string]string{GOARCH: X86, GOOS: freebsd, CGO_ENABLED: "0"},
map[string]string{GOARCH: X86_64, GOOS: freebsd, CGO_ENABLED: "0"},
map[string]string{GOARCH: X86, GOOS: windows, CC: "i586-mingw32-gcc", CGO_ENABLED: "1"},
map[string]string{GOARCH: X86_64, GOOS: windows, CC: "x86_64-w64-mingw32-gcc", CGO_ENABLED: "1"},
{GOARCH: ARM64, GOOS: darwin, CGO_ENABLED: "0"},
{GOARCH: X86_64, GOOS: darwin, CGO_ENABLED: "0"},
{GOARCH: X86, GOOS: linux, CGO_ENABLED: "0"},
{GOARCH: X86_64, GOOS: linux, CGO_ENABLED: "0"},
{GOARCH: ARM64, GOOS: linux, CGO_ENABLED: "0"},
{GOARCH: X86, GOOS: freebsd, CGO_ENABLED: "0"},
{GOARCH: X86_64, GOOS: freebsd, CGO_ENABLED: "0"},
{GOARCH: X86, GOOS: windows, CC: "i586-mingw32-gcc", CGO_ENABLED: "1"},
{GOARCH: X86_64, GOOS: windows, CC: "x86_64-w64-mingw32-gcc", CGO_ENABLED: "1"},
}
osDistroMap = map[string]distroFunc{windows: createWindowsDistro, linux: createLinuxPackage, freebsd: createLinuxPackage, darwin: createDarwinPackage}
)
Expand Down
6 changes: 5 additions & 1 deletion conn/connectionHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ import (
"time"

"github.com/getgauge/gauge/logger"
"github.com/golang/protobuf/proto"
// github.com/golang/protobuf/proto is deprecated, however this package is used by the legacy API
// which is consumed only by IntelliJ IDEA presently. Since IDEA does not plan to implement LSP
// gauge will have to keep this alive. Upgrading to google.golang.org/protobuf/proto is not a drop in change
// since the newer library does not support DecodeVarint. The whole message handling will need to be refactored.
"github.com/golang/protobuf/proto" //nolint:staticcheck
)

type messageHandler interface {
Expand Down
7 changes: 6 additions & 1 deletion conn/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ import (
"github.com/getgauge/common"
"github.com/getgauge/gauge-proto/go/gauge_messages"
"github.com/getgauge/gauge/logger"
"github.com/golang/protobuf/proto"

// github.com/golang/protobuf/proto is deprecated, however this package is used by the legacy API
// which is consumed only by IntelliJ IDEA presently. Since IDEA does not plan to implement LSP
// gauge will have to keep this alive. Upgrading to google.golang.org/protobuf/proto is not a drop in change
// since the newer library does not support DecodeVarint. The whole message handling will need to be refactored.
"github.com/golang/protobuf/proto" //nolint:staticcheck
)

type response struct {
Expand Down
7 changes: 6 additions & 1 deletion conn/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ import (
"time"

"github.com/getgauge/gauge-proto/go/gauge_messages"
"github.com/golang/protobuf/proto"

// github.com/golang/protobuf/proto is deprecated, however this package is used by the legacy API
// which is consumed only by IntelliJ IDEA presently. Since IDEA does not plan to implement LSP
// gauge will have to keep this alive. Upgrading to google.golang.org/protobuf/proto is not a drop in change
// since the newer library does not support DecodeVarint. The whole message handling will need to be refactored.
"github.com/golang/protobuf/proto" //nolint:staticcheck
)

var id int64
Expand Down
2 changes: 0 additions & 2 deletions execution/parallelGrpcExecution.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ func (e *parallelExecution) notifyBeforeSuite() {
res := e.runners[0].ExecuteAndGetStatus(m)
e.suiteResult.PreHookMessages = res.Message
e.suiteResult.PreHookScreenshotFiles = res.ScreenshotFiles
e.suiteResult.PreHookScreenshots = res.Screenshots
if res.GetFailed() {
result.AddPreHook(e.suiteResult, res)
}
Expand All @@ -80,7 +79,6 @@ func (e *parallelExecution) notifyAfterSuite() {
res := e.runners[0].ExecuteAndGetStatus(m)
e.suiteResult.PostHookMessages = res.Message
e.suiteResult.PostHookScreenshotFiles = res.ScreenshotFiles
e.suiteResult.PostHookScreenshots = res.Screenshots
if res.GetFailed() {
result.AddPostHook(e.suiteResult, res)
}
Expand Down
1 change: 0 additions & 1 deletion execution/result/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ func GetProtoHookFailure(executionResult *gauge_messages.ProtoExecutionResult) *
return &gauge_messages.ProtoHookFailure{
StackTrace: executionResult.StackTrace,
ErrorMessage: executionResult.ErrorMessage,
FailureScreenshot: executionResult.FailureScreenshot,
FailureScreenshotFile: executionResult.FailureScreenshotFile,
TableRowIndex: -1,
}
Expand Down
1 change: 0 additions & 1 deletion execution/result/scenarioResult.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ func NewScenarioResult(sce *gauge_messages.ProtoScenario) *ScenarioResult {
// SetFailure sets the scenarioResult as failed
func (s ScenarioResult) SetFailure() {
s.ProtoScenario.ExecutionStatus = gauge_messages.ExecutionStatus_FAILED
s.ProtoScenario.Failed = true
}

// GetFailed returns the state of the scenario result
Expand Down
6 changes: 1 addition & 5 deletions execution/scenarioExecutor.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ func (e *scenarioExecutor) execute(i gauge.Item, r result.Result) {
scenario := i.(*gauge.Scenario)
scenarioResult := r.(*result.ScenarioResult)
scenarioResult.ProtoScenario.ExecutionStatus = gauge_messages.ExecutionStatus_PASSED
scenarioResult.ProtoScenario.Skipped = false
if(e.runner.Info().Killed){
if e.runner.Info().Killed {
e.errMap.ScenarioErrs[scenario] = append([]error{errors.New("skipped Reason: Runner is not alive")}, e.errMap.ScenarioErrs[scenario]...)
setSkipInfoInResult(scenarioResult, scenario, e.errMap)
return
Expand Down Expand Up @@ -106,7 +105,6 @@ func (e *scenarioExecutor) handleScenarioDataStoreFailure(scenarioResult *result

func setSkipInfoInResult(scenarioResult *result.ScenarioResult, scenario *gauge.Scenario, errMap *gauge.BuildErrors) {
scenarioResult.ProtoScenario.ExecutionStatus = gauge_messages.ExecutionStatus_SKIPPED
scenarioResult.ProtoScenario.Skipped = true
var errs []string
for _, err := range errMap.ScenarioErrs[scenario] {
errs = append(errs, err.Error())
Expand All @@ -121,7 +119,6 @@ func (e *scenarioExecutor) notifyBeforeScenarioHook(scenarioResult *result.Scena
res := executeHook(message, scenarioResult, e.runner)
scenarioResult.ProtoScenario.PreHookMessages = res.Message
scenarioResult.ProtoScenario.PreHookScreenshotFiles = res.ScreenshotFiles
scenarioResult.ProtoScenario.PreHookScreenshots = res.Screenshots
if res.GetFailed() {
setScenarioFailure(e.currentExecutionInfo)
handleHookFailure(scenarioResult, res, result.AddPreHook)
Expand All @@ -136,7 +133,6 @@ func (e *scenarioExecutor) notifyAfterScenarioHook(scenarioResult *result.Scenar
res := executeHook(message, scenarioResult, e.runner)
scenarioResult.ProtoScenario.PostHookMessages = res.Message
scenarioResult.ProtoScenario.PostHookScreenshotFiles = res.ScreenshotFiles
scenarioResult.ProtoScenario.PostHookScreenshots = res.Screenshots
if res.GetFailed() {
setScenarioFailure(e.currentExecutionInfo)
handleHookFailure(scenarioResult, res, result.AddPostHook)
Expand Down
18 changes: 7 additions & 11 deletions execution/simpleExecution.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ func newSimpleExecution(executionInfo *executionInfo, combineDataTableSpecs, ski
}

return &simpleExecution{
manifest: executionInfo.manifest,
specCollection: executionInfo.specs,
runner: executionInfo.runner,
pluginHandler: executionInfo.pluginHandler,
errMaps: executionInfo.errMaps,
stream: executionInfo.stream,
skipSuiteEvents: skipSuiteEvents,
manifest: executionInfo.manifest,
specCollection: executionInfo.specs,
runner: executionInfo.runner,
pluginHandler: executionInfo.pluginHandler,
errMaps: executionInfo.errMaps,
stream: executionInfo.stream,
skipSuiteEvents: skipSuiteEvents,
currentExecutionInfo: ei,
}
}
Expand Down Expand Up @@ -142,7 +142,6 @@ func (e *simpleExecution) executeSpecs(sc *gauge.SpecCollection) (results []*res
res.AddPreHook(&gauge_messages.ProtoHookFailure{
StackTrace: preHook.StackTrace,
ErrorMessage: preHook.ErrorMessage,
FailureScreenshot: preHook.FailureScreenshot,
FailureScreenshotFile: preHook.FailureScreenshotFile,
TableRowIndex: preHook.TableRowIndex,
})
Expand All @@ -151,7 +150,6 @@ func (e *simpleExecution) executeSpecs(sc *gauge.SpecCollection) (results []*res
res.AddPostHook(&gauge_messages.ProtoHookFailure{
StackTrace: postHook.StackTrace,
ErrorMessage: postHook.ErrorMessage,
FailureScreenshot: postHook.FailureScreenshot,
FailureScreenshotFile: postHook.FailureScreenshotFile,
TableRowIndex: postHook.TableRowIndex,
})
Expand All @@ -168,7 +166,6 @@ func (e *simpleExecution) notifyBeforeSuite() {
res := e.executeHook(m)
e.suiteResult.PreHookMessages = res.Message
e.suiteResult.PreHookScreenshotFiles = res.ScreenshotFiles
e.suiteResult.PreHookScreenshots = res.Screenshots
if res.GetFailed() {
handleHookFailure(e.suiteResult, res, result.AddPreHook)
}
Expand All @@ -182,7 +179,6 @@ func (e *simpleExecution) notifyAfterSuite() {
res := e.executeHook(m)
e.suiteResult.PostHookMessages = res.Message
e.suiteResult.PostHookScreenshotFiles = res.ScreenshotFiles
e.suiteResult.PostHookScreenshots = res.Screenshots
if res.GetFailed() {
handleHookFailure(e.suiteResult, res, result.AddPostHook)
}
Expand Down
54 changes: 0 additions & 54 deletions execution/simpleExecution_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,60 +186,6 @@ func TestExecuteSpecsShouldAddsAfterSpecHookFailureScreenshotFile(t *testing.T)
}
}

func TestExecuteSpecsShouldAddsBeforeSpecHookFailureScreenshotBytes(t *testing.T) {
r := &mockRunner{}
h := &mockPluginHandler{NotifyPluginsfunc: func(m *gauge_messages.Message) {}, GracefullyKillPluginsfunc: func() {}}
r.ExecuteAndGetStatusFunc = func(m *gauge_messages.Message) *gauge_messages.ProtoExecutionResult {
if m.MessageType == gauge_messages.Message_SpecExecutionStarting {
return &gauge_messages.ProtoExecutionResult{
Failed: true,
ExecutionTime: 10,
FailureScreenshot: []byte("before spec hook failure screenshot byte"),
}
}
return &gauge_messages.ProtoExecutionResult{}
}
ei := &executionInfo{runner: r, pluginHandler: h, errMaps: &gauge.BuildErrors{}}
simpleExecution := newSimpleExecution(ei, false, false)
specsC := createSpecCollection()
simpleExecution.suiteResult = result.NewSuiteResult(ExecuteTags, simpleExecution.startTime)
specResult := simpleExecution.executeSpecs(specsC)

actualScreenshotBytes := specResult[0].ProtoSpec.PreHookFailures[0].FailureScreenshot
expectedScreenshotBytes := "before spec hook failure screenshot byte"

if string(actualScreenshotBytes) != expectedScreenshotBytes {
t.Errorf("Expected `%s` screenshot, got : %s", expectedScreenshotBytes, actualScreenshotBytes)
}
}

func TestExecuteSpecsShouldAddsAfterSpecHookFailureScreenshotBytes(t *testing.T) {
r := &mockRunner{}
h := &mockPluginHandler{NotifyPluginsfunc: func(m *gauge_messages.Message) {}, GracefullyKillPluginsfunc: func() {}}
r.ExecuteAndGetStatusFunc = func(m *gauge_messages.Message) *gauge_messages.ProtoExecutionResult {
if m.MessageType == gauge_messages.Message_SpecExecutionEnding {
return &gauge_messages.ProtoExecutionResult{
Failed: true,
ExecutionTime: 10,
FailureScreenshot: []byte("after spec hook failure screenshot bytes"),
}
}
return &gauge_messages.ProtoExecutionResult{}
}
ei := &executionInfo{runner: r, pluginHandler: h, errMaps: &gauge.BuildErrors{}}
simpleExecution := newSimpleExecution(ei, false, false)
specsC := createSpecCollection()
simpleExecution.suiteResult = result.NewSuiteResult(ExecuteTags, simpleExecution.startTime)
specResult := simpleExecution.executeSpecs(specsC)

actualScreenshotBytes := specResult[0].ProtoSpec.PostHookFailures[0].FailureScreenshot
expectedScreenshotBytes := "after spec hook failure screenshot bytes"

if string(actualScreenshotBytes) != expectedScreenshotBytes {
t.Errorf("Expected `%s` screenshot, got : %s", expectedScreenshotBytes, actualScreenshotBytes)
}
}

func createSpecCollection() *gauge.SpecCollection {
var specs []*gauge.Specification
specs = append(specs, &gauge.Specification{
Expand Down
2 changes: 0 additions & 2 deletions execution/specExecutor.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ func (e *specExecutor) notifyBeforeSpecHook() {
res := executeHook(m, e.specResult, e.runner)
e.specResult.ProtoSpec.PreHookMessages = res.Message
e.specResult.ProtoSpec.PreHookScreenshotFiles = res.ScreenshotFiles
e.specResult.ProtoSpec.PreHookScreenshots = res.Screenshots
if res.GetFailed() {
setSpecFailure(e.currentExecutionInfo)
handleHookFailure(e.specResult, res, result.AddPreHook)
Expand All @@ -193,7 +192,6 @@ func (e *specExecutor) notifyAfterSpecHook() {
res := executeHook(m, e.specResult, e.runner)
e.specResult.ProtoSpec.PostHookMessages = res.Message
e.specResult.ProtoSpec.PostHookScreenshotFiles = res.ScreenshotFiles
e.specResult.ProtoSpec.PostHookScreenshots = res.Screenshots
if res.GetFailed() {
setSpecFailure(e.currentExecutionInfo)
handleHookFailure(e.specResult, res, result.AddPostHook)
Expand Down
3 changes: 1 addition & 2 deletions execution/specExecutor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ func (r *mockRunner) IsMultithreaded() bool {
}

func (r *mockRunner) Info() *runner.RunnerInfo {
return &runner.RunnerInfo{Killed:false}
return &runner.RunnerInfo{Killed: false}
}

func (r *mockRunner) Pid() int {
Expand Down Expand Up @@ -714,7 +714,6 @@ func TestExecuteShouldMarkSpecAsSkippedWhenAllScenariosSkipped(t *testing.T) {
se := newSpecExecutor(exampleSpecWithScenarios, r, nil, errs, 0)
se.scenarioExecutor = &mockExecutor{
executeFunc: func(i gauge.Item, r result.Result) {
r.(*result.ScenarioResult).ProtoScenario.Skipped = true
r.(*result.ScenarioResult).ProtoScenario.ExecutionStatus = gauge_messages.ExecutionStatus_SKIPPED
},
}
Expand Down
3 changes: 0 additions & 3 deletions execution/stepExecutor.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ func (e *stepExecutor) executeStep(step *gauge.Step, protoStep *gauge_messages.P
executeStepMessage := &gauge_messages.Message{MessageType: gauge_messages.Message_ExecuteStep, ExecuteStepRequest: stepRequest}
stepExecutionStatus := e.runner.ExecuteAndGetStatus(executeStepMessage)
stepExecutionStatus.Message = append(stepResult.ProtoStepExecResult().GetExecutionResult().Message, stepExecutionStatus.Message...)
stepExecutionStatus.Screenshots = append(stepResult.ProtoStepExecResult().GetExecutionResult().Screenshots, stepExecutionStatus.Screenshots...)
if stepExecutionStatus.GetFailed() {
e.currentExecutionInfo.CurrentStep.ErrorMessage = stepExecutionStatus.GetErrorMessage()
e.currentExecutionInfo.CurrentStep.StackTrace = stepExecutionStatus.GetStackTrace()
Expand Down Expand Up @@ -72,7 +71,6 @@ func (e *stepExecutor) notifyBeforeStepHook(stepResult *result.StepResult) {
res := executeHook(m, stepResult, e.runner)
stepResult.ProtoStep.PreHookMessages = res.Message
stepResult.ProtoStep.PreHookScreenshotFiles = res.ScreenshotFiles
stepResult.ProtoStep.PreHookScreenshots = res.Screenshots
if res.GetFailed() {
setStepFailure(e.currentExecutionInfo)
handleHookFailure(stepResult, res, result.AddPreHook)
Expand All @@ -90,7 +88,6 @@ func (e *stepExecutor) notifyAfterStepHook(stepResult *result.StepResult) {
res := executeHook(m, stepResult, e.runner)
stepResult.ProtoStep.PostHookMessages = res.Message
stepResult.ProtoStep.PostHookScreenshotFiles = res.ScreenshotFiles
stepResult.ProtoStep.PostHookScreenshots = res.Screenshots
if res.GetFailed() {
setStepFailure(e.currentExecutionInfo)
handleHookFailure(stepResult, res, result.AddPostHook)
Expand Down
3 changes: 2 additions & 1 deletion plugin/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"github.com/getgauge/gauge/version"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
)
Expand Down Expand Up @@ -252,7 +253,7 @@ func startGRPCPlugin(pd *PluginDescriptor, command []string) (*plugin, error) {
}
logger.Debugf(true, "Attempting to connect to grpc server at port: %s", port)
gRPCConn, err := grpc.Dial(fmt.Sprintf("%s:%s", "127.0.0.1", port),
grpc.WithInsecure(),
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithDefaultCallOptions(grpc.MaxCallSendMsgSize(1024*1024*1024), grpc.MaxCallRecvMsgSize(1024*1024*1024)),
grpc.WithBlock())
if err != nil {
Expand Down
6 changes: 4 additions & 2 deletions refactor/refactor.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,13 @@ func (refactoringResult *refactoringResult) WriteToDisk() {
if !refactoringResult.Success {
return
}
// fileChange.FileContent need not be deprecated. To save the refactored file, it is much simpler and less error prone
// to replace the file with new content, rather than parsing again and replacing specific lines.
for _, fileChange := range refactoringResult.SpecsChanged {
util.SaveFile(fileChange.FileName, fileChange.FileContent, true)
util.SaveFile(fileChange.FileName, fileChange.FileContent, true) //nolint:staticcheck
}
for _, fileChange := range refactoringResult.ConceptsChanged {
util.SaveFile(fileChange.FileName, fileChange.FileContent, true)
util.SaveFile(fileChange.FileName, fileChange.FileContent, true) //nolint:staticcheck
}
}

Expand Down
4 changes: 3 additions & 1 deletion runner/grpcRunner.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
errdetails "google.golang.org/genproto/googleapis/rpc/errdetails"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/status"
)

Expand All @@ -42,6 +43,7 @@ type GrpcRunner struct {
IsExecuting bool
}

//nolint:staticcheck
func (r *GrpcRunner) invokeLegacyLSPService(message *gm.Message) (*gm.Message, error) {
switch message.MessageType {
case gm.Message_CacheFileRequest:
Expand Down Expand Up @@ -326,7 +328,7 @@ func StartGrpcRunner(m *manifest.Manifest, stdout, stderr io.Writer, timeout tim
}
logger.Debugf(true, "Attempting to connect to grpc server at port: %s", port)
conn, err := grpc.Dial(fmt.Sprintf("%s:%s", host, port),
grpc.WithInsecure(),
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(oneGB), grpc.MaxCallSendMsgSize(oneGB)),
grpc.WithBlock())
logger.Debugf(true, "Successfully made the connection with runner with port: %s", port)
Expand Down

0 comments on commit 363eb96

Please sign in to comment.