diff --git a/.gopmfile b/.gopmfile index 13de011cd..0ea9eed96 100644 --- a/.gopmfile +++ b/.gopmfile @@ -18,8 +18,8 @@ github.com/go-xorm/core = commit:5bf745d github.com/go-xorm/xorm = commit:c6c7056 github.com/gogits/chardet = commit:2404f77 github.com/gogits/cron = commit:7f3990a -github.com/gogits/git-module = commit:f78bf3b -github.com/gogits/go-gogs-client = commit:5e50f02 +github.com/gogits/git-module = commit:7b206b5 +github.com/gogits/go-gogs-client = commit:2ffd470 github.com/issue9/identicon = commit:d36b545 github.com/jaytaylor/html2text = commit:52d9b78 github.com/kardianos/minwinsvc = commit:cad6b2b diff --git a/README.md b/README.md index bdc02472b..68c583089 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra ![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true) -##### Current tip version: 0.9.83 (see [Releases](https://github.com/gogits/gogs/releases) for binary versions) +##### Current tip version: 0.9.84 (see [Releases](https://github.com/gogits/gogs/releases) for binary versions) | Web | UI | Preview | |:-------------:|:-------:|:-------:| diff --git a/cmd/web.go b/cmd/web.go index b211e97c2..06f94c787 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -88,7 +88,7 @@ func checkVersion() { {"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"}, {"gopkg.in/ini.v1", ini.Version, "1.8.4"}, {"gopkg.in/macaron.v1", macaron.Version, "1.1.7"}, - {"github.com/gogits/git-module", git.Version, "0.3.7"}, + {"github.com/gogits/git-module", git.Version, "0.3.8"}, {"github.com/gogits/go-gogs-client", gogs.Version, "0.12.1"}, } for _, c := range checkers { diff --git a/glide.lock b/glide.lock index 41f0f8ff6..a64dde1d8 100644 --- a/glide.lock +++ b/glide.lock @@ -41,9 +41,9 @@ imports: - name: github.com/gogits/cron version: 7f3990acf1833faa5ebd0e86f0a4c72a4b5eba3c - name: github.com/gogits/git-module - version: f78bf3bf703cb3eb0e85a9475d26826939feda4f + version: 7b206b529a09ae8cfa1df52a6c0cdd2612cfc6fc - name: github.com/gogits/go-gogs-client - version: 5e50f0292565471b41b3c73fcadcb886140f0082 + version: 2ffd4704c6f37d7fb10110450fe035fa6df08db8 - name: github.com/issue9/identicon version: d36b54562f4cf70c83653e13dc95c220c79ef521 - name: github.com/jaytaylor/html2text diff --git a/gogs.go b/gogs.go index fa18848c4..fbf849254 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.9.83.0816" +const APP_VER = "0.9.84.0824" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/issue.go b/models/issue.go index 6bbc0f871..1446056e5 100644 --- a/models/issue.go +++ b/models/issue.go @@ -62,73 +62,73 @@ type Issue struct { Comments []*Comment `xorm:"-"` } -func (i *Issue) BeforeInsert() { - i.CreatedUnix = time.Now().Unix() - i.UpdatedUnix = i.CreatedUnix +func (issue *Issue) BeforeInsert() { + issue.CreatedUnix = time.Now().Unix() + issue.UpdatedUnix = issue.CreatedUnix } -func (i *Issue) BeforeUpdate() { - i.UpdatedUnix = time.Now().Unix() - i.DeadlineUnix = i.Deadline.Unix() +func (issue *Issue) BeforeUpdate() { + issue.UpdatedUnix = time.Now().Unix() + issue.DeadlineUnix = issue.Deadline.Unix() } -func (i *Issue) AfterSet(colName string, _ xorm.Cell) { +func (issue *Issue) AfterSet(colName string, _ xorm.Cell) { var err error switch colName { case "id": - i.Attachments, err = GetAttachmentsByIssueID(i.ID) + issue.Attachments, err = GetAttachmentsByIssueID(issue.ID) if err != nil { - log.Error(3, "GetAttachmentsByIssueID[%d]: %v", i.ID, err) + log.Error(3, "GetAttachmentsByIssueID[%d]: %v", issue.ID, err) } - i.Comments, err = GetCommentsByIssueID(i.ID) + issue.Comments, err = GetCommentsByIssueID(issue.ID) if err != nil { - log.Error(3, "GetCommentsByIssueID[%d]: %v", i.ID, err) + log.Error(3, "GetCommentsByIssueID[%d]: %v", issue.ID, err) } - i.Labels, err = GetLabelsByIssueID(i.ID) + issue.Labels, err = GetLabelsByIssueID(issue.ID) if err != nil { - log.Error(3, "GetLabelsByIssueID[%d]: %v", i.ID, err) + log.Error(3, "GetLabelsByIssueID[%d]: %v", issue.ID, err) } case "poster_id": - i.Poster, err = GetUserByID(i.PosterID) + issue.Poster, err = GetUserByID(issue.PosterID) if err != nil { if IsErrUserNotExist(err) { - i.PosterID = -1 - i.Poster = NewGhostUser() + issue.PosterID = -1 + issue.Poster = NewGhostUser() } else { - log.Error(3, "GetUserByID[%d]: %v", i.ID, err) + log.Error(3, "GetUserByID[%d]: %v", issue.ID, err) } return } case "milestone_id": - if i.MilestoneID == 0 { + if issue.MilestoneID == 0 { return } - i.Milestone, err = GetMilestoneByID(i.MilestoneID) + issue.Milestone, err = GetMilestoneByRepoID(issue.RepoID, issue.MilestoneID) if err != nil { - log.Error(3, "GetMilestoneById[%d]: %v", i.ID, err) + log.Error(3, "GetMilestoneById[%d]: %v", issue.ID, err) } case "assignee_id": - if i.AssigneeID == 0 { + if issue.AssigneeID == 0 { return } - i.Assignee, err = GetUserByID(i.AssigneeID) + issue.Assignee, err = GetUserByID(issue.AssigneeID) if err != nil { - log.Error(3, "GetUserByID[%d]: %v", i.ID, err) + log.Error(3, "GetUserByID[%d]: %v", issue.ID, err) } case "deadline_unix": - i.Deadline = time.Unix(i.DeadlineUnix, 0).Local() + issue.Deadline = time.Unix(issue.DeadlineUnix, 0).Local() case "created_unix": - i.Created = time.Unix(i.CreatedUnix, 0).Local() + issue.Created = time.Unix(issue.CreatedUnix, 0).Local() case "updated_unix": - i.Updated = time.Unix(i.UpdatedUnix, 0).Local() + issue.Updated = time.Unix(issue.UpdatedUnix, 0).Local() } } @@ -600,7 +600,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) { opts.Issue.Index = opts.Repo.NextIssueIndex() if opts.Issue.MilestoneID > 0 { - milestone, err := getMilestoneByID(e, opts.Issue.MilestoneID) + milestone, err := getMilestoneByRepoID(e, opts.Issue.RepoID, opts.Issue.MilestoneID) if err != nil && !IsErrMilestoneNotExist(err) { return fmt.Errorf("getMilestoneByID: %v", err) } @@ -1392,50 +1392,41 @@ func NewMilestone(m *Milestone) (err error) { return err } - if _, err = sess.Exec("UPDATE `repository` SET num_milestones=num_milestones+1 WHERE id=?", m.RepoID); err != nil { + if _, err = sess.Exec("UPDATE `repository` SET num_milestones = num_milestones + 1 WHERE id = ?", m.RepoID); err != nil { return err } return sess.Commit() } -func getMilestoneByID(e Engine, id int64) (*Milestone, error) { - m := &Milestone{ID: id} +func getMilestoneByRepoID(e Engine, repoID, id int64) (*Milestone, error) { + m := &Milestone{ + ID: id, + RepoID: repoID, + } has, err := e.Get(m) if err != nil { return nil, err } else if !has { - return nil, ErrMilestoneNotExist{id, 0} + return nil, ErrMilestoneNotExist{id, repoID} } return m, nil } -// GetMilestoneByID returns the milestone of given ID. -func GetMilestoneByID(id int64) (*Milestone, error) { - return getMilestoneByID(x, id) +// GetWebhookByRepoID returns milestone of repository by given ID. +func GetMilestoneByRepoID(repoID, id int64) (*Milestone, error) { + return getMilestoneByRepoID(x, repoID, id) } -// GetRepoMilestoneByID returns the milestone of given ID and repository. -func GetRepoMilestoneByID(repoID, milestoneID int64) (*Milestone, error) { - m := &Milestone{ID: milestoneID, RepoID: repoID} - has, err := x.Get(m) - if err != nil { - return nil, err - } else if !has { - return nil, ErrMilestoneNotExist{milestoneID, repoID} - } - return m, nil -} - -// GetAllRepoMilestones returns all milestones of given repository. -func GetAllRepoMilestones(repoID int64) ([]*Milestone, error) { +// GetMilestonesByRepoID returns all milestones of a repository. +func GetMilestonesByRepoID(repoID int64) ([]*Milestone, error) { miles := make([]*Milestone, 0, 10) - return miles, x.Where("repo_id=?", repoID).Find(&miles) + return miles, x.Where("repo_id = ?", repoID).Find(&miles) } // GetMilestones returns a list of milestones of given repository and status. func GetMilestones(repoID int64, page int, isClosed bool) ([]*Milestone, error) { miles := make([]*Milestone, 0, setting.UI.IssuePagingNum) - sess := x.Where("repo_id=? AND is_closed=?", repoID, isClosed) + sess := x.Where("repo_id = ? AND is_closed = ?", repoID, isClosed) if page > 0 { sess = sess.Limit(setting.UI.IssuePagingNum, (page-1)*setting.UI.IssuePagingNum) } @@ -1509,7 +1500,7 @@ func changeMilestoneIssueStats(e *xorm.Session, issue *Issue) error { return nil } - m, err := getMilestoneByID(e, issue.MilestoneID) + m, err := getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) if err != nil { return err } @@ -1543,7 +1534,7 @@ func ChangeMilestoneIssueStats(issue *Issue) (err error) { func changeMilestoneAssign(e *xorm.Session, issue *Issue, oldMilestoneID int64) error { if oldMilestoneID > 0 { - m, err := getMilestoneByID(e, oldMilestoneID) + m, err := getMilestoneByRepoID(e, issue.RepoID, oldMilestoneID) if err != nil { return err } @@ -1561,7 +1552,7 @@ func changeMilestoneAssign(e *xorm.Session, issue *Issue, oldMilestoneID int64) } if issue.MilestoneID > 0 { - m, err := getMilestoneByID(e, issue.MilestoneID) + m, err := getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) if err != nil { return err } @@ -1595,9 +1586,9 @@ func ChangeMilestoneAssign(issue *Issue, oldMilestoneID int64) (err error) { return sess.Commit() } -// DeleteMilestoneByID deletes a milestone by given ID. -func DeleteMilestoneByID(id int64) error { - m, err := GetMilestoneByID(id) +// DeleteMilestoneByRepoID deletes a milestone from a repository. +func DeleteMilestoneByRepoID(repoID, id int64) error { + m, err := GetMilestoneByRepoID(repoID, id) if err != nil { if IsErrMilestoneNotExist(err) { return nil @@ -1626,9 +1617,9 @@ func DeleteMilestoneByID(id int64) error { return err } - if _, err = sess.Exec("UPDATE `issue` SET milestone_id=0 WHERE milestone_id=?", m.ID); err != nil { + if _, err = sess.Exec("UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { return err - } else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id=0 WHERE milestone_id=?", m.ID); err != nil { + } else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { return err } return sess.Commit() diff --git a/models/repo.go b/models/repo.go index c08c7842f..c8ac58488 100644 --- a/models/repo.go +++ b/models/repo.go @@ -359,7 +359,7 @@ func (repo *Repository) GetAssigneeByID(userID int64) (*User, error) { // GetMilestoneByID returns the milestone belongs to repository by given ID. func (repo *Repository) GetMilestoneByID(milestoneID int64) (*Milestone, error) { - return GetRepoMilestoneByID(repo.ID, milestoneID) + return GetMilestoneByRepoID(repo.ID, milestoneID) } // IssueStats returns number of open and closed repository issues by given filter mode. diff --git a/models/webhook.go b/models/webhook.go index ad4ac189b..01a014223 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -210,15 +210,18 @@ func GetWebhookByOrgID(orgID, id int64) (*Webhook, error) { } // GetActiveWebhooksByRepoID returns all active webhooks of repository. -func GetActiveWebhooksByRepoID(repoID int64) (ws []*Webhook, err error) { - err = x.Where("repo_id=?", repoID).And("is_active=?", true).Find(&ws) - return ws, err +func GetActiveWebhooksByRepoID(repoID int64) ([]*Webhook, error) { + webhooks := make([]*Webhook, 0, 5) + return webhooks, x.Find(&webhooks, &Webhook{ + RepoID: repoID, + IsActive: true, + }) } -// GetWebhooksByRepoID returns all webhooks of repository. -func GetWebhooksByRepoID(repoID int64) (ws []*Webhook, err error) { - err = x.Find(&ws, &Webhook{RepoID: repoID}) - return ws, err +// GetWebhooksByRepoID returns all webhooks of a repository. +func GetWebhooksByRepoID(repoID int64) ([]*Webhook, error) { + webhooks := make([]*Webhook, 0, 5) + return webhooks, x.Find(&webhooks, &Webhook{RepoID: repoID}) } // UpdateWebhook updates information of webhook. diff --git a/modules/bindata/bindata.go b/modules/bindata/bindata.go index 045a0b70d..84a5af758 100644 --- a/modules/bindata/bindata.go +++ b/modules/bindata/bindata.go @@ -286,7 +286,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _confAppIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x5b\x5b\x6f\x23\xc9\x75\x7e\xef\x5f\x51\xab\xcd\x66\x34\x41\x93\xd4\x65\xa4\xd1\xca\x96\xb3\x14\xd9\x94\xe8\xe1\xcd\xdd\xd4\xcc\xce\x0e\x84\x56\x8b\x5d\x24\x7b\xd5\xec\xe6\x76\x35\xa5\xd1\x22\x08\x6c\xe4\x21\x17\x20\xc8\x43\x82\x04\x01\x82\x20\x79\x48\x0c\x38\x37\x1b\x79\xb1\x13\x27\x2f\x9b\xbc\xcf\xfe\x07\x67\x1d\x3f\xf9\x2f\xe4\x3b\xa7\xaa\xc9\xa6\x46\xab\xec\xe6\xea\x15\xfb\x52\x75\xaa\xce\xfd\x3b\xa7\x7a\xde\x15\x3d\xe7\xb9\xe3\x0a\xfe\xd3\xed\x37\xdb\xad\x97\x62\x78\xda\xf6\x44\xab\xdd\x71\xac\x77\xc5\xa0\xe3\xd4\x3d\x47\x74\xeb\xcf\x1c\xd1\x38\xad\xf7\x4e\x1c\x4f\xf4\x7b\xa2\xd1\x77\x5d\xc7\x1b\xf4\x7b\xcd\x76\xef\x44\x34\xce\xbc\x61\xbf\x8b\x87\xbd\x56\xfb\x44\xcf\xb4\xbe\x21\xea\xf3\xb9\x48\x82\x99\x14\xf9\x34\xc8\x85\x9a\xa6\x37\x4a\xa4\x89\x90\xd7\x32\xbb\x15\xf3\x60\x82\x17\x51\x1e\x4b\xab\x3e\x18\xf8\xbd\x7a\xd7\x11\x47\xe2\x24\x9d\xa8\x43\xfc\x15\x27\x51\x2e\x3c\x99\x5d\x47\x23\x09\x4a\x8d\x69\x90\x60\x38\x9e\x45\x63\x71\x9b\x2e\x44\xb6\x48\x44\x9c\x8e\x82\x38\xbe\xb5\xdc\xb3\x9e\x7f\xe6\x61\xf7\x47\x62\x12\xe5\x18\xed\x44\xf9\x54\x66\x62\x23\x94\xd7\x1b\xb6\xd8\x98\x67\x69\xb8\x21\x52\x3c\xc8\xa5\xca\xf1\x24\x94\xe3\x60\x11\x83\x96\xd2\x63\x98\x02\x58\xa7\x0d\xe0\xde\xb2\x5e\x65\x72\x9e\xaa\x28\x4f\xb3\xdb\x73\xcb\xed\xf7\x87\xe2\xc8\xf2\x1a\x6e\x7b\x30\xf4\x87\x2f\x07\x34\xec\x32\x50\x53\xac\xd4\x34\x94\xea\x3d\xaf\x2d\x46\xd3\x20\x53\x32\xb7\xe8\xc6\x87\xa8\x5c\xcf\xa1\x89\xdf\x10\xad\x34\x1b\x49\xc3\x76\x22\x6f\xc4\x8a\xba\xc8\x53\x71\x29\xc5\x3c\x8b\xae\x83\x5c\x5a\xad\xbe\xdb\x70\xfc\x81\xdb\x7e\x5e\x1f\xd2\x2a\xe3\x20\x56\xc4\xfe\x49\x9c\x5e\x06\xb1\x98\x05\xaf\xa3\xd9\x62\x26\x46\x99\x0c\xf2\x08\x92\x8c\xa3\x19\x44\x92\x8e\xcb\x14\xe7\xe0\x7c\xa1\x64\x66\x8b\xca\xb6\x98\xc9\x20\x51\x22\x49\xf5\x48\xab\x5b\xff\xd0\x6f\xb8\x4e\x7d\xd8\xee\xf7\xfc\x4e\xbb\xdb\xc6\xfe\x30\x0c\x2b\x0c\x82\x7c\x34\x15\x24\x1f\xf1\xc9\x42\x2e\xa4\x88\x65\x32\xc9\xa7\x36\xd6\xbc\x62\xb9\x07\x4a\xc4\x41\x06\x1d\xe0\x02\x6b\xa9\xe8\x12\x8a\x1b\x9c\x75\x3a\xbe\xeb\x7c\xe7\xcc\xf1\x86\x3e\xfe\x9e\x39\x7e\xc7\xe9\x9d\x0c\x4f\x41\x76\x7b\x0b\xff\xb7\x26\xca\xaa\x0c\xe9\xf7\x1c\xcb\x75\x22\xc5\xfb\x1e\x47\x31\x04\xf3\x3a\x97\x89\x02\x3f\x6a\x69\x28\x8b\x38\x14\xd3\xe0\x1a\xdb\x88\x12\x29\x6e\xb2\x60\xae\x44\x94\xe0\xb5\x14\x8d\x34\x94\xdd\x28\xcb\xa0\x4f\x4d\x0f\xe4\x3c\x39\x0f\x32\x08\xb0\x4c\xea\x06\x46\x20\x02\x31\x4a\x67\xb3\xa0\x2a\x86\xe9\x8a\x14\xaf\x8a\x01\xb5\x74\x35\xde\x16\x1f\x2f\xb0\xa5\xf9\x22\x2f\xe6\x58\x9d\x76\xcf\xf1\x5f\xb8\xf5\x81\xef\x7c\x38\x74\xa0\xd3\x7e\xcf\x03\x5f\xd5\xfc\x75\x6e\x57\x67\x21\xfe\x0b\xb2\xab\x30\xbd\x49\xe8\x4e\xff\x5c\x85\x36\x76\xf3\x3c\x88\xa3\x50\xb3\x36\xc3\x66\x0d\x57\xcc\x4e\x00\x55\xcb\xeb\x08\x36\x50\x1f\xb4\x21\x4a\x95\x8e\x22\xec\x3b\xd4\xbb\x05\x7b\x33\x5b\xa8\x05\x34\x01\x29\x07\xf3\xa8\x76\xbd\x5d\x2b\x56\x29\xb3\x79\x1d\xc4\x0b\xd0\xbd\xbc\xd5\x5b\x55\x55\x31\x30\x64\xf3\xe0\x92\x04\x45\x92\xe1\xc5\xc5\x4d\x9a\x3c\xd2\xbe\x47\xae\x43\x02\x5c\x97\xb9\x08\x53\xa9\x68\xc8\x8c\x2c\xc0\x1a\xb8\xce\xf3\xb6\xf3\xa2\x7e\xdc\x71\x7c\x72\x63\x76\x0b\x62\x7b\xb9\x8d\x35\x8d\x2e\xe6\x71\x1a\x84\xa4\xd1\x17\x53\xc9\x4e\x57\xb2\x44\x5e\x48\x8f\x00\x37\x19\x16\x4d\x02\x58\x4d\x58\x2d\xdc\x46\x91\xf9\x5f\xe4\xd9\x42\x5e\x58\x4e\x8f\xd6\x6c\x62\x25\xba\xd7\x16\x39\x15\x63\x68\xd9\x50\xb8\x33\x2b\x0c\xf2\xa0\x96\xcf\xe6\x35\xf3\xfa\x42\x6c\xe2\x4e\x4c\x24\xde\x87\x32\x96\x24\x54\x70\x37\x41\x3c\xc1\x9e\x54\x1e\x64\xf9\x63\x6b\xe8\x74\x07\xfe\xa0\xce\xf6\x79\x97\x00\x96\xec\xc3\x40\xb0\xe0\x2c\xc5\x5e\x11\x59\xd2\x1b\xd0\xc8\x6f\xe7\x52\xd9\x42\x56\x27\x55\x11\xcd\x10\xb3\x6a\x1f\xcf\xe5\xe4\x37\xf4\xe5\x3c\xc1\xd3\x5e\x9a\x4f\xa3\x64\x62\x7c\x2d\x48\x0c\xe3\x34\xd1\xaa\x77\x3a\xfd\x17\x4e\x93\xa3\x86\xc7\xb1\xa0\x1b\xbc\x16\x2a\xfa\x54\x92\xf5\xcb\x00\x9a\xe6\xc1\x50\x59\xf7\x78\x9d\xc3\xdd\x9d\xee\xb1\xa5\x55\x00\xaf\xf5\xda\x1f\x51\x40\xd8\xdd\x31\x24\x92\xc5\xec\x12\xd2\x36\x2e\xa4\xb4\xd7\x33\x23\xeb\x54\xb6\xb7\xd8\xe9\x89\x8e\xc7\x4e\x09\xfd\x2d\x22\x52\x58\x6f\x49\x61\xa9\xb2\xa8\xb0\x55\x52\x16\x99\x0c\xf8\xc7\xce\xd2\x84\xec\x05\xc4\xf1\x94\xa2\xb6\xe5\x7c\x38\xe8\xf4\x5d\x04\xaa\xfa\x09\x82\xbf\xdf\x3b\xeb\x82\xf4\xce\xd6\x1a\xd1\x48\xa9\xc5\x97\x93\x63\x32\x6d\xcf\x3b\xbb\x43\x64\x7b\x9d\xc8\x32\xe0\xc1\xca\x23\x30\xb4\x4e\x24\x18\xe5\xd1\x75\x94\x43\xde\x52\x86\x56\xcb\x81\x9c\x39\xc0\xf5\xbb\x08\x6c\x86\xe0\x9e\xf6\xc7\x05\xcb\xfb\x82\x1c\x4c\x56\x46\x29\x58\xb9\x80\xbe\xf2\x00\xfe\x32\xb1\x29\x5c\x86\xe4\x4c\xf5\x24\xcc\x52\xb8\xee\xb7\x30\xaf\x4a\x3b\xa9\x27\x58\xeb\x9a\xdd\x99\x27\x21\x86\x20\x1a\x6e\x24\x58\x5d\x27\x94\x30\x52\x64\xd2\x1b\xf0\xdf\x38\xd6\x2e\x4e\x2e\x56\x24\x18\x95\xdf\xc6\x64\xcb\x5d\x12\x5d\x94\x8c\xd3\x43\x31\xcd\xf3\xb9\x3a\xac\xd5\x90\x67\x64\x9c\x42\x6d\xaa\x3a\x49\xd3\x49\x2c\xab\x60\xb2\x76\x23\x2f\x61\x8f\x30\x4d\xa9\x6a\x3b\x5b\xdb\x4f\x6a\xdb\xdb\x35\x6f\x31\x9f\xa7\x59\x5e\x81\x2f\x54\x4a\x0c\x54\xa2\xa4\xd2\x98\x66\x29\xee\x77\xdf\xe7\x97\x66\xfb\xd6\xf0\xd4\xe9\x3a\x10\x03\x74\xe4\x77\x9d\x61\xdd\x1f\xd6\x4f\x20\x8a\x8b\x77\xc7\xe3\xbd\xdd\x27\xbb\x17\x77\xac\x50\x1b\x90\x4e\x44\xe0\x67\x1e\x07\xb7\x10\xc7\x66\x58\x58\x11\xb2\xe4\x41\x37\x3a\x7e\xcc\x86\xd4\x6c\x7b\x83\x4e\xfd\xa5\x8e\x0d\xc6\x28\x0f\x76\x0f\x0e\xf6\xb7\x0e\xd8\xb2\xaa\x41\x38\x8b\x92\x75\xfb\xa2\x6c\xf4\xb0\x25\x50\xf6\x5e\x37\x84\xbd\xad\xb7\x4d\xf4\x41\x12\xae\x33\xe8\x3f\x48\x22\x49\x73\x60\x89\x87\x89\xf4\xfa\xc3\x76\xe3\xae\x5d\xef\xad\x91\x49\xb3\x49\x90\x44\x9f\xea\xfc\xfb\x10\xad\xbe\x7b\xf2\xd6\x7e\x58\x42\x24\x8e\x7b\x1c\xf0\x6b\x72\xb7\xbd\x07\x6a\x45\x50\x26\x72\x0e\x07\x57\xd8\x60\x16\xea\x54\x77\x09\x94\x70\xb5\x0a\xf4\x26\xc2\xfa\xc0\x25\x4d\x9f\x73\xdb\x31\x90\xc0\xb3\x12\xca\x28\x92\xf2\x08\x99\x30\x9d\x89\x33\xb7\x53\xf1\x46\x64\x70\xa5\xbd\x15\x61\x91\xe0\x40\x94\x5c\x21\x8b\x4e\x65\x02\x06\x92\x50\x66\x14\x04\xbb\xab\x6c\x45\xb1\x5b\xbe\x0e\x66\x73\xec\x0a\xb8\xcc\x46\xc4\x4c\x80\x8e\x34\x54\xf4\x41\xdd\xf7\x1a\x64\xa9\x3a\x2e\x7e\x15\x44\x00\x03\xd5\x2b\xc9\xb0\x46\x19\x4e\xef\xa3\x7b\x4f\x82\x7c\x08\x07\x68\x12\xf7\x81\x00\xa2\xb6\x4c\xea\x6f\x03\x02\xb6\xf9\x75\x2c\xf0\x65\x30\x00\xba\x81\x96\xaf\x49\xd1\x03\xb7\x3f\xec\xc3\x19\x31\x9c\x7c\xdf\x6a\xf6\xbb\xf5\x76\x0f\x77\x0c\x5f\xa7\xa9\xca\x19\x61\x92\x40\xf0\xf0\xbd\xcd\x62\xfc\x63\x8a\x12\xef\x6d\xea\xe1\xb8\x79\x6f\xf3\x74\x38\x44\xf6\xea\xbb\xc3\xc7\xaa\x66\xf1\x4d\xbd\xd9\x24\xd4\xbb\x55\xe5\xff\xb7\x96\x03\x28\x53\x10\xfa\x42\x16\x95\xd9\x0c\xa1\x98\x98\xe3\x5c\x9a\x44\x70\xfc\x74\x74\x05\x45\x9c\xf5\xda\xc8\x2b\xfd\xc6\x33\x67\xe8\x0f\x1c\xb7\x8b\x70\x0c\xb6\x30\x75\x7f\x7f\x9f\x14\x42\xdb\x13\x9b\xcd\xee\x47\x8f\xc9\x14\x78\x3a\xa1\x73\x20\x8a\xec\x8a\x1c\x7a\xb3\x00\x2a\x9e\x77\x2a\x74\xd0\x7a\x8c\x98\x0c\x1f\x53\x64\x09\x08\x65\x42\x69\x00\x5f\x05\xb9\x76\x82\xbc\x0a\x81\x8e\x02\x05\xb1\x13\x84\x0f\x53\xf2\x49\x00\x62\xca\xb2\x29\xa1\x67\x82\xf8\xe5\xf0\xc9\x30\x87\x26\xd7\xe3\x1c\x1a\x23\xa8\x9b\xc4\xb7\xa6\x04\xc8\x78\x5d\x2d\x65\x10\x02\xd4\x89\x14\x13\x24\x0a\x8a\xaa\x0e\x6c\x8d\x24\xc2\x2f\xab\x56\xa7\xdf\xa8\x03\xac\x3e\x20\xea\xa5\x48\xdf\x96\x36\x90\xbe\x8e\xf4\xbc\xe8\x18\xf0\x7b\x01\x67\x60\xdb\xa7\x25\x83\xeb\x20\x8a\xe9\xb5\x85\xf8\xc8\x5e\x46\xc3\x56\x9e\x55\x80\x23\xb8\xbe\xb8\x5c\x44\x71\x0e\xdf\x2e\xed\x3e\x25\x06\xf2\xaa\xe5\x0d\xeb\xee\x90\xa6\xfa\x88\x87\xcf\xb9\xa0\x29\x28\x34\xd3\x59\x80\x49\xba\x9a\xe2\x50\x8d\x8c\x9c\x2a\x1d\x26\x46\x31\x05\x0a\x70\x65\xd1\xdc\xa5\x81\xad\x8c\x87\x0c\x01\x29\xa4\x40\x0d\xff\x0d\x01\x63\x41\x3b\x3b\x77\xa6\xdd\xb3\xf3\x18\x5e\x0b\xdf\x81\x5e\x78\x66\xa7\xed\xc1\x3b\x0a\x02\xef\x6d\x16\xd4\x78\x07\x6e\x0a\x49\xcd\x09\xd5\xc1\xcd\x89\x46\x18\x65\x72\x44\x48\x71\xad\x22\x7b\xf4\x9b\xb5\xaa\x52\xd3\x47\x36\xd6\xcb\xd9\x50\x74\x5a\x4d\x59\x7a\x8f\x6a\x53\x64\xbc\x1a\xe2\x89\x1e\x55\xe5\x75\x59\xab\x1a\xd7\xb1\xaa\x0c\x5d\x36\x2b\xaa\x95\x30\x5d\xce\x90\x44\x03\x83\x4a\x4d\xd8\xe2\x72\x67\xbe\xb8\x8c\xa3\xd1\x95\xb8\x92\xb7\x58\x81\x2c\x17\x74\x2b\xb8\x9b\xc8\x84\xd0\x7c\x69\x6b\xea\x16\xdc\xce\x4a\xb4\x96\x1c\xe8\x6d\x3c\x73\x5e\xfa\x43\x2a\x85\x96\x5b\x61\x10\x8b\x5d\x94\x48\xae\xf1\xba\x7a\xfe\x08\xc8\x11\x81\x5b\x52\xb0\x93\xc0\x12\xe3\x08\xb7\x29\x24\x70\x33\x8d\xe0\x66\xa4\x1f\xe2\x06\xf1\x77\xb9\xd6\x09\x89\x5a\x83\xd9\x15\x1d\x76\xb5\x30\x1a\x11\xd3\x37\xc6\xec\xd8\xbb\x24\x78\x44\x6a\x66\x3c\x45\xbc\x72\xfa\xe7\xe0\x38\x4a\x33\x20\xe4\x79\x8a\x69\xe0\x9e\x71\x6b\xb7\xdd\x6b\x77\xcf\xba\xcc\x11\x65\x79\x94\xb3\x4e\xa3\x9c\x2b\x0a\x77\x68\x34\x7b\x54\xd8\x12\x4e\x2a\x0a\x6d\x2a\x3b\xac\x7e\xab\xc5\x39\xc6\x54\xd5\x7a\x5a\xe1\x1c\x6e\xff\x6c\x88\x84\xdf\xe9\x9f\x94\x6b\x5c\x99\x48\x8e\xdd\x90\x31\x10\x12\x9e\xfc\x8a\xa8\xd6\x18\xbf\x8f\x24\x8c\xb0\x32\x0a\x8e\xa8\x34\x10\x95\x70\x91\x71\xfa\x3d\x3a\x78\xba\xbf\x35\xdd\x9a\x6d\x29\x51\xa1\x38\x7a\x34\xbb\xa5\x9f\xaa\x49\x3a\x04\xa8\xac\x6f\x10\xac\x47\xb0\x07\x4e\x42\x1c\xaf\xce\xc7\xaf\x8b\x0c\x43\x98\x0a\xd6\xcf\x6f\x28\x64\xbc\x80\xc0\xa9\x41\x41\x8b\x45\x63\x2d\x40\xe4\x41\xb8\xf9\x66\x98\x82\x0a\xf9\x39\x62\x20\x0a\x0c\x92\xa7\x9e\xcf\x13\x4d\xf1\x4e\x42\x7d\xac\xb7\x0d\x58\x97\x28\x15\x8b\xf9\xd5\x48\x6d\xef\x88\x0a\x79\x18\xa8\xf2\xea\x15\xd2\xa9\xbe\x83\x29\x55\x92\x14\xd3\xd4\x57\x9b\x85\x91\xc5\x24\x7a\xa1\xe8\x02\xe5\xa5\xd5\x70\x10\x35\x28\x39\x41\x9a\x3a\x77\xd7\x18\x65\xd6\x8a\x65\x2c\x52\xe3\x7d\x03\x0c\x45\x2c\x7f\x36\xa7\x0a\x22\x26\x50\x4a\xee\x49\x26\x1e\x13\x53\x64\x94\x28\x9e\x00\x9d\xb4\xdc\xc8\x7f\xd7\x9d\x82\x45\x40\x66\x0e\x6b\x83\xb0\x38\x45\xe0\xb1\x7c\x2d\x47\x0b\x08\x98\x82\x1a\x40\xd5\x5d\x17\x35\xf3\xe7\x45\x91\x47\xad\x22\xaa\xc8\xb8\x17\xd4\xac\x03\xb4\x96\xca\x34\xdd\x4a\x8a\x49\x27\xdc\xf5\xe0\x5d\x9e\x7c\xd4\x1e\xa0\x56\x66\x6c\x5c\x60\x1b\x7e\x56\x02\x34\x81\x36\x69\x6e\x35\x8d\x39\xca\x26\x95\x38\x9d\x4c\xa0\x77\x06\xa5\x36\x1c\x2a\xa1\x58\xb8\x41\x51\x45\x43\x7a\x53\xe9\x6c\x58\x9d\x3a\xf7\xb6\x08\x76\x91\xe0\x68\x84\xa5\xb7\x4e\xe8\x6a\x09\x84\xe2\x09\x0a\xa7\x7c\x3a\x53\x2c\x2b\x48\x23\xca\xd6\xfc\x4c\x37\x52\xc4\x26\x45\xaf\xca\x36\xd9\x8e\x29\x1a\x60\x8f\xe4\x6b\x8f\x01\x15\xd4\xb4\x6a\xa6\xf8\x98\xe2\x93\x6b\xaa\x73\xcb\x69\xee\xec\xed\x6d\xbf\xcf\x18\x74\xdf\x72\x1a\x4d\xaf\x2e\x84\xb9\x73\xf9\x9a\xef\xb6\x9e\x1c\x58\xcd\xe5\xed\xf6\xd6\xce\x13\xa0\x0f\x12\xdb\x25\x52\xed\x79\xa9\x1d\x36\xbb\x55\x9f\xc4\xdc\x10\x83\x97\x4c\xe0\xf2\x9a\x61\x3c\x04\x94\xda\xc5\x8b\x28\x7f\xa4\x74\x6a\x1d\x4d\x53\x6a\xbc\x35\x8f\x8b\x7e\x17\xcf\xb5\x4e\xfb\x1e\x05\xf6\xed\x9d\xa7\x8c\x38\xb6\x0f\x77\x77\xb7\xf6\x2d\xd3\xba\x23\x57\xb5\x4c\x1f\x2e\x43\xac\xb7\x06\x75\xcf\x7b\xd1\x2c\x3a\x60\x6b\xcb\x22\x8d\xa3\xa6\x2e\xda\x74\xa6\x88\xc2\xce\x32\xf9\xc9\x02\x31\x55\x6f\x0c\x09\x26\x1a\xdf\x56\xc6\x8b\x38\xde\x40\xcc\xeb\x2c\x5b\x74\x7a\x7c\x41\xb6\xd8\x3f\xcb\x7f\x23\x8f\xc2\xcb\x0d\x2e\xe9\x44\x70\xa9\xd2\x18\x36\xb8\x34\xcf\x84\xd3\x09\xf7\x02\x08\x1c\x18\x74\x62\x95\x1b\x02\xc4\x44\x35\xbc\x84\x04\x4d\x21\x43\x40\x6e\xb4\x80\x86\x6f\xcf\xad\x76\x0f\xc6\xdc\xe9\x20\x70\xad\xc5\xc2\x77\xde\xd1\x7d\x51\xdd\x36\x1d\xf6\xc5\x33\xc7\x19\x88\x97\xfd\x33\x57\xb0\x38\xc8\x9c\x85\x57\x6f\x39\xef\xbc\x63\x79\x4e\xc3\x05\xde\x82\x43\x82\xc0\x3b\xef\x7e\xd0\x6a\x3a\x2f\x5c\xfc\xef\x57\x7f\x6d\x93\xac\x7c\x91\xa7\x64\xa0\x11\x41\xea\x99\xe4\xac\x1b\x06\x88\x0f\x08\x95\xed\x9e\xef\x02\x2d\x77\x8f\x11\x39\x9b\xf5\x97\x04\x3f\x9f\x5a\x8d\x7e\xff\x59\xdb\xe1\xee\x67\x49\x0b\x7e\x70\x23\x15\x99\xab\x79\xbd\x9c\x57\x1e\x13\x25\x48\x8d\x61\xa4\x05\xe9\x52\x73\x52\x51\x2c\x4b\x5f\xdf\x8a\x60\x01\xc5\x24\x79\xe1\x6f\x53\x19\x10\x60\x66\xec\x61\xca\x39\xbe\x41\x55\x02\x90\xe2\x51\xc3\xb2\xff\xe1\x4b\xbf\x7e\x86\xc2\xb3\x07\x5f\xd7\xed\x45\x63\x09\x1f\x56\x5e\x38\xc7\xf4\xaa\x42\x0f\x0c\x2e\x86\xd4\xcf\xad\x7a\x63\xd8\x7e\x4e\x75\x6a\xd3\x01\x70\xc0\x15\x92\x0e\xf2\x02\xb7\x29\x0e\xb6\x40\xdc\x23\x60\xca\x36\xf4\xa5\x83\x10\xb8\x78\x37\x05\x86\x4c\x93\x71\x94\xcd\x84\xac\x00\x2d\xc5\xec\xf2\x99\x9c\x00\xa3\xe8\x84\x01\x9a\x27\x84\x50\x5c\xdf\x01\x2e\xea\xf8\xdc\xae\x76\xbb\x6b\x30\x4b\x6a\x10\xc9\xee\x6d\x26\x63\x01\x32\x2d\x36\x88\x02\x4f\x00\xe7\xa6\x8b\x44\x03\xd2\x55\x5e\x63\xf2\x2e\xf3\x5f\x22\xca\x5b\x9c\x51\x35\xa1\xa2\x09\x67\x4a\x6c\x95\xbb\x75\x41\x72\xcb\xbd\xa3\xaa\x45\x4d\xd4\xb6\x4b\x25\xf5\x49\x0f\x9a\xa6\x1e\x5c\x89\x42\x97\xb8\xa1\x02\x76\x6c\x74\x52\x04\x3c\x2a\x58\x5b\x2f\x7d\xe2\xa6\x3c\x9c\xb2\x56\x28\x73\xcc\x5a\x35\x1c\x00\x99\xa6\x8b\x4b\xee\x32\x40\xff\x51\xae\xd8\xd6\x6b\xba\x4f\x53\xdb\xde\xdf\x2b\x68\x3e\xa4\xd5\xe5\x22\x5f\x36\xb6\xff\x65\x42\x30\xe5\xe9\x28\x98\xe7\x40\xfa\x82\x9b\x2a\xda\xbc\xde\xd2\x92\xa1\xdd\xa8\x0f\x86\x70\xac\xa2\x23\x68\xbd\x42\x45\x31\x4d\xd3\x2b\x0a\x69\xa7\xf8\x15\x79\xa0\xae\xd6\xba\xd5\xd6\x3d\x2d\x68\x8e\xd8\x71\x44\x60\x35\x8f\x66\x92\xf2\x28\x14\x00\x9f\x06\xdc\x51\x56\xd3\x21\xa3\x72\xfd\x61\xbb\xeb\x00\x94\x98\x86\x51\x9d\x95\x1f\x25\xec\xf9\xb2\x84\x08\x68\x77\xde\xb3\xf6\xc0\x1f\x76\x3c\x1f\xf3\xe8\xac\x64\xc5\xe2\xaa\xa0\x9f\x46\x8a\xf1\x27\xb5\x7c\xb2\x99\x66\x93\xba\xb2\xd4\xef\xe3\x7a\xfe\x6e\xd3\x8b\x4a\x79\xa4\x57\x94\x8b\xab\x3e\x68\x41\xf6\x78\x31\x1e\x73\x6e\xe6\x3c\x42\xf5\x39\x2a\xa5\x44\xc6\x36\xd2\x8b\x9c\x9b\xde\x7c\xc4\xb9\xd8\x1c\x8e\x84\xdc\xf3\xbd\x4a\xc0\xc4\x0d\x95\xcf\xfc\x12\xb0\xd1\xe9\x35\xfd\xe3\xb3\x56\x8b\xb0\x97\xd3\xd3\x02\xa2\x7d\x93\x63\xaf\x3a\x3f\xd8\x28\x7b\x8f\x3e\x9b\xf1\xce\x8e\xbf\xed\x34\x34\x9c\x2f\xce\x69\x18\xce\xb3\x4d\xea\x32\x80\xd0\xdb\x8c\x8d\x4d\xcd\xf2\x79\x75\x42\xd7\x64\x68\x87\x7b\x07\x4f\xf1\xee\x3b\xdf\x31\x2f\x3e\xf9\x84\x9f\x3e\xd9\xe7\x96\x4a\x9a\x4b\xbb\xe8\x49\x33\x98\x42\x5d\x6e\xca\xf5\x0d\x0c\x41\x10\xf7\xba\xc3\x81\xa7\x5b\x6b\xc8\xd1\xd4\xa5\xab\xc2\x99\x28\xa3\x73\xa5\x04\x25\x50\x8b\x97\xe7\x62\x25\x12\x00\xe0\x38\x4a\x75\x2a\xf0\x43\x6e\x89\xba\xad\x86\xd8\x7f\xb2\xf5\x7e\x55\xb4\xf5\x42\xa6\x6e\x31\xb8\x41\xad\x08\x41\x46\xbc\x50\x10\xdf\x20\xe0\x2e\xd7\x33\x29\xaf\x84\x78\x4f\x9d\x4e\x9f\xb0\x9a\x36\x56\x9d\x56\x08\x76\x72\x78\xa4\x16\x49\x18\x91\xbe\x10\x3f\xab\xcb\xc0\xc0\x73\x88\x48\x43\xb7\x56\x96\xe3\xc9\xf6\xd7\x09\xae\xd5\x07\x0c\x4e\x75\xd5\x81\x9d\x60\x9c\x4f\xdb\xd1\x51\x9c\xa3\x15\xc7\x2a\x9d\x27\x99\xbd\x32\x78\x4d\xcb\x1c\x57\x45\x9f\x4a\x67\x4a\x8b\x88\x38\x8a\x17\x56\x32\x1e\x57\x28\x24\x41\x58\xa5\x89\x4a\x9b\x78\x61\xde\x3a\x80\xa1\x44\x8c\xc0\x52\x79\x1c\xe5\x7a\x9f\xb0\x67\xbb\x45\xd1\x61\x05\xf3\xef\xc1\xa3\xda\xba\x1f\x02\xa4\x66\xc4\x0a\x91\xb2\x7d\x69\xdc\x1e\x86\x40\x0d\x00\x6b\xa4\xcd\xbd\xdd\x9d\x9d\xaa\x18\x12\x0f\x06\xbb\x71\x9f\x06\x97\x92\xad\x76\x39\x18\x0c\x12\xfb\x17\x1b\x64\xde\x1b\xe2\x9b\xfc\xfa\x83\x52\x6d\xf0\xad\x0b\xa1\xbd\xd3\x6a\xb9\xfd\xae\x69\xce\xd3\x26\x56\x19\x8e\xe3\xfe\x3c\x50\xea\x26\xcd\x42\x83\x6d\xca\xb0\x86\x04\x93\xcb\xd7\x39\xe0\xf4\x2c\xe6\x33\x1b\x6a\x54\x24\x50\xe4\xb5\x34\xc4\xd9\x61\xd3\x04\x55\xf2\x12\xa5\x9e\x0e\xbb\x1d\xbf\xde\x19\x52\xce\xa6\x14\xb8\x14\x9c\xf5\x6a\x84\x08\xb1\x8e\xd9\xe4\x0c\x81\x44\x43\x23\xb8\xe8\x06\xf3\x45\x4f\x79\xe4\x9d\xb3\x4c\x33\xd8\xaa\x37\x11\x3a\x39\xfb\xea\x27\x05\x52\x32\xef\x0d\xfc\x3a\x69\xc0\xd5\xb1\x5d\x84\xe2\x52\x48\x5c\xa3\xb8\xbf\x05\xcc\x03\x4a\xcf\xeb\x94\x5e\xf6\xb7\x0a\x42\x7a\x2f\x1a\x70\x95\xf6\x02\x02\x09\xea\x61\xc6\x0c\xd4\xeb\x31\xba\xc0\x2c\x9e\x70\x88\x3c\x9d\x53\xf7\xe8\x28\x1f\xcd\x6d\x7a\x79\x74\xb8\xbf\xfb\xf4\x7d\xbb\x90\xf0\xd1\x2c\x18\x05\x19\x7c\x20\xbc\x3c\xda\xb2\xe7\x69\x1a\x33\x14\x3e\x42\x98\xb2\xa3\x30\x96\xbe\x89\xe0\x47\x3a\xf5\x17\x2b\x1f\x8a\x8b\x15\x22\xdd\xde\xde\xd9\xde\xbe\x28\xdc\x96\xe0\x06\x77\xbf\xee\x97\x29\x95\x34\x46\xa4\x85\x78\xef\x93\x27\xb2\xdb\xf3\x76\x73\x5d\xa0\x83\x2c\xbd\x8e\x08\x16\x31\xe6\x98\xc0\x81\x89\x6f\xa5\xb7\x85\x21\x87\xec\x9a\xfa\xd0\x2f\xb9\x2d\x46\xdd\x4a\x3a\x9f\xa6\x65\x11\x12\xa5\xe9\xcb\x15\x75\x95\x39\x65\xd2\x47\x5b\xe6\xad\xba\xf8\x7f\x93\x1e\x21\xfa\x43\x60\xc1\x0a\x7e\x2b\x61\x46\x29\xb2\xc6\x0f\x45\xa8\x92\x62\xc3\x48\xca\x88\xb7\xc5\xce\x08\xd6\x1f\x16\xeb\x7d\x50\xec\xd1\xcf\x29\x30\x5e\x2c\xc5\xe4\x9b\xcf\x00\x0c\xa4\x2e\x38\xe1\xfe\xac\x66\x79\x84\xf4\x1d\x49\x0d\x22\x0d\x46\x35\xd0\x34\xf2\xe9\x88\xc5\xd7\x08\x85\x7a\x19\x3a\xa3\x51\xdc\x2a\xe4\x05\x5b\x65\x4c\x63\xcc\xb8\x1c\x2e\x75\xf8\xd1\x04\x81\xb4\xcf\x5c\xe7\x6d\x04\xa2\x50\xc0\xeb\xf5\xd7\xe6\x32\xc6\x30\x0e\x4a\xc0\x53\x53\x59\x1d\x47\x16\x5b\x87\xd7\x90\x1c\x97\xae\xb3\x46\xe4\x00\xb9\x66\xcb\x3a\x69\xf8\x85\xd7\x30\xb0\xa0\x23\x12\x7e\xb1\xa2\x12\x47\x63\xc9\x74\xee\x99\xee\x39\xdc\x88\x05\xdc\x6d\x39\xeb\xf3\xad\x57\xf3\x68\x44\x9d\x47\x80\xe7\xe7\x28\x2a\x5c\xff\x6c\xd0\xe9\xd7\x9b\x6b\x47\x9a\xc1\x35\xfe\x66\x8a\x3f\x9a\x40\xa1\xaa\xa4\x39\x7f\xa1\x68\x89\xb2\x2e\xc5\x83\x8d\x70\x91\xaa\xe9\x22\xdd\xc0\x20\xd8\x7e\x50\x74\xfc\xf5\x54\xa1\x50\x01\x8e\xb0\x33\xd2\x84\xc6\x8f\x80\x8f\xa3\xa4\x3a\xc9\xf4\x00\xc6\x90\xfa\xb2\x66\x9d\xb8\x66\x2b\x1e\xea\x9d\x06\x57\x17\x66\x18\x88\x73\x98\xe6\x2e\xee\x32\x8b\x8f\xe9\x5b\x88\xd0\xb4\x20\xb9\x9f\x43\xe7\x1c\xe3\x31\x1f\x59\xcc\xb8\x53\x5b\x64\xcd\x82\x74\x49\x87\x2d\x19\x72\x93\x28\x2c\xf6\x1a\x43\x93\x8b\x39\xb1\xa8\x44\xb3\xe7\x99\xf2\x7a\x94\x52\x92\x37\x43\x56\xa7\xec\x20\xc0\xf0\x82\x53\x01\x22\x9d\x92\xb2\x60\xef\xe6\xe6\xa6\x1a\x47\x97\x05\x87\x69\x36\xf9\x0a\xdb\xe7\x5d\xdd\xdd\x3f\x49\xf4\xc4\xd0\x21\xa5\x62\x3b\x97\x01\x9d\x7a\x17\xd6\xd5\x72\xe0\x23\xc8\x97\x4d\xff\x0e\x7b\xa8\x39\xf3\x1c\x01\x0d\xf8\x25\x2f\x1f\xa9\xaf\x9e\x7e\xd5\x63\xf4\x7b\x4e\xd1\x4b\x44\xee\x3b\x49\x2f\xbd\xbe\x58\x2b\x88\x4b\x2f\xfe\x87\x27\xe4\x77\x0f\xc1\xef\x1f\xf4\x25\x27\xe3\xf7\x9c\x89\x97\x8e\xc3\x9f\xfc\xef\x4e\xc3\xe9\x08\x8d\x9c\x90\x84\xed\xcd\xe5\x08\xc0\x46\xea\x86\x96\xc9\xdd\x24\x38\x6a\x3f\xdc\x52\x27\x76\x4e\xed\x2c\xc1\x67\xb3\xeb\x54\x01\x4b\x90\x75\x76\x0b\x22\x48\xa7\x06\x5e\x62\xb8\xf9\x52\x83\xd4\x46\x9f\x05\x35\x6c\x71\x96\x44\xaf\x9b\x01\x61\x5f\x77\x71\x79\x6b\xae\x5a\x8d\x83\x9d\x9d\xe2\xf7\x23\x7d\xb1\xb7\x65\x17\xa4\x97\x17\xfa\xd5\xee\xee\xee\xfb\xcb\x8b\x5e\x90\xa4\xb6\x78\x16\xa1\xac\xa2\xee\xb2\x97\x03\xe0\x98\x9f\x2e\x8c\x36\x5a\x5e\x8f\xb2\x94\x33\x36\xdf\xd2\x2c\x93\xcd\x67\xc5\xe1\x74\x51\xa9\x04\x97\x54\x25\x95\xc4\x50\xf2\x93\x49\x1a\x07\xa8\x57\xe1\x1f\xb5\xf9\xd5\xa4\x46\xd2\xab\xbd\x8b\xab\x0a\xf2\x85\xca\x03\xb2\x92\x56\xdf\xed\xd6\x75\xf2\x8d\xd3\x89\xfe\x7e\x6a\xd5\xf9\x2b\x92\x30\x8d\x4f\x75\xd3\xc7\x64\x61\x7a\x94\xd0\x2f\xd5\x0a\xe6\x78\xdd\x74\xb1\xee\xe4\xe5\x62\x6e\x01\x4d\xe9\x74\x8e\xbb\xec\xc5\xf1\xdf\x0c\x23\xa3\x79\xf1\xfd\x8d\xb1\xcd\x62\x9a\xcd\x46\xb2\x61\x99\x6e\x92\x79\xfa\x7f\x59\x68\xdd\xad\xb1\x38\xf4\x17\x8c\x0f\xb3\x60\xc4\xec\x36\xe5\xe5\x62\x42\x17\x6d\xc8\x9e\x7e\x5f\x04\x19\xf3\xef\xd0\xc7\x4d\x74\xd1\xc8\x22\x6a\xc2\xc4\x77\xd8\xd7\x14\xac\x0e\x6a\x6f\x82\x65\x7c\x6b\x15\xd0\xac\x90\x8d\x89\x45\xd4\x9e\x20\x35\x54\xcd\xf3\xf3\x62\xda\x72\x02\x0b\xe3\xee\x68\x7a\xb8\x1a\x6a\x22\xa1\x8e\x3b\x8a\xda\x43\xe9\x8c\x83\x30\x86\x8a\x2c\xcd\x71\xbd\xa9\x6e\xc8\x02\xd9\x05\x53\x0a\x0c\x54\xa5\x19\x4c\xf4\xf8\xed\x44\xdb\xe9\x9f\xf8\x6e\x7f\xa8\xab\x06\x13\xaa\xc8\x91\x39\x8a\xae\xbc\x99\x6a\xbd\x58\x7f\xb1\xb4\x46\x83\x65\xba\xa5\x9d\x99\x8e\x19\xbc\x42\xce\x2c\xe9\x65\x20\x51\xd3\x68\x9c\x3f\x44\x67\xe7\xc0\x7c\xb5\xb3\x2d\xbe\xf9\x4d\xdc\xd9\xd4\x5b\x2d\x85\x18\xdf\x3b\x6d\xb7\xf8\x2c\xec\x80\x93\xf7\x84\xe2\x20\x73\x1d\x22\x83\xdc\xbe\xcd\x57\xb3\xde\xee\xbc\x7c\x8b\x33\xe7\xf5\x3c\xca\x38\x76\xa0\xb2\xc4\x76\x88\x00\xed\x65\x53\x7f\xa8\x24\x82\x31\xf5\x98\x66\xd8\x36\x8d\x58\x17\xd7\x53\xfd\xd9\x45\xd1\xf0\x2b\xa9\x39\xb9\x4f\xc7\x49\x59\x6b\xae\x34\x88\x5c\xc3\x71\x3e\x90\xe7\x8f\x10\x8d\x3c\x66\x40\x23\x88\xbf\xf7\x60\x28\xd7\x01\x86\xeb\xa1\xee\xf7\x01\x44\xba\x5e\xf9\x9c\x66\xa8\xcf\xd5\xb2\x25\x6d\xae\x80\x4b\xd0\x1f\x44\x62\x2c\xf7\x10\xd5\x32\x2a\x33\x6e\x01\x50\x4b\x26\x4f\x07\xd4\xda\xf7\x17\xe1\xfc\x8e\xdd\xd3\x90\xf2\x71\x3a\xee\xb9\x15\x54\xaa\x34\xf4\x81\xf8\x52\x4a\x3a\x92\xdc\x91\x12\x3d\x2c\x4b\xe9\xa1\xf6\xc7\xfa\x06\x9a\x51\x30\x49\xb0\x5c\x34\x2a\x44\x67\x2a\x74\x2e\xb1\x37\x4a\xbd\x92\x87\x47\xde\xe9\x9e\x2c\x5b\x0c\x5f\xb7\xfc\x84\x7e\x25\xc1\xf6\xd5\x39\x46\xba\xca\xcf\x26\xea\xbd\xda\xd8\x2e\x17\xbd\x1b\xf6\xc6\xce\xda\xfd\x39\x69\xc5\xa1\x26\x98\x57\x12\xdc\x32\xf0\xde\x15\xde\xea\x5c\x61\x25\xc0\xf5\xf3\x05\xb1\xd6\xea\xb7\x9a\x6e\x9b\x4f\xb2\x29\xbe\x06\x4a\x7f\x94\xf7\x1a\x69\x45\x6f\xef\x90\x4f\x0a\x0e\xe9\xcf\x07\xcb\xef\x21\xb8\x31\xf9\xeb\xe6\x6b\xda\xa3\x45\x3e\x3e\xb0\xc8\x6e\x38\xa3\x20\x89\x95\xbf\x76\xc9\x16\x49\x42\x91\x86\x1e\x73\x3f\x90\x73\x7f\x94\xd2\x01\x28\xd2\x76\xf5\xed\xcf\x0a\xdd\x45\x52\x1e\xcd\xc6\xcb\x67\x56\x7c\x2c\x80\xe0\x4d\xdf\x02\xd7\x87\x3e\x37\x86\x56\xd0\x8c\x4e\xc8\x42\x4e\x2d\xfc\xe9\xa9\xd2\x3b\xa9\xea\xcf\x1e\x7c\xf3\xf0\xdc\xa2\x2f\x5a\x9a\x67\x0c\xc0\x3e\xd0\xae\xb6\xbd\x35\xb3\x58\x55\xcb\xcf\x22\xa7\x32\x88\xe9\xd4\x95\x4e\x64\x0d\x19\xfa\x00\xc8\xd7\xcf\x7d\x7e\x7e\x1f\xa5\x9d\x27\x53\x6b\xd5\xa7\xdc\xdf\x22\x3c\x56\xcf\x26\x0b\x0d\x0c\xc9\xb9\x39\x11\xc2\x64\x1e\xa1\x78\x12\x63\x35\xba\x7a\x54\xa4\xbe\x4a\x65\x91\x64\x04\xaa\x58\x6a\x95\x4a\x1e\x4c\x14\xa5\x4f\xca\xec\x9c\xff\xd3\x64\x99\xe1\xa3\xbc\xa2\x46\x33\x06\xf9\x61\x3a\x52\xfc\x80\x88\xd5\xb6\xab\x4f\xab\x7b\x56\xdd\x3d\x31\x96\xd2\xe0\x33\xe5\xd2\x07\x9f\x7c\x50\x48\x46\x5f\x88\x87\x79\xf1\x99\x3b\x7a\x07\x01\xdd\x91\x2e\x2b\xe5\x7e\x56\xad\x57\x58\xf8\x7c\xd5\x78\x53\x62\x1a\x4d\xa6\x31\xfe\xe3\x90\x0e\x8f\xa7\x2a\x00\xdc\x66\xa8\xb7\xaf\xa9\x85\xc5\x1f\x90\xa8\x65\xf9\xd0\x6c\xb7\x5a\xfe\x69\xfb\xe4\xb4\x83\xff\x86\x6b\xdd\xf4\x32\x62\xa4\x94\xa3\x96\x60\x96\x28\x97\xd3\x05\x85\x03\x6a\xe8\x71\xbf\x9e\x43\xf1\x49\x7b\xa8\x49\x97\x13\xcf\x5b\x54\xc9\x7a\x83\x51\x4e\x85\x17\x93\x8c\xcb\x67\x86\x0f\xd3\xe4\x4f\xc7\xeb\x8d\x21\x7b\xa4\xd8\xbb\x87\xb8\x06\xb9\xf4\x99\x58\xf2\x00\xad\xd5\x37\x9f\x5b\x0f\x5b\xca\x64\x54\xb2\x93\x60\x42\x7e\xab\xa8\x81\x85\x1b\x64\xfa\xaf\x63\x26\x93\x91\x31\x12\x94\xc0\x2b\x3b\xe9\x2f\x9b\xa5\xf7\x74\xe0\x49\xcb\x55\xf3\xfc\xdc\xea\xb6\x4f\x5c\x9d\x3a\xf7\x29\xbd\xb7\x5d\xb7\xef\xea\x8f\x99\xac\x46\xa7\xdf\x73\xcc\x35\x7d\x77\x6e\x2e\x51\x8f\x73\x67\xca\x7a\xa5\x9d\xf0\xbc\x74\xba\x5c\x6e\x6f\x4d\x51\xd4\x52\x5b\x37\xbf\x91\xd2\x74\xe2\xb5\x07\x36\x9d\x56\xfd\xac\x33\xf4\x4b\x8d\x2e\x3e\x41\x0d\xe6\xfc\x99\xec\xba\xe4\xa3\x5c\xce\x94\x2e\x06\xf5\x27\x13\xba\xfe\x0b\x74\x57\x9f\xc4\xaf\xff\x51\x84\xe7\xf8\xed\xa1\xd3\xf5\x8a\xcf\xfe\xa2\xed\x03\xca\xcc\xf5\x1e\xc9\x04\x40\xaa\x72\xe6\xd9\x9f\x4e\x2b\x8d\x1e\xfd\x3d\x7d\x46\x7f\x87\x2f\xec\x50\x56\x9a\x8e\x3d\xce\x2a\x2d\xd7\x4e\xe2\x4a\xaf\x63\xc7\xd7\x95\xce\x73\x3b\x5b\x54\xdc\x33\xfb\xe3\xa0\xf2\xed\x81\x2d\x55\xc5\xf1\xec\x79\x5e\x39\x76\xed\x79\x5c\x19\x74\xec\xcb\x49\xe5\xf8\xc4\x86\xf4\xdb\x43\x7b\x1c\x55\x5a\x6d\x3b\xcf\x2a\x43\xd7\x1e\xa9\x4a\xe3\x23\x3e\x9c\xa5\x35\x1d\x98\x74\xa4\xa6\xf6\xcf\xff\xfe\xbb\x3f\xfb\x97\x3f\xfc\xd9\x8f\xff\xee\x8b\x3f\xfe\x6d\xfb\xe7\x3f\xf9\xde\x2f\xfe\xe6\x8f\xf4\xcd\x2f\x7f\xfa\x3b\xbf\xf8\xeb\x3f\xfd\xe2\xc7\xff\xf0\xcb\x9f\xfe\xee\xdd\x17\xff\xf1\x07\x3f\xfc\xe2\x27\xff\x4a\x2f\x9a\x72\x91\xab\xd1\xd4\x6e\x65\x41\xf2\xd9\xf7\x83\x48\xd9\x3d\x2a\xc9\x51\x14\x84\xca\xee\x04\x39\xcc\xf0\xdf\xff\x72\x61\xbf\xf9\x8b\xcf\x7f\xeb\xf3\xef\x7d\xfe\xbd\x37\xff\xf4\xe6\xc7\x6f\x7e\x62\x7f\xf1\x27\x7f\xf5\xc5\x9f\xfd\xed\x7f\xfe\xe0\xcf\x6d\x47\xcd\x83\xcf\x7e\x94\xc6\x36\x7d\x58\xb4\x98\x2c\x3e\xfb\x81\xa2\x0f\xc1\x8e\xb3\x40\x45\xf4\x30\x56\x57\x91\xfd\xe6\x47\x9f\xff\xde\x9b\x7f\x7e\xf3\x8f\x6f\x7e\xf8\xf9\x77\x35\x0d\xbb\x9d\x07\x71\x44\x95\x8e\xb7\x00\xf6\x8c\x03\xb8\x53\x62\x0f\x3f\xfb\x69\x76\xf5\xd9\xf7\xa5\xfd\x6f\xbf\x8f\x55\xf3\x28\x09\x2c\x5d\x12\x84\x6c\xe4\x14\x9a\xc9\xb2\xe6\xd1\xe8\x0a\x69\x96\x95\x40\x09\x4c\x52\x09\x73\x6e\xb1\x16\x58\x1b\x16\xab\x02\x97\x9f\x4e\x2d\xd6\x07\x5f\x42\x23\x16\xff\x5d\xde\xb1\x7e\xa8\x30\x96\x16\x2b\x89\x62\x4a\x66\xb1\xa6\x70\x99\xc4\x16\xab\x8b\x3e\xed\xbb\xb6\x58\x67\x74\x12\xbe\xb0\x58\x71\xb8\xfc\x38\xb0\x58\x7b\xb4\xa6\xb2\x58\x85\xb8\xe4\x5f\x8b\x55\x49\x77\xb1\xc5\xfa\xc4\xe5\xe5\xc4\x62\xa5\x52\xc5\x9c\x5b\xac\x59\x5a\x30\xb2\x58\xbd\x1c\x3c\x2d\xd6\x31\x15\x31\xac\x6b\x86\x9a\xc5\xb7\x8c\xb3\x60\x3e\xe7\xef\x79\xd2\x52\xe0\x1c\xc5\x01\xf7\x63\xd9\xdb\xab\x80\xf1\xf1\x51\x94\x44\xd6\xab\xe5\x88\xaa\x99\x46\x07\xdf\x29\xa5\x75\x64\xa2\xd3\xfe\x0b\xbf\x85\x22\x0e\x25\xcd\xb1\xab\x3f\x8a\x28\x45\x53\x8f\xfe\x69\x01\x81\x10\xdd\x9b\xbb\x5b\x46\xf2\x07\x3c\x14\x6a\x26\x69\xf1\x2f\x38\xc6\xc8\xf6\xd0\x47\x99\x2e\xc1\x0f\x7d\x5e\xc8\x19\xe1\xbf\x02\x00\x00\xff\xff\x3e\xad\x7b\x6f\x94\x34\x00\x00") +var _confAppIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x5b\x5b\x6f\x23\xc9\x75\x7e\xef\x5f\x51\xab\xcd\x66\x34\x41\x93\xd4\x65\xa4\xd1\xca\x96\xb3\x14\xd9\x94\xe8\xe1\xcd\xdd\xd4\xcc\xce\x0e\x84\x56\x8b\x5d\x24\x7b\xd5\xec\xe6\x76\x35\xa5\xd1\x22\x08\x6c\xe4\x21\x17\x20\xc8\x43\x82\x04\x01\x82\x20\x79\x48\x0c\x38\x37\x1b\x79\xb1\x13\x27\x2f\x9b\xbc\xcf\xfe\x07\x67\x1d\x3f\xf9\x2f\xe4\x3b\xa7\xaa\xc9\xa6\x46\xab\xec\xe6\xea\x15\xfb\x52\x75\xaa\xce\xfd\x3b\xa7\x7a\xde\x15\x3d\xe7\xb9\xe3\x0a\xfe\xd3\xed\x37\xdb\xad\x97\x62\x78\xda\xf6\x44\xab\xdd\x71\xac\x77\xc5\xa0\xe3\xd4\x3d\x47\x74\xeb\xcf\x1c\xd1\x38\xad\xf7\x4e\x1c\x4f\xf4\x7b\xa2\xd1\x77\x5d\xc7\x1b\xf4\x7b\xcd\x76\xef\x44\x34\xce\xbc\x61\xbf\x8b\x87\xbd\x56\xfb\x44\xcf\xb4\xbe\x21\xea\xf3\xb9\x48\x82\x99\x14\xf9\x34\xc8\x85\x9a\xa6\x37\x4a\xa4\x89\x90\xd7\x32\xbb\x15\xf3\x60\x82\x17\x51\x1e\x4b\xab\x3e\x18\xf8\xbd\x7a\xd7\x11\x47\xe2\x24\x9d\xa8\x43\xfc\x15\x27\x51\x2e\x3c\x99\x5d\x47\x23\x09\x4a\x8d\x69\x90\x60\x38\x9e\x45\x63\x71\x9b\x2e\x44\xb6\x48\x44\x9c\x8e\x82\x38\xbe\xb5\xdc\xb3\x9e\x7f\xe6\x61\xf7\x47\x62\x12\xe5\x18\xed\x44\xf9\x54\x66\x62\x23\x94\xd7\x1b\xb6\xd8\x98\x67\x69\xb8\x21\x52\x3c\xc8\xa5\xca\xf1\x24\x94\xe3\x60\x11\x83\x96\xd2\x63\x98\x02\x58\xa7\x0d\xe0\xde\xb2\x5e\x65\x72\x9e\xaa\x28\x4f\xb3\xdb\x73\xcb\xed\xf7\x87\xe2\xc8\xf2\x1a\x6e\x7b\x30\xf4\x87\x2f\x07\x34\xec\x32\x50\x53\xac\xd4\x34\x94\xea\x3d\xaf\x2d\x46\xd3\x20\x53\x32\xb7\xe8\xc6\x87\xa8\x5c\xcf\xa1\x89\xdf\x10\xad\x34\x1b\x49\xc3\x76\x22\x6f\xc4\x8a\xba\xc8\x53\x71\x29\xc5\x3c\x8b\xae\x83\x5c\x5a\xad\xbe\xdb\x70\xfc\x81\xdb\x7e\x5e\x1f\xd2\x2a\xe3\x20\x56\xc4\xfe\x49\x9c\x5e\x06\xb1\x98\x05\xaf\xa3\xd9\x62\x26\x46\x99\x0c\xf2\x08\x92\x8c\xa3\x19\x44\x92\x8e\xcb\x14\xe7\xe0\x7c\xa1\x64\x66\x8b\xca\xb6\x98\xc9\x20\x51\x22\x49\xf5\x48\xab\x5b\xff\xd0\x6f\xb8\x4e\x7d\xd8\xee\xf7\xfc\x4e\xbb\xdb\xc6\xfe\x30\x0c\x2b\x0c\x82\x7c\x34\x15\x24\x1f\xf1\xc9\x42\x2e\xa4\x88\x65\x32\xc9\xa7\x36\xd6\xbc\x62\xb9\x07\x4a\xc4\x41\x06\x1d\xe0\x02\x6b\xa9\xe8\x12\x8a\x1b\x9c\x75\x3a\xbe\xeb\x7c\xe7\xcc\xf1\x86\x3e\xfe\x9e\x39\x7e\xc7\xe9\x9d\x0c\x4f\x41\x76\x7b\x0b\xff\xb7\x26\xca\xaa\x0c\xe9\xf7\x1c\xcb\x75\x22\xc5\xfb\x1e\x47\x31\x04\xf3\x3a\x97\x89\x02\x3f\x6a\x69\x28\x8b\x38\x14\xd3\xe0\x1a\xdb\x88\x12\x29\x6e\xb2\x60\xae\x44\x94\xe0\xb5\x14\x8d\x34\x94\xdd\x28\xcb\xa0\x4f\x4d\x0f\xe4\x3c\x39\x0f\x32\x08\xb0\x4c\xea\x06\x46\x20\x02\x31\x4a\x67\xb3\xa0\x2a\x86\xe9\x8a\x14\xaf\x8a\x01\xb5\x74\x35\xde\x16\x1f\x2f\xb0\xa5\xf9\x22\x2f\xe6\x58\x9d\x76\xcf\xf1\x5f\xb8\xf5\x81\xef\x7c\x38\x74\xa0\xd3\x7e\xcf\x03\x5f\xd5\xfc\x75\x6e\x57\x67\x21\xfe\x0b\xb2\xab\x30\xbd\x49\xe8\x4e\xff\x5c\x85\x36\x76\xf3\x3c\x88\xa3\x50\xb3\x36\xc3\x66\x0d\x57\xcc\x4e\x00\x55\xcb\xeb\x08\x36\x50\x1f\xb4\x21\x4a\x95\x8e\x22\xec\x3b\xd4\xbb\x05\x7b\x33\x5b\xa8\x05\x34\x01\x29\x07\xf3\xa8\x76\xbd\x5d\x2b\x56\x29\xb3\x79\x1d\xc4\x0b\xd0\xbd\xbc\xd5\x5b\x55\x55\x31\x30\x64\xf3\xe0\x92\x04\x45\x92\xe1\xc5\xc5\x4d\x9a\x3c\xd2\xbe\x47\xae\x43\x02\x5c\x97\xb9\x08\x53\xa9\x68\xc8\x8c\x2c\xc0\x1a\xb8\xce\xf3\xb6\xf3\xa2\x7e\xdc\x71\x7c\x72\x63\x76\x0b\x62\x7b\xb9\x8d\x35\x8d\x2e\xe6\x71\x1a\x84\xa4\xd1\x17\x53\xc9\x4e\x57\xb2\x44\x5e\x48\x8f\x00\x37\x19\x16\x4d\x02\x58\x4d\x58\x2d\xdc\x46\x91\xf9\x5f\xe4\xd9\x42\x5e\x58\x4e\x8f\xd6\x6c\x62\x25\xba\xd7\x16\x39\x15\x63\x68\xd9\x50\xb8\x33\x2b\x0c\xf2\xa0\x96\xcf\xe6\x35\xf3\xfa\x42\x6c\xe2\x4e\x4c\x24\xde\x87\x32\x96\x24\x54\x70\x37\x41\x3c\xc1\x9e\x54\x1e\x64\xf9\x63\x6b\xe8\x74\x07\xfe\xa0\xce\xf6\x79\x97\x00\x96\xec\xc3\x40\xb0\xe0\x2c\xc5\x5e\x11\x59\xd2\x1b\xd0\xc8\x6f\xe7\x52\xd9\x42\x56\x27\x55\x11\xcd\x10\xb3\x6a\x1f\xcf\xe5\xe4\x37\xf4\xe5\x3c\xc1\xd3\x5e\x9a\x4f\xa3\x64\x62\x7c\x2d\x48\x0c\xe3\x34\xd1\xaa\x77\x3a\xfd\x17\x4e\x93\xa3\x86\xc7\xb1\xa0\x1b\xbc\x16\x2a\xfa\x54\x92\xf5\xcb\x00\x9a\xe6\xc1\x50\x59\xf7\x78\x9d\xc3\xdd\x9d\xee\xb1\xa5\x55\x00\xaf\xf5\xda\x1f\x51\x40\xd8\xdd\x31\x24\x92\xc5\xec\x12\xd2\x36\x2e\xa4\xb4\xd7\x33\x23\xeb\x54\xb6\xb7\xd8\xe9\x89\x8e\xc7\x4e\x09\xfd\x2d\x22\x52\x58\x6f\x49\x61\xa9\xb2\xa8\xb0\x55\x52\x16\x99\x0c\xf8\xc7\xce\xd2\x84\xec\x05\xc4\xf1\x94\xa2\xb6\xe5\x7c\x38\xe8\xf4\x5d\x04\xaa\xfa\x09\x82\xbf\xdf\x3b\xeb\x82\xf4\xce\xd6\x1a\xd1\x48\xa9\xc5\x97\x93\x63\x32\x6d\xcf\x3b\xbb\x43\x64\x7b\x9d\xc8\x32\xe0\xc1\xca\x23\x30\xb4\x4e\x24\x18\xe5\xd1\x75\x94\x43\xde\x52\x86\x56\xcb\x81\x9c\x39\xc0\xf5\xbb\x08\x6c\x86\xe0\x9e\xf6\xc7\x05\xcb\xfb\x82\x1c\x4c\x56\x46\x29\x58\xb9\x80\xbe\xf2\x00\xfe\x32\xb1\x29\x5c\x86\xe4\x4c\xf5\x24\xcc\x52\xb8\xee\xb7\x30\xaf\x4a\x3b\xa9\x27\x58\xeb\x9a\xdd\x99\x27\x21\x86\x20\x1a\x6e\x24\x58\x5d\x27\x94\x30\x52\x64\xd2\x1b\xf0\xdf\x38\xd6\x2e\x4e\x2e\x56\x24\x18\x95\xdf\xc6\x64\xcb\x5d\x12\x5d\x94\x8c\xd3\x43\x31\xcd\xf3\xb9\x3a\xac\xd5\x90\x67\x64\x9c\x42\x6d\xaa\x3a\x49\xd3\x49\x2c\xab\x60\xb2\x76\x23\x2f\x61\x8f\x30\x4d\xa9\x6a\x3b\x5b\xdb\x4f\x6a\xdb\xdb\x35\x6f\x31\x9f\xa7\x59\x5e\x81\x2f\x54\x4a\x0c\x54\xa2\xa4\xd2\x98\x66\x29\xee\x77\xdf\xe7\x97\x66\xfb\xd6\xf0\xd4\xe9\x3a\x10\x03\x74\xe4\x77\x9d\x61\xdd\x1f\xd6\x4f\x20\x8a\x8b\x77\xc7\xe3\xbd\xdd\x27\xbb\x17\x77\xac\x50\x1b\x90\x4e\x44\xe0\x67\x1e\x07\xb7\x10\xc7\x66\x58\x58\x11\xb2\xe4\x41\x37\x3a\x7e\xcc\x86\xd4\x6c\x7b\x83\x4e\xfd\xa5\x8e\x0d\xc6\x28\x0f\x76\x0f\x0e\xf6\xb7\x0e\xd8\xb2\xaa\x41\x38\x8b\x92\x75\xfb\xa2\x6c\xf4\xb0\x25\x50\xf6\x5e\x37\x84\xbd\xad\xb7\x4d\xf4\x41\x12\xae\x33\xe8\x3f\x48\x22\x49\x73\x60\x89\x87\x89\xf4\xfa\xc3\x76\xe3\xae\x5d\xef\xad\x91\x49\xb3\x49\x90\x44\x9f\xea\xfc\xfb\x10\xad\xbe\x7b\xf2\xd6\x7e\x58\x42\x24\x8e\x7b\x1c\xf0\x6b\x72\xb7\xbd\x07\x6a\x45\x50\x26\x72\x0e\x07\x57\xd8\x60\x16\xea\x54\x77\x09\x94\x70\xb5\x0a\xf4\x26\xc2\xfa\xc0\x25\x4d\x9f\x73\xdb\x31\x90\xc0\xb3\x12\xca\x28\x92\xf2\x08\x99\x30\x9d\x89\x33\xb7\x53\xf1\x46\x64\x70\xa5\xbd\x15\x61\x91\xe0\x40\x94\x5c\x21\x8b\x4e\x65\x02\x06\x92\x50\x66\x14\x04\xbb\xab\x6c\x45\xb1\x5b\xbe\x0e\x66\x73\xec\x0a\xb8\xcc\x46\xc4\x4c\x80\x8e\x34\x54\xf4\x41\xdd\xf7\x1a\x64\xa9\x3a\x2e\x7e\x15\x44\x00\x03\xd5\x2b\xc9\xb0\x46\x19\x4e\xef\xa3\x7b\x4f\x82\x7c\x08\x07\x68\x12\xf7\x81\x00\xa2\xb6\x4c\xea\x6f\x03\x02\xb6\xf9\x75\x2c\xf0\x65\x30\x00\xba\x81\x96\xaf\x49\xd1\x03\xb7\x3f\xec\xc3\x19\x31\x9c\x7c\xdf\x6a\xf6\xbb\xf5\x76\x0f\x77\x0c\x5f\xa7\xa9\xca\x19\x61\x92\x40\xf0\xf0\xbd\xcd\x62\xfc\x63\x8a\x12\xef\x6d\xea\xe1\xb8\x79\x6f\xf3\x74\x38\x44\xf6\xea\xbb\xc3\xc7\xaa\x66\xf1\x4d\xbd\xd9\x24\xd4\xbb\x55\xe5\xff\xb7\x96\x03\x28\x53\x10\xfa\x42\x16\x95\xd9\x0c\xa1\x98\x98\xe3\x5c\x9a\x44\x70\xfc\x74\x74\x05\x45\x9c\xf5\xda\xc8\x2b\xfd\xc6\x33\x67\xe8\x0f\x1c\xb7\x8b\x70\x0c\xb6\x30\x75\x7f\x7f\x9f\x14\x42\xdb\x13\x9b\xcd\xee\x47\x8f\xc9\x14\x78\x3a\xa1\x73\x20\x8a\xec\x8a\x1c\x7a\xb3\x00\x2a\x9e\x77\x2a\x74\xd0\x7a\x8c\x98\x0c\x1f\x53\x64\x09\x08\x65\x42\x69\x00\x5f\x05\xb9\x76\x82\xbc\x0a\x81\x8e\x02\x05\xb1\x13\x84\x0f\x53\xf2\x49\x00\x62\xca\xb2\x29\xa1\x67\x82\xf8\xe5\xf0\xc9\x30\x87\x26\xd7\xe3\x1c\x1a\x23\xa8\x9b\xc4\xb7\xa6\x04\xc8\x78\x5d\x2d\x65\x10\x02\xd4\x89\x14\x13\x24\x0a\x8a\xaa\x0e\x6c\x8d\x24\xc2\x2f\xab\x56\xa7\xdf\xa8\x03\xac\x3e\x20\xea\xa5\x48\xdf\x96\x36\x90\xbe\x8e\xf4\xbc\xe8\x18\xf0\x7b\x01\x67\x60\xdb\xa7\x25\x83\xeb\x20\x8a\xe9\xb5\x85\xf8\xc8\x5e\x46\xc3\x56\x9e\x55\x80\x23\xb8\xbe\xb8\x5c\x44\x71\x0e\xdf\x2e\xed\x3e\x25\x06\xf2\xaa\xe5\x0d\xeb\xee\x90\xa6\xfa\x88\x87\xcf\xb9\xa0\x29\x28\x34\xd3\x59\x80\x49\xba\x9a\xe2\x50\x8d\x8c\x9c\x2a\x1d\x26\x46\x31\x05\x0a\x70\x65\xd1\xdc\xa5\x81\xad\x8c\x87\x0c\x01\x29\xa4\x40\x0d\xff\x0d\x01\x63\x41\x3b\x3b\x77\xa6\xdd\xb3\xf3\x18\x5e\x0b\xdf\x81\x5e\x78\x66\xa7\xed\xc1\x3b\x0a\x02\xef\x6d\x16\xd4\x78\x07\x6e\x0a\x49\xcd\x09\xd5\xc1\xcd\x89\x46\x18\x65\x72\x44\x48\x71\xad\x22\x7b\xf4\x9b\xb5\xaa\x52\xd3\x47\x36\xd6\xcb\xd9\x50\x74\x5a\x4d\x59\x7a\x8f\x6a\x53\x64\xbc\x1a\xe2\x89\x1e\x55\xe5\x75\x59\xab\x1a\xd7\xb1\xaa\x0c\x5d\x36\x2b\xaa\x95\x30\x5d\xce\x90\x44\x03\x83\x4a\x4d\xd8\xe2\x72\x67\xbe\xb8\x8c\xa3\xd1\x95\xb8\x92\xb7\x58\x81\x2c\x17\x74\x2b\xb8\x9b\xc8\x84\xd0\x7c\x69\x6b\xea\x16\xdc\xce\x4a\xb4\x96\x1c\xe8\x6d\x3c\x73\x5e\xfa\x43\x2a\x85\x96\x5b\x61\x10\x8b\x5d\x94\x48\xae\xf1\xba\x7a\xfe\x08\xc8\x11\x81\x5b\x52\xb0\x93\xc0\x12\xe3\x08\xb7\x29\x24\x70\x33\x8d\xe0\x66\xa4\x1f\xe2\x06\xf1\x77\xb9\xd6\x09\x89\x5a\x83\xd9\x15\x1d\x76\xb5\x30\x1a\x11\xd3\x37\xc6\xec\xd8\xbb\x24\x78\x44\x6a\x66\x3c\x45\xbc\x72\xfa\xe7\xe0\x38\x4a\x33\x20\xe4\x79\x8a\x69\xe0\x9e\x71\x6b\xb7\xdd\x6b\x77\xcf\xba\xcc\x11\x65\x79\x94\xb3\x4e\xa3\x9c\x2b\x0a\x77\x68\x34\x7b\x54\xd8\x12\x4e\x2a\x0a\x6d\x2a\x3b\xac\x7e\xab\xc5\x39\xc6\x54\xd5\x7a\x5a\xe1\x1c\x6e\xff\x6c\x88\x84\xdf\xe9\x9f\x94\x6b\x5c\x99\x48\x8e\xdd\x90\x31\x10\x12\x9e\xfc\x8a\xa8\xd6\x18\xbf\x8f\x24\x8c\xb0\x32\x0a\x8e\xa8\x34\x10\x95\x70\x91\x71\xfa\x3d\x3a\x78\xba\xbf\x35\xdd\x9a\x6d\x29\x51\xa1\x38\x7a\x34\xbb\xa5\x9f\xaa\x49\x3a\x04\xa8\xac\x6f\x10\xac\x47\xb0\x07\x4e\x42\x1c\xaf\xce\xc7\xaf\x8b\x0c\x43\x98\x0a\xd6\xcf\x6f\x28\x64\xbc\x80\xc0\xa9\x41\x41\x8b\x45\x63\x2d\x40\xe4\x41\xb8\xf9\x66\x98\x82\x0a\xf9\x39\x62\x20\x0a\x0c\x92\xa7\x9e\xcf\x13\x4d\xf1\x4e\x42\x7d\xac\xb7\x0d\x58\x97\x28\x15\x8b\xf9\xd5\x48\x6d\xef\x88\x0a\x79\x18\xa8\xf2\xea\x15\xd2\xa9\xbe\x83\x29\x55\x92\x14\xd3\xd4\x57\x9b\x85\x91\xc5\x24\x7a\xa1\xe8\x02\xe5\xa5\xd5\x70\x10\x35\x28\x39\x41\x9a\x3a\x77\xd7\x18\x65\xd6\x8a\x65\x2c\x52\xe3\x7d\x03\x0c\x45\x2c\x7f\x36\xa7\x0a\x22\x26\x50\x4a\xee\x49\x26\x1e\x13\x53\x64\x94\x28\x9e\x00\x9d\xb4\xdc\xc8\x7f\xd7\x9d\x82\x45\x40\x66\x0e\x6b\x83\xb0\x38\x45\xe0\xb1\x7c\x2d\x47\x0b\x08\x98\x82\x1a\x40\xd5\x5d\x17\x35\xf3\xe7\x45\x91\x47\xad\x22\xaa\xc8\xb8\x17\xd4\xac\x03\xb4\x96\xca\x34\xdd\x4a\x8a\x49\x27\xdc\xf5\xe0\x5d\x9e\x7c\xd4\x1e\xa0\x56\x66\x6c\x5c\x60\x1b\x7e\x56\x02\x34\x81\x36\x69\x6e\x35\x8d\x39\xca\x26\x95\x38\x9d\x4c\xa0\x77\x06\xa5\x36\x1c\x2a\xa1\x58\xb8\x41\x51\x45\x43\x7a\x53\xe9\x6c\x58\x9d\x3a\xf7\xb6\x08\x76\x91\xe0\x68\x84\xa5\xb7\x4e\xe8\x6a\x09\x84\xe2\x09\x0a\xa7\x7c\x3a\x53\x2c\x2b\x48\x23\xca\xd6\xfc\x4c\x37\x52\xc4\x26\x45\xaf\xca\x36\xd9\x8e\x29\x1a\x60\x8f\xe4\x6b\x8f\x01\x15\xd4\xb4\x6a\xa6\xf8\x98\xe2\x93\x6b\xaa\x73\xcb\x69\xee\xec\xed\x6d\xbf\xcf\x18\x74\xdf\x72\x1a\x4d\xaf\x2e\x84\xb9\x73\xf9\x9a\xef\xb6\x9e\x1c\x58\xcd\xe5\xed\xf6\xd6\xce\x13\xa0\x0f\x12\xdb\x25\x52\xed\x79\xa9\x1d\x36\xbb\x55\x9f\xc4\xdc\x10\x83\x97\x4c\xe0\xf2\x9a\x61\x3c\x04\x94\xda\xc5\x8b\x28\x7f\xa4\x74\x6a\x1d\x4d\x53\x6a\xbc\x35\x8f\x8b\x7e\x17\xcf\xb5\x4e\xfb\x1e\x05\xf6\xed\x9d\xa7\x8c\x38\xb6\x0f\x77\x77\xb7\xf6\x2d\xd3\xba\x23\x57\xb5\x4c\x1f\x2e\x43\xac\xb7\x06\x75\xcf\x7b\xd1\x2c\x3a\x60\x6b\xcb\x22\x8d\xa3\xa6\x2e\xda\x74\xa6\x88\xc2\xce\x32\xf9\xc9\x02\x31\x55\x6f\x0c\x09\x26\x1a\xdf\x56\xc6\x8b\x38\xde\x40\xcc\xeb\x2c\x5b\x74\x7a\x7c\x41\xb6\xd8\x3f\xcb\x7f\x23\x8f\xc2\xcb\x0d\x2e\xe9\x44\x70\xa9\xd2\x18\x36\xb8\x34\xcf\x84\xd3\x09\xf7\x02\x08\x1c\x18\x74\x62\x95\x1b\x02\xc4\x44\x35\xbc\x84\x04\x4d\x21\x43\x40\x6e\xb4\x80\x86\x6f\xcf\xad\x76\x0f\xc6\xdc\xe9\x20\x70\xad\xc5\xc2\x77\xde\xd1\x7d\x51\xdd\x36\x1d\xf6\xc5\x33\xc7\x19\x88\x97\xfd\x33\x57\xb0\x38\xc8\x9c\x85\x57\x6f\x39\xef\xbc\x63\x79\x4e\xc3\x05\xde\x82\x43\x82\xc0\x3b\xef\x7e\xd0\x6a\x3a\x2f\x5c\xfc\xef\x57\x7f\x6d\x93\xac\x7c\x91\xa7\x64\xa0\x11\x41\xea\x99\xe4\xac\x1b\x06\x88\x0f\x08\x95\xed\x9e\xef\x02\x2d\x77\x8f\x11\x39\x9b\xf5\x97\x04\x3f\x9f\x5a\x8d\x7e\xff\x59\xdb\xe1\xee\x67\x49\x0b\x7e\x70\x23\x15\x99\xab\x79\xbd\x9c\x57\x1e\x13\x25\x48\x8d\x61\xa4\x05\xe9\x52\x73\x52\x51\x2c\x4b\x5f\xdf\x8a\x60\x01\xc5\x24\x79\xe1\x6f\x53\x19\x10\x60\x66\xec\x61\xca\x39\xbe\x41\x55\x02\x90\xe2\x51\xc3\xb2\xff\xe1\x4b\xbf\x7e\x86\xc2\xb3\x07\x5f\xd7\xed\x45\x63\x09\x1f\x56\x5e\x38\xc7\xf4\xaa\x42\x0f\x0c\x2e\x86\xd4\xcf\xad\x7a\x63\xd8\x7e\x4e\x75\x6a\xd3\x01\x70\xc0\x15\x92\x0e\xf2\x02\xb7\x29\x0e\xb6\x40\xdc\x23\x60\xca\x36\xf4\xa5\x83\x10\xb8\x78\x37\x05\x86\x4c\x93\x71\x94\xcd\x84\xac\x00\x2d\xc5\xec\xf2\x99\x9c\x00\xa3\xe8\x84\x01\x9a\x27\x84\x50\x5c\xdf\x01\x2e\xea\xf8\xdc\xae\x76\xbb\x6b\x30\x4b\x6a\x10\xc9\xee\x6d\x26\x63\x01\x32\x2d\x36\x88\x02\x4f\x00\xe7\xa6\x8b\x44\x03\xd2\x55\x5e\x63\xf2\x2e\xf3\x5f\x22\xca\x5b\x9c\x51\x35\xa1\xa2\x09\x67\x4a\x6c\x95\xbb\x75\x41\x72\xcb\xbd\xa3\xaa\x45\x4d\xd4\xb6\x4b\x25\xf5\x49\x0f\x9a\xa6\x1e\x5c\x89\x42\x97\xb8\xa1\x02\x76\x6c\x74\x52\x04\x3c\x2a\x58\x5b\x2f\x7d\xe2\xa6\x3c\x9c\xb2\x56\x28\x73\xcc\x5a\x35\x1c\x00\x99\xa6\x8b\x4b\xee\x32\x40\xff\x51\xae\xd8\xd6\x6b\xba\x4f\x53\xdb\xde\xdf\x2b\x68\x3e\xa4\xd5\xe5\x22\x5f\x36\xb6\xff\x65\x42\x30\xe5\xe9\x28\x98\xe7\x40\xfa\x82\x9b\x2a\xda\xbc\xde\xd2\x92\xa1\xdd\xa8\x0f\x86\x70\xac\xa2\x23\x68\xbd\x42\x45\x31\x4d\xd3\x2b\x0a\x69\xa7\xf8\x15\x79\xa0\xae\xd6\xba\xd5\xd6\x3d\x2d\x68\x8e\xd8\x71\x44\x60\x35\x8f\x66\x92\xf2\x28\x14\x00\x9f\x06\xdc\x51\x56\xd3\x21\xa3\x72\xfd\x61\xbb\xeb\x00\x94\x98\x86\x51\x9d\x95\x1f\x25\xec\xf9\xb2\x84\x08\x68\x77\xde\xb3\xf6\xc0\x1f\x76\x3c\x1f\xf3\xe8\xac\x64\xc5\xe2\xaa\xa0\x9f\x46\x8a\xf1\x27\xb5\x7c\xb2\x99\x66\x93\xba\xb2\xd4\xef\xe3\x7a\xfe\x6e\xd3\x8b\x4a\x79\xa4\x57\x94\x8b\xab\x3e\x68\x41\xf6\x78\x31\x1e\x73\x6e\xe6\x3c\x42\xf5\x39\x2a\xa5\x44\xc6\x36\xd2\x8b\x9c\x9b\xde\x7c\xc4\xb9\xd8\x1c\x8e\x84\xdc\xf3\xbd\x4a\xc0\xc4\x0d\x95\xcf\xfc\x12\xb0\xd1\xe9\x35\xfd\xe3\xb3\x56\x8b\xb0\x97\xd3\xd3\x02\xa2\x7d\x93\x63\xaf\x3a\x3f\xd8\x28\x7b\x8f\x3e\x9b\xf1\xce\x8e\xbf\xed\x34\x34\x9c\x2f\xce\x69\x18\xce\xb3\x4d\xea\x32\x80\xd0\xdb\x8c\x8d\x4d\xcd\xf2\x79\x75\x42\xd7\x64\x68\x87\x7b\x07\x4f\xf1\xee\x3b\xdf\x31\x2f\x3e\xf9\x84\x9f\x3e\xd9\xe7\x96\x4a\x9a\x4b\xbb\xe8\x49\x33\x98\x42\x5d\x6e\xca\xf5\x0d\x0c\x41\x10\xf7\xba\xc3\x81\xa7\x5b\x6b\xc8\xd1\xd4\xa5\xab\xc2\x99\x28\xa3\x73\xa5\x04\x25\x50\x8b\x97\xe7\x62\x25\x12\x00\xe0\x38\x4a\x75\x2a\xf0\x43\x6e\x89\xba\xad\x86\xd8\x7f\xb2\xf5\x7e\x55\xb4\xf5\x42\xa6\x6e\x31\xb8\x41\xad\x08\x41\x46\xbc\x50\x10\xdf\x20\xe0\x2e\xd7\x33\x29\xaf\x84\x78\x4f\x9d\x4e\x9f\xb0\x9a\x36\x56\x9d\x56\x08\x76\x72\x78\xa4\x16\x49\x18\x91\xbe\x10\x3f\xab\xcb\xc0\xc0\x73\x88\x48\x43\xb7\x56\x96\xe3\xc9\xf6\xd7\x09\xae\xd5\x07\x0c\x4e\x75\xd5\x81\x9d\x60\x9c\x4f\xdb\xd1\x51\x9c\xa3\x15\xc7\x2a\x9d\x27\x99\xbd\x32\x78\x4d\xcb\x1c\x57\x45\x9f\x4a\x67\x4a\x8b\x88\x38\x8a\x17\x56\x32\x1e\x57\x28\x24\x41\x58\xa5\x89\x4a\x9b\x78\x61\xde\x3a\x80\xa1\x44\x8c\xc0\x52\x79\x1c\xe5\x7a\x9f\xb0\x67\xbb\x45\xd1\x61\x05\xf3\xef\xc1\xa3\xda\xba\x1f\x02\xa4\x66\xc4\x0a\x91\xb2\x7d\x69\xdc\x1e\x86\x40\x0d\x00\x6b\xa4\xcd\xbd\xdd\x9d\x9d\xaa\x18\x12\x0f\x06\xbb\x71\x9f\x06\x97\x92\xad\x76\x39\x18\x0c\x12\xfb\x17\x1b\x64\xde\x1b\xe2\x9b\xfc\xfa\x83\x52\x6d\xf0\xad\x0b\xa1\xbd\xd3\x6a\xb9\xfd\xae\x69\xce\xd3\x26\x56\x19\x8e\xe3\xfe\x3c\x50\xea\x26\xcd\x42\x83\x6d\xca\xb0\x86\x04\x93\xcb\xd7\x39\xe0\xf4\x2c\xe6\x33\x1b\x6a\x54\x24\x50\xe4\xb5\x34\xc4\xd9\x61\xd3\x04\x55\xf2\x12\xa5\x9e\x0e\xbb\x1d\xbf\xde\x19\x52\xce\xa6\x14\xb8\x14\x9c\xf5\x6a\x84\x08\xb1\x8e\xd9\xe4\x0c\x81\x44\x43\x23\xb8\xe8\x06\xf3\x45\x4f\x79\xe4\x9d\xb3\x4c\x33\xd8\xaa\x37\x11\x3a\x39\xfb\xea\x27\x05\x52\x32\xef\x0d\xfc\x3a\x69\xc0\xd5\xb1\x5d\x84\xe2\x52\x48\x5c\xa3\xb8\xbf\x05\xcc\x03\x4a\xcf\xeb\x94\x5e\xf6\xb7\x0a\x42\x7a\x2f\x1a\x70\x95\xf6\x02\x02\x09\xea\x61\xc6\x0c\xd4\xeb\x31\xba\xc0\x2c\x9e\x70\x88\x3c\x9d\x53\xf7\xe8\x28\x1f\xcd\x6d\x7a\x79\x74\xb8\xbf\xfb\xf4\x7d\xbb\x90\xf0\xd1\x2c\x18\x05\x19\x7c\x20\xbc\x3c\xda\xb2\xe7\x69\x1a\x33\x14\x3e\x42\x98\xb2\xa3\x30\x96\xbe\x89\xe0\x47\x3a\xf5\x17\x2b\x1f\x8a\x8b\x15\x22\xdd\xde\xde\xd9\xde\xbe\x28\xdc\x96\xe0\x06\x77\xbf\xee\x97\x29\x95\x34\x46\xa4\x85\x78\xef\x93\x27\xb2\xdb\xf3\x76\x73\x5d\xa0\x83\x2c\xbd\x8e\x08\x16\x31\xe6\x98\xc0\x81\x89\x6f\xa5\xb7\x85\x21\x87\xec\x9a\xfa\xd0\x2f\xb9\x2d\x46\xdd\x4a\x3a\x9f\xa6\x65\x11\x12\xa5\xe9\xcb\x15\x75\x95\x39\x65\xd2\x47\x5b\xe6\xad\xba\xf8\x7f\x93\x1e\x21\xfa\x43\x60\xc1\x0a\x7e\x2b\x61\x46\x29\xb2\xc6\x0f\x45\xa8\x92\x62\xc3\x48\xca\x88\xb7\xc5\xce\x08\xd6\x1f\x16\xeb\x7d\x50\xec\xd1\xcf\x29\x30\x5e\x2c\xc5\xe4\x9b\xcf\x00\x0c\xa4\x2e\x38\xe1\xfe\xac\x66\x79\x84\xf4\x1d\x49\x0d\x22\x0d\x46\x35\xd0\x34\xf2\xe9\x88\xc5\xd7\x08\x85\x7a\x19\x3a\xa3\x51\xdc\x2a\xe4\x05\x5b\x65\x4c\x63\xcc\xb8\x1c\x2e\x75\xf8\xd1\x04\x81\xb4\xcf\x5c\xe7\x6d\x04\xa2\x50\xc0\xeb\xf5\xd7\xe6\x32\xc6\x30\x0e\x4a\xc0\x53\x53\x59\x1d\x47\x16\x5b\x87\xd7\x90\x1c\x97\xae\xb3\x46\xe4\x00\xb9\x66\xcb\x3a\x69\xf8\x85\xd7\x30\xb0\xa0\x23\x12\x7e\xb1\xa2\x12\x47\x63\xc9\x74\xee\x99\xee\x39\xdc\x88\x05\xdc\x6d\x39\xeb\xf3\xad\x57\xf3\x68\x44\x9d\x47\x80\xe7\xe7\x28\x2a\x5c\xff\x6c\xd0\xe9\xd7\x9b\x6b\x47\x9a\xc1\x35\xfe\x66\x8a\x3f\x9a\x40\xa1\xaa\xa4\x39\x7f\xa1\x68\x89\xb2\x2e\xc5\x83\x8d\x70\x91\xaa\xe9\x22\xdd\xc0\x20\xd8\x7e\x50\x74\xfc\xf5\x54\xa1\x50\x01\x8e\xb0\x33\xd2\x84\xc6\x8f\x80\x8f\xa3\xa4\x3a\xc9\xf4\x00\xc6\x90\xfa\xb2\x66\x9d\xb8\x66\x2b\x1e\xea\x9d\x06\x57\x17\x66\x18\x88\x73\x98\xe6\x2e\xee\x32\x8b\x8f\xe9\x5b\x88\xd0\xb4\x20\xb9\x9f\x43\xe7\x1c\xe3\x31\x1f\x59\xcc\xb8\x53\x5b\x64\xcd\x82\x74\x49\x87\x2d\x19\x72\x93\x28\x2c\xf6\x1a\x43\x93\x8b\x39\xb1\xa8\x44\xb3\xe7\x99\xf2\x7a\x94\x52\x92\x37\x43\x56\xa7\xec\x20\xc0\xf0\x82\x53\x01\x22\x9d\x92\x72\x09\x8f\x6f\x6e\x6e\xaa\x71\x74\x59\xb0\x98\x66\x93\xaf\xb0\x7f\xde\xd6\x5d\x06\x48\xa4\x27\x86\x0e\x69\x15\xfb\xb9\x0c\xe8\xd8\xbb\x30\xaf\x96\x03\x27\x41\xc2\x6c\xfa\x77\xf8\x43\xd1\x99\xe7\x88\x68\x00\x30\x79\xf9\x4c\x7d\xf5\xf4\xab\x9e\xa3\xdf\x73\x8c\x5e\x22\x72\xdf\x51\x7a\xe9\xf5\xc5\x5a\x45\x5c\x7a\xf1\x3f\x3c\x22\xbf\x7b\x0a\x7e\xff\xa0\x2f\x39\x1a\xbf\xe7\x50\xbc\x74\x1e\xfe\xe4\x7f\x77\x1c\x4e\x67\x68\xe4\x85\x24\x6c\x6f\x2e\x47\x40\x36\x52\x77\xb4\x4c\xf2\x26\xc1\x51\xff\xe1\x96\x5a\xb1\x73\xea\x67\x09\x3e\x9c\x5d\xa7\x0a\x5c\x82\xb4\xb3\x5b\x10\x41\x3e\x35\xf8\x12\xc3\xcd\xa7\x1a\xa4\x36\xfa\x2e\xa8\x61\x8b\xb3\x24\x7a\xdd\x0c\x08\xfc\xba\x8b\xcb\x5b\x73\xd5\x6a\x1c\xec\xec\x14\xbf\x1f\xe9\x8b\xbd\x2d\xbb\x20\xbd\xbc\xd0\xaf\x76\x77\x77\xdf\x5f\x5e\xf4\x82\x24\xb5\xc5\xb3\x08\x75\x15\xb5\x97\xbd\x1c\x08\xc7\xfc\x74\x61\xb4\xd1\xf2\x7a\x94\xa5\x9c\xb2\xf9\x96\x66\x99\x74\x3e\x2b\x4e\xa7\x8b\x52\x25\xb8\xa4\x32\xa9\x24\x86\xc2\x51\xa8\x8c\x4c\xe3\x00\x05\x2b\xfc\xa3\x36\xbf\x9a\xd4\x48\x7a\xb5\x77\x71\x55\x41\xc2\x50\x79\x40\x56\xd2\xea\xbb\xdd\xba\xce\xbe\x71\x3a\xd1\x1f\x50\xad\x5a\x7f\x45\x16\xa6\xf1\xa9\xee\xfa\x98\x34\x4c\x8f\x12\xfa\xa5\x62\xc1\x9c\xaf\x9b\x36\xd6\x9d\xc4\x5c\xcc\x2d\xb0\x29\x1d\xcf\x71\x9b\xbd\x38\xff\x9b\x61\x64\x34\x2f\x3e\xc0\x31\xb6\x59\x4c\xb3\xd9\x48\x36\x2c\xd3\x4e\x32\x4f\xff\x2f\x2b\xad\xbb\x45\x16\xc7\xfe\x82\xf1\x61\x16\x8c\x98\xdd\xa6\xbc\x5c\x4c\xe8\xa2\x0d\xd9\xd3\xef\x8b\x20\x63\xfe\x1d\xfa\xba\x89\x2e\x1a\x59\x44\x5d\x98\xf8\x0e\xfb\x9a\x82\xd5\x41\xf1\x4d\xb8\x8c\x6f\xad\x02\x9b\x15\xb2\x31\xb1\x88\xfa\x13\xa4\x86\xaa\x79\x7e\x5e\x4c\x5b\x4e\x60\x61\xdc\x1d\x4d\x0f\x57\x43\x4d\x24\xd4\x71\x47\x51\x7f\x28\x9d\x71\x14\xc6\x50\x91\xa5\x39\xae\x37\xd5\x0d\x59\x20\xbb\x60\x4a\x81\x81\xca\x34\x03\x8a\x1e\xbf\x9d\x69\x3b\xfd\x13\xdf\xed\x0f\x75\xd9\x60\x42\x15\x39\x32\x47\xd1\x95\x37\x53\xb1\x17\xeb\x4f\x96\xd6\x68\xb0\x4c\xb7\xb4\x33\xd3\x39\x83\x57\xc8\x99\x25\xbd\x0c\x24\x6a\x1a\x8d\xf3\x87\xe8\xec\x1c\x98\xcf\x76\xb6\xc5\x37\xbf\x89\x3b\x9b\x9a\xab\xa5\x10\xe3\x7b\xa7\xed\x16\x1f\x86\x1d\x70\xf6\x9e\x50\x1c\x64\xae\x43\xa4\x90\xdb\xb7\xf9\x6a\xd6\xdb\x9d\x97\x6f\x71\xe6\xbc\x9e\x47\x19\xc7\x0e\x94\x96\xd8\x0e\x11\xa0\xbd\x6c\xea\x2f\x95\x44\x30\xa6\x26\xd3\x0c\xdb\xa6\x11\xeb\xe2\x7a\xaa\xbf\xbb\x28\x3a\x7e\x25\x35\x27\xf7\xe9\x38\x29\x6b\xcd\x95\x06\x92\x6b\x3c\xce\x27\xf2\xfc\x15\xa2\x91\xc7\x0c\x70\x04\xf1\xf7\x1e\x10\xe5\x3a\x00\x71\x3d\x14\xfe\x3e\x90\x48\xd7\x2b\x1f\xd4\x0c\xf5\xc1\x5a\xb6\xa4\xcd\x25\x70\x09\xfb\x83\x48\x8c\xe5\x1e\xa2\x5a\x86\x65\xc6\x2d\x80\x6a\xc9\xe4\xe9\x84\x5a\xfb\xfe\x22\x9c\xdf\xb1\x7b\x1a\x52\x3e\x4f\xc7\x3d\xf7\x82\x4a\xa5\x86\x3e\x11\x5f\x4a\x49\x47\x92\x3b\x52\xa2\x87\x65\x29\x3d\xd4\xff\x58\xdf\x40\x33\x0a\x26\x09\x96\x8b\x46\x85\xe8\x4c\x89\xce\x35\xf6\x46\xa9\x59\xf2\xf0\xc8\x3b\xed\x93\x65\x8f\xe1\xeb\xd6\x9f\xd0\xaf\x24\xdc\xbe\x3a\xc8\x48\x57\xf9\xd9\x44\xbd\x57\x1b\xdb\xe5\xaa\x77\xc3\xde\xd8\x59\xbb\x3f\x27\xad\x38\xd4\x05\xf3\x4a\x82\x5b\x06\xde\xbb\xc2\x5b\x1d\x2c\xac\x04\xb8\x7e\xc0\x20\xd6\x7a\xfd\x56\xd3\x6d\xf3\x51\x36\xc5\xd7\x40\xe9\xaf\xf2\x5e\x23\xad\xe8\xed\x1d\xf2\x51\xc1\x21\xfd\xf9\x60\xf9\x41\x04\x77\x26\x7f\xdd\x7c\x4e\x7b\xb4\xc8\xc7\x07\x16\xd9\x0d\x67\x14\x24\xb1\xf2\xe7\x2e\xd9\x22\x49\x28\xd2\xd0\x63\x6e\x08\x72\xee\x8f\x52\x3a\x01\x45\xda\xae\xbe\xfd\x5d\xa1\xbb\x48\xca\xa3\xd9\x78\xf9\xd0\x8a\xcf\x05\x10\xbc\xe9\x63\xe0\xfa\xd0\xe7\xce\xd0\x0a\x9a\xd1\x11\x59\xc8\xa9\x85\xbf\x3d\x55\x7a\x27\x55\xfd\xdd\x83\x6f\x1e\x9e\x5b\xf4\x49\x4b\xf3\x8c\x01\xd8\x07\xda\xd5\xb6\xb7\x66\x16\xab\x6a\xf9\x5d\xe4\x54\x06\x31\x1d\xbb\xd2\x91\xac\x21\x43\x5f\x00\xf9\xfa\xb9\xcf\xcf\xef\xa3\xb4\xf3\x64\x6a\xad\x1a\x95\xfb\x5b\x84\xc7\xea\xd9\x64\xa1\x81\x21\x39\x37\x27\x42\x98\xcc\x23\x54\x4f\x62\xac\x46\x57\x8f\x8a\xd4\x57\xa9\x2c\x92\x8c\x40\x15\x4b\xad\x52\xc9\x83\x89\xa2\xf4\x49\x99\x9d\xf3\x7f\x9a\x2c\x33\x7c\x94\x57\xd4\x68\xc6\x28\x3f\x4c\x47\x8a\x1f\x10\xb1\xda\x76\xf5\x69\x75\xcf\xaa\xbb\x27\xc6\x52\x1a\x7c\xa8\x5c\xfa\xe2\x93\x4f\x0a\xc9\xe8\x0b\xf1\x30\x2f\x3e\x73\x47\xef\x20\xa0\x3b\xd2\x65\xa5\xdc\xcf\xaa\xf5\x0a\x0b\x9f\xaf\x3a\x6f\x4a\x4c\xa3\xc9\x34\xc6\x7f\x1c\xd2\xe1\xf1\x54\x06\x80\xdb\x0c\x05\xf7\x35\xf5\xb0\xf8\x0b\x12\xb5\xac\x1f\x9a\xed\x56\xcb\x3f\x6d\x9f\x9c\x76\xf0\xdf\x70\xad\x9d\x5e\x46\x8c\x94\x72\xd4\x12\xcc\x12\xe5\x72\xba\xa0\x70\x40\x1d\x3d\x6e\xd8\x73\x28\x3e\x69\x0f\x35\xe9\x72\xe2\x79\x8b\x2a\x59\x6f\x30\xca\xa9\xf2\x62\x92\x71\xf9\xd0\xf0\x61\x9a\xfc\xed\x78\xbd\x31\x64\x8f\x14\x7b\xf7\x10\xd7\x20\x97\xbe\x13\x4b\x1e\xa0\xb5\xfa\xe8\x73\xeb\x61\x4b\x99\x8c\x4a\x76\x12\x4c\xc8\x6f\x15\x75\xb0\x70\x83\x4c\xff\x75\xcc\x64\x32\x32\x46\x82\x1a\x78\x65\x27\xfd\x65\xb7\xf4\x9e\x16\x3c\x69\xb9\x6a\x9e\x9f\x5b\xdd\xf6\x89\xab\x53\xe7\x3e\xa5\xf7\xb6\xeb\xf6\x5d\xfd\x35\x93\xd5\xe8\xf4\x7b\x8e\xb9\xa6\x0f\xcf\xcd\x25\x0a\x72\x6e\x4d\x59\xaf\xb4\x13\x9e\x97\x8e\x97\xcb\xfd\xad\x29\xaa\x5a\xea\xeb\xe6\x37\x52\x9a\x56\xbc\xf6\xc0\xa6\xd3\xaa\x9f\x75\x86\x7e\xa9\xd3\xc5\x47\xa8\xc1\x9c\xbf\x93\x5d\x97\x7c\x94\xcb\x99\xd2\xc5\xa0\xfe\x66\x42\xd7\x7f\x81\x6e\xeb\x93\xf8\xf5\xbf\x8a\xf0\x1c\xbf\x3d\x74\xba\x5e\xf1\xdd\x5f\xb4\x7d\x40\x99\xb9\xde\x23\x99\x00\x48\x55\xce\x3c\xfb\xd3\x69\xa5\xd1\xa3\xbf\xa7\xcf\xe8\xef\xf0\x85\x1d\xca\x4a\xd3\xb1\xc7\x59\xa5\xe5\xda\x49\x5c\xe9\x75\xec\xf8\xba\xd2\x79\x6e\x67\x8b\x8a\x7b\x66\x7f\x1c\x54\xbe\x3d\xb0\xa5\xaa\x38\x9e\x3d\xcf\x2b\xc7\xae\x3d\x8f\x2b\x83\x8e\x7d\x39\xa9\x1c\x9f\xd8\x90\x7e\x7b\x68\x8f\xa3\x4a\xab\x6d\xe7\x59\x65\xe8\xda\x23\x55\x69\x7c\xc4\xa7\xb3\xb4\xa6\x03\x93\x8e\xd4\xd4\xfe\xf9\xdf\x7f\xf7\x67\xff\xf2\x87\x3f\xfb\xf1\xdf\x7d\xf1\xc7\xbf\x6d\xff\xfc\x27\xdf\xfb\xc5\xdf\xfc\x91\xbe\xf9\xe5\x4f\x7f\xe7\x17\x7f\xfd\xa7\x5f\xfc\xf8\x1f\x7e\xf9\xd3\xdf\xbd\xfb\xe2\x3f\xfe\xe0\x87\x5f\xfc\xe4\x5f\xe9\x45\x53\x2e\x72\x35\x9a\xda\xad\x2c\x48\x3e\xfb\x7e\x10\x29\xbb\x47\x35\x39\x8a\x82\x50\xd9\x9d\x20\x87\x19\xfe\xfb\x5f\x2e\xec\x37\x7f\xf1\xf9\x6f\x7d\xfe\xbd\xcf\xbf\xf7\xe6\x9f\xde\xfc\xf8\xcd\x4f\xec\x2f\xfe\xe4\xaf\xbe\xf8\xb3\xbf\xfd\xcf\x1f\xfc\xb9\xed\xa8\x79\xf0\xd9\x8f\xd2\xd8\xa6\x2f\x8b\x16\x93\xc5\x67\x3f\x50\xf4\x25\xd8\x71\x16\xa8\x88\x1e\xc6\xea\x2a\xb2\xdf\xfc\xe8\xf3\xdf\x7b\xf3\xcf\x6f\xfe\xf1\xcd\x0f\x3f\xff\xae\xa6\x61\xb7\xf3\x20\x8e\xa8\xd2\xf1\x16\xc0\x9e\x71\x00\x77\x4a\xec\xe1\x67\x3f\xcd\xae\x3e\xfb\xbe\xb4\xff\xed\xf7\xb1\x6a\x1e\x25\x81\xa5\x4b\x82\x90\x8d\x9c\x42\x33\x59\xd6\x3c\x1a\x5d\x21\xcd\xb2\x12\x28\x81\x49\x2a\x61\xce\x2d\xd6\x02\x6b\xc3\x62\x55\xe0\xf2\xd3\xa9\xc5\xfa\xe0\x4b\x68\xc4\xe2\xbf\xcb\x3b\xd6\x0f\x15\xc6\xd2\x62\x25\x51\x4c\xc9\x2c\xd6\x14\x2e\x93\xd8\x62\x75\xd1\xb7\x7d\xd7\x16\xeb\x8c\x8e\xc2\x17\x16\x2b\x0e\x97\x1f\x07\x16\x6b\x8f\xd6\x54\x16\xab\x10\x97\xfc\x6b\xb1\x2a\xe9\x2e\xb6\x58\x9f\xb8\xbc\x9c\x58\xac\x54\xaa\x98\x73\x8b\x35\x4b\x0b\x46\x16\xab\x97\x83\xa7\xc5\x3a\xa6\x22\x86\x75\xcd\x50\xb3\xf8\x98\x71\x16\xcc\xe7\xfc\x41\x4f\x5a\x0a\x9c\xa3\x38\xe0\x86\x2c\x7b\x7b\x15\x30\x3e\x3e\x8a\x92\xc8\x7a\xb5\x1c\x51\x35\xd3\xe8\xe4\x3b\xa5\xb4\x8e\x4c\x74\xda\x7f\xe1\xb7\x50\xc4\xa1\xa4\x39\x76\xf5\x57\x11\xa5\x68\xea\xd1\xbf\x2d\x20\x10\xa2\x9b\x73\x77\xcb\x48\xfe\x82\x87\x42\xcd\x24\x2d\xfe\x09\xc7\x18\xd9\x1e\xfa\x28\xd3\x25\xf8\xa1\x0f\x0c\x39\x23\xfc\x57\x00\x00\x00\xff\xff\x0e\x92\x02\xc5\x95\x34\x00\x00") func confAppIniBytes() ([]byte, error) { return bindataRead( @@ -301,7 +301,7 @@ func confAppIni() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "conf/app.ini", size: 13460, mode: os.FileMode(420), modTime: time.Unix(1471250630, 0)} + info := bindataFileInfo{name: "conf/app.ini", size: 13461, mode: os.FileMode(420), modTime: time.Unix(1472077157, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index eb15acc31..ffbfce893 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -110,6 +110,15 @@ func reqAdmin() macaron.Handler { } } +func reqRepoWriter() macaron.Handler { + return func(ctx *context.Context) { + if !ctx.Repo.IsWriter() { + ctx.Error(403) + return + } + } +} + func orgAssignment(args ...bool) macaron.Handler { var ( assignOrg bool @@ -259,11 +268,6 @@ func RegisterRoutes(m *macaron.Macaron) { Delete(repo.ClearIssueLabels) m.Delete("/:id", repo.DeleteIssueLabel) }) - m.Group("/milestone", func() { - m.Combo("").Get(repo.GetIssueMilestone). - Post(bind(api.SetIssueMilestoneOption{}), repo.SetIssueMilestone). - Delete(repo.DeleteIssueMilestone) - }) }) }, mustEnableIssues) @@ -275,10 +279,10 @@ func RegisterRoutes(m *macaron.Macaron) { }) m.Group("/milestones", func() { m.Combo("").Get(repo.ListMilestones). - Post(bind(api.CreateMilestoneOption{}), repo.CreateMilestone) - m.Combo("/:id").Get(repo.GetMilestone).Patch(bind(api.EditMilestoneOption{}), repo.EditMilestone). - Delete(repo.DeleteMilestone) - m.Post("/:id/:action", repo.ChangeMilestoneStatus) + Post(reqRepoWriter(), bind(api.CreateMilestoneOption{}), repo.CreateMilestone) + m.Combo("/:id").Get(repo.GetMilestone). + Patch(reqRepoWriter(), bind(api.EditMilestoneOption{}), repo.EditMilestone). + Delete(reqRepoWriter(), repo.DeleteMilestone) }) }, repoAssignment()) }, reqToken()) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 2d37a5d0e..b83f7e66b 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -49,7 +49,6 @@ func GetIssue(ctx *context.APIContext) { } return } - ctx.JSON(200, issue.APIFormat()) } @@ -133,7 +132,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) { assignee, err := models.GetUserByName(*form.Assignee) if err != nil { if models.IsErrUserNotExist(err) { - ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", *form.Assignee)) + ctx.Error(422, "", fmt.Sprintf("assignee does not exist: [name: %s]", *form.Assignee)) } else { ctx.Error(500, "GetUserByName", err) } diff --git a/routers/api/v1/repo/issue_milestone.go b/routers/api/v1/repo/issue_milestone.go deleted file mode 100644 index 8dfdf5ef5..000000000 --- a/routers/api/v1/repo/issue_milestone.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2016 The Gogs Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package repo - -import ( - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/context" - "github.com/gogits/gogs/routers/api/v1/convert" -) - -func GetIssueMilestone(ctx *context.APIContext) { - issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - if models.IsErrIssueNotExist(err) { - ctx.Status(404) - } else { - ctx.Error(500, "GetIssueByIndex", err) - } - return - } - - apiMilestone := convert.ToMilestone(issue.Milestone) - ctx.JSON(200, &apiMilestone) -} - -func SetIssueMilestone(ctx *context.APIContext, form api.SetIssueMilestoneOption) { - if !ctx.Repo.IsWriter() { - ctx.Status(403) - return - } - - issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - if models.IsErrIssueNotExist(err) { - ctx.Status(404) - } else { - ctx.Error(500, "GetIssueByIndex", err) - } - return - } - - oldMid := issue.MilestoneID - if oldMid != form.ID { - issue.MilestoneID = form.ID - if err = models.ChangeMilestoneAssign(oldMid, issue); err != nil { - ctx.Error(500, "ChangeMilestoneAssign", err) - return - } - } - - // Refresh issue to return updated milestone - issue, err = models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - if models.IsErrIssueNotExist(err) { - ctx.Status(404) - } else { - ctx.Error(500, "GetIssueByIndex", err) - } - return - } - - apiMilestone := convert.ToMilestone(issue.Milestone) - ctx.JSON(200, &apiMilestone) -} - -func DeleteIssueMilestone(ctx *context.APIContext) { - form := api.SetIssueMilestoneOption{ - ID: 0, - } - - SetIssueMilestone(ctx, form) -} diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go index 416d9da90..652ccbb5c 100644 --- a/routers/api/v1/repo/milestone.go +++ b/routers/api/v1/repo/milestone.go @@ -5,47 +5,42 @@ package repo import ( + "time" + api "github.com/gogits/go-gogs-client" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/context" - "github.com/gogits/gogs/routers/api/v1/convert" - "time" ) func ListMilestones(ctx *context.APIContext) { - milestones, err := models.GetAllRepoMilestones(ctx.Repo.Repository.ID) + milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID) if err != nil { - ctx.Error(500, "GetAllRepoMilestones", err) + ctx.Error(500, "GetMilestonesByRepoID", err) return } apiMilestones := make([]*api.Milestone, len(milestones)) for i := range milestones { - apiMilestones[i] = convert.ToMilestone(milestones[i]) + apiMilestones[i] = milestones[i].APIFormat() } ctx.JSON(200, &apiMilestones) } func GetMilestone(ctx *context.APIContext) { - milestone, err := models.GetRepoMilestoneByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) + milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { ctx.Status(404) } else { - ctx.Error(500, "GetRepoMilestoneByID", err) + ctx.Error(500, "GetMilestoneByRepoID", err) } return } - ctx.JSON(200, convert.ToMilestone(milestone)) + ctx.JSON(200, milestone.APIFormat()) } func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) { - if !ctx.Repo.IsWriter() { - ctx.Status(403) - return - } - if form.Deadline == nil { defaultDeadline, _ := time.ParseInLocation("2006-01-02", "9999-12-31", time.Local) form.Deadline = &defaultDeadline @@ -62,21 +57,16 @@ func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) { ctx.Error(500, "NewMilestone", err) return } - ctx.JSON(201, convert.ToMilestone(milestone)) + ctx.JSON(201, milestone.APIFormat()) } func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) { - if !ctx.Repo.IsWriter() { - ctx.Status(403) - return - } - - milestone, err := models.GetRepoMilestoneByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) + milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { ctx.Status(404) } else { - ctx.Error(500, "GetRepoMilestoneByID", err) + ctx.Error(500, "GetMilestoneByRepoID", err) } return } @@ -84,67 +74,24 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) { if len(form.Title) > 0 { milestone.Name = form.Title } - if len(form.Description) > 0 { - milestone.Content = form.Description + if form.Description != nil { + milestone.Content = *form.Description } - if !form.Deadline.IsZero() { + if form.Deadline != nil && !form.Deadline.IsZero() { milestone.Deadline = *form.Deadline } + if err := models.UpdateMilestone(milestone); err != nil { ctx.Handle(500, "UpdateMilestone", err) return } - ctx.JSON(200, convert.ToMilestone(milestone)) + ctx.JSON(200, milestone.APIFormat()) } func DeleteMilestone(ctx *context.APIContext) { - if !ctx.Repo.IsWriter() { - ctx.Status(403) - return - } - - if err := models.DeleteMilestoneByID(ctx.ParamsInt64(":id")); err != nil { - ctx.Error(500, "DeleteMilestoneByID", err) + if err := models.DeleteMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil { + ctx.Error(500, "DeleteMilestoneByRepoID", err) return } ctx.Status(204) } - -func ChangeMilestoneStatus(ctx *context.APIContext) { - if !ctx.Repo.IsWriter() { - ctx.Status(403) - return - } - - m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id")) - if err != nil { - if models.IsErrMilestoneNotExist(err) { - ctx.Handle(404, "GetMilestoneByID", err) - } else { - ctx.Handle(500, "GetMilestoneByID", err) - } - return - } - - switch ctx.Params(":action") { - case "open": - if m.IsClosed { - if err = models.ChangeMilestoneStatus(m, false); err != nil { - ctx.Handle(500, "ChangeMilestoneStatus", err) - return - } - } - ctx.JSON(200, convert.ToMilestone(m)) - case "close": - if !m.IsClosed { - m.ClosedDate = time.Now() - if err = models.ChangeMilestoneStatus(m, true); err != nil { - ctx.Handle(500, "ChangeMilestoneStatus", err) - return - } - } - ctx.JSON(200, convert.ToMilestone(m)) - default: - ctx.Status(400) - } -} diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 37731e5ee..2c23a7bea 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -210,7 +210,7 @@ func Issues(ctx *context.Context) { ctx.Data["Issues"] = issues // Get milestones. - ctx.Data["Milestones"], err = models.GetAllRepoMilestones(repo.ID) + ctx.Data["Milestones"], err = models.GetMilestonesByRepoID(repo.ID) if err != nil { ctx.Handle(500, "GetAllRepoMilestones", err) return @@ -1099,12 +1099,12 @@ func EditMilestone(ctx *context.Context) { ctx.Data["RequireDatetimepicker"] = true ctx.Data["DateLang"] = setting.DateLang(ctx.Locale.Language()) - m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id")) + m, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { - ctx.Handle(404, "GetMilestoneByID", nil) + ctx.Handle(404, "", nil) } else { - ctx.Handle(500, "GetMilestoneByID", err) + ctx.Handle(500, "GetMilestoneByRepoID", err) } return } @@ -1138,12 +1138,12 @@ func EditMilestonePost(ctx *context.Context, form auth.CreateMilestoneForm) { return } - m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id")) + m, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { - ctx.Handle(404, "GetMilestoneByID", nil) + ctx.Handle(404, "", nil) } else { - ctx.Handle(500, "GetMilestoneByID", err) + ctx.Handle(500, "GetMilestoneByRepoID", err) } return } @@ -1160,12 +1160,12 @@ func EditMilestonePost(ctx *context.Context, form auth.CreateMilestoneForm) { } func ChangeMilestonStatus(ctx *context.Context) { - m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id")) + m, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { - ctx.Handle(404, "GetMilestoneByID", err) + ctx.Handle(404, "", err) } else { - ctx.Handle(500, "GetMilestoneByID", err) + ctx.Handle(500, "GetMilestoneByRepoID", err) } return } @@ -1194,8 +1194,8 @@ func ChangeMilestonStatus(ctx *context.Context) { } func DeleteMilestone(ctx *context.Context) { - if err := models.DeleteMilestoneByID(ctx.QueryInt64("id")); err != nil { - ctx.Flash.Error("DeleteMilestoneByID: " + err.Error()) + if err := models.DeleteMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.QueryInt64("id")); err != nil { + ctx.Flash.Error("DeleteMilestoneByRepoID: " + err.Error()) } else { ctx.Flash.Success(ctx.Tr("repo.milestones.deletion_success")) } diff --git a/templates/.VERSION b/templates/.VERSION index 4bc615f7d..16cc0b999 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.9.83.0816 \ No newline at end of file +0.9.84.0824 \ No newline at end of file