// Code generated by protoc-gen-go4grpc; DO NOT EDIT
// source: maintner.proto

/*
Package maintpb is a generated protocol buffer package.

It is generated from these files:

	maintner.proto

It has these top-level messages:

	Mutation
	GithubMutation
	GithubIssueMutation
	BoolChange
	StringChange
	GithubLabel
	GithubMilestone
	GithubIssueEvent
	GithubDismissedReviewEvent
	GithubCommit
	GithubReview
	GithubIssueSyncStatus
	GithubIssueCommentMutation
	GithubUser
	GithubTeam
	GitMutation
	GitRepo
	GitCommit
	GitDiffTree
	GitDiffTreeFile
	GerritMutation
	GitRef
*/
package maintpb

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type Mutation struct {
	GithubIssue *GithubIssueMutation `protobuf:"bytes,1,opt,name=github_issue,json=githubIssue" json:"github_issue,omitempty"`
	Github      *GithubMutation      `protobuf:"bytes,3,opt,name=github" json:"github,omitempty"`
	Git         *GitMutation         `protobuf:"bytes,2,opt,name=git" json:"git,omitempty"`
	Gerrit      *GerritMutation      `protobuf:"bytes,4,opt,name=gerrit" json:"gerrit,omitempty"`
}

func (m *Mutation) Reset()                    { *m = Mutation{} }
func (m *Mutation) String() string            { return proto.CompactTextString(m) }
func (*Mutation) ProtoMessage()               {}
func (*Mutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

func (m *Mutation) GetGithubIssue() *GithubIssueMutation {
	if m != nil {
		return m.GithubIssue
	}
	return nil
}

func (m *Mutation) GetGithub() *GithubMutation {
	if m != nil {
		return m.Github
	}
	return nil
}

func (m *Mutation) GetGit() *GitMutation {
	if m != nil {
		return m.Git
	}
	return nil
}

func (m *Mutation) GetGerrit() *GerritMutation {
	if m != nil {
		return m.Gerrit
	}
	return nil
}

type GithubMutation struct {
	Owner string `protobuf:"bytes,1,opt,name=owner" json:"owner,omitempty"`
	Repo  string `protobuf:"bytes,2,opt,name=repo" json:"repo,omitempty"`
	// Updated labels. (All must have id set at least)
	Labels []*GithubLabel `protobuf:"bytes,3,rep,name=labels" json:"labels,omitempty"`
	// Updated milestones. (All must have id set at least)
	Milestones []*GithubMilestone `protobuf:"bytes,4,rep,name=milestones" json:"milestones,omitempty"`
}

func (m *GithubMutation) Reset()                    { *m = GithubMutation{} }
func (m *GithubMutation) String() string            { return proto.CompactTextString(m) }
func (*GithubMutation) ProtoMessage()               {}
func (*GithubMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }

func (m *GithubMutation) GetOwner() string {
	if m != nil {
		return m.Owner
	}
	return ""
}

func (m *GithubMutation) GetRepo() string {
	if m != nil {
		return m.Repo
	}
	return ""
}

func (m *GithubMutation) GetLabels() []*GithubLabel {
	if m != nil {
		return m.Labels
	}
	return nil
}

func (m *GithubMutation) GetMilestones() []*GithubMilestone {
	if m != nil {
		return m.Milestones
	}
	return nil
}

type GithubIssueMutation struct {
	Owner  string `protobuf:"bytes,1,opt,name=owner" json:"owner,omitempty"`
	Repo   string `protobuf:"bytes,2,opt,name=repo" json:"repo,omitempty"`
	Number int32  `protobuf:"varint,3,opt,name=number" json:"number,omitempty"`
	// not_exist is set true if the issue has been found to not exist.
	// If true, the owner/repo/number fields above must still be set.
	// If a future issue mutation for the same number arrives without
	// not_exist set, then the issue comes back to life.
	NotExist         bool                       `protobuf:"varint,13,opt,name=not_exist,json=notExist" json:"not_exist,omitempty"`
	Id               int64                      `protobuf:"varint,12,opt,name=id" json:"id,omitempty"`
	User             *GithubUser                `protobuf:"bytes,4,opt,name=user" json:"user,omitempty"`
	Assignees        []*GithubUser              `protobuf:"bytes,10,rep,name=assignees" json:"assignees,omitempty"`
	DeletedAssignees []int64                    `protobuf:"varint,11,rep,packed,name=deleted_assignees,json=deletedAssignees" json:"deleted_assignees,omitempty"`
	Created          *google_protobuf.Timestamp `protobuf:"bytes,5,opt,name=created" json:"created,omitempty"`
	Updated          *google_protobuf.Timestamp `protobuf:"bytes,6,opt,name=updated" json:"updated,omitempty"`
	Title            string                     `protobuf:"bytes,9,opt,name=title" json:"title,omitempty"`
	// body_change changes the body field (the top post, which isn't a comment).
	// It is now used in preference to the old body field.
	BodyChange *StringChange `protobuf:"bytes,31,opt,name=body_change,json=bodyChange" json:"body_change,omitempty"`
	// body was the old way to change the body, but it doesn't support removing the
	// body text, which is common on PRs. New mutations use body_change instead.
	Body        string `protobuf:"bytes,7,opt,name=body" json:"body,omitempty"`
	NoMilestone bool   `protobuf:"varint,15,opt,name=no_milestone,json=noMilestone" json:"no_milestone,omitempty"`
	// When setting a milestone, only the milestone_id must be set.
	// TODO: allow num or title to be used if Github only returns those? So far unneeded.
	// The num and title, if non-zero, are treated as if they were a GithubMutation.Milestone update.
	MilestoneId    int64                         `protobuf:"varint,16,opt,name=milestone_id,json=milestoneId" json:"milestone_id,omitempty"`
	MilestoneNum   int64                         `protobuf:"varint,17,opt,name=milestone_num,json=milestoneNum" json:"milestone_num,omitempty"`
	MilestoneTitle string                        `protobuf:"bytes,18,opt,name=milestone_title,json=milestoneTitle" json:"milestone_title,omitempty"`
	Closed         *BoolChange                   `protobuf:"bytes,19,opt,name=closed" json:"closed,omitempty"`
	Locked         *BoolChange                   `protobuf:"bytes,25,opt,name=locked" json:"locked,omitempty"`
	PullRequest    bool                          `protobuf:"varint,28,opt,name=pull_request,json=pullRequest" json:"pull_request,omitempty"`
	ClosedAt       *google_protobuf.Timestamp    `protobuf:"bytes,21,opt,name=closed_at,json=closedAt" json:"closed_at,omitempty"`
	ClosedBy       *GithubUser                   `protobuf:"bytes,22,opt,name=closed_by,json=closedBy" json:"closed_by,omitempty"`
	RemoveLabel    []int64                       `protobuf:"varint,23,rep,packed,name=remove_label,json=removeLabel" json:"remove_label,omitempty"`
	AddLabel       []*GithubLabel                `protobuf:"bytes,24,rep,name=add_label,json=addLabel" json:"add_label,omitempty"`
	Comment        []*GithubIssueCommentMutation `protobuf:"bytes,8,rep,name=comment" json:"comment,omitempty"`
	CommentStatus  *GithubIssueSyncStatus        `protobuf:"bytes,14,opt,name=comment_status,json=commentStatus" json:"comment_status,omitempty"`
	Event          []*GithubIssueEvent           `protobuf:"bytes,26,rep,name=event" json:"event,omitempty"`
	EventStatus    *GithubIssueSyncStatus        `protobuf:"bytes,27,opt,name=event_status,json=eventStatus" json:"event_status,omitempty"`
	Review         []*GithubReview               `protobuf:"bytes,29,rep,name=review" json:"review,omitempty"`
	ReviewStatus   *GithubIssueSyncStatus        `protobuf:"bytes,30,opt,name=review_status,json=reviewStatus" json:"review_status,omitempty"`
}

func (m *GithubIssueMutation) Reset()                    { *m = GithubIssueMutation{} }
func (m *GithubIssueMutation) String() string            { return proto.CompactTextString(m) }
func (*GithubIssueMutation) ProtoMessage()               {}
func (*GithubIssueMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }

func (m *GithubIssueMutation) GetOwner() string {
	if m != nil {
		return m.Owner
	}
	return ""
}

func (m *GithubIssueMutation) GetRepo() string {
	if m != nil {
		return m.Repo
	}
	return ""
}

func (m *GithubIssueMutation) GetNumber() int32 {
	if m != nil {
		return m.Number
	}
	return 0
}

func (m *GithubIssueMutation) GetNotExist() bool {
	if m != nil {
		return m.NotExist
	}
	return false
}

func (m *GithubIssueMutation) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubIssueMutation) GetUser() *GithubUser {
	if m != nil {
		return m.User
	}
	return nil
}

func (m *GithubIssueMutation) GetAssignees() []*GithubUser {
	if m != nil {
		return m.Assignees
	}
	return nil
}

func (m *GithubIssueMutation) GetDeletedAssignees() []int64 {
	if m != nil {
		return m.DeletedAssignees
	}
	return nil
}

func (m *GithubIssueMutation) GetCreated() *google_protobuf.Timestamp {
	if m != nil {
		return m.Created
	}
	return nil
}

func (m *GithubIssueMutation) GetUpdated() *google_protobuf.Timestamp {
	if m != nil {
		return m.Updated
	}
	return nil
}

func (m *GithubIssueMutation) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *GithubIssueMutation) GetBodyChange() *StringChange {
	if m != nil {
		return m.BodyChange
	}
	return nil
}

func (m *GithubIssueMutation) GetBody() string {
	if m != nil {
		return m.Body
	}
	return ""
}

func (m *GithubIssueMutation) GetNoMilestone() bool {
	if m != nil {
		return m.NoMilestone
	}
	return false
}

func (m *GithubIssueMutation) GetMilestoneId() int64 {
	if m != nil {
		return m.MilestoneId
	}
	return 0
}

func (m *GithubIssueMutation) GetMilestoneNum() int64 {
	if m != nil {
		return m.MilestoneNum
	}
	return 0
}

func (m *GithubIssueMutation) GetMilestoneTitle() string {
	if m != nil {
		return m.MilestoneTitle
	}
	return ""
}

func (m *GithubIssueMutation) GetClosed() *BoolChange {
	if m != nil {
		return m.Closed
	}
	return nil
}

func (m *GithubIssueMutation) GetLocked() *BoolChange {
	if m != nil {
		return m.Locked
	}
	return nil
}

func (m *GithubIssueMutation) GetPullRequest() bool {
	if m != nil {
		return m.PullRequest
	}
	return false
}

func (m *GithubIssueMutation) GetClosedAt() *google_protobuf.Timestamp {
	if m != nil {
		return m.ClosedAt
	}
	return nil
}

func (m *GithubIssueMutation) GetClosedBy() *GithubUser {
	if m != nil {
		return m.ClosedBy
	}
	return nil
}

func (m *GithubIssueMutation) GetRemoveLabel() []int64 {
	if m != nil {
		return m.RemoveLabel
	}
	return nil
}

func (m *GithubIssueMutation) GetAddLabel() []*GithubLabel {
	if m != nil {
		return m.AddLabel
	}
	return nil
}

func (m *GithubIssueMutation) GetComment() []*GithubIssueCommentMutation {
	if m != nil {
		return m.Comment
	}
	return nil
}

func (m *GithubIssueMutation) GetCommentStatus() *GithubIssueSyncStatus {
	if m != nil {
		return m.CommentStatus
	}
	return nil
}

func (m *GithubIssueMutation) GetEvent() []*GithubIssueEvent {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *GithubIssueMutation) GetEventStatus() *GithubIssueSyncStatus {
	if m != nil {
		return m.EventStatus
	}
	return nil
}

func (m *GithubIssueMutation) GetReview() []*GithubReview {
	if m != nil {
		return m.Review
	}
	return nil
}

func (m *GithubIssueMutation) GetReviewStatus() *GithubIssueSyncStatus {
	if m != nil {
		return m.ReviewStatus
	}
	return nil
}

// BoolChange represents a change to a boolean value.
// (Notably, the wrapper type permits representing a change to false.)
type BoolChange struct {
	Val bool `protobuf:"varint,1,opt,name=val" json:"val,omitempty"`
}

func (m *BoolChange) Reset()                    { *m = BoolChange{} }
func (m *BoolChange) String() string            { return proto.CompactTextString(m) }
func (*BoolChange) ProtoMessage()               {}
func (*BoolChange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }

func (m *BoolChange) GetVal() bool {
	if m != nil {
		return m.Val
	}
	return false
}

// StringChange represents a change to a boolean value.
// (Notably, the wrapper type permits representing a change to the empty string.)
type StringChange struct {
	Val string `protobuf:"bytes,1,opt,name=val" json:"val,omitempty"`
}

func (m *StringChange) Reset()                    { *m = StringChange{} }
func (m *StringChange) String() string            { return proto.CompactTextString(m) }
func (*StringChange) ProtoMessage()               {}
func (*StringChange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }

func (m *StringChange) GetVal() string {
	if m != nil {
		return m.Val
	}
	return ""
}

type GithubLabel struct {
	Id   int64  `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
}

func (m *GithubLabel) Reset()                    { *m = GithubLabel{} }
func (m *GithubLabel) String() string            { return proto.CompactTextString(m) }
func (*GithubLabel) ProtoMessage()               {}
func (*GithubLabel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }

func (m *GithubLabel) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubLabel) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

type GithubMilestone struct {
	Id int64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	// Following only need to be non-zero on changes:
	Title  string      `protobuf:"bytes,2,opt,name=title" json:"title,omitempty"`
	Closed *BoolChange `protobuf:"bytes,3,opt,name=closed" json:"closed,omitempty"`
	Number int64       `protobuf:"varint,4,opt,name=number" json:"number,omitempty"`
}

func (m *GithubMilestone) Reset()                    { *m = GithubMilestone{} }
func (m *GithubMilestone) String() string            { return proto.CompactTextString(m) }
func (*GithubMilestone) ProtoMessage()               {}
func (*GithubMilestone) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }

func (m *GithubMilestone) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubMilestone) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *GithubMilestone) GetClosed() *BoolChange {
	if m != nil {
		return m.Closed
	}
	return nil
}

func (m *GithubMilestone) GetNumber() int64 {
	if m != nil {
		return m.Number
	}
	return 0
}

// See https://developer.github.com/v3/activity/events/types/#issuesevent
// for some info.
type GithubIssueEvent struct {
	// Required:
	Id int64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	// event_type can be one of "assigned", "unassigned", "labeled",
	// "unlabeled", "opened", "edited", "milestoned", "demilestoned",
	// "closed", "reopened", "referenced", "renamed" or anything else
	// that Github adds in the future.
	EventType string                     `protobuf:"bytes,2,opt,name=event_type,json=eventType" json:"event_type,omitempty"`
	ActorId   int64                      `protobuf:"varint,3,opt,name=actor_id,json=actorId" json:"actor_id,omitempty"`
	Created   *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=created" json:"created,omitempty"`
	// label is populated for "labeled" and "unlabeled" events.
	// The label will usually not have an ID, due to Github's API
	// not returning one.
	Label *GithubLabel `protobuf:"bytes,5,opt,name=label" json:"label,omitempty"`
	// milestone is populated for "milestoned" and "demilestoned" events.
	// The label will usually not have an ID, due to Github's API
	// not returning one.
	Milestone *GithubMilestone `protobuf:"bytes,6,opt,name=milestone" json:"milestone,omitempty"`
	// For "assigned", "unassigned":
	AssigneeId int64 `protobuf:"varint,7,opt,name=assignee_id,json=assigneeId" json:"assignee_id,omitempty"`
	AssignerId int64 `protobuf:"varint,8,opt,name=assigner_id,json=assignerId" json:"assigner_id,omitempty"`
	// For "referenced", "closed":
	Commit *GithubCommit `protobuf:"bytes,9,opt,name=commit" json:"commit,omitempty"`
	// For "renamed" events:
	RenameFrom        string      `protobuf:"bytes,11,opt,name=rename_from,json=renameFrom" json:"rename_from,omitempty"`
	RenameTo          string      `protobuf:"bytes,12,opt,name=rename_to,json=renameTo" json:"rename_to,omitempty"`
	ReviewerId        int64       `protobuf:"varint,13,opt,name=reviewer_id,json=reviewerId" json:"reviewer_id,omitempty"`
	ReviewRequesterId int64       `protobuf:"varint,14,opt,name=review_requester_id,json=reviewRequesterId" json:"review_requester_id,omitempty"`
	TeamReviewer      *GithubTeam `protobuf:"bytes,16,opt,name=team_reviewer,json=teamReviewer" json:"team_reviewer,omitempty"`
	// Contents of a dismissed review event, see dismissed_review in
	// https://developer.github.com/v3/issues/events/ for more info
	DismissedReview *GithubDismissedReviewEvent `protobuf:"bytes,15,opt,name=dismissed_review,json=dismissedReview" json:"dismissed_review,omitempty"`
	// other_json is usually empty. If Github adds event types or fields
	// in the future, this captures those added fields. If non-empty it
	// will be a JSON object with the fields that weren't understood.
	OtherJson []byte `protobuf:"bytes,10,opt,name=other_json,json=otherJson,proto3" json:"other_json,omitempty"`
}

func (m *GithubIssueEvent) Reset()                    { *m = GithubIssueEvent{} }
func (m *GithubIssueEvent) String() string            { return proto.CompactTextString(m) }
func (*GithubIssueEvent) ProtoMessage()               {}
func (*GithubIssueEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }

func (m *GithubIssueEvent) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubIssueEvent) GetEventType() string {
	if m != nil {
		return m.EventType
	}
	return ""
}

func (m *GithubIssueEvent) GetActorId() int64 {
	if m != nil {
		return m.ActorId
	}
	return 0
}

func (m *GithubIssueEvent) GetCreated() *google_protobuf.Timestamp {
	if m != nil {
		return m.Created
	}
	return nil
}

func (m *GithubIssueEvent) GetLabel() *GithubLabel {
	if m != nil {
		return m.Label
	}
	return nil
}

func (m *GithubIssueEvent) GetMilestone() *GithubMilestone {
	if m != nil {
		return m.Milestone
	}
	return nil
}

func (m *GithubIssueEvent) GetAssigneeId() int64 {
	if m != nil {
		return m.AssigneeId
	}
	return 0
}

func (m *GithubIssueEvent) GetAssignerId() int64 {
	if m != nil {
		return m.AssignerId
	}
	return 0
}

func (m *GithubIssueEvent) GetCommit() *GithubCommit {
	if m != nil {
		return m.Commit
	}
	return nil
}

func (m *GithubIssueEvent) GetRenameFrom() string {
	if m != nil {
		return m.RenameFrom
	}
	return ""
}

func (m *GithubIssueEvent) GetRenameTo() string {
	if m != nil {
		return m.RenameTo
	}
	return ""
}

func (m *GithubIssueEvent) GetReviewerId() int64 {
	if m != nil {
		return m.ReviewerId
	}
	return 0
}

func (m *GithubIssueEvent) GetReviewRequesterId() int64 {
	if m != nil {
		return m.ReviewRequesterId
	}
	return 0
}

func (m *GithubIssueEvent) GetTeamReviewer() *GithubTeam {
	if m != nil {
		return m.TeamReviewer
	}
	return nil
}

func (m *GithubIssueEvent) GetDismissedReview() *GithubDismissedReviewEvent {
	if m != nil {
		return m.DismissedReview
	}
	return nil
}

func (m *GithubIssueEvent) GetOtherJson() []byte {
	if m != nil {
		return m.OtherJson
	}
	return nil
}

// Contents of a dismissed review event - when someone leaves a
// review requesting changes and someone else dismisses it. See
// https://developer.github.com/v3/issues/events for more information.
type GithubDismissedReviewEvent struct {
	ReviewId         int64  `protobuf:"varint,1,opt,name=review_id,json=reviewId" json:"review_id,omitempty"`
	DismissalMessage string `protobuf:"bytes,3,opt,name=dismissal_message,json=dismissalMessage" json:"dismissal_message,omitempty"`
	State            string `protobuf:"bytes,4,opt,name=state" json:"state,omitempty"`
}

func (m *GithubDismissedReviewEvent) Reset()                    { *m = GithubDismissedReviewEvent{} }
func (m *GithubDismissedReviewEvent) String() string            { return proto.CompactTextString(m) }
func (*GithubDismissedReviewEvent) ProtoMessage()               {}
func (*GithubDismissedReviewEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }

func (m *GithubDismissedReviewEvent) GetReviewId() int64 {
	if m != nil {
		return m.ReviewId
	}
	return 0
}

func (m *GithubDismissedReviewEvent) GetDismissalMessage() string {
	if m != nil {
		return m.DismissalMessage
	}
	return ""
}

func (m *GithubDismissedReviewEvent) GetState() string {
	if m != nil {
		return m.State
	}
	return ""
}

type GithubCommit struct {
	Owner    string `protobuf:"bytes,1,opt,name=owner" json:"owner,omitempty"`
	Repo     string `protobuf:"bytes,2,opt,name=repo" json:"repo,omitempty"`
	CommitId string `protobuf:"bytes,3,opt,name=commit_id,json=commitId" json:"commit_id,omitempty"`
}

