Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
yaml-cpp
Commits
1f9cc2d3
"...composable_kernel.git" did not exist on "943d72992e56738efd92ca94718e4a3c639c66f2"
Commit
1f9cc2d3
authored
Mar 03, 2011
by
Jesse Beder
Browse files
Compressed the sequence-of-maps emitting (got rid of the unnecessary newline) - issue 61
parent
9128d841
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
45 additions
and
31 deletions
+45
-31
src/emitter.cpp
src/emitter.cpp
+25
-15
src/emitterstate.cpp
src/emitterstate.cpp
+1
-1
src/emitterstate.h
src/emitterstate.h
+8
-4
test/emittertests.cpp
test/emittertests.cpp
+11
-11
No files found.
src/emitter.cpp
View file @
1f9cc2d3
...
@@ -153,16 +153,19 @@ namespace YAML
...
@@ -153,16 +153,19 @@ namespace YAML
// document-level
// document-level
case
ES_WAITING_FOR_DOC
:
case
ES_WAITING_FOR_DOC
:
m_stream
<<
"---"
;
m_stream
<<
"---"
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
m_pState
->
SwitchState
(
ES_WRITING_DOC
);
m_pState
->
SwitchState
(
ES_WRITING_DOC
);
return
true
;
return
true
;
case
ES_WRITING_DOC
:
case
ES_WRITING_DOC
:
return
true
;
return
true
;
case
ES_DONE_WITH_DOC
:
m_pState
->
SetError
(
"Write called on finished document"
);
return
true
;
// block sequence
// block sequence
case
ES_WAITING_FOR_BLOCK_SEQ_ENTRY
:
case
ES_WAITING_FOR_BLOCK_SEQ_ENTRY
:
m_stream
<<
IndentTo
(
curIndent
)
<<
"-"
;
m_stream
<<
IndentTo
(
curIndent
)
<<
"-"
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
m_pState
->
SwitchState
(
ES_WRITING_BLOCK_SEQ_ENTRY
);
m_pState
->
SwitchState
(
ES_WRITING_BLOCK_SEQ_ENTRY
);
return
true
;
return
true
;
case
ES_WRITING_BLOCK_SEQ_ENTRY
:
case
ES_WRITING_BLOCK_SEQ_ENTRY
:
...
@@ -180,7 +183,7 @@ namespace YAML
...
@@ -180,7 +183,7 @@ namespace YAML
return
true
;
return
true
;
case
ES_DONE_WITH_FLOW_SEQ_ENTRY
:
case
ES_DONE_WITH_FLOW_SEQ_ENTRY
:
m_stream
<<
','
;
m_stream
<<
','
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
m_pState
->
SwitchState
(
ES_WAITING_FOR_FLOW_SEQ_ENTRY
);
m_pState
->
SwitchState
(
ES_WAITING_FOR_FLOW_SEQ_ENTRY
);
return
false
;
return
false
;
...
@@ -191,7 +194,7 @@ namespace YAML
...
@@ -191,7 +194,7 @@ namespace YAML
case
ES_WAITING_FOR_BLOCK_MAP_KEY
:
case
ES_WAITING_FOR_BLOCK_MAP_KEY
:
if
(
m_pState
->
CurrentlyInLongKey
())
{
if
(
m_pState
->
CurrentlyInLongKey
())
{
m_stream
<<
IndentTo
(
curIndent
)
<<
'?'
;
m_stream
<<
IndentTo
(
curIndent
)
<<
'?'
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
}
}
m_pState
->
SwitchState
(
ES_WRITING_BLOCK_MAP_KEY
);
m_pState
->
SwitchState
(
ES_WRITING_BLOCK_MAP_KEY
);
return
true
;
return
true
;
...
@@ -218,7 +221,7 @@ namespace YAML
...
@@ -218,7 +221,7 @@ namespace YAML
if
(
m_pState
->
CurrentlyInLongKey
())
{
if
(
m_pState
->
CurrentlyInLongKey
())
{
EmitSeparationIfNecessary
();
EmitSeparationIfNecessary
();
m_stream
<<
'?'
;
m_stream
<<
'?'
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
}
}
return
true
;
return
true
;
case
ES_WRITING_FLOW_MAP_KEY
:
case
ES_WRITING_FLOW_MAP_KEY
:
...
@@ -228,7 +231,7 @@ namespace YAML
...
@@ -228,7 +231,7 @@ namespace YAML
return
true
;
return
true
;
case
ES_WAITING_FOR_FLOW_MAP_VALUE
:
case
ES_WAITING_FOR_FLOW_MAP_VALUE
:
m_stream
<<
':'
;
m_stream
<<
':'
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
m_pState
->
SwitchState
(
ES_WRITING_FLOW_MAP_VALUE
);
m_pState
->
SwitchState
(
ES_WRITING_FLOW_MAP_VALUE
);
return
true
;
return
true
;
case
ES_WRITING_FLOW_MAP_VALUE
:
case
ES_WRITING_FLOW_MAP_VALUE
:
...
@@ -284,7 +287,7 @@ namespace YAML
...
@@ -284,7 +287,7 @@ namespace YAML
case
ES_WRITING_BLOCK_MAP_KEY
:
case
ES_WRITING_BLOCK_MAP_KEY
:
if
(
!
m_pState
->
CurrentlyInLongKey
())
{
if
(
!
m_pState
->
CurrentlyInLongKey
())
{
m_stream
<<
':'
;
m_stream
<<
':'
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
}
}
m_pState
->
SwitchState
(
ES_DONE_WITH_BLOCK_MAP_KEY
);
m_pState
->
SwitchState
(
ES_DONE_WITH_BLOCK_MAP_KEY
);
break
;
break
;
...
@@ -312,8 +315,10 @@ namespace YAML
...
@@ -312,8 +315,10 @@ namespace YAML
if
(
!
good
())
if
(
!
good
())
return
;
return
;
if
(
m_pState
->
RequiresSeparation
())
if
(
m_pState
->
RequiresS
oftS
eparation
())
m_stream
<<
' '
;
m_stream
<<
' '
;
else
if
(
m_pState
->
RequiresHardSeparation
())
m_stream
<<
'\n'
;
m_pState
->
UnsetSeparation
();
m_pState
->
UnsetSeparation
();
}
}
...
@@ -403,8 +408,10 @@ namespace YAML
...
@@ -403,8 +408,10 @@ namespace YAML
curState
==
ES_WRITING_BLOCK_MAP_KEY
||
curState
==
ES_WRITING_BLOCK_MAP_VALUE
||
curState
==
ES_WRITING_BLOCK_MAP_KEY
||
curState
==
ES_WRITING_BLOCK_MAP_VALUE
||
curState
==
ES_WRITING_DOC
curState
==
ES_WRITING_DOC
)
{
)
{
m_stream
<<
"
\n
"
;
if
(
m_pState
->
RequiresHardSeparation
()
||
curState
!=
ES_WRITING_BLOCK_SEQ_ENTRY
)
{
m_pState
->
UnsetSeparation
();
m_stream
<<
"
\n
"
;
m_pState
->
UnsetSeparation
();
}
}
}
m_pState
->
PushState
(
ES_WAITING_FOR_BLOCK_MAP_ENTRY
);
m_pState
->
PushState
(
ES_WAITING_FOR_BLOCK_MAP_ENTRY
);
}
else
if
(
flowType
==
Flow
)
{
}
else
if
(
flowType
==
Flow
)
{
...
@@ -469,11 +476,12 @@ namespace YAML
...
@@ -469,11 +476,12 @@ namespace YAML
m_stream
<<
'\n'
;
m_stream
<<
'\n'
;
unsigned
curIndent
=
m_pState
->
GetCurIndent
();
unsigned
curIndent
=
m_pState
->
GetCurIndent
();
m_stream
<<
IndentTo
(
curIndent
);
m_stream
<<
IndentTo
(
curIndent
);
m_pState
->
UnsetSeparation
();
m_pState
->
SwitchState
(
ES_WAITING_FOR_BLOCK_MAP_KEY
);
m_pState
->
SwitchState
(
ES_WAITING_FOR_BLOCK_MAP_KEY
);
}
else
if
(
flowType
==
FT_FLOW
)
{
}
else
if
(
flowType
==
FT_FLOW
)
{
if
(
curState
==
ES_DONE_WITH_FLOW_MAP_VALUE
)
{
if
(
curState
==
ES_DONE_WITH_FLOW_MAP_VALUE
)
{
m_stream
<<
','
;
m_stream
<<
','
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
}
}
m_pState
->
SwitchState
(
ES_WAITING_FOR_FLOW_MAP_KEY
);
m_pState
->
SwitchState
(
ES_WAITING_FOR_FLOW_MAP_KEY
);
}
else
}
else
...
@@ -503,7 +511,7 @@ namespace YAML
...
@@ -503,7 +511,7 @@ namespace YAML
m_stream
<<
'\n'
;
m_stream
<<
'\n'
;
m_stream
<<
IndentTo
(
m_pState
->
GetCurIndent
());
m_stream
<<
IndentTo
(
m_pState
->
GetCurIndent
());
m_stream
<<
':'
;
m_stream
<<
':'
;
m_pState
->
RequireSeparation
();
m_pState
->
RequireS
oftS
eparation
();
}
}
m_pState
->
SwitchState
(
ES_WAITING_FOR_BLOCK_MAP_VALUE
);
m_pState
->
SwitchState
(
ES_WAITING_FOR_BLOCK_MAP_VALUE
);
}
else
if
(
flowType
==
FT_FLOW
)
{
}
else
if
(
flowType
==
FT_FLOW
)
{
...
@@ -518,8 +526,10 @@ namespace YAML
...
@@ -518,8 +526,10 @@ namespace YAML
if
(
!
good
())
if
(
!
good
())
return
;
return
;
if
(
CanEmitNewline
())
if
(
CanEmitNewline
())
{
m_stream
<<
'\n'
;
m_stream
<<
'\n'
;
m_pState
->
UnsetSeparation
();
}
}
}
bool
Emitter
::
CanEmitNewline
()
const
bool
Emitter
::
CanEmitNewline
()
const
...
@@ -685,7 +695,7 @@ namespace YAML
...
@@ -685,7 +695,7 @@ namespace YAML
m_pState
->
SetError
(
ErrorMsg
::
INVALID_ANCHOR
);
m_pState
->
SetError
(
ErrorMsg
::
INVALID_ANCHOR
);
return
*
this
;
return
*
this
;
}
}
m_pState
->
RequireSeparation
();
m_pState
->
Require
Hard
Separation
();
// Note: no PostAtomicWrite() because we need another value for this node
// Note: no PostAtomicWrite() because we need another value for this node
return
*
this
;
return
*
this
;
}
}
...
@@ -711,7 +721,7 @@ namespace YAML
...
@@ -711,7 +721,7 @@ namespace YAML
return
*
this
;
return
*
this
;
}
}
m_pState
->
RequireSeparation
();
m_pState
->
Require
Hard
Separation
();
// Note: no PostAtomicWrite() because we need another value for this node
// Note: no PostAtomicWrite() because we need another value for this node
return
*
this
;
return
*
this
;
}
}
...
...
src/emitterstate.cpp
View file @
1f9cc2d3
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
namespace
YAML
namespace
YAML
{
{
EmitterState
::
EmitterState
()
:
m_isGood
(
true
),
m_curIndent
(
0
),
m_requiresSeparation
(
false
)
EmitterState
::
EmitterState
()
:
m_isGood
(
true
),
m_curIndent
(
0
),
m_requiresS
oftSeparation
(
false
),
m_requiresHardS
eparation
(
false
)
{
{
// start up
// start up
m_stateStack
.
push
(
ES_WAITING_FOR_DOC
);
m_stateStack
.
push
(
ES_WAITING_FOR_DOC
);
...
...
src/emitterstate.h
View file @
1f9cc2d3
...
@@ -103,9 +103,12 @@ namespace YAML
...
@@ -103,9 +103,12 @@ namespace YAML
void
StartLongKey
();
void
StartLongKey
();
void
StartSimpleKey
();
void
StartSimpleKey
();
bool
RequiresSeparation
()
const
{
return
m_requiresSeparation
;
}
bool
RequiresSoftSeparation
()
const
{
return
m_requiresSoftSeparation
;
}
void
RequireSeparation
()
{
m_requiresSeparation
=
true
;
}
bool
RequiresHardSeparation
()
const
{
return
m_requiresHardSeparation
;
}
void
UnsetSeparation
()
{
m_requiresSeparation
=
false
;
}
void
RequireSoftSeparation
()
{
m_requiresSoftSeparation
=
true
;
}
void
RequireHardSeparation
()
{
m_requiresSoftSeparation
=
true
;
m_requiresHardSeparation
=
true
;
}
void
ForceHardSeparation
()
{
m_requiresSoftSeparation
=
false
;
}
void
UnsetSeparation
()
{
m_requiresSoftSeparation
=
false
;
m_requiresHardSeparation
=
false
;
}
void
ClearModifiedSettings
();
void
ClearModifiedSettings
();
...
@@ -184,7 +187,8 @@ namespace YAML
...
@@ -184,7 +187,8 @@ namespace YAML
std
::
stack
<
Group
*>
m_groups
;
std
::
stack
<
Group
*>
m_groups
;
unsigned
m_curIndent
;
unsigned
m_curIndent
;
bool
m_requiresSeparation
;
bool
m_requiresSoftSeparation
;
bool
m_requiresHardSeparation
;
};
};
template
<
typename
T
>
template
<
typename
T
>
...
...
test/emittertests.cpp
View file @
1f9cc2d3
...
@@ -103,7 +103,7 @@ namespace Test
...
@@ -103,7 +103,7 @@ namespace Test
out
<<
"item 2"
;
out
<<
"item 2"
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
- item 1
\n
-
\n
pens: 8
\n
pencils: 14
\n
- item 2"
;
desiredOutput
=
"---
\n
- item 1
\n
- pens: 8
\n
pencils: 14
\n
- item 2"
;
}
}
void
NestedBlockMap
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
{
void
NestedBlockMap
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
{
...
@@ -451,7 +451,7 @@ namespace Test
...
@@ -451,7 +451,7 @@ namespace Test
out
<<
YAML
::
Value
<<
YAML
::
Alias
(
"id001"
);
out
<<
YAML
::
Value
<<
YAML
::
Alias
(
"id001"
);
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndMap
;
desiredOutput
=
"---
\n
receipt: Oz-Ware Purchase Invoice
\n
date: 2007-08-06
\n
customer:
\n
given: Dorothy
\n
family: Gale
\n
items:
\n
-
\n
part_no: A4786
\n
descrip: Water Bucket (Filled)
\n
price: 1.47
\n
quantity: 4
\n
-
\n
part_no: E1628
\n
descrip: High Heeled
\"
Ruby
\"
Slippers
\n
price: 100.27
\n
quantity: 1
\n
bill-to: &id001
\n
street: |
\n
123 Tornado Alley
\n
Suite 16
\n
city: East Westville
\n
state: KS
\n
ship-to: *id001"
;
desiredOutput
=
"---
\n
receipt: Oz-Ware Purchase Invoice
\n
date: 2007-08-06
\n
customer:
\n
given: Dorothy
\n
family: Gale
\n
items:
\n
- part_no: A4786
\n
descrip: Water Bucket (Filled)
\n
price: 1.47
\n
quantity: 4
\n
- part_no: E1628
\n
descrip: High Heeled
\"
Ruby
\"
Slippers
\n
price: 100.27
\n
quantity: 1
\n
bill-to: &id001
\n
street: |
\n
123 Tornado Alley
\n
Suite 16
\n
city: East Westville
\n
state: KS
\n
ship-to: *id001"
;
}
}
void
STLContainers
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
STLContainers
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -471,7 +471,7 @@ namespace Test
...
@@ -471,7 +471,7 @@ namespace Test
out
<<
ages
;
out
<<
ages
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
- [2, 3, 5, 7, 11, 13]
\n
-
\n
Daniel: 26
\n
Jesse: 24"
;
desiredOutput
=
"---
\n
- [2, 3, 5, 7, 11, 13]
\n
- Daniel: 26
\n
Jesse: 24"
;
}
}
void
SimpleComment
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
SimpleComment
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -514,7 +514,7 @@ namespace Test
...
@@ -514,7 +514,7 @@ namespace Test
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
-
\n
key 1: value 1
\n
key 2:
\n
- a
\n
- b
\n
- c"
;
desiredOutput
=
"---
\n
- key 1: value 1
\n
key 2:
\n
- a
\n
- b
\n
- c"
;
}
}
void
SimpleGlobalSettings
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
SimpleGlobalSettings
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -529,7 +529,7 @@ namespace Test
...
@@ -529,7 +529,7 @@ namespace Test
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
-
\n
? key 1
\n
: value 1
\n
? key 2
\n
: [a, b, c]"
;
desiredOutput
=
"---
\n
- ? key 1
\n
: value 1
\n
? key 2
\n
: [a, b, c]"
;
}
}
void
ComplexGlobalSettings
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
ComplexGlobalSettings
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -548,7 +548,7 @@ namespace Test
...
@@ -548,7 +548,7 @@ namespace Test
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
-
\n
key 1: value 1
\n
key 2: [a, b, c]
\n
-
\n
? [1, 2]
\n
:
\n
a: b"
;
desiredOutput
=
"---
\n
- key 1: value 1
\n
key 2: [a, b, c]
\n
- ? [1, 2]
\n
:
\n
a: b"
;
}
}
void
Null
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
Null
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -561,7 +561,7 @@ namespace Test
...
@@ -561,7 +561,7 @@ namespace Test
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
- ~
\n
-
\n
null value: ~
\n
~: null key"
;
desiredOutput
=
"---
\n
- ~
\n
- null value: ~
\n
~: null key"
;
}
}
void
EscapedUnicode
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
EscapedUnicode
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -606,7 +606,7 @@ namespace Test
...
@@ -606,7 +606,7 @@ namespace Test
out
<<
Foo
(
3
,
"goodbye"
);
out
<<
Foo
(
3
,
"goodbye"
);
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
-
\n
x: 5
\n
bar: hello
\n
-
\n
x: 3
\n
bar: goodbye"
;
desiredOutput
=
"---
\n
- x: 5
\n
bar: hello
\n
- x: 3
\n
bar: goodbye"
;
}
}
void
UserTypeInContainer
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
UserTypeInContainer
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -616,7 +616,7 @@ namespace Test
...
@@ -616,7 +616,7 @@ namespace Test
fv
.
push_back
(
Foo
(
3
,
"goodbye"
));
fv
.
push_back
(
Foo
(
3
,
"goodbye"
));
out
<<
fv
;
out
<<
fv
;
desiredOutput
=
"---
\n
-
\n
x: 5
\n
bar: hello
\n
-
\n
x: 3
\n
bar: goodbye"
;
desiredOutput
=
"---
\n
- x: 5
\n
bar: hello
\n
- x: 3
\n
bar: goodbye"
;
}
}
template
<
typename
T
>
template
<
typename
T
>
...
@@ -649,7 +649,7 @@ namespace Test
...
@@ -649,7 +649,7 @@ namespace Test
out
<<
bar
<<
baz
;
out
<<
bar
<<
baz
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
-
\n
x: 5
\n
bar: hello
\n
- ~"
;
desiredOutput
=
"---
\n
- x: 5
\n
bar: hello
\n
- ~"
;
}
}
void
NewlineAtEnd
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
NewlineAtEnd
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
@@ -706,7 +706,7 @@ namespace Test
...
@@ -706,7 +706,7 @@ namespace Test
out
<<
YAML
::
LongKey
<<
YAML
::
Key
<<
"f"
<<
YAML
::
Newline
<<
YAML
::
Value
<<
"foo"
;
out
<<
YAML
::
LongKey
<<
YAML
::
Key
<<
"f"
<<
YAML
::
Newline
<<
YAML
::
Value
<<
"foo"
;
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndMap
;
out
<<
YAML
::
EndSeq
;
out
<<
YAML
::
EndSeq
;
desiredOutput
=
"---
\n
- a
\n\n
-
\n
- b
\n
- c
\n\n\n
-
\n
\n
d: e
\n
? f
\n\n
: foo"
;
desiredOutput
=
"---
\n
- a
\n\n
-
\n
- b
\n
- c
\n\n\n
-
\n
d: e
\n
? f
\n\n
: foo"
;
}
}
void
Binary
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
void
Binary
(
YAML
::
Emitter
&
out
,
std
::
string
&
desiredOutput
)
...
...
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