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
chenpangpang
transformers
Commits
83a41d39
"...git@developer.sourcefind.cn:chenpangpang/transformers.git" did not exist on "fa2ccbc0817d6c0848555a8f44d475f13f49e26f"
Commit
83a41d39
authored
Jan 15, 2020
by
Julien Chaumond
Browse files
💄
super
parent
cd51893d
Changes
75
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
27 additions
and
27 deletions
+27
-27
templates/adding_a_new_model/modeling_tf_xxx.py
templates/adding_a_new_model/modeling_tf_xxx.py
+7
-7
templates/adding_a_new_model/modeling_xxx.py
templates/adding_a_new_model/modeling_xxx.py
+6
-6
templates/adding_a_new_model/tests/test_tokenization_xxx.py
templates/adding_a_new_model/tests/test_tokenization_xxx.py
+1
-1
templates/adding_a_new_model/tokenization_xxx.py
templates/adding_a_new_model/tokenization_xxx.py
+1
-1
tests/test_tokenization_albert.py
tests/test_tokenization_albert.py
+1
-1
tests/test_tokenization_bert.py
tests/test_tokenization_bert.py
+1
-1
tests/test_tokenization_bert_japanese.py
tests/test_tokenization_bert_japanese.py
+2
-2
tests/test_tokenization_ctrl.py
tests/test_tokenization_ctrl.py
+1
-1
tests/test_tokenization_gpt2.py
tests/test_tokenization_gpt2.py
+1
-1
tests/test_tokenization_openai.py
tests/test_tokenization_openai.py
+1
-1
tests/test_tokenization_roberta.py
tests/test_tokenization_roberta.py
+1
-1
tests/test_tokenization_t5.py
tests/test_tokenization_t5.py
+1
-1
tests/test_tokenization_transfo_xl.py
tests/test_tokenization_transfo_xl.py
+1
-1
tests/test_tokenization_xlm.py
tests/test_tokenization_xlm.py
+1
-1
tests/test_tokenization_xlnet.py
tests/test_tokenization_xlnet.py
+1
-1
No files found.
templates/adding_a_new_model/modeling_tf_xxx.py
View file @
83a41d39
...
@@ -69,7 +69,7 @@ TFXxxOutput = tf.keras.layers.Layer
...
@@ -69,7 +69,7 @@ TFXxxOutput = tf.keras.layers.Layer
class
TFXxxLayer
(
tf
.
keras
.
layers
.
Layer
):
class
TFXxxLayer
(
tf
.
keras
.
layers
.
Layer
):
def
__init__
(
self
,
config
,
**
kwargs
):
def
__init__
(
self
,
config
,
**
kwargs
):
super
(
TFXxxLayer
,
self
).
__init__
(
**
kwargs
)
super
().
__init__
(
**
kwargs
)
self
.
attention
=
TFXxxAttention
(
config
,
name
=
"attention"
)
self
.
attention
=
TFXxxAttention
(
config
,
name
=
"attention"
)
self
.
intermediate
=
TFXxxIntermediate
(
config
,
name
=
"intermediate"
)
self
.
intermediate
=
TFXxxIntermediate
(
config
,
name
=
"intermediate"
)
self
.
transformer_output
=
TFXxxOutput
(
config
,
name
=
"output"
)
self
.
transformer_output
=
TFXxxOutput
(
config
,
name
=
"output"
)
...
@@ -91,7 +91,7 @@ class TFXxxLayer(tf.keras.layers.Layer):
...
@@ -91,7 +91,7 @@ class TFXxxLayer(tf.keras.layers.Layer):
####################################################
####################################################
class
TFXxxMainLayer
(
tf
.
keras
.
layers
.
Layer
):
class
TFXxxMainLayer
(
tf
.
keras
.
layers
.
Layer
):
def
__init__
(
self
,
config
,
**
kwargs
):
def
__init__
(
self
,
config
,
**
kwargs
):
super
(
TFXxxMainLayer
,
self
).
__init__
(
**
kwargs
)
super
().
__init__
(
**
kwargs
)
def
_resize_token_embeddings
(
self
,
new_num_tokens
):
def
_resize_token_embeddings
(
self
,
new_num_tokens
):
raise
NotImplementedError
# Not implemented yet in the library fr TF 2.0 models
raise
NotImplementedError
# Not implemented yet in the library fr TF 2.0 models
...
@@ -307,7 +307,7 @@ class TFXxxModel(TFXxxPreTrainedModel):
...
@@ -307,7 +307,7 @@ class TFXxxModel(TFXxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
super
(
TFXxxModel
,
self
).
__init__
(
config
,
*
inputs
,
**
kwargs
)
super
().
__init__
(
config
,
*
inputs
,
**
kwargs
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
def
call
(
self
,
inputs
,
**
kwargs
):
def
call
(
self
,
inputs
,
**
kwargs
):
...
@@ -348,7 +348,7 @@ class TFXxxForMaskedLM(TFXxxPreTrainedModel):
...
@@ -348,7 +348,7 @@ class TFXxxForMaskedLM(TFXxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
super
(
TFXxxForMaskedLM
,
self
).
__init__
(
config
,
*
inputs
,
**
kwargs
)
super
().
__init__
(
config
,
*
inputs
,
**
kwargs
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
self
.
mlm
=
TFXxxMLMHead
(
config
,
self
.
transformer
.
embeddings
,
name
=
"mlm"
)
self
.
mlm
=
TFXxxMLMHead
(
config
,
self
.
transformer
.
embeddings
,
name
=
"mlm"
)
...
@@ -397,7 +397,7 @@ class TFXxxForSequenceClassification(TFXxxPreTrainedModel):
...
@@ -397,7 +397,7 @@ class TFXxxForSequenceClassification(TFXxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
super
(
TFXxxForSequenceClassification
,
self
).
__init__
(
config
,
*
inputs
,
**
kwargs
)
super
().
__init__
(
config
,
*
inputs
,
**
kwargs
)
self
.
num_labels
=
config
.
num_labels
self
.
num_labels
=
config
.
num_labels
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
...
@@ -452,7 +452,7 @@ class TFXxxForTokenClassification(TFXxxPreTrainedModel):
...
@@ -452,7 +452,7 @@ class TFXxxForTokenClassification(TFXxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
super
(
TFXxxForTokenClassification
,
self
).
__init__
(
config
,
*
inputs
,
**
kwargs
)
super
().
__init__
(
config
,
*
inputs
,
**
kwargs
)
self
.
num_labels
=
config
.
num_labels
self
.
num_labels
=
config
.
num_labels
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
...
@@ -509,7 +509,7 @@ class TFXxxForQuestionAnswering(TFXxxPreTrainedModel):
...
@@ -509,7 +509,7 @@ class TFXxxForQuestionAnswering(TFXxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
def
__init__
(
self
,
config
,
*
inputs
,
**
kwargs
):
super
(
TFXxxForQuestionAnswering
,
self
).
__init__
(
config
,
*
inputs
,
**
kwargs
)
super
().
__init__
(
config
,
*
inputs
,
**
kwargs
)
self
.
num_labels
=
config
.
num_labels
self
.
num_labels
=
config
.
num_labels
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
self
.
transformer
=
TFXxxMainLayer
(
config
,
name
=
"transformer"
)
...
...
templates/adding_a_new_model/modeling_xxx.py
View file @
83a41d39
...
@@ -138,7 +138,7 @@ XxxOutput = nn.Module
...
@@ -138,7 +138,7 @@ XxxOutput = nn.Module
class
XxxLayer
(
nn
.
Module
):
class
XxxLayer
(
nn
.
Module
):
def
__init__
(
self
,
config
):
def
__init__
(
self
,
config
):
super
(
XxxLayer
,
self
).
__init__
()
super
().
__init__
()
self
.
attention
=
XxxAttention
(
config
)
self
.
attention
=
XxxAttention
(
config
)
self
.
intermediate
=
XxxIntermediate
(
config
)
self
.
intermediate
=
XxxIntermediate
(
config
)
self
.
output
=
XxxOutput
(
config
)
self
.
output
=
XxxOutput
(
config
)
...
@@ -298,7 +298,7 @@ class XxxModel(XxxPreTrainedModel):
...
@@ -298,7 +298,7 @@ class XxxModel(XxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
):
def
__init__
(
self
,
config
):
super
(
XxxModel
,
self
).
__init__
(
config
)
super
().
__init__
(
config
)
self
.
embeddings
=
XxxEmbeddings
(
config
)
self
.
embeddings
=
XxxEmbeddings
(
config
)
self
.
encoder
=
XxxEncoder
(
config
)
self
.
encoder
=
XxxEncoder
(
config
)
...
@@ -426,7 +426,7 @@ class XxxForMaskedLM(XxxPreTrainedModel):
...
@@ -426,7 +426,7 @@ class XxxForMaskedLM(XxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
):
def
__init__
(
self
,
config
):
super
(
XxxForMaskedLM
,
self
).
__init__
(
config
)
super
().
__init__
(
config
)
self
.
transformer
=
XxxModel
(
config
)
self
.
transformer
=
XxxModel
(
config
)
self
.
lm_head
=
nn
.
Linear
(
config
.
n_embd
,
config
.
vocab_size
)
self
.
lm_head
=
nn
.
Linear
(
config
.
n_embd
,
config
.
vocab_size
)
...
@@ -507,7 +507,7 @@ class XxxForSequenceClassification(XxxPreTrainedModel):
...
@@ -507,7 +507,7 @@ class XxxForSequenceClassification(XxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
):
def
__init__
(
self
,
config
):
super
(
XxxForSequenceClassification
,
self
).
__init__
(
config
)
super
().
__init__
(
config
)
self
.
num_labels
=
config
.
num_labels
self
.
num_labels
=
config
.
num_labels
self
.
transformer
=
XxxModel
(
config
)
self
.
transformer
=
XxxModel
(
config
)
...
@@ -593,7 +593,7 @@ class XxxForTokenClassification(XxxPreTrainedModel):
...
@@ -593,7 +593,7 @@ class XxxForTokenClassification(XxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
):
def
__init__
(
self
,
config
):
super
(
XxxForTokenClassification
,
self
).
__init__
(
config
)
super
().
__init__
(
config
)
self
.
num_labels
=
config
.
num_labels
self
.
num_labels
=
config
.
num_labels
self
.
transformer
=
XxxModel
(
config
)
self
.
transformer
=
XxxModel
(
config
)
...
@@ -692,7 +692,7 @@ class XxxForQuestionAnswering(XxxPreTrainedModel):
...
@@ -692,7 +692,7 @@ class XxxForQuestionAnswering(XxxPreTrainedModel):
"""
"""
def
__init__
(
self
,
config
):
def
__init__
(
self
,
config
):
super
(
XxxForQuestionAnswering
,
self
).
__init__
(
config
)
super
().
__init__
(
config
)
self
.
num_labels
=
config
.
num_labels
self
.
num_labels
=
config
.
num_labels
self
.
transformer
=
XxxModel
(
config
)
self
.
transformer
=
XxxModel
(
config
)
...
...
templates/adding_a_new_model/tests/test_tokenization_xxx.py
View file @
83a41d39
...
@@ -27,7 +27,7 @@ class XxxTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -27,7 +27,7 @@ class XxxTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
XxxTokenizer
tokenizer_class
=
XxxTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
XxxTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
vocab_tokens
=
[
vocab_tokens
=
[
"[UNK]"
,
"[UNK]"
,
...
...
templates/adding_a_new_model/tokenization_xxx.py
View file @
83a41d39
...
@@ -109,7 +109,7 @@ class XxxTokenizer(PreTrainedTokenizer):
...
@@ -109,7 +109,7 @@ class XxxTokenizer(PreTrainedTokenizer):
Whether to lower case the input
Whether to lower case the input
Only has an effect when do_basic_tokenize=True
Only has an effect when do_basic_tokenize=True
"""
"""
super
(
XxxTokenizer
,
self
).
__init__
(
super
().
__init__
(
unk_token
=
unk_token
,
unk_token
=
unk_token
,
sep_token
=
sep_token
,
sep_token
=
sep_token
,
pad_token
=
pad_token
,
pad_token
=
pad_token
,
...
...
tests/test_tokenization_albert.py
View file @
83a41d39
...
@@ -30,7 +30,7 @@ class AlbertTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -30,7 +30,7 @@ class AlbertTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
AlbertTokenizer
tokenizer_class
=
AlbertTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
AlbertTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# We have a SentencePiece fixture for testing
# We have a SentencePiece fixture for testing
tokenizer
=
AlbertTokenizer
(
SAMPLE_VOCAB
)
tokenizer
=
AlbertTokenizer
(
SAMPLE_VOCAB
)
...
...
tests/test_tokenization_bert.py
View file @
83a41d39
...
@@ -38,7 +38,7 @@ class BertTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -38,7 +38,7 @@ class BertTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
test_rust_tokenizer
=
True
test_rust_tokenizer
=
True
def
setUp
(
self
):
def
setUp
(
self
):
super
(
BertTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
vocab_tokens
=
[
vocab_tokens
=
[
"[UNK]"
,
"[UNK]"
,
...
...
tests/test_tokenization_bert_japanese.py
View file @
83a41d39
...
@@ -35,7 +35,7 @@ class BertJapaneseTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -35,7 +35,7 @@ class BertJapaneseTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
BertJapaneseTokenizer
tokenizer_class
=
BertJapaneseTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
BertJapaneseTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
vocab_tokens
=
[
vocab_tokens
=
[
"[UNK]"
,
"[UNK]"
,
...
@@ -135,7 +135,7 @@ class BertJapaneseCharacterTokenizationTest(TokenizerTesterMixin, unittest.TestC
...
@@ -135,7 +135,7 @@ class BertJapaneseCharacterTokenizationTest(TokenizerTesterMixin, unittest.TestC
tokenizer_class
=
BertJapaneseTokenizer
tokenizer_class
=
BertJapaneseTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
BertJapaneseCharacterTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
vocab_tokens
=
[
"[UNK]"
,
"[CLS]"
,
"[SEP]"
,
"こ"
,
"ん"
,
"に"
,
"ち"
,
"は"
,
"ば"
,
"世"
,
"界"
,
"、"
,
"。"
]
vocab_tokens
=
[
"[UNK]"
,
"[CLS]"
,
"[SEP]"
,
"こ"
,
"ん"
,
"に"
,
"ち"
,
"は"
,
"ば"
,
"世"
,
"界"
,
"、"
,
"。"
]
...
...
tests/test_tokenization_ctrl.py
View file @
83a41d39
...
@@ -27,7 +27,7 @@ class CTRLTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -27,7 +27,7 @@ class CTRLTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
CTRLTokenizer
tokenizer_class
=
CTRLTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
CTRLTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
vocab
=
[
"adapt"
,
"re@@"
,
"a@@"
,
"apt"
,
"c@@"
,
"t"
,
"<unk>"
]
vocab
=
[
"adapt"
,
"re@@"
,
"a@@"
,
"apt"
,
"c@@"
,
"t"
,
"<unk>"
]
...
...
tests/test_tokenization_gpt2.py
View file @
83a41d39
...
@@ -29,7 +29,7 @@ class GPT2TokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -29,7 +29,7 @@ class GPT2TokenizationTest(TokenizerTesterMixin, unittest.TestCase):
test_rust_tokenizer
=
True
test_rust_tokenizer
=
True
def
setUp
(
self
):
def
setUp
(
self
):
super
(
GPT2TokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
vocab
=
[
vocab
=
[
...
...
tests/test_tokenization_openai.py
View file @
83a41d39
...
@@ -28,7 +28,7 @@ class OpenAIGPTTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -28,7 +28,7 @@ class OpenAIGPTTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
OpenAIGPTTokenizer
tokenizer_class
=
OpenAIGPTTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
OpenAIGPTTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
vocab
=
[
vocab
=
[
...
...
tests/test_tokenization_roberta.py
View file @
83a41d39
...
@@ -28,7 +28,7 @@ class RobertaTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -28,7 +28,7 @@ class RobertaTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
RobertaTokenizer
tokenizer_class
=
RobertaTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
RobertaTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
vocab
=
[
vocab
=
[
...
...
tests/test_tokenization_t5.py
View file @
83a41d39
...
@@ -31,7 +31,7 @@ class T5TokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -31,7 +31,7 @@ class T5TokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
T5Tokenizer
tokenizer_class
=
T5Tokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
T5TokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# We have a SentencePiece fixture for testing
# We have a SentencePiece fixture for testing
tokenizer
=
T5Tokenizer
(
SAMPLE_VOCAB
)
tokenizer
=
T5Tokenizer
(
SAMPLE_VOCAB
)
...
...
tests/test_tokenization_transfo_xl.py
View file @
83a41d39
...
@@ -33,7 +33,7 @@ class TransfoXLTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -33,7 +33,7 @@ class TransfoXLTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
TransfoXLTokenizer
if
is_torch_available
()
else
None
tokenizer_class
=
TransfoXLTokenizer
if
is_torch_available
()
else
None
def
setUp
(
self
):
def
setUp
(
self
):
super
(
TransfoXLTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
vocab_tokens
=
[
vocab_tokens
=
[
"<unk>"
,
"<unk>"
,
...
...
tests/test_tokenization_xlm.py
View file @
83a41d39
...
@@ -29,7 +29,7 @@ class XLMTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -29,7 +29,7 @@ class XLMTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
XLMTokenizer
tokenizer_class
=
XLMTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
XLMTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
# Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
vocab
=
[
vocab
=
[
...
...
tests/test_tokenization_xlnet.py
View file @
83a41d39
...
@@ -31,7 +31,7 @@ class XLNetTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
...
@@ -31,7 +31,7 @@ class XLNetTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
tokenizer_class
=
XLNetTokenizer
tokenizer_class
=
XLNetTokenizer
def
setUp
(
self
):
def
setUp
(
self
):
super
(
XLNetTokenizationTest
,
self
).
setUp
()
super
().
setUp
()
# We have a SentencePiece fixture for testing
# We have a SentencePiece fixture for testing
tokenizer
=
XLNetTokenizer
(
SAMPLE_VOCAB
,
keep_accents
=
True
)
tokenizer
=
XLNetTokenizer
(
SAMPLE_VOCAB
,
keep_accents
=
True
)
...
...
Prev
1
2
3
4
Next
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