func (m *GithubCommit) Reset()                    { *m = GithubCommit{} }
func (m *GithubCommit) String() string            { return proto.CompactTextString(m) }
func (*GithubCommit) ProtoMessage()               {}
func (*GithubCommit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }

func (m *GithubCommit) GetOwner() string {
	if m != nil {
		return m.Owner
	}
	return ""
}

func (m *GithubCommit) GetRepo() string {
	if m != nil {
		return m.Repo
	}
	return ""
}

func (m *GithubCommit) GetCommitId() string {
	if m != nil {
		return m.CommitId
	}
	return ""
}

// Contents of a pull request review - when someone
// comments, requests changes, or approves changes
// on a pull request. See
// https://developer.github.com/v3/pulls/reviews/ for more information.
type GithubReview struct {
	// Required:
	Id               int64                      `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	ActorId          int64                      `protobuf:"varint,2,opt,name=actor_id,json=actorId" json:"actor_id,omitempty"`
	Created          *google_protobuf.Timestamp `protobuf:"bytes,3,opt,name=created" json:"created,omitempty"`
	Body             string                     `protobuf:"bytes,4,opt,name=body" json:"body,omitempty"`
	State            string                     `protobuf:"bytes,5,opt,name=state" json:"state,omitempty"`
	CommitId         string                     `protobuf:"bytes,6,opt,name=commit_id,json=commitId" json:"commit_id,omitempty"`
	ActorAssociation string                     `protobuf:"bytes,7,opt,name=actor_association,json=actorAssociation" json:"actor_association,omitempty"`
	// other_json is usually empty.
	OtherJson []byte `protobuf:"bytes,8,opt,name=other_json,json=otherJson,proto3" json:"other_json,omitempty"`
}

func (m *GithubReview) Reset()                    { *m = GithubReview{} }
func (m *GithubReview) String() string            { return proto.CompactTextString(m) }
func (*GithubReview) ProtoMessage()               {}
func (*GithubReview) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }

func (m *GithubReview) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubReview) GetActorId() int64 {
	if m != nil {
		return m.ActorId
	}
	return 0
}

func (m *GithubReview) GetCreated() *google_protobuf.Timestamp {
	if m != nil {
		return m.Created
	}
	return nil
}

func (m *GithubReview) GetBody() string {
	if m != nil {
		return m.Body
	}
	return ""
}

func (m *GithubReview) GetState() string {
	if m != nil {
		return m.State
	}
	return ""
}

func (m *GithubReview) GetCommitId() string {
	if m != nil {
		return m.CommitId
	}
	return ""
}

func (m *GithubReview) GetActorAssociation() string {
	if m != nil {
		return m.ActorAssociation
	}
	return ""
}

func (m *GithubReview) GetOtherJson() []byte {
	if m != nil {
		return m.OtherJson
	}
	return nil
}

// GithubIssueSyncStatus notes where syncing is at for comments
// on an issue,
// This mutation type is only made at/after the same top-level mutation
// which created the corresponding comments.
type GithubIssueSyncStatus struct {
	// server_date is the "Date" response header from Github for the
	// final HTTP response.
	ServerDate *google_protobuf.Timestamp `protobuf:"bytes,1,opt,name=server_date,json=serverDate" json:"server_date,omitempty"`
}

func (m *GithubIssueSyncStatus) Reset()                    { *m = GithubIssueSyncStatus{} }
func (m *GithubIssueSyncStatus) String() string            { return proto.CompactTextString(m) }
func (*GithubIssueSyncStatus) ProtoMessage()               {}
func (*GithubIssueSyncStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }

func (m *GithubIssueSyncStatus) GetServerDate() *google_protobuf.Timestamp {
	if m != nil {
		return m.ServerDate
	}
	return nil
}

type GithubIssueCommentMutation struct {
	Id      int64                      `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	User    *GithubUser                `protobuf:"bytes,2,opt,name=user" json:"user,omitempty"`
	Body    string                     `protobuf:"bytes,3,opt,name=body" json:"body,omitempty"`
	Created *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=created" json:"created,omitempty"`
	Updated *google_protobuf.Timestamp `protobuf:"bytes,5,opt,name=updated" json:"updated,omitempty"`
}

func (m *GithubIssueCommentMutation) Reset()                    { *m = GithubIssueCommentMutation{} }
func (m *GithubIssueCommentMutation) String() string            { return proto.CompactTextString(m) }
func (*GithubIssueCommentMutation) ProtoMessage()               {}
func (*GithubIssueCommentMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }

func (m *GithubIssueCommentMutation) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubIssueCommentMutation) GetUser() *GithubUser {
	if m != nil {
		return m.User
	}
	return nil
}

func (m *GithubIssueCommentMutation) GetBody() string {
	if m != nil {
		return m.Body
	}
	return ""
}

func (m *GithubIssueCommentMutation) GetCreated() *google_protobuf.Timestamp {
	if m != nil {
		return m.Created
	}
	return nil
}

func (m *GithubIssueCommentMutation) GetUpdated() *google_protobuf.Timestamp {
	if m != nil {
		return m.Updated
	}
	return nil
}

type GithubUser struct {
	Id    int64  `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	Login string `protobuf:"bytes,2,opt,name=login" json:"login,omitempty"`
}

func (m *GithubUser) Reset()                    { *m = GithubUser{} }
func (m *GithubUser) String() string            { return proto.CompactTextString(m) }
func (*GithubUser) ProtoMessage()               {}
func (*GithubUser) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }

func (m *GithubUser) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubUser) GetLogin() string {
	if m != nil {
		return m.Login
	}
	return ""
}

type GithubTeam struct {
	Id   int64  `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	Slug string `protobuf:"bytes,2,opt,name=slug" json:"slug,omitempty"`
}

func (m *GithubTeam) Reset()                    { *m = GithubTeam{} }
func (m *GithubTeam) String() string            { return proto.CompactTextString(m) }
func (*GithubTeam) ProtoMessage()               {}
func (*GithubTeam) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }

func (m *GithubTeam) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GithubTeam) GetSlug() string {
	if m != nil {
		return m.Slug
	}
	return ""
}

type GitMutation struct {
	Repo *GitRepo `protobuf:"bytes,1,opt,name=repo" json:"repo,omitempty"`
	// commit adds a commit, or adds new information to a commit if fields
	// are added in the future.
	Commit *GitCommit `protobuf:"bytes,2,opt,name=commit" json:"commit,omitempty"`
}

func (m *GitMutation) Reset()                    { *m = GitMutation{} }
func (m *GitMutation) String() string            { return proto.CompactTextString(m) }
func (*GitMutation) ProtoMessage()               {}
func (*GitMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }

func (m *GitMutation) GetRepo() *GitRepo {
	if m != nil {
		return m.Repo
	}
	return nil
}

func (m *GitMutation) GetCommit() *GitCommit {
	if m != nil {
		return m.Commit
	}
	return nil
}

// GitRepo identifies a git repo being mutated.
type GitRepo struct {
	// If go_repo is set, it identifies a go.googlesource.com/<go_repo> repo.
	GoRepo string `protobuf:"bytes,1,opt,name=go_repo,json=goRepo" json:"go_repo,omitempty"`
}

