Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
47540288
Commit
47540288
authored
Jul 30, 2019
by
liuyuhang
Committed by
33cn
Aug 14, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add comment reply hash
parent
3436c30f
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
41 additions
and
139 deletions
+41
-139
proposal_rule.go
plugin/dapp/autonomy/commands/proposal_rule.go
+3
-3
rule.go
plugin/dapp/autonomy/executor/rule.go
+2
-1
rule_test.go
plugin/dapp/autonomy/executor/rule_test.go
+3
-3
ruleaction.go
plugin/dapp/autonomy/executor/ruleaction.go
+3
-3
ruleaction_test.go
plugin/dapp/autonomy/executor/ruleaction_test.go
+2
-2
rule.proto
plugin/dapp/autonomy/proto/rule.proto
+4
-2
autonomy.pb.go
plugin/dapp/autonomy/types/autonomy.pb.go
+0
-0
board.pb.go
plugin/dapp/autonomy/types/board.pb.go
+0
-0
lcommon.pb.go
plugin/dapp/autonomy/types/lcommon.pb.go
+24
-125
project.pb.go
plugin/dapp/autonomy/types/project.pb.go
+0
-0
rule.pb.go
plugin/dapp/autonomy/types/rule.pb.go
+0
-0
No files found.
plugin/dapp/autonomy/commands/proposal_rule.go
View file @
47540288
...
...
@@ -273,7 +273,7 @@ func CommentProposalCmd() *cobra.Command {
func
addCommentProposalflags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"proposalID"
,
"p"
,
""
,
"proposal ID"
)
cmd
.
MarkFlagRequired
(
"proposalID"
)
cmd
.
Flags
()
.
StringP
(
"rep
Cmt
Hash"
,
"r"
,
""
,
"reply Comment hash"
)
cmd
.
Flags
()
.
StringP
(
"repHash"
,
"r"
,
""
,
"reply Comment hash"
)
cmd
.
Flags
()
.
StringP
(
"comment"
,
"c"
,
""
,
"comment"
)
cmd
.
MarkFlagRequired
(
"comment"
)
}
...
...
@@ -281,12 +281,12 @@ func addCommentProposalflags(cmd *cobra.Command) {
func
commentProposal
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
proposalID
,
_
:=
cmd
.
Flags
()
.
GetString
(
"proposalID"
)
rep
CmtHash
,
_
:=
cmd
.
Flags
()
.
GetString
(
"repCmt
Hash"
)
rep
Hash
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rep
Hash"
)
comment
,
_
:=
cmd
.
Flags
()
.
GetString
(
"comment"
)
params
:=
&
auty
.
Comment
{
ProposalID
:
proposalID
,
Rep
CmtHash
:
repCmt
Hash
,
Rep
Hash
:
rep
Hash
,
Comment
:
comment
,
}
var
res
string
...
...
plugin/dapp/autonomy/executor/rule.go
View file @
47540288
...
...
@@ -174,10 +174,11 @@ func saveCommentHeightIndex(res *auty.ReceiptProposalComment) (kvs []*types.KeyV
kv
:=
&
types
.
KeyValue
{}
kv
.
Key
=
calcCommentHeight
(
res
.
Cmt
.
ProposalID
,
dapp
.
HeightIndexStr
(
res
.
Height
,
int64
(
res
.
Index
)))
kv
.
Value
=
types
.
Encode
(
&
auty
.
RelationCmt
{
Rep
CmtHash
:
res
.
Cmt
.
RepCmt
Hash
,
Rep
Hash
:
res
.
Cmt
.
Rep
Hash
,
Comment
:
res
.
Cmt
.
Comment
,
Height
:
res
.
Height
,
Index
:
res
.
Index
,
Hash
:
res
.
Hash
,
})
kvs
=
append
(
kvs
,
kv
)
return
kvs
...
...
plugin/dapp/autonomy/executor/rule_test.go
View file @
47540288
...
...
@@ -271,7 +271,7 @@ func TestExecLocalCommentProp(t *testing.T) {
receiptCmt
:=
&
auty
.
ReceiptProposalComment
{
Cmt
:
&
auty
.
Comment
{
ProposalID
:
propID
,
Rep
Cmt
Hash
:
Repcmt
,
RepHash
:
Repcmt
,
Comment
:
comment
,
},
Height
:
11
,
...
...
@@ -298,7 +298,7 @@ func TestExecDelLocalCommentProp(t *testing.T) {
receiptCmt
:=
&
auty
.
ReceiptProposalComment
{
Cmt
:
&
auty
.
Comment
{
ProposalID
:
propID
,
Rep
Cmt
Hash
:
Repcmt
,
RepHash
:
Repcmt
,
Comment
:
comment
,
},
Height
:
11
,
...
...
@@ -348,7 +348,7 @@ func TestListProposalComment(t *testing.T) {
testcase
=
append
(
testcase
,
testcase1
...
)
testcase
=
append
(
testcase
,
testcase2
...
)
cur
:=
&
auty
.
RelationCmt
{
Rep
Cmt
Hash
:
"aaaaaa"
,
RepHash
:
"aaaaaa"
,
Comment
:
"bbbbbbbbbb"
,
}
for
_
,
tcase
:=
range
testcase
{
...
...
plugin/dapp/autonomy/executor/ruleaction.go
View file @
47540288
...
...
@@ -331,15 +331,15 @@ func (a *action) commentProp(cm *auty.Comment) (*types.Receipt, error) {
var
logs
[]
*
types
.
ReceiptLog
var
kv
[]
*
types
.
KeyValue
receiptLog
:=
getCommentReceiptLog
(
cm
,
a
.
height
,
a
.
index
,
auty
.
TyLogCommentProp
)
receiptLog
:=
getCommentReceiptLog
(
cm
,
a
.
height
,
a
.
index
,
common
.
ToHex
(
a
.
txhash
),
auty
.
TyLogCommentProp
)
logs
=
append
(
logs
,
receiptLog
)
return
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
,
KV
:
kv
,
Logs
:
logs
},
nil
}
func
getCommentReceiptLog
(
cur
*
auty
.
Comment
,
height
int64
,
index
int32
,
ty
int32
)
*
types
.
ReceiptLog
{
func
getCommentReceiptLog
(
cur
*
auty
.
Comment
,
height
int64
,
index
int32
,
hash
string
,
ty
int32
)
*
types
.
ReceiptLog
{
log
:=
&
types
.
ReceiptLog
{}
log
.
Ty
=
ty
r
:=
&
auty
.
ReceiptProposalComment
{
Cmt
:
cur
,
Height
:
height
,
Index
:
index
}
r
:=
&
auty
.
ReceiptProposalComment
{
Cmt
:
cur
,
Height
:
height
,
Index
:
index
,
Hash
:
hash
}
log
.
Log
=
types
.
Encode
(
r
)
return
log
}
...
...
plugin/dapp/autonomy/executor/ruleaction_test.go
View file @
47540288
...
...
@@ -537,7 +537,7 @@ func TestComment(t *testing.T) {
comment
:=
"3333333333"
opt1
:=
&
auty
.
Comment
{
ProposalID
:
propID
,
Rep
Cmt
Hash
:
Repcmt
,
RepHash
:
Repcmt
,
Comment
:
comment
,
}
pbtx
,
err
:=
commentPropTx
(
opt1
)
...
...
@@ -569,7 +569,7 @@ func TestComment(t *testing.T) {
err
=
types
.
Decode
(
value
,
cmt
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
cmt
.
Comment
,
comment
)
require
.
Equal
(
t
,
cmt
.
Rep
Cmt
Hash
,
Repcmt
)
require
.
Equal
(
t
,
cmt
.
RepHash
,
Repcmt
)
}
func
commentPropTx
(
parm
*
auty
.
Comment
)
(
*
types
.
Transaction
,
error
)
{
...
...
plugin/dapp/autonomy/proto/rule.proto
View file @
47540288
...
...
@@ -81,7 +81,7 @@ message TransferFund {
// Comment action
message
Comment
{
string
proposalID
=
1
;
string
rep
CmtHash
=
2
;
string
rep
Hash
=
2
;
string
comment
=
3
;
}
...
...
@@ -89,6 +89,7 @@ message ReceiptProposalComment {
Comment
cmt
=
1
;
int64
height
=
2
;
int32
index
=
3
;
string
hash
=
4
;
}
// query
...
...
@@ -100,10 +101,11 @@ message ReqQueryProposalComment {
}
message
RelationCmt
{
string
rep
Cmt
Hash
=
1
;
string
repHash
=
1
;
string
comment
=
2
;
int64
height
=
3
;
int32
index
=
4
;
string
hash
=
5
;
}
message
ReplyQueryProposalComment
{
...
...
plugin/dapp/autonomy/types/autonomy.pb.go
View file @
47540288
This diff is collapsed.
Click to expand it.
plugin/dapp/autonomy/types/board.pb.go
View file @
47540288
This diff is collapsed.
Click to expand it.
plugin/dapp/autonomy/types/lcommon.pb.go
View file @
47540288
...
...
@@ -3,62 +3,30 @@
package
types
import
(
fmt
"fmt"
math
"math"
proto
"github.com/golang/protobuf/proto"
)
import
proto
"github.com/golang/protobuf/proto"
import
fmt
"fmt"
import
math
"math"
// 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
VoteResult
struct
{
// 总票数
TotalVotes
int32
`protobuf:"varint,1,opt,name=totalVotes
,proto3
" json:"totalVotes,omitempty"`
TotalVotes
int32
`protobuf:"varint,1,opt,name=totalVotes" json:"totalVotes,omitempty"`
// 赞成票
ApproveVotes
int32
`protobuf:"varint,2,opt,name=approveVotes
,proto3
" json:"approveVotes,omitempty"`
ApproveVotes
int32
`protobuf:"varint,2,opt,name=approveVotes" json:"approveVotes,omitempty"`
// 反对票
OpposeVotes
int32
`protobuf:"varint,3,opt,name=opposeVotes
,proto3
" json:"opposeVotes,omitempty"`
OpposeVotes
int32
`protobuf:"varint,3,opt,name=opposeVotes" json:"opposeVotes,omitempty"`
// 是否通过
Pass
bool
`protobuf:"varint,4,opt,name=pass,proto3" json:"pass,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
Pass
bool
`protobuf:"varint,4,opt,name=pass" json:"pass,omitempty"`
}
func
(
m
*
VoteResult
)
Reset
()
{
*
m
=
VoteResult
{}
}
func
(
m
*
VoteResult
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
VoteResult
)
ProtoMessage
()
{}
func
(
*
VoteResult
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_d916a933dd8220ff
,
[]
int
{
0
}
}
func
(
m
*
VoteResult
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_VoteResult
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
VoteResult
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_VoteResult
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
VoteResult
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_VoteResult
.
Merge
(
m
,
src
)
}
func
(
m
*
VoteResult
)
XXX_Size
()
int
{
return
xxx_messageInfo_VoteResult
.
Size
(
m
)
}
func
(
m
*
VoteResult
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_VoteResult
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_VoteResult
proto
.
InternalMessageInfo
func
(
*
VoteResult
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor2
,
[]
int
{
0
}
}
func
(
m
*
VoteResult
)
GetTotalVotes
()
int32
{
if
m
!=
nil
{
...
...
@@ -90,42 +58,19 @@ func (m *VoteResult) GetPass() bool {
type
PublicVote
struct
{
// 是否需要公示
Publicity
bool
`protobuf:"varint,1,opt,name=publicity
,proto3
" json:"publicity,omitempty"`
Publicity
bool
`protobuf:"varint,1,opt,name=publicity" json:"publicity,omitempty"`
// 总票数
TotalVotes
int32
`protobuf:"varint,2,opt,name=totalVotes
,proto3
" json:"totalVotes,omitempty"`
TotalVotes
int32
`protobuf:"varint,2,opt,name=totalVotes" json:"totalVotes,omitempty"`
// 全体持票人反对票
OpposeVotes
int32
`protobuf:"varint,3,opt,name=opposeVotes
,proto3
" json:"opposeVotes,omitempty"`
OpposeVotes
int32
`protobuf:"varint,3,opt,name=opposeVotes" json:"opposeVotes,omitempty"`
// 是否通过
PubPass
bool
`protobuf:"varint,4,opt,name=pubPass,proto3" json:"pubPass,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
PubPass
bool
`protobuf:"varint,4,opt,name=pubPass" json:"pubPass,omitempty"`
}
func
(
m
*
PublicVote
)
Reset
()
{
*
m
=
PublicVote
{}
}
func
(
m
*
PublicVote
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
PublicVote
)
ProtoMessage
()
{}
func
(
*
PublicVote
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_d916a933dd8220ff
,
[]
int
{
1
}
}
func
(
m
*
PublicVote
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_PublicVote
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
PublicVote
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_PublicVote
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
PublicVote
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_PublicVote
.
Merge
(
m
,
src
)
}
func
(
m
*
PublicVote
)
XXX_Size
()
int
{
return
xxx_messageInfo_PublicVote
.
Size
(
m
)
}
func
(
m
*
PublicVote
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_PublicVote
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_PublicVote
proto
.
InternalMessageInfo
func
(
*
PublicVote
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor2
,
[]
int
{
1
}
}
func
(
m
*
PublicVote
)
GetPublicity
()
bool
{
if
m
!=
nil
{
...
...
@@ -156,36 +101,13 @@ func (m *PublicVote) GetPubPass() bool {
}
type
VotesRecord
struct
{
Address
[]
string
`protobuf:"bytes,1,rep,name=address,proto3" json:"address,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
Address
[]
string
`protobuf:"bytes,1,rep,name=address" json:"address,omitempty"`
}
func
(
m
*
VotesRecord
)
Reset
()
{
*
m
=
VotesRecord
{}
}
func
(
m
*
VotesRecord
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
VotesRecord
)
ProtoMessage
()
{}
func
(
*
VotesRecord
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_d916a933dd8220ff
,
[]
int
{
2
}
}
func
(
m
*
VotesRecord
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_VotesRecord
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
VotesRecord
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_VotesRecord
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
VotesRecord
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_VotesRecord
.
Merge
(
m
,
src
)
}
func
(
m
*
VotesRecord
)
XXX_Size
()
int
{
return
xxx_messageInfo_VotesRecord
.
Size
(
m
)
}
func
(
m
*
VotesRecord
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_VotesRecord
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_VotesRecord
proto
.
InternalMessageInfo
func
(
*
VotesRecord
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor2
,
[]
int
{
2
}
}
func
(
m
*
VotesRecord
)
GetAddress
()
[]
string
{
if
m
!=
nil
{
...
...
@@ -196,46 +118,23 @@ func (m *VotesRecord) GetAddress() []string {
type
RuleConfig
struct
{
// 董事会成员参与率,以%为单位,只保留整数部分
BoardAttendRatio
int32
`protobuf:"varint,1,opt,name=boardAttendRatio
,proto3
" json:"boardAttendRatio,omitempty"`
BoardAttendRatio
int32
`protobuf:"varint,1,opt,name=boardAttendRatio" json:"boardAttendRatio,omitempty"`
// 董事会成员赞成率
BoardApproveRatio
int32
`protobuf:"varint,2,opt,name=boardApproveRatio
,proto3
" json:"boardApproveRatio,omitempty"`
BoardApproveRatio
int32
`protobuf:"varint,2,opt,name=boardApproveRatio" json:"boardApproveRatio,omitempty"`
// 全体持票人否决率
PubOpposeRatio
int32
`protobuf:"varint,3,opt,name=pubOpposeRatio
,proto3
" json:"pubOpposeRatio,omitempty"`
PubOpposeRatio
int32
`protobuf:"varint,3,opt,name=pubOpposeRatio" json:"pubOpposeRatio,omitempty"`
// 提案金额
ProposalAmount
int64
`protobuf:"varint,4,opt,name=proposalAmount
,proto3
" json:"proposalAmount,omitempty"`
ProposalAmount
int64
`protobuf:"varint,4,opt,name=proposalAmount" json:"proposalAmount,omitempty"`
// 重大项目公示金额阈值
LargeProjectAmount
int64
`protobuf:"varint,5,opt,name=largeProjectAmount
,proto3
" json:"largeProjectAmount,omitempty"`
LargeProjectAmount
int64
`protobuf:"varint,5,opt,name=largeProjectAmount" json:"largeProjectAmount,omitempty"`
// 重大项目公示时间(以区块数为单位)
PublicPeriod
int32
`protobuf:"varint,6,opt,name=publicPeriod,proto3" json:"publicPeriod,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
PublicPeriod
int32
`protobuf:"varint,6,opt,name=publicPeriod" json:"publicPeriod,omitempty"`
}
func
(
m
*
RuleConfig
)
Reset
()
{
*
m
=
RuleConfig
{}
}
func
(
m
*
RuleConfig
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
RuleConfig
)
ProtoMessage
()
{}
func
(
*
RuleConfig
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_d916a933dd8220ff
,
[]
int
{
3
}
}
func
(
m
*
RuleConfig
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_RuleConfig
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
RuleConfig
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_RuleConfig
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
RuleConfig
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_RuleConfig
.
Merge
(
m
,
src
)
}
func
(
m
*
RuleConfig
)
XXX_Size
()
int
{
return
xxx_messageInfo_RuleConfig
.
Size
(
m
)
}
func
(
m
*
RuleConfig
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_RuleConfig
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_RuleConfig
proto
.
InternalMessageInfo
func
(
*
RuleConfig
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor2
,
[]
int
{
3
}
}
func
(
m
*
RuleConfig
)
GetBoardAttendRatio
()
int32
{
if
m
!=
nil
{
...
...
@@ -286,9 +185,9 @@ func init() {
proto
.
RegisterType
((
*
RuleConfig
)(
nil
),
"types.RuleConfig"
)
}
func
init
()
{
proto
.
RegisterFile
(
"lcommon.proto"
,
fileDescriptor
_d916a933dd8220ff
)
}
func
init
()
{
proto
.
RegisterFile
(
"lcommon.proto"
,
fileDescriptor
2
)
}
var
fileDescriptor
_d916a933dd8220ff
=
[]
byte
{
var
fileDescriptor
2
=
[]
byte
{
// 314 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0x84
,
0x92
,
0x3d
,
0x4e
,
0xf3
,
0x40
,
0x10
,
0x86
,
0xe5
,
0xfc
,
0x7d
,
0xc9
,
0xe4
,
0x03
,
0xc1
,
0x54
,
0x2e
,
0x10
,
0x8a
,
0x5c
,
0x40
,
0x84
,
...
...
plugin/dapp/autonomy/types/project.pb.go
View file @
47540288
This diff is collapsed.
Click to expand it.
plugin/dapp/autonomy/types/rule.pb.go
View file @
47540288
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment