From b58a32164f621409b74fe4e80372af87a697f1bb Mon Sep 17 00:00:00 2001 From: noah Date: Sat, 18 Dec 2021 16:42:07 +0900 Subject: [PATCH 1/4] Delete Chatops of Slack --- internal/server/router.go | 6 - internal/server/slack/deploy.go | 383 --------------- internal/server/slack/deploy_test.go | 107 ----- internal/server/slack/interface.go | 29 -- internal/server/slack/lock.go | 323 ------------- internal/server/slack/middlewares.go | 133 ------ internal/server/slack/mock/interactor.go | 452 ------------------ internal/server/slack/rollback.go | 278 ----------- internal/server/slack/rollback_test.go | 111 ----- internal/server/slack/slack.go | 62 +-- internal/server/slack/slack_oss.go | 16 +- .../slack/testdata/deploy-interact.json | 232 --------- .../slack/testdata/rollback-interact.json | 161 ------- 13 files changed, 2 insertions(+), 2291 deletions(-) delete mode 100644 internal/server/slack/deploy.go delete mode 100644 internal/server/slack/deploy_test.go delete mode 100644 internal/server/slack/lock.go delete mode 100644 internal/server/slack/middlewares.go delete mode 100644 internal/server/slack/mock/interactor.go delete mode 100644 internal/server/slack/rollback.go delete mode 100644 internal/server/slack/rollback_test.go delete mode 100644 internal/server/slack/testdata/deploy-interact.json delete mode 100644 internal/server/slack/testdata/rollback-interact.json diff --git a/internal/server/router.go b/internal/server/router.go index 8cacdad3..d89d6ae9 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -219,10 +219,6 @@ func NewRouter(c *RouterConfig) *gin.Engine { if isSlackEnabled(c) { slackapi := r.Group("/slack") { - m := s.NewSlackMiddleware(&s.SlackMiddlewareConfig{ - Interactor: c.Interactor, - Secret: c.ChatConfig.Secret, - }) slack := s.NewSlack(&s.SlackConfig{ ServerHost: c.Host, ServerProto: c.Proto, @@ -232,8 +228,6 @@ func NewRouter(c *RouterConfig) *gin.Engine { slackapi.GET("", slack.Index) slackapi.GET("/signin", slack.Signin) slackapi.GET("/signout", slack.Signout) - slackapi.POST("/interact", m.Verify(), m.ParseIntr(), m.SetChatUser(), slack.Interact) - slackapi.POST("/command", m.Verify(), m.ParseCmd(), m.SetChatUser(), slack.Cmd) } } diff --git a/internal/server/slack/deploy.go b/internal/server/slack/deploy.go deleted file mode 100644 index 93bb5068..00000000 --- a/internal/server/slack/deploy.go +++ /dev/null @@ -1,383 +0,0 @@ -package slack - -import ( - "context" - "fmt" - "net/http" - "strconv" - "strings" - - "github.com/gin-gonic/gin" - "github.com/slack-go/slack" - "go.uber.org/zap" - - "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/ent/callback" - "github.com/gitploy-io/gitploy/model/ent/deployment" - "github.com/gitploy-io/gitploy/model/ent/event" - "github.com/gitploy-io/gitploy/model/extent" - "github.com/gitploy-io/gitploy/pkg/e" -) - -const ( -// linkUnprocessalbeEntity = "https://github.com/gitploy-io/gitploy/discussions/64" -) - -const ( - // When creating a view, set unique block_ids for all blocks - // and unique action_ids for each block element. - blockEnv = "block_env" - blockType = "block_type" - blockRef = "block_ref" - blockApprovers = "block_approvers" - actionEnv = "action_env" - actionType = "action_type" - actionRef = "action_ref" - actionApprovers = "action_approver_ids" -) - -type ( - deployViewSubmission struct { - Env string - Type string - Ref string - ApproverIDs []string - } - - ErrorsPayload struct { - ResponseAction string `json:"response_action"` - Errors map[string]string `json:"errors"` - } -) - -// handleDeployCmd handles deploy command: "/gitploy deploy OWNER/REPO". -// It opens a dialog with fields to submit the payload for deployment. -func (s *Slack) handleDeployCmd(c *gin.Context) { - ctx := c.Request.Context() - - av, _ := c.Get(KeyCmd) - cmd := av.(slack.SlashCommand) - - bv, _ := c.Get(KeyChatUser) - cu := bv.(*ent.ChatUser) - - s.log.Debug("Processing deploy command.", zap.String("command", cmd.Text)) - ns, n := parseCmd(cmd.Text) - - r, err := s.i.FindRepoOfUserByNamespaceName(ctx, cu.Edges.User, ns, n) - if ent.IsNotFound(err) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, fmt.Sprintf("The `%s/%s` repository is not found.", ns, n)) - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to get the repo.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - config, err := s.i.GetConfig(ctx, cu.Edges.User, r) - if err != nil { - postResponseWithError(cmd.ChannelID, cmd.ResponseURL, err) - c.Status(http.StatusOK) - return - } - - perms, err := s.i.ListPermsOfRepo(ctx, r, "", 1, 100) - if err != nil { - s.log.Error("It has failed to list permissions.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - perms = s.filterPerms(perms, cu) - - // Create a new callback to interact with submissions. - cb, err := s.i.CreateCallback(ctx, &ent.Callback{ - Type: callback.TypeDeploy, - RepoID: r.ID, - }) - if err != nil { - s.log.Error("It has failed to create a new callback.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - _, err = slack.New(cu.BotToken). - OpenViewContext(ctx, cmd.TriggerID, buildDeployView(cb.Hash, config, perms)) - if err != nil { - s.log.Error("It has failed to open a new view.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - c.Status(http.StatusOK) -} - -func parseCmd(cmd string) (string, string) { - words := strings.Fields(cmd) - - nn := strings.Split(words[1], "/") - - return nn[0], nn[1] -} - -// filterPerms returns permissions except the deployer. -func (s *Slack) filterPerms(perms []*ent.Perm, cu *ent.ChatUser) []*ent.Perm { - ret := []*ent.Perm{} - - for _, p := range perms { - if p.Edges.User == nil { - s.log.Warn("The user edge of perm is not found.", zap.Int("perm_id", p.ID)) - continue - } - - if cu.Edges.User == nil { - s.log.Warn("The user edge of chat-user is not found.", zap.String("chat_user_id", cu.ID)) - continue - } - - if p.Edges.User.ID != cu.Edges.User.ID { - ret = append(ret, p) - } - } - - return ret -} - -func buildDeployView(callbackID string, c *extent.Config, perms []*ent.Perm) slack.ModalViewRequest { - envs := []*slack.OptionBlockObject{} - for _, env := range c.Envs { - envs = append(envs, &slack.OptionBlockObject{ - Text: &slack.TextBlockObject{ - Type: slack.PlainTextType, - Text: env.Name, - }, - Value: env.Name, - }) - } - - approvers := []*slack.OptionBlockObject{} - for _, perm := range perms { - u := perm.Edges.User - if u == nil { - continue - } - - approvers = append(approvers, &slack.OptionBlockObject{ - Text: &slack.TextBlockObject{ - Type: slack.PlainTextType, - Text: u.Login, - }, - Value: strconv.FormatInt(u.ID, 10), - }) - } - - set := []slack.Block{ - slack.NewInputBlock( - blockEnv, - slack.NewTextBlockObject(slack.PlainTextType, "Environment", false, false), - slack.NewOptionsSelectBlockElement( - slack.OptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select target environment", false, false), - actionEnv, - envs..., - ), - ), - slack.NewInputBlock( - blockType, - slack.NewTextBlockObject(slack.PlainTextType, "Type", false, false), - slack.NewOptionsSelectBlockElement( - slack.OptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select your ref type", false, false), - actionType, - slack.NewOptionBlockObject( - "commit", - slack.NewTextBlockObject(slack.PlainTextType, "Commit", false, false), - nil, - ), - slack.NewOptionBlockObject( - "branch", - slack.NewTextBlockObject(slack.PlainTextType, "Branch", false, false), - nil, - ), - slack.NewOptionBlockObject( - "tag", - slack.NewTextBlockObject(slack.PlainTextType, "Tag", false, false), - nil, - ), - ), - ), - slack.NewInputBlock( - blockRef, - slack.NewTextBlockObject(slack.PlainTextType, "Ref", false, false), - slack.NewPlainTextInputBlockElement( - slack.NewTextBlockObject(slack.PlainTextType, "E.g. Commit - 25a667d6, Branch - main, Tag - v0.1.2", false, false), - actionRef, - ), - ), - } - - if len(approvers) > 0 { - set = append(set, slack.InputBlock{ - Type: slack.MBTInput, - BlockID: blockApprovers, - Label: slack.NewTextBlockObject(slack.PlainTextType, "Approvers", false, false), - Optional: true, - Element: slack.NewOptionsSelectBlockElement( - slack.MultiOptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select approvers", false, false), - actionApprovers, - approvers..., - ), - }) - } - - return slack.ModalViewRequest{ - Type: slack.VTModal, - CallbackID: callbackID, - Title: slack.NewTextBlockObject(slack.PlainTextType, "Deploy", false, false), - Submit: slack.NewTextBlockObject(slack.PlainTextType, "Submit", false, false), - Close: slack.NewTextBlockObject(slack.PlainTextType, "Close", false, false), - Blocks: slack.Blocks{ - BlockSet: set, - }, - } -} - -// interactDeploy deploy with the submitted payload. -func (s *Slack) interactDeploy(c *gin.Context) { - ctx := c.Request.Context() - - iv, _ := c.Get(KeyIntr) - itr := iv.(slack.InteractionCallback) - - cv, _ := c.Get(KeyChatUser) - cu := cv.(*ent.ChatUser) - - cb, _ := s.i.FindCallbackByHash(ctx, itr.View.CallbackID) - - // Parse view submission, and - // validate values. - sm := parseViewSubmissions(itr) - - // Validate the entity is processible. - _, err := s.getCommitSha(ctx, cu.Edges.User, cb.Edges.Repo, sm.Type, sm.Ref) - if e.HasErrorCode(err, e.ErrorCodeEntityNotFound) { - c.JSON(http.StatusOK, buildErrorsPayload(map[string]string{ - blockRef: "The reference is not found.", - })) - return - } else if err != nil { - s.log.Error("It has failed to get the SHA of commit.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - config, err := s.i.GetConfig(ctx, cu.Edges.User, cb.Edges.Repo) - if err != nil { - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - if err := config.Eval(&extent.EvalValues{}); err != nil { - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - var env *extent.Env - if env = config.GetEnv(sm.Env); env == nil { - postBotMessage(cu, "The env is not defined in the config.") - c.Status(http.StatusOK) - return - } - - d, err := s.i.Deploy(ctx, cu.Edges.User, cb.Edges.Repo, - &ent.Deployment{ - Type: deployment.Type(sm.Type), - Env: sm.Env, - Ref: sm.Ref, - }, - env, - ) - if err != nil { - s.log.Error("It has failed to deploy.", zap.Error(err)) - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - if _, err := s.i.CreateEvent(ctx, &ent.Event{ - Kind: event.KindDeployment, - Type: event.TypeCreated, - DeploymentID: d.ID, - }); err != nil { - s.log.Error("It has failed to create the event.", zap.Error(err)) - } - - c.Status(http.StatusOK) -} - -func parseViewSubmissions(itr slack.InteractionCallback) *deployViewSubmission { - sm := &deployViewSubmission{} - - values := itr.View.State.Values - if v, ok := values[blockEnv][actionEnv]; ok { - sm.Env = v.SelectedOption.Value - } - - if v, ok := values[blockType][actionType]; ok { - sm.Type = v.SelectedOption.Value - } - - if v, ok := values[blockRef][actionRef]; ok { - sm.Ref = v.Value - } - - ids := make([]string, 0) - if v, ok := values[blockApprovers][actionApprovers]; ok { - for _, option := range v.SelectedOptions { - ids = append(ids, option.Value) - } - - sm.ApproverIDs = ids - } - - return sm -} - -func buildErrorsPayload(errors map[string]string) *ErrorsPayload { - return &ErrorsPayload{ - ResponseAction: "errors", - Errors: errors, - } -} - -func (s *Slack) getCommitSha(ctx context.Context, u *ent.User, re *ent.Repo, typ, ref string) (string, error) { - switch typ { - case "commit": - c, err := s.i.GetCommit(ctx, u, re, ref) - if err != nil { - return "", err - } - - return c.SHA, nil - case "branch": - b, err := s.i.GetBranch(ctx, u, re, ref) - if err != nil { - return "", err - } - - return b.CommitSHA, nil - case "tag": - t, err := s.i.GetTag(ctx, u, re, ref) - if err != nil { - return "", err - } - - return t.CommitSHA, nil - default: - return "", fmt.Errorf("Type must be one of commit, branch, tag.") - } -} diff --git a/internal/server/slack/deploy_test.go b/internal/server/slack/deploy_test.go deleted file mode 100644 index c68d1a30..00000000 --- a/internal/server/slack/deploy_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package slack - -import ( - "context" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "github.com/gin-gonic/gin" - "github.com/golang/mock/gomock" - "github.com/slack-go/slack" - "go.uber.org/zap" - - "github.com/gitploy-io/gitploy/internal/server/slack/mock" - "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/ent/deployment" - "github.com/gitploy-io/gitploy/model/extent" -) - -func TestSlack_interactDeploy(t *testing.T) { - t.Run("Create a new deployment with payload.", func(t *testing.T) { - m := mock.NewMockInteractor(gomock.NewController(t)) - - // These values are in "./testdata/deploy-interact.json" - const ( - callbackID = "nafyVuEqzcchuVmV" - branch = "main" - env = "prod" - ) - - t.Log("Find the callback which was stored by the Slash command.") - m. - EXPECT(). - FindCallbackByHash(gomock.Any(), callbackID). - Return(&ent.Callback{ - Edges: ent.CallbackEdges{ - Repo: &ent.Repo{ID: 1}, - }, - }, nil) - - t.Log("Get branch to validate the payload.") - m. - EXPECT(). - GetBranch(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{}), branch). - Return(&extent.Branch{ - Name: branch, - }, nil) - - t.Log("Get the config file of the repository.") - m. - EXPECT(). - GetConfig(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{})). - Return(&extent.Config{ - Envs: []*extent.Env{ - {Name: env}, - }, - }, nil) - - t.Log("Deploy with the payload.") - m. - EXPECT(). - Deploy(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{}), &ent.Deployment{ - Type: deployment.TypeBranch, - Ref: branch, - Env: env, - }, gomock.AssignableToTypeOf(&extent.Env{})). - DoAndReturn(func(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, e *extent.Env) (*ent.Deployment, error) { - return d, nil - }) - - t.Log("Create a new event") - m. - EXPECT(). - CreateEvent(gomock.Any(), gomock.AssignableToTypeOf(&ent.Event{})). - Return(&ent.Event{}, nil) - - s := &Slack{ - i: m, - log: zap.L(), - } - - gin.SetMode(gin.ReleaseMode) - router := gin.New() - router.POST("/interact", func(c *gin.Context) { - bytes, _ := ioutil.ReadFile("./testdata/deploy-interact.json") - intr := slack.InteractionCallback{} - intr.UnmarshalJSON(bytes) - c.Set(KeyIntr, intr) - c.Set(KeyChatUser, &ent.ChatUser{ - Edges: ent.ChatUserEdges{ - User: &ent.User{}, - }, - }) - }, s.interactDeploy) - - req, _ := http.NewRequest("POST", "/interact", nil) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - - w := httptest.NewRecorder() - router.ServeHTTP(w, req) - - if w.Code != http.StatusOK { - t.Fatalf("w.Code = %d, wanted %d. Body = %v", w.Code, http.StatusOK, w.Body) - } - }) -} diff --git a/internal/server/slack/interface.go b/internal/server/slack/interface.go index 84fd4e60..545a5c95 100644 --- a/internal/server/slack/interface.go +++ b/internal/server/slack/interface.go @@ -6,7 +6,6 @@ import ( "context" "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/extent" ) type ( @@ -18,35 +17,7 @@ type ( UpdateChatUser(ctx context.Context, cu *ent.ChatUser) (*ent.ChatUser, error) DeleteChatUser(ctx context.Context, cu *ent.ChatUser) error - ListPermsOfRepo(ctx context.Context, r *ent.Repo, q string, page, perPage int) ([]*ent.Perm, error) - FindPermOfRepo(ctx context.Context, r *ent.Repo, u *ent.User) (*ent.Perm, error) - - FindRepoOfUserByNamespaceName(ctx context.Context, u *ent.User, namespace, name string) (*ent.Repo, error) - UpdateRepo(ctx context.Context, r *ent.Repo) (*ent.Repo, error) - - CreateCallback(ctx context.Context, cb *ent.Callback) (*ent.Callback, error) - FindCallbackByHash(ctx context.Context, hash string) (*ent.Callback, error) - - ListDeploymentsOfRepo(ctx context.Context, r *ent.Repo, env string, status string, page, perPage int) ([]*ent.Deployment, error) - FindDeploymentByID(ctx context.Context, id int) (*ent.Deployment, error) - Deploy(ctx context.Context, u *ent.User, re *ent.Repo, d *ent.Deployment, env *extent.Env) (*ent.Deployment, error) - GetConfig(ctx context.Context, u *ent.User, r *ent.Repo) (*extent.Config, error) - - ListLocksOfRepo(ctx context.Context, r *ent.Repo) ([]*ent.Lock, error) - FindLockOfRepoByEnv(ctx context.Context, r *ent.Repo, env string) (*ent.Lock, error) - HasLockOfRepoForEnv(ctx context.Context, r *ent.Repo, env string) (bool, error) - FindLockByID(ctx context.Context, id int) (*ent.Lock, error) - CreateLock(ctx context.Context, l *ent.Lock) (*ent.Lock, error) - DeleteLock(ctx context.Context, l *ent.Lock) error - SubscribeEvent(fn func(e *ent.Event)) error UnsubscribeEvent(fn func(e *ent.Event)) error - - CheckNotificationRecordOfEvent(ctx context.Context, e *ent.Event) bool - CreateEvent(ctx context.Context, e *ent.Event) (*ent.Event, error) - - GetCommit(ctx context.Context, u *ent.User, r *ent.Repo, sha string) (*extent.Commit, error) - GetBranch(ctx context.Context, u *ent.User, r *ent.Repo, branch string) (*extent.Branch, error) - GetTag(ctx context.Context, u *ent.User, r *ent.Repo, tag string) (*extent.Tag, error) } ) diff --git a/internal/server/slack/lock.go b/internal/server/slack/lock.go deleted file mode 100644 index bc6f243e..00000000 --- a/internal/server/slack/lock.go +++ /dev/null @@ -1,323 +0,0 @@ -package slack - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin" - "github.com/nleeper/goment" - "github.com/slack-go/slack" - "go.uber.org/zap" - - "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/ent/callback" - "github.com/gitploy-io/gitploy/model/ent/perm" - "github.com/gitploy-io/gitploy/model/extent" -) - -type ( - lockViewSubmission struct { - Env string - } -) - -func (s *Slack) handleLockCmd(c *gin.Context) { - ctx := c.Request.Context() - - av, _ := c.Get(KeyCmd) - cmd := av.(slack.SlashCommand) - - bv, _ := c.Get(KeyChatUser) - cu := bv.(*ent.ChatUser) - - s.log.Debug("Processing lock command.", zap.String("command", cmd.Text)) - ns, n := parseCmd(cmd.Text) - - r, err := s.i.FindRepoOfUserByNamespaceName(ctx, cu.Edges.User, ns, n) - if ent.IsNotFound(err) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, fmt.Sprintf("The `%s/%s` repository is not found.", ns, n)) - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to get the repo.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - // Validate the perm for the repo. - if p, err := s.i.FindPermOfRepo(ctx, r, cu.Edges.User); !(p.RepoPerm == perm.RepoPermWrite || p.RepoPerm == perm.RepoPermAdmin) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, "Write perm is required to lock the environment.") - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to get the perm.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - // Build the modal with unlocked envs. - config, err := s.i.GetConfig(ctx, cu.Edges.User, r) - if err != nil { - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - locks, err := s.i.ListLocksOfRepo(ctx, r) - if err != nil { - s.log.Error("It has failed to list locks.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - cb, err := s.i.CreateCallback(ctx, &ent.Callback{ - Type: callback.TypeLock, - RepoID: r.ID, - }) - if err != nil { - s.log.Error("It has failed to create a new callback.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - _, err = slack.New(cu.BotToken). - OpenViewContext(ctx, cmd.TriggerID, buildLockView(cb.Hash, config, locks)) - if err != nil { - s.log.Error("It has failed to open a new view.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - c.Status(http.StatusOK) -} - -func buildLockView(callbackID string, c *extent.Config, locks []*ent.Lock) slack.ModalViewRequest { - hasLocked := func(env string) bool { - for _, lock := range locks { - if lock.Env == env { - return true - } - } - - return false - } - - envs := []*slack.OptionBlockObject{} - for _, env := range c.Envs { - if hasLocked(env.Name) { - continue - } - - envs = append(envs, &slack.OptionBlockObject{ - Text: &slack.TextBlockObject{ - Type: slack.PlainTextType, - Text: env.Name, - }, - Value: env.Name, - }) - } - - return slack.ModalViewRequest{ - Type: slack.VTModal, - CallbackID: callbackID, - Title: slack.NewTextBlockObject(slack.PlainTextType, "Lock", false, false), - Submit: slack.NewTextBlockObject(slack.PlainTextType, "Submit", false, false), - Close: slack.NewTextBlockObject(slack.PlainTextType, "Close", false, false), - Blocks: slack.Blocks{ - BlockSet: []slack.Block{ - slack.NewInputBlock( - blockEnv, - slack.NewTextBlockObject(slack.PlainTextType, "Environment", false, false), - slack.NewOptionsSelectBlockElement( - slack.OptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select the environment", false, false), - actionEnv, - envs..., - ), - ), - }, - }, - } -} - -func (s *Slack) handleUnlockCmd(c *gin.Context) { - ctx := c.Request.Context() - - av, _ := c.Get(KeyCmd) - cmd := av.(slack.SlashCommand) - - bv, _ := c.Get(KeyChatUser) - cu := bv.(*ent.ChatUser) - - s.log.Debug("Processing lock command.", zap.String("command", cmd.Text)) - ns, n := parseCmd(cmd.Text) - - r, err := s.i.FindRepoOfUserByNamespaceName(ctx, cu.Edges.User, ns, n) - if ent.IsNotFound(err) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, fmt.Sprintf("The `%s/%s` repository is not found.", ns, n)) - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to get the repo.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - // Validate the perm for the repo. - if p, err := s.i.FindPermOfRepo(ctx, r, cu.Edges.User); !(p.RepoPerm == perm.RepoPermWrite || p.RepoPerm == perm.RepoPermAdmin) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, "Write perm is required to lock the environment.") - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to get the perm.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - // Build the modal with unlocked envs. - locks, err := s.i.ListLocksOfRepo(ctx, r) - if len(locks) == 0 { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, fmt.Sprintf("There is no locked environments in the `%s/%s` repository.", ns, n)) - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to list locks.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - cb, err := s.i.CreateCallback(ctx, &ent.Callback{ - Type: callback.TypeUnlock, - RepoID: r.ID, - }) - if err != nil { - s.log.Error("It has failed to create a new callback.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - _, err = slack.New(cu.BotToken). - OpenViewContext(ctx, cmd.TriggerID, buildUnlockView(cb.Hash, locks)) - if err != nil { - s.log.Error("It has failed to open a new view.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - c.Status(http.StatusOK) -} - -func buildUnlockView(callbackID string, locks []*ent.Lock) slack.ModalViewRequest { - envs := []*slack.OptionBlockObject{} - for _, lock := range locks { - var txt string - if lock.Edges.User != nil { - ca, _ := goment.New(lock.CreatedAt) - txt = fmt.Sprintf("%s - Locked by %s %s", lock.Env, lock.Edges.User.Login, ca.FromNow()) - } else { - ca, _ := goment.New(lock.CreatedAt) - txt = fmt.Sprintf("%s - Locked %s", lock.Env, ca.FromNow()) - } - - envs = append(envs, &slack.OptionBlockObject{ - Text: &slack.TextBlockObject{ - Type: slack.PlainTextType, - Text: txt, - }, - Value: lock.Env, - }) - } - - return slack.ModalViewRequest{ - Type: slack.VTModal, - CallbackID: callbackID, - Title: slack.NewTextBlockObject(slack.PlainTextType, "Unlock", false, false), - Submit: slack.NewTextBlockObject(slack.PlainTextType, "Submit", false, false), - Close: slack.NewTextBlockObject(slack.PlainTextType, "Close", false, false), - Blocks: slack.Blocks{ - BlockSet: []slack.Block{ - slack.NewInputBlock( - blockEnv, - slack.NewTextBlockObject(slack.PlainTextType, "Environment", false, false), - slack.NewOptionsSelectBlockElement( - slack.OptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select the environment", false, false), - actionEnv, - envs..., - ), - ), - }, - }, - } -} - -func (s *Slack) interactLock(c *gin.Context) { - ctx := c.Request.Context() - - iv, _ := c.Get(KeyIntr) - itr := iv.(slack.InteractionCallback) - - cv, _ := c.Get(KeyChatUser) - cu := cv.(*ent.ChatUser) - - cb, _ := s.i.FindCallbackByHash(ctx, itr.View.CallbackID) - - sm := parseLockViewSubmissions(itr) - - if _, err := s.i.CreateLock(ctx, &ent.Lock{ - Env: sm.Env, - UserID: cu.Edges.User.ID, - RepoID: cb.Edges.Repo.ID, - }); err != nil { - s.log.Error("It has failed to lock the environment.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - postBotMessage(cu, fmt.Sprintf("Success to lock the `%s` environment of the `%s` repository.", sm.Env, cb.Edges.Repo.GetFullName())) - c.Status(http.StatusOK) -} - -func (s *Slack) interactUnlock(c *gin.Context) { - ctx := c.Request.Context() - - iv, _ := c.Get(KeyIntr) - itr := iv.(slack.InteractionCallback) - - cv, _ := c.Get(KeyChatUser) - cu := cv.(*ent.ChatUser) - - cb, _ := s.i.FindCallbackByHash(ctx, itr.View.CallbackID) - - sm := parseLockViewSubmissions(itr) - - lock, err := s.i.FindLockOfRepoByEnv(ctx, cb.Edges.Repo, sm.Env) - if ent.IsNotFound(err) { - postBotMessage(cu, fmt.Sprintf("The `%s` environment is not locked.", sm.Env)) - c.Status(http.StatusOK) - } else if err != nil { - s.log.Error("It has failed to find the lock.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - if err := s.i.DeleteLock(ctx, lock); err != nil { - s.log.Error("It has failed to unlock the environment.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - postBotMessage(cu, fmt.Sprintf("Success to unlock the `%s` environment of the `%s` repository.", sm.Env, cb.Edges.Repo.GetFullName())) - c.Status(http.StatusOK) -} - -func parseLockViewSubmissions(itr slack.InteractionCallback) *lockViewSubmission { - sm := &lockViewSubmission{} - - values := itr.View.State.Values - if v, ok := values[blockEnv][actionEnv]; ok { - sm.Env = v.SelectedOption.Value - } - - return sm -} diff --git a/internal/server/slack/middlewares.go b/internal/server/slack/middlewares.go deleted file mode 100644 index 33694b7e..00000000 --- a/internal/server/slack/middlewares.go +++ /dev/null @@ -1,133 +0,0 @@ -package slack - -import ( - "bytes" - "io/ioutil" - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gitploy-io/gitploy/model/ent" - "github.com/slack-go/slack" - "go.uber.org/zap" -) - -const ( - KeyCmd = "gitploy.slack.command" - KeyIntr = "gitploy.slack.interaction" - KeyChatUser = "gitploy.slack.user" -) - -type ( - SlackMiddleware struct { - i Interactor - secret string - log *zap.Logger - } - - SlackMiddlewareConfig struct { - Interactor Interactor - Secret string - } -) - -func NewSlackMiddleware(c *SlackMiddlewareConfig) *SlackMiddleware { - return &SlackMiddleware{ - i: c.Interactor, - secret: c.Secret, - log: zap.L().Named("slack-middleware"), - } -} - -func (m *SlackMiddleware) Verify() gin.HandlerFunc { - return func(c *gin.Context) { - v, err := slack.NewSecretsVerifier(c.Request.Header, m.secret) - if err != nil { - m.log.Error("failed to generate the verifier.") - c.AbortWithStatus(http.StatusInternalServerError) - } - - d := copyRawData(c.Request) - v.Write(d) - - if err := v.Ensure(); err != nil { - m.log.Error("invalid request.", zap.Error(err)) - c.AbortWithStatus(http.StatusBadRequest) - } - } -} - -func (m *SlackMiddleware) ParseCmd() gin.HandlerFunc { - return func(c *gin.Context) { - cmd, err := slack.SlashCommandParse(c.Request) - if err != nil { - m.log.Error("It has failed to parse the command.", zap.Error(err)) - c.AbortWithStatus(http.StatusInternalServerError) - return - } - - c.Set(KeyCmd, cmd) - } -} - -func (m *SlackMiddleware) ParseIntr() gin.HandlerFunc { - return func(c *gin.Context) { - c.Request.ParseForm() - payload := c.Request.PostForm.Get("payload") - - intr := slack.InteractionCallback{} - if err := intr.UnmarshalJSON([]byte(payload)); err != nil { - m.log.Error("It has failed to parse the interaction callback.", zap.Error(err)) - c.AbortWithStatus(http.StatusInternalServerError) - return - } - - c.Set(KeyIntr, intr) - } -} - -func (m *SlackMiddleware) SetChatUser() gin.HandlerFunc { - return func(c *gin.Context) { - ctx := c.Request.Context() - - if v, ok := c.Get(KeyCmd); ok { - cmd := v.(slack.SlashCommand) - - cu, err := m.i.FindChatUserByID(ctx, cmd.UserID) - if ent.IsNotFound(err) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, "Slack is not connected with Gitploy.") - c.Status(http.StatusOK) - return - } else if err != nil { - m.log.Error("It has failed to get chat-user.", zap.Error(err)) - c.AbortWithStatus(http.StatusInternalServerError) - return - } - - c.Set(KeyChatUser, cu) - return - } - - if v, ok := c.Get(KeyIntr); ok { - intr := v.(slack.InteractionCallback) - - cu, err := m.i.FindChatUserByID(ctx, intr.User.ID) - // InteractionCallback doesn't have the response URL. - if err != nil { - m.log.Error("It has failed to get chat-user.", zap.Error(err)) - c.AbortWithStatus(http.StatusInternalServerError) - return - } - - c.Set(KeyChatUser, cu) - return - } - } -} - -func copyRawData(req *http.Request) []byte { - bodyBytes, _ := ioutil.ReadAll(req.Body) - req.Body.Close() - - req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) - return bodyBytes -} diff --git a/internal/server/slack/mock/interactor.go b/internal/server/slack/mock/interactor.go deleted file mode 100644 index 84fdccb2..00000000 --- a/internal/server/slack/mock/interactor.go +++ /dev/null @@ -1,452 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./interface.go - -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - reflect "reflect" - - ent "github.com/gitploy-io/gitploy/model/ent" - extent "github.com/gitploy-io/gitploy/model/extent" - gomock "github.com/golang/mock/gomock" -) - -// MockInteractor is a mock of Interactor interface. -type MockInteractor struct { - ctrl *gomock.Controller - recorder *MockInteractorMockRecorder -} - -// MockInteractorMockRecorder is the mock recorder for MockInteractor. -type MockInteractorMockRecorder struct { - mock *MockInteractor -} - -// NewMockInteractor creates a new mock instance. -func NewMockInteractor(ctrl *gomock.Controller) *MockInteractor { - mock := &MockInteractor{ctrl: ctrl} - mock.recorder = &MockInteractorMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockInteractor) EXPECT() *MockInteractorMockRecorder { - return m.recorder -} - -// CheckNotificationRecordOfEvent mocks base method. -func (m *MockInteractor) CheckNotificationRecordOfEvent(ctx context.Context, e *ent.Event) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CheckNotificationRecordOfEvent", ctx, e) - ret0, _ := ret[0].(bool) - return ret0 -} - -// CheckNotificationRecordOfEvent indicates an expected call of CheckNotificationRecordOfEvent. -func (mr *MockInteractorMockRecorder) CheckNotificationRecordOfEvent(ctx, e interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckNotificationRecordOfEvent", reflect.TypeOf((*MockInteractor)(nil).CheckNotificationRecordOfEvent), ctx, e) -} - -// CreateCallback mocks base method. -func (m *MockInteractor) CreateCallback(ctx context.Context, cb *ent.Callback) (*ent.Callback, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateCallback", ctx, cb) - ret0, _ := ret[0].(*ent.Callback) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateCallback indicates an expected call of CreateCallback. -func (mr *MockInteractorMockRecorder) CreateCallback(ctx, cb interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCallback", reflect.TypeOf((*MockInteractor)(nil).CreateCallback), ctx, cb) -} - -// CreateChatUser mocks base method. -func (m *MockInteractor) CreateChatUser(ctx context.Context, cu *ent.ChatUser) (*ent.ChatUser, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateChatUser", ctx, cu) - ret0, _ := ret[0].(*ent.ChatUser) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateChatUser indicates an expected call of CreateChatUser. -func (mr *MockInteractorMockRecorder) CreateChatUser(ctx, cu interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateChatUser", reflect.TypeOf((*MockInteractor)(nil).CreateChatUser), ctx, cu) -} - -// CreateEvent mocks base method. -func (m *MockInteractor) CreateEvent(ctx context.Context, e *ent.Event) (*ent.Event, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateEvent", ctx, e) - ret0, _ := ret[0].(*ent.Event) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateEvent indicates an expected call of CreateEvent. -func (mr *MockInteractorMockRecorder) CreateEvent(ctx, e interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateEvent", reflect.TypeOf((*MockInteractor)(nil).CreateEvent), ctx, e) -} - -// CreateLock mocks base method. -func (m *MockInteractor) CreateLock(ctx context.Context, l *ent.Lock) (*ent.Lock, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateLock", ctx, l) - ret0, _ := ret[0].(*ent.Lock) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateLock indicates an expected call of CreateLock. -func (mr *MockInteractorMockRecorder) CreateLock(ctx, l interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateLock", reflect.TypeOf((*MockInteractor)(nil).CreateLock), ctx, l) -} - -// DeleteChatUser mocks base method. -func (m *MockInteractor) DeleteChatUser(ctx context.Context, cu *ent.ChatUser) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteChatUser", ctx, cu) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteChatUser indicates an expected call of DeleteChatUser. -func (mr *MockInteractorMockRecorder) DeleteChatUser(ctx, cu interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteChatUser", reflect.TypeOf((*MockInteractor)(nil).DeleteChatUser), ctx, cu) -} - -// DeleteLock mocks base method. -func (m *MockInteractor) DeleteLock(ctx context.Context, l *ent.Lock) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteLock", ctx, l) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteLock indicates an expected call of DeleteLock. -func (mr *MockInteractorMockRecorder) DeleteLock(ctx, l interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteLock", reflect.TypeOf((*MockInteractor)(nil).DeleteLock), ctx, l) -} - -// Deploy mocks base method. -func (m *MockInteractor) Deploy(ctx context.Context, u *ent.User, re *ent.Repo, d *ent.Deployment, env *extent.Env) (*ent.Deployment, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Deploy", ctx, u, re, d, env) - ret0, _ := ret[0].(*ent.Deployment) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Deploy indicates an expected call of Deploy. -func (mr *MockInteractorMockRecorder) Deploy(ctx, u, re, d, env interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Deploy", reflect.TypeOf((*MockInteractor)(nil).Deploy), ctx, u, re, d, env) -} - -// FindCallbackByHash mocks base method. -func (m *MockInteractor) FindCallbackByHash(ctx context.Context, hash string) (*ent.Callback, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindCallbackByHash", ctx, hash) - ret0, _ := ret[0].(*ent.Callback) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindCallbackByHash indicates an expected call of FindCallbackByHash. -func (mr *MockInteractorMockRecorder) FindCallbackByHash(ctx, hash interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindCallbackByHash", reflect.TypeOf((*MockInteractor)(nil).FindCallbackByHash), ctx, hash) -} - -// FindChatUserByID mocks base method. -func (m *MockInteractor) FindChatUserByID(ctx context.Context, id string) (*ent.ChatUser, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindChatUserByID", ctx, id) - ret0, _ := ret[0].(*ent.ChatUser) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindChatUserByID indicates an expected call of FindChatUserByID. -func (mr *MockInteractorMockRecorder) FindChatUserByID(ctx, id interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindChatUserByID", reflect.TypeOf((*MockInteractor)(nil).FindChatUserByID), ctx, id) -} - -// FindDeploymentByID mocks base method. -func (m *MockInteractor) FindDeploymentByID(ctx context.Context, id int) (*ent.Deployment, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindDeploymentByID", ctx, id) - ret0, _ := ret[0].(*ent.Deployment) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindDeploymentByID indicates an expected call of FindDeploymentByID. -func (mr *MockInteractorMockRecorder) FindDeploymentByID(ctx, id interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindDeploymentByID", reflect.TypeOf((*MockInteractor)(nil).FindDeploymentByID), ctx, id) -} - -// FindLockByID mocks base method. -func (m *MockInteractor) FindLockByID(ctx context.Context, id int) (*ent.Lock, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindLockByID", ctx, id) - ret0, _ := ret[0].(*ent.Lock) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindLockByID indicates an expected call of FindLockByID. -func (mr *MockInteractorMockRecorder) FindLockByID(ctx, id interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindLockByID", reflect.TypeOf((*MockInteractor)(nil).FindLockByID), ctx, id) -} - -// FindLockOfRepoByEnv mocks base method. -func (m *MockInteractor) FindLockOfRepoByEnv(ctx context.Context, r *ent.Repo, env string) (*ent.Lock, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindLockOfRepoByEnv", ctx, r, env) - ret0, _ := ret[0].(*ent.Lock) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindLockOfRepoByEnv indicates an expected call of FindLockOfRepoByEnv. -func (mr *MockInteractorMockRecorder) FindLockOfRepoByEnv(ctx, r, env interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindLockOfRepoByEnv", reflect.TypeOf((*MockInteractor)(nil).FindLockOfRepoByEnv), ctx, r, env) -} - -// FindPermOfRepo mocks base method. -func (m *MockInteractor) FindPermOfRepo(ctx context.Context, r *ent.Repo, u *ent.User) (*ent.Perm, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindPermOfRepo", ctx, r, u) - ret0, _ := ret[0].(*ent.Perm) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindPermOfRepo indicates an expected call of FindPermOfRepo. -func (mr *MockInteractorMockRecorder) FindPermOfRepo(ctx, r, u interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindPermOfRepo", reflect.TypeOf((*MockInteractor)(nil).FindPermOfRepo), ctx, r, u) -} - -// FindRepoOfUserByNamespaceName mocks base method. -func (m *MockInteractor) FindRepoOfUserByNamespaceName(ctx context.Context, u *ent.User, namespace, name string) (*ent.Repo, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindRepoOfUserByNamespaceName", ctx, u, namespace, name) - ret0, _ := ret[0].(*ent.Repo) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindRepoOfUserByNamespaceName indicates an expected call of FindRepoOfUserByNamespaceName. -func (mr *MockInteractorMockRecorder) FindRepoOfUserByNamespaceName(ctx, u, namespace, name interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindRepoOfUserByNamespaceName", reflect.TypeOf((*MockInteractor)(nil).FindRepoOfUserByNamespaceName), ctx, u, namespace, name) -} - -// FindUserByID mocks base method. -func (m *MockInteractor) FindUserByID(ctx context.Context, id int64) (*ent.User, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindUserByID", ctx, id) - ret0, _ := ret[0].(*ent.User) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FindUserByID indicates an expected call of FindUserByID. -func (mr *MockInteractorMockRecorder) FindUserByID(ctx, id interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindUserByID", reflect.TypeOf((*MockInteractor)(nil).FindUserByID), ctx, id) -} - -// GetBranch mocks base method. -func (m *MockInteractor) GetBranch(ctx context.Context, u *ent.User, r *ent.Repo, branch string) (*extent.Branch, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBranch", ctx, u, r, branch) - ret0, _ := ret[0].(*extent.Branch) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBranch indicates an expected call of GetBranch. -func (mr *MockInteractorMockRecorder) GetBranch(ctx, u, r, branch interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBranch", reflect.TypeOf((*MockInteractor)(nil).GetBranch), ctx, u, r, branch) -} - -// GetCommit mocks base method. -func (m *MockInteractor) GetCommit(ctx context.Context, u *ent.User, r *ent.Repo, sha string) (*extent.Commit, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCommit", ctx, u, r, sha) - ret0, _ := ret[0].(*extent.Commit) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetCommit indicates an expected call of GetCommit. -func (mr *MockInteractorMockRecorder) GetCommit(ctx, u, r, sha interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCommit", reflect.TypeOf((*MockInteractor)(nil).GetCommit), ctx, u, r, sha) -} - -// GetConfig mocks base method. -func (m *MockInteractor) GetConfig(ctx context.Context, u *ent.User, r *ent.Repo) (*extent.Config, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetConfig", ctx, u, r) - ret0, _ := ret[0].(*extent.Config) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetConfig indicates an expected call of GetConfig. -func (mr *MockInteractorMockRecorder) GetConfig(ctx, u, r interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConfig", reflect.TypeOf((*MockInteractor)(nil).GetConfig), ctx, u, r) -} - -// GetTag mocks base method. -func (m *MockInteractor) GetTag(ctx context.Context, u *ent.User, r *ent.Repo, tag string) (*extent.Tag, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetTag", ctx, u, r, tag) - ret0, _ := ret[0].(*extent.Tag) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTag indicates an expected call of GetTag. -func (mr *MockInteractorMockRecorder) GetTag(ctx, u, r, tag interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTag", reflect.TypeOf((*MockInteractor)(nil).GetTag), ctx, u, r, tag) -} - -// HasLockOfRepoForEnv mocks base method. -func (m *MockInteractor) HasLockOfRepoForEnv(ctx context.Context, r *ent.Repo, env string) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasLockOfRepoForEnv", ctx, r, env) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HasLockOfRepoForEnv indicates an expected call of HasLockOfRepoForEnv. -func (mr *MockInteractorMockRecorder) HasLockOfRepoForEnv(ctx, r, env interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasLockOfRepoForEnv", reflect.TypeOf((*MockInteractor)(nil).HasLockOfRepoForEnv), ctx, r, env) -} - -// ListDeploymentsOfRepo mocks base method. -func (m *MockInteractor) ListDeploymentsOfRepo(ctx context.Context, r *ent.Repo, env, status string, page, perPage int) ([]*ent.Deployment, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListDeploymentsOfRepo", ctx, r, env, status, page, perPage) - ret0, _ := ret[0].([]*ent.Deployment) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListDeploymentsOfRepo indicates an expected call of ListDeploymentsOfRepo. -func (mr *MockInteractorMockRecorder) ListDeploymentsOfRepo(ctx, r, env, status, page, perPage interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDeploymentsOfRepo", reflect.TypeOf((*MockInteractor)(nil).ListDeploymentsOfRepo), ctx, r, env, status, page, perPage) -} - -// ListLocksOfRepo mocks base method. -func (m *MockInteractor) ListLocksOfRepo(ctx context.Context, r *ent.Repo) ([]*ent.Lock, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListLocksOfRepo", ctx, r) - ret0, _ := ret[0].([]*ent.Lock) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListLocksOfRepo indicates an expected call of ListLocksOfRepo. -func (mr *MockInteractorMockRecorder) ListLocksOfRepo(ctx, r interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListLocksOfRepo", reflect.TypeOf((*MockInteractor)(nil).ListLocksOfRepo), ctx, r) -} - -// ListPermsOfRepo mocks base method. -func (m *MockInteractor) ListPermsOfRepo(ctx context.Context, r *ent.Repo, q string, page, perPage int) ([]*ent.Perm, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListPermsOfRepo", ctx, r, q, page, perPage) - ret0, _ := ret[0].([]*ent.Perm) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListPermsOfRepo indicates an expected call of ListPermsOfRepo. -func (mr *MockInteractorMockRecorder) ListPermsOfRepo(ctx, r, q, page, perPage interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPermsOfRepo", reflect.TypeOf((*MockInteractor)(nil).ListPermsOfRepo), ctx, r, q, page, perPage) -} - -// SubscribeEvent mocks base method. -func (m *MockInteractor) SubscribeEvent(fn func(*ent.Event)) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SubscribeEvent", fn) - ret0, _ := ret[0].(error) - return ret0 -} - -// SubscribeEvent indicates an expected call of SubscribeEvent. -func (mr *MockInteractorMockRecorder) SubscribeEvent(fn interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeEvent", reflect.TypeOf((*MockInteractor)(nil).SubscribeEvent), fn) -} - -// UnsubscribeEvent mocks base method. -func (m *MockInteractor) UnsubscribeEvent(fn func(*ent.Event)) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UnsubscribeEvent", fn) - ret0, _ := ret[0].(error) - return ret0 -} - -// UnsubscribeEvent indicates an expected call of UnsubscribeEvent. -func (mr *MockInteractorMockRecorder) UnsubscribeEvent(fn interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsubscribeEvent", reflect.TypeOf((*MockInteractor)(nil).UnsubscribeEvent), fn) -} - -// UpdateChatUser mocks base method. -func (m *MockInteractor) UpdateChatUser(ctx context.Context, cu *ent.ChatUser) (*ent.ChatUser, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateChatUser", ctx, cu) - ret0, _ := ret[0].(*ent.ChatUser) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpdateChatUser indicates an expected call of UpdateChatUser. -func (mr *MockInteractorMockRecorder) UpdateChatUser(ctx, cu interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateChatUser", reflect.TypeOf((*MockInteractor)(nil).UpdateChatUser), ctx, cu) -} - -// UpdateRepo mocks base method. -func (m *MockInteractor) UpdateRepo(ctx context.Context, r *ent.Repo) (*ent.Repo, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateRepo", ctx, r) - ret0, _ := ret[0].(*ent.Repo) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpdateRepo indicates an expected call of UpdateRepo. -func (mr *MockInteractorMockRecorder) UpdateRepo(ctx, r interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRepo", reflect.TypeOf((*MockInteractor)(nil).UpdateRepo), ctx, r) -} diff --git a/internal/server/slack/rollback.go b/internal/server/slack/rollback.go deleted file mode 100644 index 7c8c7819..00000000 --- a/internal/server/slack/rollback.go +++ /dev/null @@ -1,278 +0,0 @@ -package slack - -import ( - "context" - "fmt" - "net/http" - "strconv" - - "github.com/gin-gonic/gin" - "github.com/nleeper/goment" - "github.com/slack-go/slack" - "go.uber.org/zap" - - "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/ent/callback" - "github.com/gitploy-io/gitploy/model/ent/deployment" - "github.com/gitploy-io/gitploy/model/ent/event" - "github.com/gitploy-io/gitploy/model/extent" -) - -const ( - blockDeployment = "block_deployment" - actionDeployment = "aciton_deployment" -) - -type ( - rollbackViewSubmission struct { - DeploymentID int - ApproverIDs []string - } - - deploymentAggregation struct { - envName string - deployments []*ent.Deployment - } -) - -// handleRollbackCmd handles rollback command: "/gitploy rollback OWNER/REPO". -func (s *Slack) handleRollbackCmd(c *gin.Context) { - ctx := c.Request.Context() - - av, _ := c.Get(KeyCmd) - cmd := av.(slack.SlashCommand) - - bv, _ := c.Get(KeyChatUser) - cu := bv.(*ent.ChatUser) - - s.log.Debug("Processing rollback command.", zap.String("command", cmd.Text)) - ns, n := parseCmd(cmd.Text) - - r, err := s.i.FindRepoOfUserByNamespaceName(ctx, cu.Edges.User, ns, n) - if ent.IsNotFound(err) { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, fmt.Sprintf("The `%s/%s` repository is not found.", ns, n)) - c.Status(http.StatusOK) - return - } else if err != nil { - s.log.Error("It has failed to get the repo.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - config, err := s.i.GetConfig(ctx, cu.Edges.User, r) - if err != nil { - postResponseWithError(cmd.ChannelID, cmd.ResponseURL, err) - c.Status(http.StatusOK) - return - } - - perms, err := s.i.ListPermsOfRepo(ctx, r, "", 1, 100) - if err != nil { - s.log.Error("It has failed to list permissions.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - perms = s.filterPerms(perms, cu) - - cb, err := s.i.CreateCallback(ctx, &ent.Callback{ - Type: callback.TypeRollback, - RepoID: r.ID, - }) - if err != nil { - s.log.Error("It has failed to create a new callback.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - as := s.getSuccessfulDeploymentAggregation(ctx, r, config) - - _, err = slack.New(cu.BotToken). - OpenViewContext(ctx, cmd.TriggerID, buildRollbackView(cb.Hash, as, perms)) - if err != nil { - s.log.Error("It has failed to open a dialog.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - c.Status(http.StatusOK) -} - -func buildRollbackView(callbackID string, as []*deploymentAggregation, perms []*ent.Perm) slack.ModalViewRequest { - groups := []*slack.OptionGroupBlockObject{} - - for _, a := range as { - options := []*slack.OptionBlockObject{} - - for _, d := range a.deployments { - created, _ := goment.New(d.CreatedAt) - - options = append(options, slack.NewOptionBlockObject( - strconv.Itoa(d.ID), - slack.NewTextBlockObject( - slack.PlainTextType, - fmt.Sprintf("#%d - %s deployed %s", d.ID, d.GetShortRef(), created.FromNow()), - false, false), - nil)) - } - - groups = append(groups, slack.NewOptionGroupBlockElement( - slack.NewTextBlockObject(slack.PlainTextType, string(a.envName), false, false), - options...)) - } - - approvers := []*slack.OptionBlockObject{} - for _, perm := range perms { - u := perm.Edges.User - if u == nil { - continue - } - - approvers = append(approvers, slack.NewOptionBlockObject( - strconv.FormatInt(u.ID, 10), - slack.NewTextBlockObject(slack.PlainTextType, u.Login, false, false), - nil)) - } - - sets := []slack.Block{ - slack.NewInputBlock( - blockDeployment, - slack.NewTextBlockObject(slack.PlainTextType, "Deployments", false, false), - slack.NewOptionsGroupSelectBlockElement( - slack.OptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select target deployment", false, false), - actionDeployment, - groups..., - ), - ), - } - - if len(approvers) > 0 { - sets = append(sets, slack.InputBlock{ - Type: slack.MBTInput, - BlockID: blockApprovers, - Optional: true, - Label: slack.NewTextBlockObject(slack.PlainTextType, "Approvers", false, false), - Element: slack.NewOptionsSelectBlockElement( - slack.MultiOptTypeStatic, - slack.NewTextBlockObject(slack.PlainTextType, "Select approvers", false, false), - actionApprovers, - approvers..., - ), - }) - } - - return slack.ModalViewRequest{ - Type: slack.VTModal, - CallbackID: callbackID, - Title: slack.NewTextBlockObject(slack.PlainTextType, "Rollback", false, false), - Submit: slack.NewTextBlockObject(slack.PlainTextType, "Submit", false, false), - Close: slack.NewTextBlockObject(slack.PlainTextType, "Close", false, false), - Blocks: slack.Blocks{ - BlockSet: sets, - }, - } -} - -func (s *Slack) getSuccessfulDeploymentAggregation(ctx context.Context, r *ent.Repo, cf *extent.Config) []*deploymentAggregation { - a := []*deploymentAggregation{} - - for _, env := range cf.Envs { - ds, _ := s.i.ListDeploymentsOfRepo(ctx, r, env.Name, string(deployment.StatusSuccess), 1, 5) - if len(ds) == 0 { - continue - } - - a = append(a, &deploymentAggregation{ - envName: env.Name, - deployments: ds, - }) - } - - return a -} - -func (s *Slack) interactRollback(c *gin.Context) { - ctx := c.Request.Context() - - iv, _ := c.Get(KeyIntr) - itr := iv.(slack.InteractionCallback) - - cv, _ := c.Get(KeyChatUser) - cu := cv.(*ent.ChatUser) - - cb, _ := s.i.FindCallbackByHash(ctx, itr.View.CallbackID) - - sm := parseRollbackSubmissions(itr) - - d, err := s.i.FindDeploymentByID(ctx, sm.DeploymentID) - if err != nil { - s.log.Error("It has failed to find the deployment.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - config, err := s.i.GetConfig(ctx, cu.Edges.User, cb.Edges.Repo) - if err != nil { - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - if err := config.Eval(&extent.EvalValues{}); err != nil { - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - var env *extent.Env - if env = config.GetEnv(d.Env); env == nil { - postBotMessage(cu, "The env is not defined in the config.") - c.Status(http.StatusOK) - return - } - - d, err = s.i.Deploy(ctx, cu.Edges.User, cb.Edges.Repo, &ent.Deployment{ - Type: deployment.Type(d.Type), - Ref: d.Ref, - Sha: d.Sha, - Env: d.Env, - IsRollback: true, - }, env) - if err != nil { - s.log.Error("It has failed to deploy.", zap.Error(err)) - postMessageWithError(cu, err) - c.Status(http.StatusOK) - return - } - - if _, err := s.i.CreateEvent(ctx, &ent.Event{ - Kind: event.KindDeployment, - Type: event.TypeCreated, - DeploymentID: d.ID, - }); err != nil { - s.log.Error("It has failed to create the event.", zap.Error(err)) - } - - c.Status(http.StatusOK) -} - -func parseRollbackSubmissions(itr slack.InteractionCallback) *rollbackViewSubmission { - sm := &rollbackViewSubmission{} - - values := itr.View.State.Values - if v, ok := values[blockDeployment][actionDeployment]; ok { - sm.DeploymentID = atoi(v.SelectedOption.Value) - } - - ids := make([]string, 0) - if v, ok := values[blockApprovers][actionApprovers]; ok { - for _, option := range v.SelectedOptions { - ids = append(ids, option.Value) - } - - sm.ApproverIDs = ids - } - - return sm -} diff --git a/internal/server/slack/rollback_test.go b/internal/server/slack/rollback_test.go deleted file mode 100644 index 064067e1..00000000 --- a/internal/server/slack/rollback_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package slack - -import ( - "context" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "github.com/gin-gonic/gin" - "github.com/golang/mock/gomock" - "github.com/slack-go/slack" - "go.uber.org/zap" - - "github.com/gitploy-io/gitploy/internal/server/slack/mock" - "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/ent/deployment" - "github.com/gitploy-io/gitploy/model/extent" -) - -func TestSlack_interactRollback(t *testing.T) { - t.Run("Rollback with the returned deployment.", func(t *testing.T) { - m := mock.NewMockInteractor(gomock.NewController(t)) - - // These values are in "./testdata/rollback-interact.json" - const ( - callbackID = "hZUZvJgWhxYvdekUGESXKjSusKWWIRKr" - chatUserID = "U025KUBB2" - deploymentID = 33 - ) - - t.Log("Find the callback which was stored by the Slash command.") - m. - EXPECT(). - FindCallbackByHash(gomock.Any(), callbackID). - Return(&ent.Callback{ - Edges: ent.CallbackEdges{ - Repo: &ent.Repo{ID: 1}, - }, - }, nil) - - t.Log("Find the deployment by ID.") - m. - EXPECT(). - FindDeploymentByID(gomock.Any(), deploymentID). - Return(&ent.Deployment{ - ID: deploymentID, - Type: deployment.TypeCommit, - Ref: "main", - Sha: "ee411aa", - Env: "prod", - }, nil) - - t.Log("Get the config file of the repository.") - m. - EXPECT(). - GetConfig(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{})). - Return(&extent.Config{ - Envs: []*extent.Env{ - {Name: "prod"}, - }, - }, nil) - - t.Log("Roll back with the returned deployment.") - m. - EXPECT(). - Deploy(gomock.Any(), gomock.AssignableToTypeOf(&ent.User{}), gomock.AssignableToTypeOf(&ent.Repo{}), &ent.Deployment{ - Type: deployment.TypeCommit, - Ref: "main", - Sha: "ee411aa", - Env: "prod", - IsRollback: true, - }, gomock.AssignableToTypeOf(&extent.Env{})). - DoAndReturn(func(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, e *extent.Env) (*ent.Deployment, error) { - d.ID = deploymentID + 1 - return d, nil - }) - - t.Log("Create a new event") - m. - EXPECT(). - CreateEvent(gomock.Any(), gomock.AssignableToTypeOf(&ent.Event{})). - Return(&ent.Event{}, nil) - - s := &Slack{i: m, log: zap.L()} - - gin.SetMode(gin.ReleaseMode) - router := gin.New() - router.POST("/interact", func(c *gin.Context) { - bytes, _ := ioutil.ReadFile("./testdata/rollback-interact.json") - intr := slack.InteractionCallback{} - intr.UnmarshalJSON(bytes) - c.Set(KeyIntr, intr) - c.Set(KeyChatUser, &ent.ChatUser{ - Edges: ent.ChatUserEdges{ - User: &ent.User{}, - }, - }) - }, s.interactRollback) - - req, _ := http.NewRequest("POST", "/interact", nil) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - - w := httptest.NewRecorder() - router.ServeHTTP(w, req) - - if w.Code != http.StatusOK { - t.Fatalf("w.Code = %d, wanted %d. Body = %v", w.Code, http.StatusOK, w.Body) - } - }) -} diff --git a/internal/server/slack/slack.go b/internal/server/slack/slack.go index 9a71c5c4..13f92d79 100644 --- a/internal/server/slack/slack.go +++ b/internal/server/slack/slack.go @@ -2,33 +2,17 @@ // Use of this source code is governed by the Gitploy Non-Commercial License // that can be found in the LICENSE file. -// +build !oss +//go:build !oss package slack import ( "context" - "net/http" - "regexp" - "github.com/gin-gonic/gin" "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/model/ent/callback" - "github.com/slack-go/slack" "go.uber.org/zap" ) -const ( - help = "Below are the commands you can use:\n\n" + - "*Deploy*\n" + - "`/gitploy deploy OWNER/REPO` - Create a new deployment for OWNER/REPO.\n\n" + - "*Rollback*\n" + - "`/gitploy rollback OWNER/REPO` - Rollback by the deployment for OWNER/REPO.\n\n" + - "*Lock/Unlock*\n" + - "`/gitploy lock OWNER/REPO` - Lock the environment to disable deploying.\n" + - "`/gitploy unlock OWNER/REPO` - Unlock the environment.\n\n" -) - func NewSlack(c *SlackConfig) *Slack { s := &Slack{ host: c.ServerHost, @@ -44,47 +28,3 @@ func NewSlack(c *SlackConfig) *Slack { return s } - -// Cmd handles Slash command of Slack. -// https://api.slack.com/interactivity/slash-commands -func (s *Slack) Cmd(c *gin.Context) { - av, _ := c.Get(KeyCmd) - cmd := av.(slack.SlashCommand) - - if matched, _ := regexp.MatchString("^deploy[[:blank:]]+[0-9A-Za-z._-]*/[0-9A-Za-z._-]*$", cmd.Text); matched { - s.handleDeployCmd(c) - } else if matched, _ := regexp.MatchString("^rollback[[:blank:]]+[0-9A-Za-z._-]*/[0-9A-Za-z._-]*$", cmd.Text); matched { - s.handleRollbackCmd(c) - } else if matched, _ := regexp.MatchString("^lock[[:blank:]]+[0-9A-Za-z._-]*/[0-9A-Za-z._-]*$", cmd.Text); matched { - s.handleLockCmd(c) - } else if matched, _ := regexp.MatchString("^unlock[[:blank:]]+[0-9A-Za-z._-]*/[0-9A-Za-z._-]*$", cmd.Text); matched { - s.handleUnlockCmd(c) - } else { - postResponseMessage(cmd.ChannelID, cmd.ResponseURL, help) - } -} - -// Interact interacts interactive components (dialog, button). -func (s *Slack) Interact(c *gin.Context) { - ctx := c.Request.Context() - - v, _ := c.Get(KeyIntr) - itr := v.(slack.InteractionCallback) - - cb, err := s.i.FindCallbackByHash(ctx, itr.View.CallbackID) - if err != nil { - s.log.Error("It has failed to find the callback.", zap.Error(err)) - c.Status(http.StatusInternalServerError) - return - } - - if cb.Type == callback.TypeDeploy { - s.interactDeploy(c) - } else if cb.Type == callback.TypeRollback { - s.interactRollback(c) - } else if cb.Type == callback.TypeLock { - s.interactLock(c) - } else if cb.Type == callback.TypeUnlock { - s.interactUnlock(c) - } -} diff --git a/internal/server/slack/slack_oss.go b/internal/server/slack/slack_oss.go index 0b53b000..7d5ecd67 100644 --- a/internal/server/slack/slack_oss.go +++ b/internal/server/slack/slack_oss.go @@ -1,21 +1,7 @@ -// +build oss +//go:build oss package slack -import ( - "net/http" - - "github.com/gin-gonic/gin" -) - func NewSlack(c *SlackConfig) *Slack { return &Slack{} } - -func (s *Slack) Cmd(c *gin.Context) { - c.Status(http.StatusInternalServerError) -} - -func (s *Slack) Interact(c *gin.Context) { - c.Status(http.StatusInternalServerError) -} diff --git a/internal/server/slack/testdata/deploy-interact.json b/internal/server/slack/testdata/deploy-interact.json deleted file mode 100644 index bb2cc380..00000000 --- a/internal/server/slack/testdata/deploy-interact.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "type": "view_submission", - "team": { - "id": "T024K36ZE3", - "domain": "gitploy" - }, - "user": { - "id": "U025KUBB2", - "username": "octocat", - "name": "octocat", - "team_id": "T024K36ZE3" - }, - "trigger_id": "2343342985366.2150662237479.d8d4101b1404c64b832d43c5768fd2b0", - "view": { - "id": "V02AA2N0H34", - "team_id": "T024K36ZE3", - "type": "modal", - "blocks": [ - { - "type": "input", - "block_id": "block_env", - "label": { - "type": "plain_text", - "text": "Environment", - "emoji": true - }, - "optional": false, - "dispatch_action": false, - "element": { - "type": "static_select", - "action_id": "action_env", - "placeholder": { - "type": "plain_text", - "text": "Select target environment", - "emoji": true - }, - "options": [ - { - "text": { - "type": "plain_text", - "text": "prod", - "emoji": true - }, - "value": "prod" - } - ] - } - }, - { - "type": "input", - "block_id": "block_type", - "label": { - "type": "plain_text", - "text": "Reference Type", - "emoji": true - }, - "optional": false, - "dispatch_action": false, - "element": { - "type": "static_select", - "action_id": "action_type", - "placeholder": { - "type": "plain_text", - "text": "Select your reference type", - "emoji": true - }, - "options": [ - { - "text": { - "type": "plain_text", - "text": "Commit", - "emoji": true - }, - "value": "commit" - }, - { - "text": { - "type": "plain_text", - "text": "Branch", - "emoji": true - }, - "value": "branch" - }, - { - "text": { - "type": "plain_text", - "text": "Tag", - "emoji": true - }, - "value": "tag" - } - ] - } - }, - { - "type": "input", - "block_id": "block_ref", - "label": { - "type": "plain_text", - "text": "Reference", - "emoji": true - }, - "optional": false, - "dispatch_action": false, - "element": { - "type": "plain_text_input", - "action_id": "action_ref", - "placeholder": { - "type": "plain_text", - "text": "E.g. Commit - 25a667d6, Branch - main, Tag - v0.1.2", - "emoji": true - }, - "dispatch_action_config": { - "trigger_actions_on": [ - "on_enter_pressed" - ] - } - } - }, - { - "type": "input", - "block_id": "block_approvers", - "label": { - "type": "plain_text", - "text": "Approvers", - "emoji": true - }, - "optional": true, - "dispatch_action": false, - "element": { - "type": "multi_static_select", - "action_id": "action_approver_ids", - "placeholder": { - "type": "plain_text", - "text": "Select approvers", - "emoji": true - }, - "options": [ - { - "text": { - "type": "plain_text", - "text": "hanjunlee", - "emoji": true - }, - "value": "17633736" - } - ] - } - } - ], - "private_metadata": "", - "callback_id": "nafyVuEqzcchuVmV", - "state": { - "values": { - "block_env": { - "action_env": { - "type": "static_select", - "selected_option": { - "text": { - "type": "plain_text", - "text": "prod", - "emoji": true - }, - "value": "prod" - } - } - }, - "block_type": { - "action_type": { - "type": "static_select", - "selected_option": { - "text": { - "type": "plain_text", - "text": "Branch", - "emoji": true - }, - "value": "branch" - } - } - }, - "block_ref": { - "action_ref": { - "type": "plain_text_input", - "value": "main" - } - }, - "block_approvers": { - "action_approver_ids": { - "type": "multi_static_select", - "selected_options": [ - { - "text": { - "type": "plain_text", - "text": "hanjunlee", - "emoji": true - }, - "value": "17633736" - } - ] - } - } - } - }, - "hash": "1628164073.uijClkp6", - "title": { - "type": "plain_text", - "text": "Deploy", - "emoji": true - }, - "clear_on_close": false, - "notify_on_close": false, - "close": { - "type": "plain_text", - "text": "Close", - "emoji": true - }, - "submit": { - "type": "plain_text", - "text": "Submit", - "emoji": true - }, - "previous_view_id": null, - "root_view_id": "V02AA2N0H34", - "app_id": "24NKFBZT8", - "external_id": "", - "app_installed_team_id": "T024E6ZE3", - "bot_id": "B02YBE1F" - }, - "response_urls": [], - "is_enterprise_install": false, - "enterprise": null -} \ No newline at end of file diff --git a/internal/server/slack/testdata/rollback-interact.json b/internal/server/slack/testdata/rollback-interact.json deleted file mode 100644 index 25aeccf1..00000000 --- a/internal/server/slack/testdata/rollback-interact.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "type": "view_submission", - "team": { - "id": "T024EKG6ZE3", - "domain": "gitploy" - }, - "user": { - "id": "U025KUBB2", - "username": "octocat", - "name": "octocat", - "team_id": "T024EKG6ZE3" - }, - "api_app_id": "A024NKFBZT8", - "token": "KPuw2gHb31oG2GDX5mjbsw6O", - "trigger_id": "2479998291107.2150662237479.a6afd8db96b07e504c2a4dfb22d70e82", - "view": { - "id": "V02E0V16N13", - "team_id": "T024EKG6ZE3", - "type": "modal", - "blocks": [ - { - "type": "input", - "block_id": "block_deployment", - "label": { - "type": "plain_text", - "text": "Deployments", - "emoji": true - }, - "optional": false, - "dispatch_action": false, - "element": { - "type": "static_select", - "action_id": "aciton_deployment", - "placeholder": { - "type": "plain_text", - "text": "Select target deployment", - "emoji": true - }, - "option_groups": [ - { - "label": { - "type": "plain_text", - "text": "local", - "emoji": true - }, - "options": [ - { - "text": { - "type": "plain_text", - "text": "#33 - 36644dd deployed at 15 days ago", - "emoji": true - }, - "value": "33" - }, - { - "text": { - "type": "plain_text", - "text": "#32 - 36644dd deployed at 15 days ago", - "emoji": true - }, - "value": "32" - } - ] - } - ] - } - }, - { - "type": "input", - "block_id": "block_approvers", - "label": { - "type": "plain_text", - "text": "Approvers", - "emoji": true - }, - "optional": true, - "dispatch_action": false, - "element": { - "type": "multi_static_select", - "action_id": "action_approver_ids", - "placeholder": { - "type": "plain_text", - "text": "Select approvers", - "emoji": true - }, - "options": [ - { - "text": { - "type": "plain_text", - "text": "hanjunlee", - "emoji": true - }, - "value": "17633736" - } - ] - } - } - ], - "private_metadata": "", - "callback_id": "hZUZvJgWhxYvdekUGESXKjSusKWWIRKr", - "state": { - "values": { - "block_deployment": { - "aciton_deployment": { - "type": "static_select", - "selected_option": { - "text": { - "type": "plain_text", - "text": "#33 - 36644dd deployed at 15 days ago", - "emoji": true - }, - "value": "33" - } - } - }, - "block_approvers": { - "action_approver_ids": { - "type": "multi_static_select", - "selected_options": [ - { - "text": { - "type": "plain_text", - "text": "hanjunlee", - "emoji": true - }, - "value": "17633736" - } - ] - } - } - } - }, - "hash": "1631327008.N96kHN5Y", - "title": { - "type": "plain_text", - "text": "Rollback", - "emoji": true - }, - "clear_on_close": false, - "notify_on_close": false, - "close": { - "type": "plain_text", - "text": "Close", - "emoji": true - }, - "submit": { - "type": "plain_text", - "text": "Submit", - "emoji": true - }, - "previous_view_id": null, - "root_view_id": "V02E0V16N13", - "app_id": "A024NKFBZT8", - "external_id": "", - "app_installed_team_id": "T024EKG6ZE3", - "bot_id": "B02582YBE1F" - }, - "response_urls": [], - "is_enterprise_install": false, - "enterprise": null -} \ No newline at end of file From 233a5a00cf07a5a8fe7fb98de27beb9f28741d47 Mon Sep 17 00:00:00 2001 From: noah Date: Sat, 18 Dec 2021 19:12:54 +0900 Subject: [PATCH 2/4] Remove helper --- internal/server/slack/helper.go | 70 --------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 internal/server/slack/helper.go diff --git a/internal/server/slack/helper.go b/internal/server/slack/helper.go deleted file mode 100644 index 09814d34..00000000 --- a/internal/server/slack/helper.go +++ /dev/null @@ -1,70 +0,0 @@ -package slack - -import ( - "strconv" - - "github.com/gitploy-io/gitploy/model/ent" - "github.com/gitploy-io/gitploy/pkg/e" - "github.com/slack-go/slack" -) - -func postResponseMessage(channelID, responseURL, message string) error { - _, _, _, err := slack. - New(""). - SendMessage( - channelID, - slack.MsgOptionResponseURL(responseURL, "ephemeral"), - slack.MsgOptionText(message, false), - ) - return err -} - -func postBotMessage(cu *ent.ChatUser, message string) error { - _, _, _, err := slack. - New(cu.BotToken). - SendMessage( - cu.ID, - slack.MsgOptionText(message, false), - ) - return err -} - -func postResponseWithError(channelID, responseURL string, err error) error { - var message string - if ge, ok := err.(*e.Error); ok { - message = ge.Message - } else { - message = err.Error() - } - - _, _, _, err = slack. - New(""). - SendMessage( - channelID, - slack.MsgOptionResponseURL(responseURL, "ephemeral"), - slack.MsgOptionText(message, false), - ) - return err -} - -func postMessageWithError(cu *ent.ChatUser, err error) error { - var message string - if ge, ok := err.(*e.Error); ok { - message = ge.Message - } else { - message = err.Error() - } - - _, _, _, err = slack. - New(cu.BotToken). - SendMessage( - cu.ID, - slack.MsgOptionText(message, false), - ) - return err -} - -func atoi(a string) int { - i, _ := strconv.Atoi(a) - return i -} From be543b628d00b12cb7efbdb0ef996e5e3a8d3b45 Mon Sep 17 00:00:00 2001 From: noah Date: Sat, 18 Dec 2021 20:07:43 +0900 Subject: [PATCH 3/4] Fix documents for Chatops --- docs/concepts/chatops.md | 7 ----- docs/concepts/notification.md | 18 +++++++++++++ docs/images/slack-bot-token-scopes.png | Bin 47404 -> 38046 bytes docs/images/slack-deploy.png | Bin 38412 -> 0 bytes docs/images/slack-interactivity.png | Bin 45140 -> 0 bytes docs/images/slack-new-command.png | Bin 33254 -> 0 bytes docs/images/slack-notification.png | Bin 0 -> 33032 bytes docs/tasks/integration.md | 34 ++++--------------------- mkdocs.yml | 2 +- 9 files changed, 24 insertions(+), 37 deletions(-) delete mode 100644 docs/concepts/chatops.md create mode 100644 docs/concepts/notification.md delete mode 100644 docs/images/slack-deploy.png delete mode 100644 docs/images/slack-interactivity.png delete mode 100644 docs/images/slack-new-command.png create mode 100644 docs/images/slack-notification.png diff --git a/docs/concepts/chatops.md b/docs/concepts/chatops.md deleted file mode 100644 index 5687998e..00000000 --- a/docs/concepts/chatops.md +++ /dev/null @@ -1,7 +0,0 @@ -# Chatops - -ChatOps is a term that’s been coined recently to refer to using chat services, such as Slack or Microsoft Teams, to deploy or run some operations. Gitploy also supports Chatops as a helper tool. - -## Integration - -Currently, Gitploy supports Slack only, but it will support Microsoft Teams near the corner. You can check [the documentation](../tasks/integration.md) for details. diff --git a/docs/concepts/notification.md b/docs/concepts/notification.md new file mode 100644 index 00000000..aa09d51e --- /dev/null +++ b/docs/concepts/notification.md @@ -0,0 +1,18 @@ +# Notification + +Gitploy notifies users when deployments and reviews are created or updated. Now, Gitploy supports browser notification and Slack. + +## Browser + +Gitploy provides the browser notification to alert events as default. Almost modern browsers provide [notification API](https://developer.mozilla.org/ko/docs/Web/API/notification), but unfortunately, some browsers are not supported. To avoid browser compatibility, you can replace it with Slack. + +*Note that if the notification doesn't work even though your browser provides it, you should check the setting that it is enabled or not.* + + +## Slack + +Slack is a popular messaging app for businesses globally. Gitploy supports Slack to notify events of deployments and reviews. You can figure out the Connect button on the settings page after integrating with Slack. Check [the documentation](../tasks/integration.md) for details. + +Figure) Slack notification + +![Slack Notification](../images/slack-notification.png) \ No newline at end of file diff --git a/docs/images/slack-bot-token-scopes.png b/docs/images/slack-bot-token-scopes.png index 9aeea3b08d17b5e3bca33afe8c1f61803a0fb2a3..9ee1ca7d4f9205819139cd52eea91216589b7937 100644 GIT binary patch literal 38046 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

_OqwdI2H|N3xL)~-7p2E~IKHDuM@f&1RyC_l z$w3J+RuXc!-ABylY^p}rtMaV#wgc)h+?TI+{#jO4Arcq4)m96Ov(_!z8v|*d8A>r~ zMXnI{FMd|QVg!9s;{2uD0BmID`jI)mteejgt;CJW0^LsNd+)9LW%9bM`tVZrznA|51~j-ds^4cO>+Ng% z2cf)eYwMa*VSNi~*E0AGT9JZIZ{*EyppZPihdY?nOZp~jwPB^ffLCm+Hh_uOCX%kc zIE4A$EPy9K@mq|fn)EVizd4=n_tL?KnJpXc+HHsx;l+M@!J8bfyK7#meI~f`oX-0w zTO4H9;q>R4W!q^Nf^ggXC0b}*I z?wpDrTB%A)NBYMv8Iv333_Y`D27&Ss{e-$2^e0Go1%%kLj1Fxv6=}my&E^!B57$ZQ z28$r&VqBrnDjsHf_|9eXQY=JcjxkZe&uQsQd|vt$5n`Eh*LbIw ztKai}NwLs;$K39~B-(E*=bq*Hcz^o`WiGXdk_po#JrI8iZJ~NP(e)Nes+zGeGy_rg zcXf#V%om1@k;KddKk6?yNT!b!G6^ey@O5i|_}>B@AikH?5Gcy2lqdP`KKK$^l?}jR zRonHdt>61R6}lyWz@J~mZ~tD%m{w(gCfAj))hxp zF#In}{euQwdEM^je2?AbP;Yyou7DY{C~H

{(_YoEUBTdwE6#z&`^V?_1=)PLZSq_2v zRcdIz#_4+7&xG>Cp5Ca$ylX*qIz3#YM~FMvSLaCBwrgmPq;fHEHpi2&qc>-*Wo_AC zX0J{*&)nLIKhw&8sxM|*;WY&%A*X(-wRftR%Q!iVaVrnZ8CGGW`J)rsw<%4(j_mLv zJgM}5Io`I=bpS9p-{f|;9L(9`e4tZSl?ddbUT?VKvGmXP=JC*J#-+b-G%vS7yB?p2 zC)->FdVi@!5t<`4RqbKe>10^GZCZBu$7Qlau1Aum%9!`qiTz#QFAl4@DK;7Xo>NFU z`OMB4gBH9eNWJ>WU3PA_Sgk^&BQ3usHT410Hg=D0 z>lLs+YkRwwTQ3U2O^P;D8V_!)4Stw(UGjw+|2iMO_X(mswQf19{XprCit_jY772H1 zD+*uUd7s&%PKVT3MC-F+VN1$~!foS$7$t8E=ea3cE3E_Hl#W6(vNH85BgeiZ76A0s z`?rBa@=17TYD(c!wb^`EY7U8NvEmQcy`Ph(Qx3)dYK6J$<+J<(KLNRLgRP>@_#hmq zN2V*J*u8GM^R~R-bl4e}-o-w;BbpN%5QfMyOEhYad3hWⅈ*W!qRpZ06fZ<+h%tY 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 literal 47404 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þzgG{h|?N{li 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 diff --git a/docs/images/slack-deploy.png b/docs/images/slack-deploy.png deleted file mode 100644 index 6647a6a396e8fc501117d2548e6de3300af18aba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38412 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 KxvX8o ziHa&niHeda*a3~rER7%_Btw73!zsipVELTB=5uQ8DTx669H1l-_#O61Xh;!0#NuH3 z`RHou_|}q;K^=T!Q0=URsKOF^x0sa?;^`mqt%(84vfv1fuj{1E^>l=n)%heo#$LYB zUVaA#;v3cHkHbFiAqL)k4JCVOHMKoQU|VA9fVL8X!h;z35*8SKcBbz$F#O`|>Ww56 z^N2De1$cdV_I^)+sy_S%LRyR~k=)pXY{|Ez-!k(f62vs57_frxGuJQdw`y3V2xK1K zKa}%b9e%{*<3yxYg?>8|*C2%8OYFtSg%aWryQ;BtqS**O@~^1%>Bc4r_jq$+NfhRP z#vHI~Y|N1QmAWf0q!k?kk;uU90^pJNGU8n|EEx8aW^=zO59YKR8;Mn;@pX6R3HWO` zdbo#494nCuF(hH>`(txz8=GXG-`02q?v8!lQGNmyLP(lH-8`>B5I0>q$-+YT_!_R< z`XjTES5<-{>+t(W@zDxXvj94^Zv)B9-EBT)#c2DWZr z$4esWWf*^m4P5LZKD8QeKKwEtd-s~FC!p-a5r+Mqq&Ss5Sx~(r;hH)!X1j0w;cgTp zHgpuIsaK`Z6>gKr&)E&g!#0r^95p75vcIuxI6|G$@Lgv`ZV`g7fSo15f%$4{Pr3T> zOpj*x{kgKMCfl1yBON^Dj=H4J)wOlCkor|7`RSbn4=Riz=CsC+xdZOVAD|$x#}1Z= zpcV2%YrgH5j8?$89^OK5B@V@fROLIy9K$gAz;F4oTv%j4Bl}QSh}qf0lyzX<`3a%F z$r9qzK%V!3WATNjgQM-_QGoc?p;iH{;?t@xSO6W|@pc?h&aZk6ssXCZ-^&I~vXjXL zQoPfh2~`*!HA_fE5_&Q)oCIkAD@*hwn(-a-C!uo%j95ej5`-EI5X5_73I*62w4z|I zAUPqE%+Csp4sdt@;u)OdCOEJ$21XkA96`IC4hfKOor-5~`Lt88;A=1)+7( zpK0D9E}?y1$3DYB%#i%38cQ^Y@kzopyGsF~;9V?yEuLx!ji_pNlEQI;^)yQCyK9VV zgosbd6KpjUp!bA6k>b@8L*vC0y?clbgiWx^fo;A-Vo_P`1|M`0|KZ!(F3#zo=GHYEW51a1bR2>H5<5o%C@S@>aCYlOExq22XWpt}WRZ zaA7eZsrxJj@`mvGA9kZ`3T#NZ=(fWkTs2E648 z(CNbJf)wFh$1_M^l2iGRguWc2*u%EL^M$)I)FsU&{Vq<7Y(FMN3Q5vqQcH<@pJ|`W zEcz<6M2v&VJqGg^#)YvReWSle@Kc;fCXO;6H9{=ips_UnHo-ROb~b_PsB|QC|95S2 zb?P~?IjURfG!o#4v1kBYIu(G@TjeF`=`*aKU!`9?)MtZQk=!nXK*&JmPeoY~UlP9L zeX0E7zd_M!BF#l%NCBXTRBD^_%C(mkRe3k#b0BM^%&CB;Fs2;*vvQDfP-dHLn`~Qj zkbf|nMw;e^hM9(&<|j?QN>0&7RYTQ0^PmH)8S@v^W^EI>4#~7f-%Kg zmE9ujBF^I5V(-}uvpe$~3(G0f8JCRES++Tyj7A;%s2$glc>CDhhEant>JQNaR=-v|9r>C^&FA$k~rQNSVc*$USH}ym0*NIJPH{UpS6a zgRI3}8pctSpNpMAHL;jKm(5uQ%pxvr*K5~&^@W`9v5x+tU_NffWL{u_^QB?3V&bgq zZD)ve4=c!Q+UlxvzK3hpCEK?6oE6g%Gfyf_D*KnG^0&g^eU>Tnsbpgf)+WuS1?%d= zor*?(?y;81rzBX*b<@uJd8-LtY}Pr~GJWgoCCJZJ6x}R~RTFmO(la#k=B=v5GsUh! zml!)%$#eXt$+iBDLD!In?i|t_z8r^EAgh)6q{S*LS}Pz(@#yJjcD{C@wXVKm7j#t5`Z$~K#jdS38U*gkeD^QhjaMT$I+x1FuSFFWpy zi{Rp1izW;I!|Hp=%f?HzVPd-}XT!#0`nMK7IjzWy9|#fPee~QkDngdp0pms5Bra~59|*S54?BfXQ%KT zFfg!|NI3fDtP8_#JEj@RYegMpBz6j46+Vq;>tE_C+PK3LVBl2oZ+R6c7Le4iBL^^d z*9G&#b0Pq+UWTBK{LWy1BBhDVioQ>_qqSN-BCXSgV(EXVp-4=sv+-#z5?5#so{bU;XC6Z*h-MNfeBc|QhrSuilBC*54x}y@kZr}A@t^Q>_RVKTN$Q>9TRuVS&t?gZP z7~`w{rRY5xX0kHJt)=Z!l?km=vHoGH7182>^t;a&(m{2>mO$#Cjk4Z3p%-~wS@=W)}tqF{Aun_^hhh+B%AP}3`} zp>Hd_63oYK{xcQB6l1-fZOf$H%=*DOfY6J7WpjSYZe(9; z(Q)_ixb@Oq{?_#>wRPQovrBeog!Vb}xwSqExJ)ET5WTXqu&rR?yvAV>jcrYMLPrilPtN6U`CiS^_wDPPn_>^@u z%KPI}!FlBg=Cktc?);d1f4q06C-tlOP3^Pxc>N=0A||FtTnIZmVn#G4SI2JKxuyDf`=4E-0S{C`F6!=S|Q)lwH$LMi9e2f{q33&{q2(x&RaOuV=y@it5FaElN$bpG_{M8l z;hseEcAwg(@5TsajP=o88eb8v)Zayosp0#9?OQb?4Jl(;SqK{NJ3Itruo(ml_ze>L z;DH|q2f0YgGjEt=9O@R)_>#}iR zQL|<$8V(w=GCYPrD+YtFz%ND&E>fj2sL|T&ygu?Ri}I$^I(A1AhOV z%t%J^R}lvbeliVN1rkx9oe>EK0}}%inE)aQ2??LwS7RO}G4a2vga6|vGj(vV;bCNS zc6MfPW@P}{nJ_YQb8|B?u`sf*(1T0R+q+sj7`V_|+mruC$Ukz#jO-2V%xoOYfYv0x zWJ3SeaP({wn`}z_6M$oc=*RJAv<69rmY?ZN(Jj#0FjUJ-#HUNw4~SAg@6!(kP;JCae+Kag>8A?i`|bF zq2!nGQFn5AnUtPld6_=LFC-SnTUe<{JNFX;1#(k!v$oQWVEbi?(Ww!z<&nYV)ZIiN z{r049_-NSqV0eMG`a2Pyi+(g0DG5w~4>~%Oh!8wHBq=&1yjUcJYb+fizek!+|1u5>LpA3;!RPA!oFXe>M3}Ns=z~ zkb}>1D56dhmx0LvZ~yMmU)e5|Fl3*;ZQVd-VtA2WZJeGgH|N~ICfd9&ArMjLWuf6wW^B{tsr44da)!y=Riu7(85+R^^B>0l3j00mboh|7Lre~Y4}X?M4~G%EL+MkBVMF?F(?alf zVnP9c^a?4GKPC9;e<0}sGQ}n3X#UyJ4l3}9c?gh&Likex3^{mh`BzSV82O)p3%o^N zpQEzGko;2u2@XQY8Gd*!rP=??>scsx90CS0LjNP7Qxd$8_37B9s{h>vzf~p=9>+C8 zG7JXPAEn{N!CiY}SSXbg_}@)K0^>mj-XHSwAEN)1AjE`$zRrpBS$6V&6upKC9*1Wa zrSJdD^8bq}7DMS1`~0UO&}CpyQ@F*GQLXd&sn90&X|eZaSL^rpmB~%3(7EkCe7iN* zkxtvAA53E5e?J->#zOfSlWo7Al5Nr-4sGcNC$c}0pqGq#nNH?(p|W=OVCA3c^udSn zCICsK|%e6NCc1FeS#l)XsXpZ3{@)XvGU2-1;cyI%Skw1I*2UvE5MIlKj43cph7}+W1L= zF(r#$;%1zYm$O<3EwfF!O=&vY?J_=^=ao-{t^H;FW91*)%Liep)jLWc<=%1J%w0RK zSoAtf-PmAGSy2Qh?fH-;sliRaJrK*qrrY}6<4=t=zqXpkGPd@rwd36PzI^{(y&>>0 zezIq>_u?2y;|A#Lbc!>yo!Cb3R!mRi1YM%g;T~}QNIdJeU4ckf-DrYmtKZ(!`uW-l z<=f5_sj8HkvmZ>f!Y#MDbIO>da#-Qbc(yY{;PO+-oJ;Eev-3KoA@Wc=zpf&6UWe^? z?xlVx^bm=(fiH*E-x3_x9bb4l0o8`_fG-K1&HgC)_q1wPNQSj%Q7|$`y&ajZWe*cQEB`HPcH6N&SQEHciB-3 zk2@pD)P{NCDpg;lg4Z~$m-MqQ=PM0)b>cDq>Djt31Xew4as;p)WJPVTbZ5{NbrzC; zy%)v(8pyhXIRD9Jz;xWqt6PPK0m_gwjIZ%hA@YdZbhXWs!2@=8JC0ta@iXad zmIK<;B8hqBfGy{5wnt-)2y+lqtTRwgTN?9t;u}(u_V<5Y|Hry-$(*(k=)Pmd2D8Bp6|E8`<#H7 zZTuV%Ca+m-lzX&LEr^|e-PKsVYr6X48DPctgGyd5k;TYv0RPB!uFSKpo&*c=WTkZx zuh+gGm*wkPOSyJ^tpf7bwZ!g&w3u{3@UMzhJB6f^8DM3c$!)zDgRVIlqn2v>3+e!@>UU1$V2~H zPP$tb^Gx<`c04prb3R;&xZ)0&d-Z%4#N&5kLvqNYa#Y9?L%`#4_(&m@)YD>__X(lT zerGgu@F&gG{#5?Gz$BY~2LzAn#fR&|xhM|ndDEaNIMrgcT!Zf5@0S}D7IS5ar+TgX zyXoGudLyfd?`g)PGeu1o>#U}mR4sxN*JFPv!+W1B^~vIEM!#HyG46NxqFdc{eL|uJ zw0WR*c5JjBoKDOXt8;s5*9RuBIUG!f)|8&ElLzmww7SPK0tH?~G9n>%(DXBx>y8%- zbQhhD;E+(fpO4k0>w?Y0R{{<{ZXlOO~%3DnfH^|_VL zo(HO|=0iW5m_1f{vSmNQn=7=?Jm2l&HQlZW{2WyC;h>FRt?9j=G|I+z22M2bdrxLl zMe$R@5?8pqmFowqo{`KmWUBq)1pDWpLSM7@s+ak6!CRy@VB0&&c{k=S-~(+g#fHsdcDRKB?jI`!DzKxp zoeR+BS!9pG{kI{;8)^ER1oEyr{si(nVLt<5GjKC#&v=yr7HO3h-O#lEtK6WDseFU_ZrN*NrO~lM+Fh&5+}grW%nvN5 z-J^9c*vo|n85|{qqj4G?e622~tyAooZ*2@QKzbcA_s@%@9b&T3g8&dsA5v z#&t!9;`HnOa(6dlT%}ta2UX;3iQE1jC&_XP%^kx+JwphRBiCj7r}`B|y7yaP?%+=@ zzF{1%`+ICwhIvVg7^DP}ufLLdTXqj2H^%eck6SYW+Lpo*orb`M*ZSqd^$CN+8 zKc)>l1k`tO2}FCElY%j_?%r?rM1K&hx_q+n)_R7@!B&H8Pz)0m z<=XxWM4OjAj9vRK&z+l}a?ospwAZoAVM`c3$C-#E&8BIcHuD6{UiO@0df@wQ{~(SZ z_j!RPc&Ty1@+(?K93HnO4MGz$b$;;}I6B>%$lfXTrW5gR>O-~Pt z;9ST1&uTR%vZf^pbZkMQ?%+n?aZc)OssHT>2noFnxjkSFj4emtby{bG8!4-)cVf^U zME1aiDo=HPU=z!@7DsOP+KtnFXV8|nc?}oEMAi2RMp0J>%{ji-_&shlrh={!PF+(I zive69wQ^p=#h?i3Qy1m@K}lWx>>*d*7Y2{A`||de4P9#e&tXy4rukFmGip>`w3Tho zU0#=4Bcl70xrQT`4~~bLm*IqjHNT)QVB7)T+;m_3so|XhA&`#HeU~X`OLhCB3eK!y zyH4=`b^c(;e78bZHegK*q!znIiVJeIdS0{xf+y1S+eWbIksbmR~7 z*XHYZNIgIDCFO2URL@j<&bwO37~@LPWHqU*K$=41(%kFA*-HP99Rl;ww?tYSe>O^Its8x6&P!hQ z^IS$~>dc9(#7%;Bs==5}!l!TzzV9!tcq|-2u)SFCoqeykyD$Q+GbwBMbNu>92>|XzDB{>B4+TnSnmKr_#JxUxU;4i=6pj8<5%>g_|v~%dS>%!UFLol@G8bLs= z@Tl0efA;s2NQO<24x9aQltCmCapk=813bGTl+8(v=11czoE~2OBan=t`mnJ9*D#vm z+ovjfR>y+rj&kBApH{|=KxnYxM)p+nqcTZMXx!dOBRsIQKclp_t-~!{zgUoN5HW&~ zVZ+~_{xG4^aDYZZ(DkVYkDb_1{f#AVP?XCWH2z&kkRDDxfA?3Y#SpVyY5*v`7?41y zQljyFgr)AOHjrouZDEk!urEB8)kIFcGp*TLw!d2fExoy%Q9nzu*~u!2$B_n@n^&)l zSz1o{;qPM$y#OX7aU_jKG@-VAfVd|AuKNy`wvX1~wsUpN=y7tSSS1S}8hmI!jb(Os z*|+@g82RvJiN#zatB7-@^}_!SoskRXU~W13ZNI94o)P_%YgH15Od4Mz2M{#u{$Oq& z(DwY0_Un9tN4U*ODbsYg9w~xz~K1XJL)cNe_@+mD3(@UXaPpcWq0+* z`bT<=3KHSN@Uf5G2B&(5X}_EdQp(pahwf5Xv5q_S8f6bTj$n1>N^}k7=xmr(i&RvK z9H_M}hwyHc>-BWuO1S{B-v6v$sAvdF(@G|*eSiftljDsPUX?z9Hx4=2m%1TpX+W$- z?tu<|YKPbU!uVso7JK4}Mg?rl<=0s)CK1O&@WW@|vIJOC`&}m0nqNq;O8=zUu4rdq zs|rNI&f90rQ!Za=U7MkuYx8u+D!ImQAg1+Z1Q_~SCv=|nhX>kV#*)_SS#6aT7u)0BVgP&w$lw)l_|o;z)C|bM zcc;)kj;m}y3){J}#+p5=H0<3`4zO5isJxCN_ypQ@dZ9 znKXR>#jRz{Ois5MKLhKqw1b72P$HT=A2}BLHkA87;av=TPBKDm(Nss0=K!9g%BQ;t zLpR=Ei>Ny&JhI>$!1Q}oOFr{aM1O?0UU%8^VEI2zn9v6s_2a>__2Kg8FRza*mvdD* zghhasD)q3niUt&pHqbPr-|1S=^2Zz6lkNQYMBK``}9^T`=dn<#*7h=+-yf2f58&Pq^L6f@lLB`IH>s$jT zs3Hta1MF$i^>vq_YAn5hQw|oIzWa7I)Jy&fl?WkVrBfj!tOO)?`P`@~Sc3vqLo@!A1h)2gwARlw0!768yZyCGJ=a?RoQEmY2{TEpjeb2wOP ztZt=hr1__7A@D*>J;Va~mHTT>Ao~mS)HXX|Gg)BqrxR;>d1#t=upyzOwchZw&Ee4j z^?3K@!pZn#Ep)-3m&fij7sJPj#d5gP2hIE6I}mJxtkFVFJUvLub+xiV%`Xe5{Hz3Vvzsct-m1JGcqtF_(--dz4Xss`D@USpTOXs z4-KkR_@6R5!oa}fX;==e?LX`8FW?sD9T>WUF5>#Y{68`ne}G{{#vf%p^nW&puJ9WO zE!c?e`Nxv_OGb+%7(s0Nztd@WGAJ<4lJPm70ao!FMWG1E6^x(Ooo=NEYy=^192jdO zcu09f{{psA*zT%3uf_yl@6dT{{0Vp*LO^v^pTS5D(vlcYt|b^?nQm4GHhJ7vO%e7_ zsnKgs+r9^5^S^PZhvWLymWx*wzTY6x!_~g1 zcAcdwZj`&(ScCH^k>l~?PqlKr=gBl`G`C8awx^BHcq}dhVV)u1JdZ)OOLB_AJqW(> zvLvQ~0Aw3}x2udy(V$8BVlOx9B}(}u8B9tU_?Z$MKf5VP+5Jv`I7W(yG@=VIAU0l- zSWVDkwN&w)>HB<(YjyXvkbq{LCGJQnZ#;+fk|`yoqrv0N@eVgC$%k})=h<~F4Y?=6 zbbBqPxAzsR!K3lr9z>?sOf|S5Z+*d3{!LwO0oRKFr=xk{aedfti;ebFBWdi(Si=DH zq7MtTa|)lvQVXTveZae26rI^o+fJf6F!x!uL!J(pW_%ZJ?<|O zcRO7w+;6S@GPZ!&rq|=E_efWF->~SVr}E^pQ@HJeXbPQ<*;U@&O;qbH52tXm(rdSc zE9FXW_ftu!v|+$o5OaC2cu4>FfbgDCZ)xs>Bo`_AI~YH;OC;ZVnFW^V3@>OHX(U^~m%k!b8yYUhs%@K^S`PB^`pr>Oc$fxpbXIKTTLc^h=8}FBaAy4H^g42EF zv3x49|4zpy9*WUR$`kMjbR>h+@{5_ZD0R+nS9P zWrMfF`>bR4GuRzyj*#AJabU#Dp7m|9DK7UrZ}nt_BmBYX8V%zoXfd`HS1- zETjJcL9pqWOAvcs!0U;to;VfGMDU}%{IO85FoC|!*1-2&P{7UR$(*ic7X6-6)Po<7 z@h*$epcwO)o;B^!r<6x3!WCUlA;M3M-0d9VOOlvNVC=H-bjlNUR*$*DAccgx4!iaN(s%6pVu z7!?V#hDT+>oJ^XUOde#_e5h{lULKN+V@o_gEN{m%KVz#h8ZrKePZ8WxI2R`F3k8dO z{cUw1fi(L&r6V5sr;B%e1K-IPR>3QW8}&MAiF9eK*qcKsPtvSFy##g6HtWbU0_q+q zVXoQv(Awc({+B|X2Z3PMy5`|rxrv}8=ID2|rw!n`U!aFPyTj(P^Xj$4a|DWQozkkTD6ILgieJ6{%ZP01#ADnE3{ub!mcJf?IEk-M#MU2%Kit z2VM^e5*J^8akt1tU8~EIa1l|o;24TWF;C`64Vj6z4aQMh94$A`c|_*7bZ>&;S?jIQ zpUJP$aX%!orQAoFCdtjRkXjRDD5Ik#*uGPNYW zHj#WcuGi#n(q%T1Le2VGXE`yc0PS;6*L+c`nVqL8@7P$-`J+2Sk1VR7Kas_lhCHDf_G7oN?Dgobe;;eGHyEB>r!VF#vT`cLp=LuwawPs z71r3e)w{j!C@y}}%M*|-ZLFF+j}_|$t#-E*%8r``vK#c zXLaB^Kin>{l{Nw}sA`?_(ER*MFX031SvsF9%cF3+9~V>JM^X){h<!IWh6AV+Q5EPTMTcIs+Z(c@HR|oz2wbbZo9trn1noW6tLX zH?3Te0QTYLK27s7%^KF=hHeYVCWOzHYT5HBo|YQ&v;^jsY7>zMuZKWTw7pXe(H-00R1Y072eBVdQIf`37Wsja33Ap0CI z)|x4BaV4Mt@T>|t*&Vcxv`@YGZkjE>4&a2QII)@ZfJkt$Z--sI`YbEeFo z3=i{>aSQ1@%adALfdTU_Q1qEjsUgG{A$3yivQ{>k!xqnhTeKq3r>I8WSXcD9S19-f zX}6G&3#pyhd$Y&0fT19^C{MldCBA$C&rkIwj|e2<-)zWe-#Vj@ISU z*?o#xt3sY4i$UEmZ!yW~kNi0)Q4`oQq7=0B7|@v1EU*%waSW>bqyp0%Mw8gXx-(1H z@CH9G%-~B88PCtiPGi?#pZKe2G=N!wYM*?zHIGPd@8@gmN5v$;@&^IdwRX6Z$!*zG zk!Nwd!|AeaD8|WBEHOLc@HTWSWJjoHm_a4pX(JhQ5{;}=AN{~k!Uvb*mO|nXIM2vt zfq`TeM|FV1>KnmXfpKN;yh~p|I4gYld)>4yHw-WS2#F>%+qpL-``yg%^qvJz#yt5R z5M{VXnM4PIkUneg!fyc@$k(LrPJe631P-&` zipwU-H$q+xc8is8mHg52C-ge-nUzyhx^w8r9&(0gdv`f&G!X5}<8&}^-i@U(a&qs; zsOQ~wF-ZH4SI#n$M%WJ~mdQZG>o~O62zwNe(dPMR2U^Q?NSurn@N`oWiMZcmGnxU-O}IzcvNGkwtU@T5MZykfXXOaZc+l@ zT-+x)QZbWY_xt`s9_KG6bOPwgV|Ec=5EVU9G#-5l=B&~YFi z19f=r$y5-`l2p4@@}tUX79r4s!*#w@nT(w{Hm+rYH^Gvq)$$D_;}ARO>f*zGfpbYcIRVIo0+KdrvD4 zEl4|o|(&I-Dca73sqvPtXFGMQq(l9QoW`&BDroioXx>ry&eJp#KXfWEjzDl#2l~OtVh#>rG#p*PJ zXdm*!_&W9rNkAkaYnYiZ7wwn2#4Q-3Iub1W}l0?KWNSL%Fc8eYzGjz2=!%zJ930Qqarlm;4r1s4H1@*VHuSKddY zWA1<{htnMLYnqgUHbDGzu|+&b#7fVzcoygUjq>BCMy&+`0f&Us!%o#lTCJRqiwIeS z#N2KHun|wN7l(@s-nzBWyAXq7K2+8P!SgIuQ+=|ddX{63ny$)mruMT4@m2vu3IS z%Xvo9Sd+U&aC|FPDilQpZtG5`&~9QGfCsUWLk~!#IH+}lAYVZkf#NAdEKhpJgK3X~ znqNx{wi~j~W zCqBCIcMEqod|8^SJBfARj(~viv#y7OZ`i94_hOyQbRnrRQ0Vr9G8JjD-77e30R#uG z#L;VCtgW7Qd#%8r#H2UaZd4iHjJ3ZYtMVPFQaJ97`;Mmb%Kv8Czy6A;R8y0{pfGQ`_GH!ZUX0lcvBHFPH3mmihHqG2t8O zW}5~qb}h*mKed4a5{Hh!pmbEU($P(-m(?LW5T7M(@bQL%_`!Q7;Y%LdNwH_s_7^`C zwj6Y(62B~Ce~&L~z2(%wHt)LH z%OhEs%9~B*ol}PF!$GmsbqywSGFlX1w!S5U=z<3Ef!YKQG`oXPTzPv-wd*djKEzUh zICV@P1>}Ek^>hE{D>O_Su9jmLbH44(in{BHSZb<{Zb9H9D}0fuw~Kqhs+KGMECa#| zPE^Wful5HS{mj6AZSoe_NfF+s2heP4I{EH;x{!jIm*RP)wCntt0bhcF(3H2uT&WQ~ z!_7zJ2xTXrCCfy$i98X+8R+Cwb9f@l1?zSA>f-MD^>}G=y@u$6?Q4|O0!~u3caN|7 z7&=`A)QURXF`4nx{Nvn#)5-iV+eNdOl9!Yy<{02Y5k;v^?GFHV8K8b;0V&;3sLw*> zNH|=z-Dog&{gBDthkFR@eOt*AS(0CNf7-&Nq(Z`CSW_PvEf>}0hw^`e!*e>Ik`Zn0i`xOJ#<4CVn80!(_Gls|2$@i1lPWy_h7c4}RXkVUI7-%zuF-u^@r+yN z;9r44N=RwWl<9+HwHjQv#h|+~U0AWxk4JQjm#09joV(?4pI!Q>l{f3)%5#$^_&Je< zVh-A3QM9G3OT<*rb4Qama5eumKnC9CDC!*kTtjzvG_~++;g1rreK5^B15{WQz6%5Z zKuy=Ub_C4uFh9?bE@9@2elh}H8YhKC0|?_;ve0IVwM{WdP1jZ3!TfxKp*zC`lg@bg zuL=Ow&99zf-CB)6IJjCQNPu#fflD>8*2S-$!S0&NbcAGD2nop-B1!5{f^aa7{p;8~iN1KD+Vn-W{_gI9g|cpwlL0Gqf^UK9k0+k1A;$KtIrSAe)M&X{ zoX(|#0iixPZUqctb}a5-~rGoJ4+dE8@g{(Qt#VsuYOxf+$SNJ|M{ zvH1L@2b-?LpY#B!jnAyM+R-aZ%cJK>UmOC?0Ot^{1Qm*TrK(`&mT#gr0MV)2+?nvk zSe>(Uy|f>^63J>i!s_AteX>#+J=2>VT$S^$sy*)mf4wwR0LE$y^o+x6dFq=!uv#@o380NCYh3ZVDAyQtzbTWy1JMlX@B;hDkLMOw;ckf&wD${p2iQFB zY>3btU7W3SAHM@gA)tiGpR!_tTNz8r7_2TgSBy%WIQ-c9RMp|@u*sCT&UPBPB-7YNJn%dQ*XUWR;!Cvm`b7% z(woI}obfgZ90IYZsrnJ%JI$e6Lg8;L&r5gFoskFbHmN+)y9WVqSoG6r^6Pni_6&{D zEV?j63a5A4=bPCxu09g?%?A__o@pmll}0-wqMBn$1|GTq?O6MWB=#!`EUbkkQX|A! z$z;wHR0XOIs8m2@R~M&{UMbOUS`&@en1A zIUJ1nYz^+ua)q>2jRxeaQxrP3fCz$%@p6D5kxvDe#ZF0Ljo~h;9QF|l^V%Mon|>!% zP2yRUU9b2x!1MX1e?&#G8<*{d*eI1{OQx>4-g<^vZ(A8S$mE{W$l$dT#-wi;_sZ!< zy_8k3m^lSMnqIos1NBTfF&T-$jHR&|ksZ=TrSlH)uDf8OMQNy^` z79$DDA8T~&h`3Ba2mkWpwQ|-Noa82KOIfU)(`$8qyQ0y_K!|LR9LfLva@+aY7kipi zCW~pkuiqev%}k_JyWWXu+ZW~Tcg%$p?uP1O%=zM*D`gue$0^mcvkB5G`U=N-xjT>j z$EDn%WS(uBh!vgwFTyf(C1)&ad`o{!h;{tv}ocS?E2WH0;`htQ&n>B7Ej&Z9bN zRW68OjEY|}S#Ch;ixL+bQZjKhm&SaPUailtkEht)^5)K%O1wau<*G>F38<-l4Bh*! zzt9KE?Jb7ly$+Irjxs5WsHJLP;SQqY5LOwCsQZCFko2LP_m|ta zvrGf5X`7J|GwsEO4o~B5k zir5NNDTn@`{3I%CtpN`5^KQsAxYC9?XK;j@nWJ3H&8`*i_{(`%C^MUr21OYmNUy$Z z*%ZtbKKvL00EQ-w0`yjF=JdXMF;(sS(yh^tZ0l5R6>s^756?6@s=DlOv%61lk0`qu zeD@z^Q_Idinm3E2)pQ9gl`U&LZ_ER($!m-bQc#-(#us0Z0e&irZztz%4P7Tg8~6i1 zc?#*;&b2q=N2N@i?i1`olCPljn(@sT9D|zLsM_C#LA-<3SodNQeneZ0z~NI z%??Rw=X1T_@)#A!ve}z$)h?JF5qrn*W9;k`NtcCJx4Nyg^*{97Uqq5n$IqR)2?$k< z|A~%=_qCA$Gg&q|4L{ib38(#wq>=#BO*|LTtbZo{-zh5sPr&D*pzsg-r4J=c@ub&i z7g(fPD(?MqpZ_jB9tO;u4-c0C+E0w&&u;+e^9=^%@l(f(^{rklj0P={e6d9F47$?( zg7`A8PnS{s(TvT6>A%?v)e^CM`ShCv4j_L<%HQnLI*Ie?%J#)0n0UHdQf|fv2b?<| zgJu@{L)#V56IfgkO9AaG96jLgIn0jcE1&N5TzC7XwUNjVO--}(BE$DEGN4F*N4zW(|s5lL`0 zqYiN0T&5M|bw0^is5YMRyGNQA1Yv^~BJeqXkDS->;vFH6%RsRS><=m#>m&{{X*41} zn`FA?ml-Pv!4)xXMnK&XN8j_~Ehea=7YX}bU=U?@Dql7q41i^V5hLXxEc!x)P7#k1 z@`)F(NA|CF+2up0tWY?D?aw#bc&u*Wu5Yh%<&JsSOl}C=HX}HHQxQA-05pzMZi!U} zkeob9_uR)1Dd-smZ+~`z2|)ztgqc)6*B@Tb*XoB9+;yZ7$7+6e2$m-Uxk6MGU-vNv z;~CReW4I3%6&=>QVBNrT_)JtUNM^Z|!+Z_47T=)YZN)=2fP)FytRC0~6It^Ge_*rO zW`xg`=^iR}1LxY`*il-{6n)}%yIK3NF(UT+coBMq46u{?Nux?a#jihk1CBJD+&INn z2BX>|Y+zm@?B-}e^mp*cuqI3L+_n(>(;SSS^yMM);nIS=!^@Lv@K8dg=wkq&xY_NR zW_>2d$wV%FB6x>UFRIBdD9LE!1&rYAfwhIY!qhxd{>#Q=tpid7ltQ@CQ9MU35y=-X zVA4Li8$~Rb2WE2YTSEF5)&-96zRLp%Hhe0g_!fGDxzMrMxJK!Y=eY$j%L9q|-Fo7g z6HEmfY+heHLG{kWjV!%3@f0ylF+RM79bz)m#OqhsIri2F=JdV438kZ4w zx5tb9_qAcfwnxj=@c<;ya((lTEDj&`xnK2+Z^W#NX8ECEEapLiy{q;mOhmeFnx6YH zyEZB0KCI!Bo1IJBOnSas#t`9kN0DtE?c8slkG8x;1dKMhGT^$1Qx_iOlVHStu zdk1XBgR!AsdO|W=AD-!F6xtoicSCS$d4#^eD${v&~cuM;V zV)oR*(bg8NPa=_+;LkI_yW0ekSi}Q7fFEV#vlUIisz~AjcT-|;2x+C;_U2GLqu?B8 z20ds-)k2>S-)g!MD3W;4h6()0q{mh7NQkx})D$hi8|*TEa+bdtAlPCgmB5sVyY3b7iXVfpeigtWjyLh{Qcb|N`z{Bsd^^tbz z{_(r(@y>Fv!-dE|vhm%V=;;Ej^IkyH%hmp+VPzz7JE{T0YNkX~dW34o<5}XN!)xZ| zrK3v@{(igLP$hA{r@Gm+0spq{W7v4RITP#Bb0Ork0?H_t(@{dv=4&ah`%cMsIx`l- z;RI&!#7U!Yw!*11*JrnD?g+`$gOWQi&Av#0p-tiqDZ23CqBe=$+;0BeFJ&BD)~{@@ zzey&8>soO9cBMDFKAx-HF0)d;v{laMNPCNJ`2z-jqaco1P2oQao zs~+8B!-?ei-(OO%#KU&zk!QZ!#L}vjtnsbigVr0*l1V+^kW1VU3@bSXJk;4<4JiKR z*VsGY#@wlvdHZV2ro!!aM{Qqh2QRxekSIt(PNijzO2igVd^nDmvEqUW@u) zM}EveSoCCD5|?%+gf`dsp8idi7}+r>wghCpQI70SzECG@o5;1tMg@QgDY>C|fX99` zsydal4U<;A`G}c>uFWX)#d4t`mFR-M-4nHP&R4m?HxuC)MmN8M66rKD2*B`E-*(O$ zj;ZwPj$|fxr&H#^c-pZNMS%hfFvh%Ts({w<{upjMwCZrVm~&MbiZPyZ@>^5rL#xNV z-R1c}OqD$Q^x@Ysz(?>0E&D%m^N4Hc17=V?-wYBTL!Fb#l&7^e@b5W2P00(Io%VJ3 zLPxZ?Uf@YLY*?fnd_3@FX=TRaG#_?77;pRksC&zXs=n`gTj>r_Iz<}k?og2KZt0Tl zZY5PhI;16~yFgf>}Xa)76aOf-U(5iJ&+BNza4lF434=RWf`$I~4yMzge zLImUjB(3+TyKhq$D$JG2^_(uF9L|d*`)pkLo^tNoXce!x!figEg<SIvi6VOQ>1Lpd-2Hi~G}1aCiz4QkV4NdoHWOK= zu01;_wa@NFn<}L0g?ygNVVPUL&Fa5)^$a1YNa%^CA}G?VS`~OU#2}yUYjAMK{Heln zDsn7ZP|rJZ?`$Pai^KrZaBF%fHC&PzIMbuy>tyMckJ?o9#t*59{E=; z076c3A)xV*kmugY$~IO^&do(u?;Tgje&`8;^#bi)n{(fa|Ct*pQgdf0HtTr*q)_+g zK^*A&uVkV%gpHWq!!68AhR1$PnUAEO4KPNxEaH0oN#Q;@Mq(H-w@|Nn9TLVIyb)AF z-!$%vVZS_F=<|+wOX`w(wl!ob_*7TQz+Q+a`j)7Y1l^d6^cn38)GOfVxC!_6x?`qNYr}_g$wE%St1YpT;Ty$775}_{ihh10meS5h$Q+*7+hr6P}_rWr{_z zkkT8p$v3(?$yP^x>N>|uwlOyR^F!W5^STnvdsfi95it{cAGh}~ZV$H?&Fbq`IBhID9?v>N&IPc z*?1Iv5SlRrzPiK+@|Yo9YX*&uKmka;pg^lOceQ%*%i^p;^UAl*YoM_4zf{@RudcbZ{v}nqw z>}|8)rGJiFIhi+Z>9=3-{;>#Dqn}Ti1yOm$>Ut6aQ-Hzq`ggM0)RRa&qzs^>L-xRtw+3GWI8wk6x9d|gi(FHvD6Q@ zqSg=@#qfA$YRMRCNGM#1`7zGkggRk}Kol`Qk4z%pmqquzx4V;#1i-Qw+g@Qd;t$N= z1IV6*=m#?eRKT5NECTP%LC-qkkCK)ixbRks~12qPpz2s zLAmCGfp-w{BUYCj>4cjC@Q%~ium5>Tr%Dg1LlJ$jB+-o&=+~MNeXHtRhDVf5k&8@J58W$`rdeQ5q^j{W$d;xmn2T?sDT62|c?nCg*%->gHjkY9d&)-UTF4@3w!teEr+N*>(U=X`GsN6=Ek+<(G6|5To@l$!&@4yA~L zb(Lh&qH|RX8%uNc&T1|O94|mQ_)W?j|7=9cOb8gIO&n}qG=lH$rINXrTT=<|DG04> z6>^iOERP46Aa{rLM;{RNvM5RBbwNlYBe^%^{%`%*@<93cy-^&IvLB^Dkp*~ zObe)#+Bqb%nUh75}(S7pO5tLVFKK?RYM0^PU@T&n+{_Zr}RD2DxH8 zPxy)^0*Sl?Dgpa?)gK%$NG@B0yx&4s%rBkCsh`_y`=ud@J$^P=XqabDUnM26W3e?;0H^@n{j!lxt`nv7U zdGenWm#LsSEspULveSYBB|pzKge}@|vzY|>?BOE1-^-UhpyG}ZH9B8ccR%kWjm=a_ zGayKF@CF!o1AyAlzr!6nFB1 zoBFL{w%@vrB!f;vhqa8H_CabuPyZTK)WN5b=x(yhScOdP;)`O%Y@~@IwI4aM3BC7L zVR3H>u|Lg-ZEn79Yu4NHT8v}$d4Mz|y*uEkbUV$X+Ld2c*ZKDP{q@T=B+8@=Cj{u{ znhC5U9Y>TeUZR1-J4-C?=b_p`gHhPr#jbe6Sob6maS#PD{=mlhu zxS%f3k(Y*#KH5JMCOkljcFbZgMB^yKz@76xi568ZEl^2RJ)6y>dK|72{jr@~w!m-8 z^3GKSU-j%^4smU`fH^Z^s~GJ?<0b6@w{z#j!B%lIF=y65mp4V78{YgU^qU_{z;r5X?pbAohT58hC?BB{GLh(iKA5sjftS3ArMWaVAQVo3PcOCg+Y4@ zNu~p-tF2yUMUp=lWHP(Mt1g<1_pqbrYOSGfSAOPJ+^k>{!m=s##l6i0X&M$K<2K;} zA59r7Dw*?Z1bTa=5{QPBW}ZCRq;yc#qHy`OCIq9Xt{eVguQiDY8Jm9DI_Y$CpwEeX zgy0LGSX2)}MTgJBMXq?WD*Eu@s?0mEzbyK3!zDRR4GFtD)V?}gFrT}$Zh+NDC^L?y zfZS=K^TpC(YqUnCv?rlfP?(kd##L(8@Es0|-5nPC_+6t|o4bD5yEZsTI)0lp;)4|M z1lNQA8uad&ZvJ*X`h&I{e|I-XG-69<}pyTF+C&P!*?~S1$`jqLJ zanMPCcd?tAey?3;m2Z9TjIg~5(~F5v?ON`~@l%?nUqB6cac~W(>m}EMxAwb(%hS({ zV)AF$0}@3NWcx1R2iM14Z4+}yjrxRG`5z>c5JQ+LWoFr`hFasdEIt|#v~<1?_vpQh z$59@NXAWSx@ipNpL=!P?m}WNHIZkBA)U3L}jnHjKDa-W=V4)o-#{QrK=lX^7HC+#p zrZK&GIS+k>QXIDDko$uBzRY6L1NrUmOeFRX=0aoHra5)r4AaYbP-vTK&hbX0%VHhX zgOJXGnjdb%lG)`_SH*KtQPxvRhPHU8Whg+u#ybK;+I3&;NPcs&cka_07vz7LcGp%5bqPbEH z48EXj;u^XsrChmhnptPsJhsoFka}Nf5s6F}Dc8QZ3lPJ#Mx9D8LMpf%yIgtHg?ODE zc?NPscm`Hklb04e^@&Hy0Y<^5^Xy@v#X7gJCryag{G*`-5YgsGILGGw>DL)~WpcsQ|3vsLwj;N9jeF$T z1@O$;*LRCEPZn?{Vocw!j8a4l@zSfaXHB~Pc4#vl;~0ZSJsm5p>dco2qE~*GfCCd6 zRtU2c^JQ&B4_@RlV{&KK1A-*X8Ud-bPdz=P)qdAV90P36E64ciZ<`G2wXA%gJ-E51 zWrgKCayF)WVM~|{3i7b$xnh{%ggg9X(V)56EaMN_9uSD2cw`;pK=H@~HC!`gsKf+g z=-8mW_QYj>dW1~Yg{t>B?csV2{nFoYZ6<*wq~WrSo=7j8xUq$(RKQAgpe12oMolaf`7w3w@j7d%RdXh)&u=&TL`)E2g5MsuX3EQ|%3 zCqs5%R@IPw`>$Kj2yWM6n+2O)*J-Rxpyml(l^){h^Mk$@*1{|`-d&avk-@z|@N<2& z#mBTGE>QE>@^X~4RK!&@1u>$1Pi{JI4PAt;DKc328QR70pc_)a+dvF#ELN@#WG#t; zfC!R(&u=~zcnHfDcF1%6F2J=%<(3CctyM|dUC}8<$n@TK*_Xr5Ip`KnDM%y;S%ajt z8v_Fj1}O`i7ub}oh#ZL)E8pASyhzPJ4J?g3&x8F+xH#p$T&&#+U$U@p&=+POQVPY2 zX?D1LY=;v6t3Qc1iWK2)%#WriI6GmLoXk};D~)Kj>VV;KF|IrpvNN?ly+t5s_l#_HAC7VZ1e|1x+qnbf z5N3xHEwt1QRzP^0g&oKPF+ln409Yz()wJ^VY&H+lHKKPdn$M^2f2Ik0i3x`ra6G$4u6tqDb?e!^NH6x^o#tP!H&H_bw^Wdi&ViA2q>eK*2M6^S2KGRd8m zN-Qspi&qzF_UNrkA=Zi{&D8M}h{m$9UvK5+|5Vj5xyXl2emGbZ5+7V#F6tWY6!3mA zYATAW%F9*b-r-~4_Uyf(3ce6~cO;Oao?7DPG|Zj8+Mv=RCK?I6`Qyfr z$%9VkE6if}l;f}j^OUPS+wL6Ip|YZ*7Jzi*hAy}MGS|{>PZg7AcyIx=FEGFF4Of#ft>p`1f6(v zM=2L^lf)T~BW;QCA$1(dj8>)WB_qP`vfs#So~V~gD!)`S7G0a`cHFoPV9Hin;)U!U1{_hl7X$U=#x0T9OoPa|q_ zUUg@QSl_*~m}5!JGr*)4I9={tH*BGTMxcZq-u{)sKD|hUPlK>Dh!(Aa;JxJY$d4S* zGzsmpffP+vA#CQN!`-0TU0~V}E6hKN<^>D$GG63*On7>+){tt7q7wDB+^hojY*3YT zeP46+Mq%2)E)KG&!B432XO-kAM^4sTQ~w?zjoq)`pIckFpr^)Xpw&BIT;NDX2t4k=FSuJ3ERnPYia#y_? z=_dId!7R-)Ui^Bz(44gmm)+``X^fyrDAaip*n|}8*Go@f)5e`Q^i2Y*-EpCZON2ka zYYx85BHFhm>t9WX5C5oWU1@kUQICV1T}sfUp6%R7iU7Ge4e`W4Xck{F!?yQBh`a-R);iS^g$X>r-B{|gGo%e*qMcjy=9oL;a3tyA8t~_>*JICIj)t zqHD%ZrF%g_IcnXSM=Q7+&ys}9P?;>N9G3k&Qms}U)z{(ipEVW)G!^@d+z452^}}Cf zd=XZ6fjIFsLEI&iIPKhNeX>YyYzG5ohhpGe)rffD@Hz%~^=hb*ZAL@*enxUn!MYgm z2l;&sws*L4CpHds_ivrqZ4qHDpJZ;JXz_(}tdR+PLF*hi@_`&O&AhuE38}?Lb`s#f|CQ3W z9e4W`#>&?~%F<~VK~R|_*;Qr%*$6mX<3}=omAOba=d#uJ^6m$d~2LA;GgJQKD??Op9-UQU5&M0ILl(0+~n8*^f6UfY`^6Z=_(i4onI#A!ah%R<;sP< zvHL-V(p3y+js<9=bLoZc{=iQP$ ze$S2goz#%))y@k{$n?JXhHp$k?sSmp@05t?eE&b5{rwwW^SgIWj# zWu@ozF&_MdpPid@Bi5tT_3~nm!HPB=oUR{P3crQi5_I{zBC%>0Va0{0?Svx?b((U) zqvH``mhCzb8$cgM_-;A{GR~0qCruXWw3mFY^MAN~Vd8AuLpEjY6+rtrVIhJU$wYp4JK z&_lrfzwD8J1HTBLoXCW)a*W>p4JT~j2hXu^_O1ROCgPRP;MP|1m?-G}arqFqmiJPl z=3hbmbs0hY$yzKPM5FN!N~WzGU@TsFt{4ApWftNBY(g6@TIrt9zc2rP`xPq$yk&e6 zeMAupt{RDdc@ebec_t$n&4c>1NwOs-UP$3}*$!iDS}ycD9}$1~R+BBnib1{97nDY% zo+Qs7J3~i+ch9UX5HTkWcf@dbPGT{~YNkv9q(=MqxQ6-WDlNr9`QEvPit6w8YV)ML zf8yrxyB;ss+J6AL(t%|5XaFI5m~RwnvV~mR;a~R%?JhM7W=kY>apZ%2b|y`9?r|f! z!1Xfs3b4Lbf^??6JMgk;TsPWpgzhW>unC3aaEAmIjr;kwr_@=YQf?$d^I++^_WwEs zf(wlQ=thHfIBi;3(KT<;$fB2&)Mtaa!j9JKIRnTs0*15>WHT09}jg zp;Z)4$sY#M?EdzG%^Tv{EGYH*<^S~)Atnq2o`I5Jd_m!VIe8zSxNN`FN{FrJ>SUHS zm+D=PMu8>fnhR)LU<`(LiTT~%)w>+z+@T*T4JLEnO#U|PM(_sHi6lHaaaIUA3E;ma zNL$kd?gL$*!tQuJ4N!fUI07D14sh$1`X(?NilNyoD#O>ftUzET6KE;2C1XPYxAh&+ zK$xt&d|=RR_yANpo5zDY9bS5bso$s-UOxn=-i&riJ%P4n>x>H+MG(%pv(}zMCV?eL@&}E~)zMP!1Ibk`uoj(o zL8Oux-h%W@%R z(eoiTlU2=FNIQ|z{<||dLJ3=5KFc@-M5PMjKI~l}vUT_b0_4Ys^D#L#+hrktIA`#l zD|T~LtdQp$wOn|79{BKrg;RK(Kepl^HGAvPc3;1E>LW>P=53VFPX*DW zN#Kl7T>nEBY8B7c(mLNVqf=w+SD99WHn&*HHU0SH=YKq1A3W1mc2ynFWY@Uk^O&^K zY%pVvrO^tmbJ`OF9u|+m<^ts57nbk@>uP#lDru*T#jP6mD|`S$G+rxZItz4aNuP}R zQX^m;=CS@u<^b!P-{%hiS+G=hv0HZRezqy2+33!Gak!8KDjNO9xPsoE9AB>OdZGdi z3)*$70GDAyib)C~Y|Kt{j@PTpF(j{a8fC5+Oe1xbFe@&=AXQVKU=I}nV22`+~M$nt6PlCJ~LO%2%|7B!&KLSeJ(wn!s4O~aq1`$}^ zsSj(q7>r6eC=DZ^#x1RcG=2W@3XYG&zvc{{p3C<(B*?ct7=3MQD8xs$JCb;;`u{*Z zplLBfg@!G>ooIyr>8t81tG5*TaSR6aNA zh_c4cDwE;Rk96g+bgE@l>fK>WP_W2PG$I5&@ERKNt(U4&IIO1iFWNZTb?P0n>yD$o!9Y7wVFSLAXJ*dsS1Jvs2Pd@Hs+3B~< zfMA0*)PiUgeZq{qFQx!ADvJ`UquEjo@9_iopQoWLyQU#uAHjOg|5QEDtgvkr;i$iU z2st8Z`W({ftLhLMldm{BrRQ@%%TxOoXxT6Q4aRw*o_vW;J;y|m){n~SM)%8)sQUoE z=vEC+|KZMR*tEi-TlOgps~2E>e2us^bLf1KSPApI(x5#!hRs|tL<9&M$z$m?zE|@S z+#i^Q5>as+y*9W|&J;s^;?Avk`8MC4(&3-nAS@EpEQQ>w$4kdklOg9#-#_P-Y&hMe zYgh|dj6>b&YU8Bu2xw{YNxP548s0Ak#Wv(p48@Gfu1`4AX|9V9w?Ic%dyo@P2b7C3 zfFU#o`De7n-{>bm&(tp%ul5=1uXV_k97Dp3cG~s_O@n54H|}wdw&yh2G$D2X;4Op* z-WLpD6uPzWHy&AM_y@UG!#56$Ny&PUH8!6+JPjND~r_MsR zlNwZk1FnnR%2?YWp+FlZelE^j5M}uFUon=@J1UIBprzrLwqL$eY|l=1K}r}RhOM2PPgdX0 z*4U9h=`Wl4aE2Wz?Eab$K9j;6Q&h&#C@F%94mI$=K2O?92axq^Fh55F0MvUhb~c7! z;psIb;{Tp>G5i2YV+24yHB>DDzp(|WMcDZASp*}@5|HA5Stjtqk2X^I-(wH;=za)t&;IubfYDHAYx2{Kexvi({mR3nKM(H5 z&SS_6ToMYR-udU-L3?^T;@lFn|7a(O5O_O+LNV0;csu?9p!Hf6WWP)P6>uOt7sLSD z33Ln!q`$BFEt7&E+BPOSOYwit^wgl}PYnwF?u*FZS4p`L0zFo)0L0>792{Wm4aj__ zObeDnnXw!h*0H&28$F==OL9Bh)&GmEL&vDAcQl{R3UJL`mX8@1HI6%qfQf?u)_ArG zVd%EU*-Fb=-GzFWp@Q@4Oe>%hmIXAKlWRVoxCKDX$OqzO;g3a{ffhS&5_`&Pq~_?XnOf&L1JI`KKI z07v0R6iKb+6vM6ggj@{2hjWyK`oBRsQ!CN_O*xOttpSd={pL|a=M(Mg64B-W|Kp80 z?j<9t-lo&+oU#{N-BzzN6L@(;-i#-)vm|lE952{+2rNyGV9AOa8YkZDPY@l+e4nfS z`{M|hL)>0h>pwtw%@yeB?G>th3mJ_r@Ft5H`RwxVmOvndQh=s@`)ID{e6%@($B#w-3~zb=%WE-v=|VAMtV>7Ybe*tT8H9KI4C&nPk#f8y(oob98>gV*_e&M zbbD)_jra&)nmu)QVoy+ybvDLIOitnThHP$U6AS}wby~eQ zI4+<~2;F6^3)Mdd)jMSYv>{?iJ%G;~diHH_2QECVLSBI(ZbBfAmw9w$I4w0DBEAJe z&4E3x&;MoEU{9VWVQQd#by>dxLupeb3q&bWFh!N+qWG9yGmU^;OTWIix5zT_@Cew~ z04jl>wt5YeiB%g&=*u+#!VOq8H!NKan8b%bOboEc3XfkI0|C7`P;C=$85K>HgNI?O zY-9>^^LVA5n0=IR-2d+S2@ku`mlOp*e0eZ;R*CNJ(?X#QND)sg#L7<-iAd{= zLI4UvWmZedWyWcI`m#5c73YpdxfFxldUX6H8gIps5Qw=)0T3C;woCOjvL#BuSw@qV{+VCV52OA3G_)#0m-K7A) z1;#v0;Z^(e>qHl|_p1PO#I+|3GB222e^N#y$rr>GB?l-JX;x0BouM|gl_+w*NvqjH zRk9?+_}b!f^0QO9;)6nDU#<4aWBpN+p%3^Z63wGxc07)>)bjDXo5PmfE#^?V9Q=vX z^!ZPS)Jw+JjU-la+0@U+GD$udzreOk6ht@dRAQ<&lVz<=2$6=};o0GMEQ%Kv6Er?e zkf$_$aloW4ml%HvrwuWC9tjIg8@tN|@>OMf^+Yr732c(oGIw6sKq9*XhHVrPzZlRF zt>2z|r(DrE>ll$$65k0iDI`qxjeP&B*bl(x2g zaSWNDE?4G^YeNk-owCb37UR@SN5z98rSEy)%_eeM4z9>QR;<X3ar9l(d)HF5Ynct*<2KobB2 z2xkn2Wge_O1fFs?mg-ImAVu_)pegPc)zi~6V2lhwuMU2}fRcT{8Y6F=*P47pw=(wO z8(+|Gu*nw?*S2WcFoYY-F`sFZpx`pKJV9^HX>!H8{lY*pfE74Zj7W)kC&%NN z44`u5%s+DX18wrPHtKLPgWg!wpC^Kl=W#1MVaaF~-g_jRC*iQwe1ltb2@pp0xISsC z!FK;f8_`q@aEOR@zi4K4?5JC&*@lb9ZDa z8cVI)u(GgHH;+pQDScr2f~is|ITb9^G{5{d?6T1Ko`y!m^M=n)w~rI|wy1hh(iMyN zQMK;&6+N#_Tg?9w(SEf;`K5gs@*EslTIF$o(78F zqY?DdtBYUwU6C9F-wJ8j4vrmKXpW;M8+LiDM!E0L%vfrjP}Is8pEq;uDE`u5g@{@m55fkPCBqAuz%DP zZ`%fW@*Nmz{Qelka8QQ1yQRnRw*7?~kd@q*8g@s-G8=YZPkEjoz1JnaEYr4Kp~Qmc z*s-$^OltOuksZ8RJ28orZe zs&QV;2L8)w(NquTGn!Xs=p$V`cN?}1D|^b)?cNI)GCH3^->Pv~DlAf^IDU8U9{0Cj ze&e6wvN-detkQA{TW)xY0)SC|Nj&D>NrB;G>rSCn?l=7>{1vmdJe z3-oT3yXTJakKKCx?-**P{25ve66vm3$^!%^M+Zg0rN3IdwuUF|@!^i9Z6AYw`CSH@ z2=B>(_C^RWM>>eP+>i-BXG4x(&TBVK^Q!WW+QrF3-VFD}WP%bStw!8uYO|?{r&TF_ zV>wAVcNKJ>Rp%^KKPU%g@biM)Z!sXV&|ABeTF{r9+NJTsi9aI$>=*R!@&HFpybjE^ z$~L<4y-S7nRH5;>zLCaH$b28LV;CDAV#!Nzj@>fJCEJRj6E|%fEwZ z0)_B?n(YU*f(Qr=sTdp2zau@)8`9vfP%8cS!PnV|M?V#iNSsv&kBXnw2ce&7z8kC` z{rNsDYZ>*@`m5u>og!K*g!G*B52JP|QxD^YR07}abY|0W{5shx6qz;fJ=Bd8dp0~i z-0iKuj)&u@Bk?-_mTb3)*EHpL(RYP=-PVDafvW~iAS5n;|B*($loi#k410!gC9czMMYgSdhq%}dN1y~x zX$ZuDQ{qg=Y!D0Y(L9CBbeFqNF#mePbKHJJs@DTY_ML;+YITn0_nynG@J8qHBlg-! zYvTfE9aysSAJbK%eC|UUv&L>&(jC}TZ8HfLd0Y+){gJE6rlsv;#(n*u9W%9r8Ipe2kZm||Xt0)0Bo&)0y-Kgw)G+TnXFXbA z%4qJXZ&z13y;PDyRa)lN(MfNs_#TeVd1fmOG%MUQj-+zgw{I!{|VL-U~ zntp@aES;j^`g_>Ke#_0!p6M?>;}zfLS?3(YBo$K~$fE+#w!BtBy`3|D0O z@vn4XeP0#Uih8y`^RbWrYMwlG!Flv754qxxnT?y^PTfp5Alax`9#;HdGG*1B9&Zc! zljWU}f4|e6W;B0o*R*^%gI7TNB%AFx>dZUwe8y$t#Y((uxXhL{J6%cZU#QZ)V#!V`e~PE9C9xsX zJ>|3BW#eA zBc*QoCO~Z!zt*>7@vXj*VW``FU3t?1Y~kX>7wnD6uR;?)pRLklk;++Z0n$!*E?n1tZ*~6t8UP{gD$Z>c0!2VKdAeQsjtSs2Ci6^ z)N}OkR{bV?4;ug!;zK@N=s3wPhi?8Dcw36h?=kp52JU_gcXbtEQQRyO!ce>Zf_rP< z;hYVLt-`SD&72l|`|*7!U9miCWc^W{){MQh>d>9XE~ZKH6oE6l#rW`;NGd>OoN(yx z7)FY(y~J=C73S)9n$pXq;zhyd`oR8cydG@u_X4};DzX>B3R&PhXVA*8bB~nM`39zl zUemZA3*I7zjMU z8hrL4^=Sa7!7xKJYgR1488ps#(j|^1K&3(cAu=?vf*IcIUoARONG? z38s$FF>|=>!T4}`Fj^ek25EB_aWWQsFqP(GIf#O&eJ^;1NW9k#^40CezSEhW^VCZ$ zY;PtYHn8ne3?K>`h6`cNZ*Ts>?&c@+J-%v>68!Tkwm_Nnk4fegWz$x}O&WsF%=%K) zatWhZHyj#%9wiK6Ww38Ya4GLmg9GvyN}!R|*BKNXzG!Se+yPD~MCqT}v^fY&^mBbV zYq6RBHg-|0?iyvLhOedOA-yE{vXMrjVLgH5y$0g^`x^$gVLprI7_?kJ?{j2p5T&`a z!^pM%fH;U&=dq+({54>Ds@x<9AE zDy8twt{M~nQ6NU`^(q*w0WwZhY4&B4h@9U!$`$7Zn^x2WI?)s2T5D2oX03yA3b4M?@L9i+jcjYsDqfQd{DVIRYsb*4peg>#Nrjw`aX4LqxClnPw+E`~RD zLyj)op2@Ms{1xwE4f)}S>Vlk#=>n#A0%c3DR2}(t-V~t&_SVnaAg*TTB?R23xf6-= zIhJ=hbs8XsQrxrIU@NS1BLo~Bs|EKNg2Q<@7i}{O@12TV1+y~x>P%DJOj1|r@*sv` zJ(#A+l9*duL$8t)`r-Zkm4w%O#vr>VhRJjFkfaTNrr9hBEIelW4(uevwNuNhh<^oL zPoeffSc@#ZQ;s`@-1`y&F|J#hq%$L>&Xg(Bs|A-d#{>Ln;j%&;9p;!UW&oAQe7GoxY7Qf|NHml7R2~tt>w>e z|MgY>yNx!HmcXSp#TRkt|DK=z{d0a$RQhc;e&kjE9s>Wp10-a>?XFs>4Ca4N{q)-`ub1y<3rNdfss2!EvjM4c zBTyD%0lV|DXE>Ai#y2egdtm1eP-dRrM!rsbok1$-%O|OQwhAoXMx$90Wgx|Pe-hD# zGHlW9UD9&JixE0~&HmPB1?T{Y#&qtpp|EgqyUK=uH zZ}orQ@tj;f9s#_lc**wD|4ab?etP+I80qV`@(tLv|7a3}*Wg7N(4zK*{o}IV3(y8a zCz|X3eRcne1%tl$A~px*v(YpD<1(xyXalHD%WnjK-{4D1C`t%+&S+`Fzgz!5P4g`T$S}z2ET|m)! zi0#)0ALvv9(xRwOZ$Sj`*)w%u;N5Goqo%Xs{raUQa3Gg4;^qa&JpRBeiTHXpC;j=eeCq{{`E zj6UE<|DFoZ=)7obI%A%jVgw3Rt#cAfd*emq;1;LO&s$|*8~4S<{!%HB1O~6~kh(D7 z?CAvuv=se#ANum!Lf=90L%xkcHNY?dfO~=`kW?sENo&kl9yJ<)!Hw=Q2F{T7Vp#G# zi-@7qlLd*dOk#?pf$ zV8)x?aE!JD2tGoTK=GQP83G9-99jJw-VXbd`nW{!{yMq=qMMefRmKGR#*$+0FrLQ$Hhr+vO!LEm7sAAq?;rE{W(DVKV`fE?^R>~eSF{s7Hh?BS}g9prY zvbfltC}aMu@Tq16E`isjxB)C~_*DKAE=yiiph9s4zniH^96Q!_v|TMG1+*$z7L~sQ zs;!zaaM~=Q0}{78U{#eU<-SGBanD4tFj~8S+Q2Dfc*{77{}Ko~l5Xv?Zb!ESy(+@p za@$r@-EQ$}&&#Cl_xqFCm2}-UUgfLQ$AO&9aC4fT-p`sX_QO0bGneyPySAhB)_^SK z9>rNsqr}Bkim=K9LCBwWEotXm*%Vsf68$RRb!X<->O9nu)PwCMQ}2ARzAVatxPFbt zVHFQK`toR;7*z4#eQQ2u1iJx`bwM<;QE7EnuGbUn;+;d{eI;k&^BQR8qjLs0t|Z)c zrpnyXh?u2i5t|VN8Ji(xNT{e+OXK;B>ZSU~2L=Z8AK<37J~h4vgGm*)T#fonxx|~l zwi%ouxyYllAn{-~D!3kqC3}1X+Z;~Bs~X(Q$47%Ql!AR#cKO5lg&Du~0WjCS0p*7= z31zU9_>XM6z-7$UE#xd==IMEDsJMZES~)#WF*}rAqwJmg<$k{ZA@^458gd;n4ns_C zs;8tXf1Tu~h7&Q=$A_3JV{ink{gKzzFV%RJXQL(Z8U9US9%&^_w~}>Bi#j|yV-gl% zRWoq7Zw7~IQJ?)PyJ%xf2BM+^WM)13dl7-8D~<2RNjSPsNgRs{0yeX+3Z4zDQqekRHH0!r6wnkXu0QQ#+P%*F{l$5U>4^m(K z@`HxA5Nvf_qg;SZ^dn+BZHTk>zNDKW9U3}sKYHj%mQyysdg)!>lNlr-Lz-*ltwyhx zVbiWyavy#BWwV}Z!(H2G>vl2o*aJ9UfEYw(A zGN}sQdDa%;V8(^vY0LMx79}{J87??N_Ps`TP57+u{cX@7@np#7L8;FP z5bk$VjH%=F=5)pfaXj7Rt3QF0hO6)l`XA$;N;S;e$Zx*hm&GzF)WJ3G6R{#yN+9DKRa3%Uk1Ws>(qAtXl# zdcDxyPUG=itfL}5t@WcNb}0;AZJ3nm#q&}V-~jIXB;%z&iItXYk+zM4S$gFBw;Z?M zo)Qg6a98~lSbt~+82je?A!+WrG~8ekb;{?yapKS$X%)DfHnbS)wC6-U8x}=>71wIV zYC5QlssoA*Dh_xI%Fy{=-3WlX%Y;RW$6@WQ8Q7;~`#e6_pAB$I z1$c3qN2{wE;}H-HQKh*m4svfLXJwz+f?NgdiPzO)Zr?IE8|nupxflXIlhvS^KKg~% zhsswSkE3CXJv6zgKRLpuvo8+D)T~XJN%W7sooCAJ7cQo5q%s(rj(;`)kqm9eNFHYD z+P?mda+=2_x7QMhH$<5Ib@ifi0n*omtXJM8ZMG2@$@vjZCoeiH*V+Y%M!^A(WK-H6 zGV7N5y$WMv^P~A3mXp#6jTf6*r@hB&<7li_TZDKLp-C}xlq~Vj46efQo&{Jxdf&4b zEjTa9fFy9%O}itsK?D35(HZeG%K1=kR$qXwKK-Bn}mjtLDdviYLqdh0CmY?ia1! zWQs6ixC@K-&N2a!_pR{6<2>Pd^BrHXj8{Fd*h>&v0i`*oN_;h$&F*{GkjGe8al@`8 z>KQo7rC>S2`pPuTdK3k;YW^+#_0rXn7b8fB$HEhP3dxYDv$xR0wL-IEQ;Nk<9N@`N zSO+mqu?2q-F#Zfz<`H$+8&&fM3ne+TXpAz=^%OCJ z#Lw3oYHnh|d2Zkc`O)d7Svg+rVv#}i3a^`A2cLm2&Cc#P{AzEa{Kvk60eYGbK(eu= zWiH}UP)NnRRJEnf^f;L!nNPU*tGpI#jGR3 zT-ICt@`5E_uequ4+BrzMNKr+W_r7BKe1UhPQV+T5E?Q0?-`ZD&k`h%Wk!@r`c6G2q zPn5y+IwQo%2Kj!bd`O^xPBcC^aZZ{vH&BnG3NV<3VM~f1r&KuWf9J1#6-AqYi1~PB zX4;J9L~xi?u%l2nlI$0WKo6xJK31r%uSN38iVm*?!jkbg#&Ka{{Ir5fVz;IQM;#4s zy<>5jRTdU{9~}^Ywqjmk(ddV^Cz9s!DRNG5R8dbti}>$ps~A1*Cx(rgUFZ$y*VX3A{hb_`+k*}9Lt zf#g>CYkM)iAB|SGugHSY@|IWL(6~}H9!dsg6M)?pgp&yB9>iguVtD8M_k+S!?UOv~S>-zQ| zTt8fXJdW4x{d&J&FYnj$`M5uxPnT&ooi^oChmE5S%m^Z&i2$>n>&@$#;y#gUBQaiX ztCMSxT_NY_yfb@#R_U}hpm~v8Z3^UAvx2d~L$wqr{k$gHhsDd8G!n3ZMl&LLzmkw` zG@>r@bD6ugX! zAl3`At2sX!qz#Ta`H#7Ca5EI#F-9)+HmB+*?IALKV}laL1Pm|x@A?+kdbT=HPSCvD z@R%&9>;%nYPlef^Vjj1C6i`Gi5}8_SHGas8klxN05tHH^j4i7Y4t+%-krhS8ExO*Qg$gar&xKXug@JIMMtTw?UV|^8sWB z%ow0I@x6G7UX`66ub(?nsCyTv=@7c9KXgjK{9u2IV`7~NPOjcU_*7U_0>55*&>bri z9hYb}LBd2)R$4xl1uNSz(fgL6qaoqNFY9YGn?!2hiW~wKr%fFC((0m)J!=$Jhv@;C zkMBHvCBW^JDz$Kmv?3ndx~&8a-sA6!B*$34XTnb&ndJ}^YtN*l<~k{!Cq27IB#oTk zc4xYJM2RwD86z|0bQpP}lPi9Um+|0LRa$`lSyA^Az$W#s^w7PmQ_vxrV(+}w1P_9j zc5zB!)nSWHE5{Fws&|G|mfD$oqCI{$z+=bEevU~hPop&jf5Z;5*VOp75x?LFkfMDo zYDU-~iC0-ix?F0}|EQODx4X5`yV>1fhD`u(0c+%Hh|;Io@c*R*2|bK>LWOU;(EcT` z_br*He!}w=fuah#d3PnLD<~(^lJv^KF=*jf?`=&oj3afjccANZV8C%N*-K7PTWVOj zXq%d!&!yaYVc1rA6?UuPCQNXva&1nDCQvCP)GpMwYR~W+ zovyB{t0Y;J6H#kE)Yy%)mWvG?KL13SU0CI!Lg~WUZzYJxYiaWV!E4@CXW|d4Xef+O zzKoiF@sfGljDJM7PyW78rRgKZQwITkI|HMnLXa#yS}Ys>b}gD!bz*zW!^ydDfFze`PlVFDBO6W;2rP$Ov zhshcvQ%?tf!9&G8q%#k1BXqSsapDWC^jkqk1+MVi`?m>m1E%d0^uxG?=vvwjh*zxmSdE3kJrZl$eMc@XwXqAaz!XFM0x z404T)6*rtghu$iUiCZ`fQQuP)`Fb}!H3g+a}*zkqfq z4b_+9c`Xil7z5xG)m7U^y2FrSX{WW+?tJ?4K<1v!m!yG|yxJSXy()Ee5?tnHt4gS_ z*JHG|KyRcmfG53@=Q!Q{d2pnbeZJ5j8QlLN$(VVNq zTHhCfKCOey0^`MyY1WGF;!kQ#RAIMgNj|504-^?EU{&RAJ{*sw({b545+FtAKOKlL zp1C{gvTxvGNgp;UV#f;CBUdjQ``V0*Je)rZ7fss=;f#QZHpXriFWmPamF83@lpVHI zMMdSkC_yes?IuxPyFsNH9>UA{YJb`%MRcmj1Th^!+%1b1u}HmS;zP8oz^#%)y+fWT zxVGlExM06OTyBRI9PVFeef#r)X5x9(o+`|@*I6G%L20C~ujyU6Y*-`5%lli)ly>RH zOc@m=e5(G%coFgj)3M~!+`GP(ANM1JnL@f($vk|v-z4G^-hBGSJblsPeN%EwW^PVf z#}EuBd6-tXN;+7m^U)>C>a^*5@2;2geaOV^d(~RT`jTiRHH#pZ=88DHXAem_))Fjq z4O3lHmvL;?F4G+&i3bT>GjN&ASdm?hHFa_e?_&zSPx#3%&QQ9&jZ2)WSR{5om?z00 zdQnP7_yoRTE^onO2Y*HA4y7Dd7OUzhmXf+Gf-f%l{Jg^$yUK_w0ue6TEHF@Q5$VAiN+W|c@N~506UD?kO`-wE7Cg zQht$o??v9Sg!rmgY4a!|sIYqOR+~a>2*n8z~D*^_p=Lb4mdSef2_miEhiMoBvHwjwN(C5iZ zFW?E@0Kuo(wHCW1pAwJmc-@rqtYTt+;$czO#5f%W-w`X*6VJO}t%baI*uP`=&vE1J zTZ!q|*F2DHnJVw=+G~)edznn?rnbjot8}N&@*d})t!r#oIXLyoNEW^(_Dsd#IXu|z z=41&ZkroIv!tXVWfNG~9N+{k)-K1S~LI@6i9}1bfnIX*ZH9V%5jnJvw2J@iA$2sR& zg-vdE*oo5RWrF!kh{YTJ-rG=@B$_>K{`2A$zp{!pllD&EuH&?VIRBTgltu=GiJh?68>8NS@);AZ5>~SJzO~-X?AY-sILE+gY(3mT ztsUJKhzhRHx6}~XOnoVoyKv(Yz64eXcJsFDn-~ZV^TZJ!)R0F^wuuKuzvMVFqC-SS z1vQ%0y`szMjo?R@+e|+Id^0Oxg;7Z=>-n@Rb4WkZo(pblR75>PUeOhBFM-1<_Eu5Q z*#X@kTXi~Qg}q(V%K6eEL=`zS6pFzX0M@iYDlZcgH@@A-Q?|L&Z2>pPWAVCpH*29O-oG( ztDIHNID9^HU{2UYhes)#O&w&*oQ*B!@X4v?jFLEdv`QV-`m)kRLFPJfhEwI5DkucqXL5FLI% zAwX=-vfwT$(kD}n{Ty);4_`GK(Ih)O!lG;YoqkOocJFL|kJ5+-bDyF zWBaph`eWHmwA(FoP6o+~(GX{KX*Xp`oh-MoEow|r%dRF8nL#_8lR~)LL0iXl8lS-3 z3f36cq<6u`N@}9<@2j5+N5dN3rpv~btHj+|uSDJ03IlbbYy{%Is?UTk^#%`d!iM>X zlQU)4HYrw#-VUPh}doBoNCjfH}8s1 zGHpn{r)-$Oa)&rz8FU!@^cgn6edBe`WH%yIinoYKrP#{g?BM<8DTBl~q12SrldX48 zwBp^=*m%kI)#E(TK{d(N(|4EyOgM@CRfo=NPcv*R-Fiv*(~gK1lu_ZOihY5mHC0>j zc34=UQOM79{i-=jPE%TEej7xX3hbs&#VifqP20r@j~Z7ZjfU-#FH#1H)kle8o!s0j zuz*EJb!+c{jbWmOgQa`Jl-?B|`C?IxiyqOpvQ$v}J%IqQIx!pQaGLXdQn*3fusFLZ z3-QD0Lk6gMFGV(S3xqjA=+RkpJqxQQc}^rXeP(F6#)G!jD5Bb`;z9*R{!Da*~xi zChK3}5qt<_#1{(FL!vm7vGU)@n-Porx?6vg#xp7$y-K>DcAaS)f9aaWcw50hl{{=7 zd@lSy%IgKFav8{v%knI`RDY?r|7X7Z^%dI*nd?hmParTIDsr@&#>v`NcmmN->X_<6 zh`CUyfUMXt?ou53zq)Er)WzR50C{W+oM@JyOM`Y{F-x=j{gtlU(1x7QtF$so$xKI{ z-_kogeBjBfkh7l_lBXB?Ua?8DS=V=-T>tUX0(Oe!hL3}~_J1UEDFx%&Yu+Sp_kbPg zJJ5tWD}Vemn)B}|T_76ptZII*Z)DSmBszC?-1^?B918SlR+kyK>_pG5&i@{k6OVCUf^{m`R8JJ2=vG1q_V}M%Tr4IeY?kE?>w!4anO1t-#_*n<&_G*Zl13Huo zaGpf7UnkN9GQkX+DoDhN(bFz~(k%vix#bZ|>)3a4D1)vwRxtgT6rUrh+j6tpMn)Y> z^WG<$@La?C8m%JD>HRz2LL_si9oUz(>zp9pD$oor7L>);Cp|-b8E>OLxVV1UI(Tx9~;S=@9xm#=?c@XLsvk zT-VE0XmTG{hDY=34(;Em7BFhi2f1f*P-ipz22Y8#w^F^{;jahdwaYWN0Z?CW1ejDc z573kvz3oMZ@V0DEa-|Z`=f2QUFSKR7Z#pwxAt=;P<^x+pP$RFv4Y{I;0*$npKR4HN|vr(fwsI0*(72VFwT*W8*0nH)aZn*H~%vjauY zL;Mz~u8#^JmwI|-2;{0eCX6s$E&H6rXBYCFvgtLZN*(i^Z-|iCwN*N7e6Gkaep7`?iKARy31xgQ&%0a5^^rf(s;gC3usJDMxeglS^z8a!#YZk@RscQ zI?wiU@8iY`VYQ)Ofq)?cXD^Tlf~U3uwQFR1oUQ((skc7;omIyG%U0`T2@0rDrbdwz!G7qqk|3#DH* z5Z)XBH%5qFU?YdInzn^UKEL;lhZ@h`^##|&zGZ_32r7%5VddUlo2}GaDd#6}E?giXK4L5jspP7=1)KmwG7z28fCTG$f2hS3 za46LfIydX%dIlpyc&6TFu@eH-6dLpO8r5gK_6=x6EJD@CC}K}{WSU}Yg1=r6;>raR zyV8=s4 z5WC4-#vFw!PHJdKq8BXreNxrV2NlRRws(Ks4d>-T7Me?zf)zmyjPd?1TXu2(U3D)kE1ZF$$vU#s|W?xU1&%pw5rryhIC)Ui39IYC1sgX(%rQm|+bHLC z#4dALzi9a5wH0jn)M?<_AEL+am+z$#zT5l`#t%n(c@ky;p7FR&!N|~S_sPh6PUX#H z$%tHkM}B1w|BpW&)maXG#YVyzRv16OCR1a{y41%2Tr$A;HBI6J`rWFCrM`5F$6mme zV|v<{|Az9)r`bb$$SRbbdV?Mu7NrS>%fh`&|>E~wF&$;nd3 zH=%SkYWK9Ldt2a(5Z~5{=m$fO$ojn*71Zixqgc<}0I2F{qR19rbvRSwY+KJ+WVO;B zMwfkfcTstq->~Fq3c-1^paq^)Vv?gdoRM7WJH^P>R;c8Fz9a0%UVcNi;q!2Rs;M~B z_ZnR*wIc}<2G8UDY4F3bRtqTCc>P4KFIKK!hi~E~Zvx zSnkiu3(=3~(6vlGkH_NAagKpE2!P_MAHsEBMFW@wp?SYgj?$zv>L?S~CmVWsldEUa z(TqnuSHj=6%Q~jC1l1!HB=MXy6uCJba5j?Te7kU*bLpnJZaJPSyf!i}75*YTD$#vd z`>P^h?b)kRS!Yn};@kJ;E5xO&>#<%!adR|@dD;beGnFyAU_XCTy)vnTi17j7shA6k zLxav|?OQxWAnjR4JS$N2dmD6!)`S|lFr2VQXik~Kr&+9bWE6mb;Voe`Rb&gR`O_Nf*B_w-aOd%c5a9)%;n z*uhlsWoD>y!u@e@Jx1(NSI$BxUNdZ)1ZOYP_7LthAQ*qnq}QtR7muHAbqkKD@LDuUE;N`H z1-y`;HR}3uc&+!8h}`Yon;!O}F#}U5-BJhJRKUymw4l7pE|A>0QbdC(R83k^?h7@% z_|>KXG=!6~+VKSzcEyzXj{VNCIJ zvIoZ-&E)346RRVY)56S}^#JDaWaFOW;kaeWq4#6qcMoRCftBOf)Ze%IQo?K^6y!uM z;J~v8_f%bTN5*XLK!zxG_1|AZ17w;pr5vMIUjlrrAe&b;QBqT4{DOwaQcL2T>K|QE zCYuRVIrQ52blZBoB=f$D>vr?*_L7O^Bb9k*Q10;2{^&BU1nnplykdZ@e25b74hME-i_boh%1<%My*W%G z=SB9+n}Y~@;FODO3Lvnp(Q&DH2HbU7{v*xgviWy#;-9%N-kMNWC)^Mh&m9OYru_B* z-byW(J0B|2{~jiB#xs*8G2*~Fby1xY^Av98`1xh)QZ6tm?TQkp%gR5@Ur}QeKzNv# zJ!`p)Yv&kiBigym63ob&(l@=s=a?IN5k3-z$-;+`h(wX>uNuv#bPoXOlQH}F^jn5+ z-Sf}ya_^2^JBzn1jJ%AC-@(^xG`QHs&7^8fEAf(_THoGpCOg?aV|ozIbc-v|{*GjP zXi=Obl9edl1K}P4n|B>~2DzO5`r-M7lC;-l&rA;5MfY-hhr4yF&;+rCE%beVO*E-% znY3g(+C0BD@rQ3Mgp7qu+vOVKnD}Q}ls$dvsKI;g(=O5{Z?5QIXkD>bd$*$Bhf)K-&rYzaY5PsfS zWY5A-#9OxCj1bnoHD?PvsXh!TR+Q*d=~ZcBp=Cct7p7lVbahMp_mCfqA27N zI2mp5Fzo8cT#*Z~evGXmOZHeh8PEO`aOtznd83$R@UhX$7zKEGOo8H9$aU98t<+ox ztxIf48x+(=Lga)Gd{A>LHAuGy`vOfe5V*cfpAmhj)4cwHR!VN*Z~Lk_YleBt!(Q3x z+Ds3|KBEI^LGv4AbgBu`m14-C#R}U$C(58md3EB(plcaRorHKq8ze4E-7n6rG|h?p zaT2cSZm=mp?L|+gPtwh|0HJLi(RnO_bo5~HG)GJ2rH|#pT`*enZd%;kLgzvQA(i{s~_#6N1(tki)T?m+mtrOM2Un5`u_?uwMVR0z-S0Ee@=AoNj z>igFS)%U@r>GKJ97yWgEMla?;n{-9=uMz(L7XSOOng5U6V(u6f8c>G|DPWG-viaYI z=*JKvf8kqSs>Mcc=sjhj>iSTwN^@~!|7X>J1%Oca+QV2O|6JnF2mfrA3Z08>SHxkv j{vR~@Wwzoge&+;iiXR50V^8ESfgk02>URt882kShkei*2 diff --git a/docs/images/slack-new-command.png b/docs/images/slack-new-command.png deleted file mode 100644 index 8d78cbf93147d5a7fca6726457b3cb620826ed17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33254 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 literal 0 HcmV?d00001 diff --git a/docs/tasks/integration.md b/docs/tasks/integration.md index b0c3b58b..466eddd5 100644 --- a/docs/tasks/integration.md +++ b/docs/tasks/integration.md @@ -33,44 +33,20 @@ jobs: ## Slack -Slack integration provides Chatops (i.e. deploy, rollback) and notification alert for events. +Slack integration provides notifications for events. ### Step 1: Create App -Firstly, we have to create [Slack App](https://api.slack.com/apps). Let’s click the Create App button and fill out inputs. +Firstly, we have to create [Slack App](https://api.slack.com/apps). You should click the Create App button and fill out inputs. ### Step 2: Configure Permissions -After creating App let’s move to the *OAuth & Permissions* page. On this page, we have to set up *the redirect URLs* and *Bot Token scopes*. Firstly, let’s add a new redirect URL with the `GITPLOY_SERVER_PROTO://GITPLOY_SERVER_HOST/slack/signin` format; secondly, add `chat:write` and `commands` scopes into the Bot Token scopes. +After creating App, we move to the *OAuth & Permissions* page and set up *the redirect URLs* and *Bot Token scopes*on this page. Firstly, you should add a new redirect URL with the `GITPLOY_SERVER_PROTO://GITPLOY_SERVER_HOST/slack/signin` format; secondly, add `chat:write` scope into the Bot Token scopes. Figure) Slack Bot Token Scopes ![Slack Bot Token Sceops](../images/slack-bot-token-scopes.png) -### Step 3: Create Slash Command - -To use the slash command, we have to create a new command, `/gitploy`. Move to the *Slash Commands* page, and fill out the "Create New Command" form like the following: - -* Command: `/gitploy` -* Request URL: `GITPLOY_SERVER_PROTO://GITPLOY_SERVER_HOST/slack/command` -* Short Description: `Gitploy command` -* Use Hint: `[deploy | rollback | help]` - -Figure) Slack Create New Command - -![Slack New Command](../images/slack-new-command.png) - -### Step 4: Configure Interactivity - -To enable the interactivity, we have to configure which URL interact with Slack. Move to the *Interactivity & Shortcuts* page, and fill out the "Request URL" with the `GITPLOY_SERVER_PROTO://GITPLOY_SERVER_HOST/slack/interact` - -Figure) Slack Interactivity - -![Slack Interactivity](../images/slack-interactivity.png) - -### Step 5: Run Server With App Credentials - -To enable Slack integration, you have to set up these environments when you run the server: `GITPLOY_SLACK_CLIENT_ID`, `GITPLOY_SLACK_CLIENT_SECRET`, and `GITPLOY_SLACK_SIGNING_SECRET`. You can get these credentials from *App Credentials* section of *Basic Information* page. - -On settings page, you can find the button to connect with Slack. Now, you can run the slash command `/gitploy` in Slack. +### Step 3: Run Server With App Credentials +To enable Slack integration, you have to set up these environments when you run the server: `GITPLOY_SLACK_CLIENT_ID` and `GITPLOY_SLACK_CLIENT_SECRET`. You can get these credentials from *App Credentials* section of *Basic Information* page. diff --git a/mkdocs.yml b/mkdocs.yml index 82b118b7..2c37c60c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,7 +18,7 @@ nav: - Review: concepts/review.md - Lock: concepts/lock.md - Permission: concepts/permission.md - - Chatops: concepts/chatops.md + - Notification: concepts/notification.md - Metrics: concepts/metrics.md - License: concepts/license.md - "Self-hosted Server": concepts/self-hosted-server.md From 4738386a72e8fae0d7b337d7b88ca3595f056112 Mon Sep 17 00:00:00 2001 From: noah Date: Sat, 18 Dec 2021 20:12:21 +0900 Subject: [PATCH 4/4] Remove SLACK_SIGNING_SECRET env --- cmd/server/config.go | 11 +++++------ cmd/server/main.go | 1 - docs/references/GITPLOY_SLACK_SIGNING_SECRET.md | 7 ------- docs/references/configurations.md | 1 - internal/server/router.go | 1 - 5 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 docs/references/GITPLOY_SLACK_SIGNING_SECRET.md diff --git a/cmd/server/config.go b/cmd/server/config.go index 888f35a9..aaf6b563 100644 --- a/cmd/server/config.go +++ b/cmd/server/config.go @@ -48,11 +48,10 @@ type ( } Slack struct { - SlackClientID string `split_words:"true"` - SlackClientSecret string `split_words:"true"` - SlackSigningSecret string `split_words:"true"` - SlackUserScopes []string `split_words:"true" default:""` - SlackBotScopes []string `split_words:"true" default:"commands,chat:write"` + SlackClientID string `split_words:"true"` + SlackClientSecret string `split_words:"true"` + SlackUserScopes []string `split_words:"true" default:""` + SlackBotScopes []string `split_words:"true" default:"commands,chat:write"` } Webhook struct { @@ -88,7 +87,7 @@ func (c *Config) isGithubEnabled() bool { } func (c *Config) isSlackEnabled() bool { - return c.SlackClientID != "" && c.SlackClientSecret != "" && c.SlackSigningSecret != "" + return c.SlackClientID != "" && c.SlackClientSecret != "" } func (c *Config) hasTLS() bool { diff --git a/cmd/server/main.go b/cmd/server/main.go index 2257c9bd..c9feb525 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -123,7 +123,6 @@ func newChatConfig(c *Config) *server.ChatConfig { Type: server.ChatTypeSlack, ClientID: c.SlackClientID, ClientSecret: c.SlackClientSecret, - Secret: c.SlackSigningSecret, BotScopes: c.SlackBotScopes, UserScopes: c.SlackUserScopes, } diff --git a/docs/references/GITPLOY_SLACK_SIGNING_SECRET.md b/docs/references/GITPLOY_SLACK_SIGNING_SECRET.md deleted file mode 100644 index 1349ddd5..00000000 --- a/docs/references/GITPLOY_SLACK_SIGNING_SECRET.md +++ /dev/null @@ -1,7 +0,0 @@ -# GITPLOY_SLACK_SIGNING_SECRET - -Optional string value configure Slack signing secret. It confirms that each request comes from Slack by verifying its unique signature. - -``` -GITPLOY_SLACK_SIGNING_SECRET=525e5a41c7cfdf2d915ad75c74d482 -``` \ No newline at end of file diff --git a/docs/references/configurations.md b/docs/references/configurations.md index 96a2487a..e72b5e6f 100644 --- a/docs/references/configurations.md +++ b/docs/references/configurations.md @@ -18,7 +18,6 @@ Index of server configuration settings: * [GITPLOY_SERVER_PROTO](./GITPLOY_SERVER_PROTO.md) * [GITPLOY_SLACK_CLIENT_ID](./GITPLOY_SLACK_CLIENT_ID.md) * [GITPLOY_SLACK_CLIENT_SECRET](./GITPLOY_SLACK_CLIENT_SECRET.md) -* [GITPLOY_SLACK_SIGNING_SECRET](./GITPLOY_SLACK_SIGNING_SECRET.md) * [GITPLOY_STORE_DRIVER](./GITPLOY_STORE_DRIVER.md) * [GITPLOY_STORE_SOURCE](./GITPLOY_STORE_SOURCE.md) * [GITPLOY_TLS_CERT](./GITPLOY_TLS_CERT.md) diff --git a/internal/server/router.go b/internal/server/router.go index d89d6ae9..32f61188 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -63,7 +63,6 @@ type ( Type ChatType ClientID string ClientSecret string - Secret string BotScopes []string UserScopes []string }