func (m *GitRepo) Reset()                    { *m = GitRepo{} }
func (m *GitRepo) String() string            { return proto.CompactTextString(m) }
func (*GitRepo) ProtoMessage()               {}
func (*GitRepo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }

func (m *GitRepo) GetGoRepo() string {
	if m != nil {
		return m.GoRepo
	}
	return ""
}

type GitCommit struct {
	Sha1 string `protobuf:"bytes,1,opt,name=sha1" json:"sha1,omitempty"`
	// raw is the "git cat-file commit $sha1" output.
	Raw      []byte       `protobuf:"bytes,2,opt,name=raw,proto3" json:"raw,omitempty"`
	DiffTree *GitDiffTree `protobuf:"bytes,3,opt,name=diff_tree,json=diffTree" json:"diff_tree,omitempty"`
}

func (m *GitCommit) Reset()                    { *m = GitCommit{} }
func (m *GitCommit) String() string            { return proto.CompactTextString(m) }
func (*GitCommit) ProtoMessage()               {}
func (*GitCommit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }

func (m *GitCommit) GetSha1() string {
	if m != nil {
		return m.Sha1
	}
	return ""
}

func (m *GitCommit) GetRaw() []byte {
	if m != nil {
		return m.Raw
	}
	return nil
}

func (m *GitCommit) GetDiffTree() *GitDiffTree {
	if m != nil {
		return m.DiffTree
	}
	return nil
}

// git diff-tree --numstat oldtree newtree
type GitDiffTree struct {
	File []*GitDiffTreeFile `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"`
}

func (m *GitDiffTree) Reset()                    { *m = GitDiffTree{} }
func (m *GitDiffTree) String() string            { return proto.CompactTextString(m) }
func (*GitDiffTree) ProtoMessage()               {}
func (*GitDiffTree) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }

func (m *GitDiffTree) GetFile() []*GitDiffTreeFile {
	if m != nil {
		return m.File
	}
	return nil
}

// GitDiffTreeFile represents one line of `git diff-tree --numstat` output.
type GitDiffTreeFile struct {
	File    string `protobuf:"bytes,1,opt,name=file" json:"file,omitempty"`
	Added   int64  `protobuf:"varint,2,opt,name=added" json:"added,omitempty"`
	Deleted int64  `protobuf:"varint,3,opt,name=deleted" json:"deleted,omitempty"`
	Binary  bool   `protobuf:"varint,4,opt,name=binary" json:"binary,omitempty"`
}

func (m *GitDiffTreeFile) Reset()                    { *m = GitDiffTreeFile{} }
func (m *GitDiffTreeFile) String() string            { return proto.CompactTextString(m) }
func (*GitDiffTreeFile) ProtoMessage()               {}
func (*GitDiffTreeFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }

func (m *GitDiffTreeFile) GetFile() string {
	if m != nil {
		return m.File
	}
	return ""
}

func (m *GitDiffTreeFile) GetAdded() int64 {
	if m != nil {
		return m.Added
	}
	return 0
}

func (m *GitDiffTreeFile) GetDeleted() int64 {
	if m != nil {
		return m.Deleted
	}
	return 0
}

func (m *GitDiffTreeFile) GetBinary() bool {
	if m != nil {
		return m.Binary
	}
	return false
}

type GerritMutation struct {
	// Project is the Gerrit server and project, without scheme (https implied) or
	// trailing slash.
	Project string `protobuf:"bytes,1,opt,name=project" json:"project,omitempty"`
	// Commits to add.
	Commits []*GitCommit `protobuf:"bytes,2,rep,name=commits" json:"commits,omitempty"`
	// git refs to update.
	Refs []*GitRef `protobuf:"bytes,3,rep,name=refs" json:"refs,omitempty"`
	// deleted_refs are ref names to delete.
	DeletedRefs []string `protobuf:"bytes,4,rep,name=deleted_refs,json=deletedRefs" json:"deleted_refs,omitempty"`
}

func (m *GerritMutation) Reset()                    { *m = GerritMutation{} }
func (m *GerritMutation) String() string            { return proto.CompactTextString(m) }
func (*GerritMutation) ProtoMessage()               {}
func (*GerritMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }

func (m *GerritMutation) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GerritMutation) GetCommits() []*GitCommit {
	if m != nil {
		return m.Commits
	}
	return nil
}

func (m *GerritMutation) GetRefs() []*GitRef {
	if m != nil {
		return m.Refs
	}
	return nil
}

func (m *GerritMutation) GetDeletedRefs() []string {
	if m != nil {
		return m.DeletedRefs
	}
	return nil
}

type GitRef struct {
	// ref is the git ref name, such as:
	//    HEAD
	//    refs/heads/master
	//    refs/changes/00/14700/1
	//    refs/changes/00/14700/meta
	//    refs/meta/config
	Ref string `protobuf:"bytes,1,opt,name=ref" json:"ref,omitempty"`
	// sha1 is the lowercase hex sha1
	Sha1 string `protobuf:"bytes,2,opt,name=sha1" json:"sha1,omitempty"`
}

func (m *GitRef) Reset()                    { *m = GitRef{} }
func (m *GitRef) String() string            { return proto.CompactTextString(m) }
func (*GitRef) ProtoMessage()               {}
func (*GitRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }

func (m *GitRef) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *GitRef) GetSha1() string {
	if m != nil {
		return m.Sha1
	}
	return ""
}

func init() {
	proto.RegisterType((*Mutation)(nil), "maintpb.Mutation")
	proto.RegisterType((*GithubMutation)(nil), "maintpb.GithubMutation")
	proto.RegisterType((*GithubIssueMutation)(nil), "maintpb.GithubIssueMutation")
	proto.RegisterType((*BoolChange)(nil), "maintpb.BoolChange")
	proto.RegisterType((*StringChange)(nil), "maintpb.StringChange")
	proto.RegisterType((*GithubLabel)(nil), "maintpb.GithubLabel")
	proto.RegisterType((*GithubMilestone)(nil), "maintpb.GithubMilestone")
	proto.RegisterType((*GithubIssueEvent)(nil), "maintpb.GithubIssueEvent")
	proto.RegisterType((*GithubDismissedReviewEvent)(nil), "maintpb.GithubDismissedReviewEvent")
	proto.RegisterType((*GithubCommit)(nil), "maintpb.GithubCommit")
	proto.RegisterType((*GithubReview)(nil), "maintpb.GithubReview")
	proto.RegisterType((*GithubIssueSyncStatus)(nil), "maintpb.GithubIssueSyncStatus")
	proto.RegisterType((*GithubIssueCommentMutation)(nil), "maintpb.GithubIssueCommentMutation")
	proto.RegisterType((*GithubUser)(nil), "maintpb.GithubUser")
	proto.RegisterType((*GithubTeam)(nil), "maintpb.GithubTeam")
	proto.RegisterType((*GitMutation)(nil), "maintpb.GitMutation")
	proto.RegisterType((*GitRepo)(nil), "maintpb.GitRepo")
	proto.RegisterType((*GitCommit)(nil), "maintpb.GitCommit")
	proto.RegisterType((*GitDiffTree)(nil), "maintpb.GitDiffTree")
	proto.RegisterType((*GitDiffTreeFile)(nil), "maintpb.GitDiffTreeFile")
	proto.RegisterType((*GerritMutation)(nil), "maintpb.GerritMutation")
	proto.RegisterType((*GitRef)(nil), "maintpb.GitRef")
}

func init() { proto.RegisterFile("maintner.proto", fileDescriptor0) }

var fileDescriptor0 = []byte{
	// 1540 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x6d, 0x6f, 0xdb, 0xb6,
	0x13, 0x87, 0x9f, 0xa5, 0xb3, 0x93, 0xb8, 0x4c, 0xd3, 0xb2, 0xe9, 0x53, 0xfe, 0xea, 0x1f, 0x6b,
	0xd0, 0x07, 0xa7, 0xed, 0x86, 0xae, 0x40, 0x31, 0x0c, 0x69, 0xda, 0x0e, 0x2e, 0xd6, 0xbe, 0x60,
	0xd3, 0xd7, 0x82, 0x6c, 0xd1, 0x8e, 0x3a, 0x49, 0xf4, 0x24, 0x3a, 0x5d, 0x80, 0xbd, 0xea, 0xd7,
	0xd8, 0x8b, 0x0d, 0xfb, 0x4e, 0xfb, 0x3e, 0x03, 0x8f, 0xa4, 0x24, 0x3b, 0x4e, 0x93, 0xee, 0x1d,
	0xef, 0xee, 0x77, 0xe4, 0x1d, 0xef, 0x89, 0x84, 0xf5, 0x24, 0x88, 0x52, 0x99, 0xf2, 0x6c, 0x30,
	0xcb, 0x84, 0x14, 0xa4, 0x83, 0xf4, 0x6c, 0xb4, 0xfd, 0x7c, 0x1a, 0xc9, 0xa3, 0xf9, 0x68, 0x30,
	0x16, 0xc9, 0xde, 0x54, 0xc4, 0x41, 0x3a, 0xdd, 0x43, 0xc4, 0x68, 0x3e, 0xd9, 0x9b, 0xc9, 0x93,
	0x19, 0xcf, 0xf7, 0x64, 0x94, 0xf0, 0x5c, 0x06, 0xc9, 0xac, 0x5c, 0xe9, 0x5d, 0xbc, 0x7f, 0x6a,
	0xe0, 0xbc, 0x9d, 0xcb, 0x40, 0x46, 0x22, 0x25, 0x3f, 0x42, 0x4f, 0xef, 0xe5, 0x47, 0x79, 0x3e,
	0xe7, 0xb4, 0xb6, 0x53, 0xdb, 0xed, 0x3e, 0xb9, 0x31, 0x30, 0x27, 0x0d, 0x7e, 0x42, 0xe1, 0x50,
	0xc9, 0xac, 0x0e, 0xeb, 0x4e, 0x4b, 0x26, 0xd9, 0x83, 0xb6, 0x26, 0x69, 0x03, 0x55, 0xaf, 0x2e,
	0xa9, 0x16, 0x5a, 0x06, 0x46, 0xbe, 0x81, 0xc6, 0x34, 0x92, 0xb4, 0x8e, 0xe8, 0xcb, 0x55, 0x74,
	0x01, 0x55, 0x00, 0xdc, 0x98, 0x67, 0x59, 0x24, 0x69, 0x73, 0x79, 0x63, 0x64, 0x57, 0x36, 0x46,
	0xda, 0xfb, 0xbb, 0x06, 0xeb, 0x8b, 0x67, 0x92, 0xcb, 0xd0, 0x12, 0x9f, 0x52, 0x9e, 0xa1, 0x5b,
	0x2e, 0xd3, 0x04, 0x21, 0xd0, 0xcc, 0xf8, 0x4c, 0xa0, 0x09, 0x2e, 0xc3, 0x35, 0x79, 0x00, 0xed,
	0x38, 0x18, 0xf1, 0x38, 0xa7, 0x8d, 0x9d, 0xc6, 0xb2, 0x61, 0x47, 0xf3, 0xd1, 0xcf, 0x4a, 0xc8,
	0x0c, 0x86, 0x3c, 0x03, 0x48, 0xa2, 0x98, 0xe7, 0x52, 0xa4, 0x3c, 0xa7, 0x4d, 0xd4, 0xa0, 0xcb,
	0x8e, 0x5b, 0x00, 0xab, 0x60, 0xbd, 0x3f, 0x00, 0x36, 0x57, 0xdc, 0xe9, 0x57, 0x58, 0x7a, 0x05,
	0xda, 0xe9, 0x3c, 0x19, 0xf1, 0x0c, 0x2f, 0xbc, 0xc5, 0x0c, 0x45, 0xae, 0x83, 0x9b, 0x0a, 0xe9,
	0xf3, 0xdf, 0xa2, 0x5c, 0xd2, 0xb5, 0x9d, 0xda, 0xae, 0xc3, 0x9c, 0x54, 0xc8, 0x57, 0x8a, 0x26,
	0xeb, 0x50, 0x8f, 0x42, 0xda, 0xdb, 0xa9, 0xed, 0x36, 0x58, 0x3d, 0x0a, 0xc9, 0x5d, 0x68, 0xce,
	0x73, 0x9e, 0x99, 0xab, 0xdd, 0x5c, 0x32, 0xfd, 0x43, 0xce, 0x33, 0x86, 0x00, 0xf2, 0x18, 0xdc,
	0x20, 0xcf, 0xa3, 0x69, 0xca, 0x79, 0x4e, 0x01, 0x1d, 0x5d, 0x89, 0x2e, 0x51, 0xe4, 0x3e, 0x5c,
	0x0a, 0x79, 0xcc, 0x25, 0x0f, 0xfd, 0x52, 0xb5, 0xbb, 0xd3, 0xd8, 0x6d, 0xb0, 0xbe, 0x11, 0xec,
	0x17, 0xe0, 0xef, 0xa0, 0x33, 0xce, 0x78, 0x20, 0x79, 0x48, 0x5b, 0x68, 0xcb, 0xf6, 0x60, 0x2a,
	0xc4, 0x34, 0xe6, 0x03, 0x9b, 0xd0, 0x83, 0x43, 0x9b, 0xbf, 0xcc, 0x42, 0x95, 0xd6, 0x7c, 0x16,
	0xa2, 0x56, 0xfb, 0x7c, 0x2d, 0x03, 0x55, 0x77, 0x2c, 0x23, 0x19, 0x73, 0xea, 0xea, 0x3b, 0x46,
	0x82, 0x3c, 0x85, 0xee, 0x48, 0x84, 0x27, 0xfe, 0xf8, 0x28, 0x48, 0xa7, 0x9c, 0xde, 0xc6, 0xfd,
	0xb6, 0x0a, 0x1f, 0xdf, 0xcb, 0x2c, 0x4a, 0xa7, 0x07, 0x28, 0x64, 0xa0, 0x90, 0x7a, 0xad, 0x62,
	0xa3, 0x28, 0xda, 0xd1, 0xb1, 0x51, 0x6b, 0xf2, 0x3f, 0xe8, 0xa5, 0xc2, 0x2f, 0xc2, 0x4d, 0x37,
	0x30, 0x0c, 0xdd, 0x54, 0x14, 0xc9, 0xa0, 0x20, 0x85, 0xdc, 0x8f, 0x42, 0xda, 0xc7, 0x98, 0x74,
	0x0b, 0xde, 0x30, 0x24, 0x77, 0x60, 0xad, 0x84, 0xa4, 0xf3, 0x84, 0x5e, 0x42, 0x4c, 0xa9, 0xf7,
	0x6e, 0x9e, 0x90, 0xbb, 0xb0, 0x51, 0x82, 0xb4, 0x5b, 0x04, 0x2d, 0x59, 0x2f, 0xd8, 0x87, 0xe8,
	0xdf, 0x7d, 0x68, 0x8f, 0x63, 0x91, 0xf3, 0x90, 0x6e, 0x2e, 0x05, 0xfb, 0x85, 0x10, 0xb1, 0x71,
	0xcc, 0x40, 0x14, 0x38, 0x16, 0xe3, 0x5f, 0x78, 0x48, 0xaf, 0x7d, 0x01, 0xac, 0x21, 0xca, 0x95,
	0xd9, 0x3c, 0x8e, 0xfd, 0x8c, 0xff, 0x3a, 0xe7, 0xb9, 0xa4, 0x37, 0xb4, 0xb7, 0x8a, 0xc7, 0x34,
	0x8b, 0x7c, 0x0f, 0xae, 0xde, 0xd9, 0x0f, 0x24, 0xdd, 0x3a, 0x37, 0x54, 0x8e, 0x06, 0xef, 0x4b,
	0xf2, 0xa8, 0x50, 0x1c, 0x9d, 0xd0, 0x2b, 0x67, 0x67, 0xa9, 0xd1, 0x78, 0x81, 0x77, 0x9f, 0xf1,
	0x44, 0x1c, 0x73, 0x1f, 0x8b, 0x94, 0x5e, 0xc5, 0x8c, 0xeb, 0x6a, 0x1e, 0x96, 0x2f, 0x26, 0x73,
	0x18, 0x1a, 0x39, 0xfd, 0x42, 0x9d, 0x3b, 0x41, 0x18, 0x6a, 0x95, 0x1f, 0xa0, 0x33, 0x16, 0x49,
	0xc2, 0x53, 0x49, 0x1d, 0x54, 0xb8, 0xb3, 0xaa, 0x35, 0x1e, 0x68, 0x48, 0xd1, 0x92, 0xac, 0x0e,
	0x79, 0x05, 0xeb, 0x66, 0xe9, 0xe7, 0x32, 0x90, 0xf3, 0x9c, 0xae, 0xa3, 0x2f, 0xb7, 0x56, 0xed,
	0xf2, 0xfe, 0x24, 0x1d, 0xbf, 0x47, 0x14, 0x5b, 0x33, 0x5a, 0x9a, 0x24, 0x7b, 0xd0, 0xe2, 0xc7,
	0xca, 0x86, 0x6d, 0xb4, 0xe1, 0xda, 0x2a, 0xed, 0x57, 0x0a, 0xc0, 0x34, 0x8e, 0xec, 0x43, 0x0f,
	0x17, 0xf6, 0xd4, 0xeb, 0x17, 0x3a, 0xb5, 0x8b, 0x3a, 0xe6, 0xcc, 0x87, 0xd0, 0xce, 0xf8, 0x71,
	0xc4, 0x3f, 0xd1, 0x9b, 0x78, 0xe8, 0xd6, 0x92, 0x32, 0x43, 0x21, 0x33, 0x20, 0x72, 0x00, 0x6b,
	0x7a, 0x65, 0x8f, 0xbc, 0x75, 0xa1, 0x23, 0x7b, 0x5a, 0x49, 0x53, 0xde, 0x2d, 0x80, 0x32, 0xcf,
	0x48, 0x1f, 0x1a, 0xc7, 0x41, 0x8c, 0x1d, 0xd1, 0x61, 0x6a, 0xe9, 0xed, 0x40, 0xaf, 0x5a, 0x8f,
	0x55, 0x84, 0xab, 0x11, 0x8f, 0xa1, 0x5b, 0x09, 0xa4, 0xe9, 0x7b, 0xb5, 0xa2, 0xef, 0x11, 0x68,
	0xa6, 0x41, 0xc2, 0x6d, 0x43, 0x55, 0x6b, 0xef, 0x77, 0xd8, 0x58, 0xea, 0xd8, 0xa7, 0xd4, 0x8a,
	0xce, 0x51, 0xaf, 0x76, 0x8e, 0xb2, 0xb2, 0x1a, 0xe7, 0x57, 0x56, 0xd9, 0xb6, 0x9b, 0xb8, 0xad,
	0xa1, 0xbc, 0x3f, 0x5b, 0xd0, 0x5f, 0x8e, 0xe2, 0xa9, 0xf3, 0x6f, 0x02, 0xe8, 0x70, 0xaa, 0xd9,
	0x6e, 0x8c, 0x70, 0x91, 0x73, 0x78, 0x32, 0xe3, 0xe4, 0x1a, 0x38, 0xc1, 0x58, 0x8a, 0x4c, 0xf5,
	0x93, 0x06, 0x2a, 0x75, 0x90, 0x1e, 0x86, 0xd5, 0xfe, 0xda, 0xbc, 0x78, 0x7f, 0xbd, 0x07, 0x2d,
	0x5d, 0x24, 0xad, 0xd3, 0x53, 0xba, 0x28, 0x12, 0x0d, 0x21, 0x4f, 0xc1, 0x2d, 0x1b, 0x9e, 0xee,
	0xc6, 0x67, 0x8f, 0xc2, 0x12, 0x4a, 0x6e, 0x43, 0xd7, 0x8e, 0x07, 0x65, 0x77, 0x07, 0xed, 0x06,
	0xcb, 0x1a, 0x86, 0x15, 0x00, 0x3a, 0xe6, 0x2c, 0x00, 0x94, 0x6f, 0x0f, 0xa1, 0xad, 0xca, 0x24,
	0x92, 0xd8, 0xd0, 0x4f, 0x67, 0xe8, 0x01, 0x0a, 0x99, 0x01, 0xa9, 0xfd, 0x32, 0xae, 0x22, 0xee,
	0x4f, 0x32, 0x91, 0xd0, 0x2e, 0xde, 0x22, 0x68, 0xd6, 0xeb, 0x4c, 0x24, 0x6a, 0x82, 0x1a, 0x80,
	0x14, 0x38, 0x2b, 0x5d, 0xe6, 0x68, 0xc6, 0xa1, 0xd0, 0xda, 0x2a, 0x55, 0xb5, 0x35, 0x6b, 0xda,
	0x1a, 0xcb, 0x1a, 0x86, 0x64, 0x00, 0x9b, 0xa6, 0x00, 0x4c, 0x3f, 0xd4, 0xc0, 0x75, 0x04, 0x5e,
	0xd2, 0x22, 0x66, 0x25, 0xc3, 0x90, 0x3c, 0x83, 0x35, 0xc9, 0x83, 0xc4, 0xb7, 0x5b, 0xe0, 0x24,
	0x38, 0xdd, 0xe5, 0x0e, 0x79, 0x90, 0xb0, 0x9e, 0x42, 0x32, 0x03, 0x24, 0xef, 0xa0, 0x1f, 0x46,
	0x79, 0x12, 0xe5, 0xaa, 0x3d, 0x9a, 0x1a, 0xdd, 0x40, 0xe5, 0xe5, 0xe6, 0xf4, 0xd2, 0xc2, 0xb4,
	0xae, 0x6e, 0x11, 0x1b, 0xe1, 0x22, 0x57, 0x65, 0x97, 0x90, 0x47, 0x3c, 0xf3, 0x3f, 0xe6, 0x22,
	0xa5, 0xb0, 0x53, 0xdb, 0xed, 0x31, 0x17, 0x39, 0x6f, 0x72, 0x91, 0x7a, 0x9f, 0x6b, 0xb0, 0x7d,
	0xf6, 0x76, 0xfa, 0xd6, 0xd0, 0xef, 0x22, 0x65, 0x1d, 0xcd, 0x18, 0x86, 0xf8, 0x16, 0xd0, 0x4a,
	0x41, 0xec, 0x27, 0x3c, 0xcf, 0x83, 0x29, 0xc7, 0x14, 0x75, 0x59, 0xbf, 0x10, 0xbc, 0xd5, 0x7c,
	0x55, 0x65, 0xaa, 0x77, 0x70, 0xcc, 0x54, 0x97, 0x69, 0xe2, 0x4d, 0xd3, 0xa9, 0xf7, 0x1b, 0xde,
	0x07, 0xe8, 0x55, 0x83, 0xfa, 0x15, 0xef, 0xa5, 0xeb, 0xe0, 0xea, 0x04, 0xb0, 0xd5, 0xe1, 0x32,
	0x47, 0x33, 0x86, 0xa1, 0xf7, 0xb9, 0x6e, 0xf7, 0x35, 0x77, 0xb1, 0x5c, 0x79, 0xd5, 0xd2, 0xaa,
	0x9f, 0x59, 0x5a, 0x8d, 0x8b, 0x97, 0x96, 0x7d, 0x36, 0x34, 0x2b, 0xcf, 0x86, 0xc2, 0xf1, 0x56,
	0xc5, 0xf1, 0x45, 0xc3, 0xdb, 0x8b, 0x86, 0xab, 0x8b, 0xd5, 0x76, 0x05, 0x79, 0x2e, 0xc6, 0x11,
	0x8e, 0x1d, 0xf3, 0x14, 0xe9, 0xa3, 0x60, 0xbf, 0xe4, 0x2f, 0x05, 0xd8, 0x59, 0x0e, 0xf0, 0x21,
	0x6c, 0xad, 0x6c, 0xce, 0xe4, 0x39, 0x74, 0x73, 0x9e, 0x1d, 0xf3, 0xcc, 0x57, 0x0f, 0x28, 0xf3,
	0x37, 0xf8, 0x92, 0x97, 0xa0, 0xe1, 0x2f, 0x03, 0xc9, 0xd5, 0x37, 0x63, 0xfb, 0xec, 0x11, 0x79,
	0xea, 0xa2, 0xed, 0x8b, 0xb4, 0x7e, 0xde, 0x8b, 0xd4, 0x5e, 0x60, 0xa3, 0x72, 0x81, 0xff, 0xad,
	0xcb, 0x55, 0x5e, 0x91, 0xad, 0x0b, 0xbf, 0x22, 0xbd, 0x27, 0x00, 0xa5, 0x4d, 0xab, 0x26, 0x45,
	0x2c, 0xa6, 0x51, 0x6a, 0x27, 0x05, 0x12, 0xde, 0x23, 0xab, 0xa3, 0xaa, 0x79, 0xd5, 0x50, 0xca,
	0xe3, 0xf9, 0xd4, 0x66, 0xad, 0x5a, 0x7b, 0x3e, 0xce, 0xb1, 0xe2, 0xb6, 0xfe, 0x6f, 0x12, 0x5b,
	0x87, 0xa0, 0x5f, 0xbd, 0x1d, 0xc6, 0x67, 0xc2, 0xa4, 0xfa, 0xbd, 0xa2, 0x21, 0xea, 0x5b, 0x24,
	0x55, 0xdc, 0x62, 0x37, 0xf4, 0x3c, 0xe8, 0x18, 0x65, 0x72, 0x15, 0x3a, 0x53, 0xe1, 0x17, 0xfb,
	0xbb, 0xac, 0x3d, 0x15, 0x4a, 0xe0, 0x85, 0xe0, 0x16, 0x8a, 0x68, 0xe5, 0x51, 0xf0, 0xd8, 0x40,
	0x70, 0xad, 0xe6, 0x6f, 0x16, 0x7c, 0xc2, 0xd3, 0x7a, 0x4c, 0x2d, 0xd5, 0x13, 0x2b, 0x8c, 0x26,
	0x13, 0x5f, 0x66, 0x9c, 0x9b, 0xb2, 0x58, 0x98, 0x1e, 0x2f, 0xa3, 0xc9, 0xe4, 0x30, 0xe3, 0x9c,
	0x39, 0xa1, 0x59, 0x79, 0xcf, 0xd1, 0x55, 0x2b, 0x20, 0x0f, 0xa0, 0x39, 0x89, 0x62, 0x95, 0x6d,
	0xa7, 0x7e, 0x55, 0x16, 0xf3, 0x3a, 0x8a, 0x39, 0x43, 0x94, 0x97, 0xe0, 0xf0, 0xae, 0x0a, 0x94,
	0xa1, 0x66, 0x03, 0x34, 0x54, 0xad, 0x55, 0x58, 0x82, 0x30, 0xe4, 0xb6, 0x86, 0x35, 0x41, 0x28,
	0x74, 0xcc, 0x87, 0xc4, 0x8e, 0x4d, 0x43, 0xaa, 0x69, 0x3d, 0x8a, 0xd2, 0x20, 0xd3, 0x75, 0xea,
	0x30, 0x43, 0x79, 0x7f, 0xa9, 0x3f, 0xe6, 0xc2, 0xf7, 0x53, 0x6d, 0x32, 0xcb, 0xc4, 0x47, 0x3e,
	0x96, 0xe6, 0x44, 0x4b, 0x92, 0x07, 0xfa, 0xed, 0x18, 0xc9, 0x9c, 0xd6, 0xd1, 0x99, 0x55, 0xf1,
	0xb0, 0x10, 0x72, 0x47, 0x85, 0x78, 0x62, 0xff, 0x9f, 0x1b, 0x8b, 0x21, 0x9e, 0x30, 0x14, 0xaa,
	0x47, 0xae, 0xfd, 0x5b, 0x21, 0x58, 0x7d, 0x3d, 0x5d, 0xd6, 0x35, 0x3c, 0xc6, 0x27, 0xb9, 0x37,
	0x80, 0xb6, 0x56, 0xc1, 0xe8, 0xf0, 0x89, 0x7d, 0x1d, 0x65, 0x7c, 0x52, 0xc4, 0xb0, 0x5e, 0xc6,
	0x70, 0xd4, 0xc6, 0x64, 0xff, 0xf6, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x4d, 0xc5, 0xae,
	0x6d, 0x10, 0x00, 0x00,
}
