Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
node-sass
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
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
楚学文
node-sass
Commits
5e1d4feb
Commit
5e1d4feb
authored
Apr 25, 2012
by
Aaron Leung
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #12 from larsimmisch/master
Remove signed/unsigned warnings
parents
106c682b
b1c20103
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
56 additions
and
64 deletions
+56
-64
context.cpp
context.cpp
+2
-4
context.hpp
context.hpp
+3
-3
eval_apply.cpp
eval_apply.cpp
+10
-11
functions.hpp
functions.hpp
+1
-1
node.cpp
node.cpp
+34
-35
node.hpp
node.hpp
+2
-3
node_comparisons.cpp
node_comparisons.cpp
+2
-3
sass_interface.cpp
sass_interface.cpp
+2
-4
No files found.
context.cpp
View file @
5e1d4feb
...
...
@@ -52,8 +52,7 @@ namespace Sass {
Context
::~
Context
()
{
int
i
;
for
(
i
=
0
;
i
<
source_refs
.
size
();
++
i
)
{
for
(
size_t
i
=
0
;
i
<
source_refs
.
size
();
++
i
)
{
delete
[]
source_refs
[
i
];
}
// cerr << "Deallocated " << i << " source string(s)." << endl;
...
...
@@ -117,4 +116,4 @@ namespace Sass {
register_function
(
not_descriptor
,
not_impl
);
}
}
\ No newline at end of file
}
context.hpp
View file @
5e1d4feb
...
...
@@ -40,14 +40,14 @@ namespace Sass {
};
struct
Context
{
string
sass_path
;
string
css_path
;
vector
<
string
>
include_paths
;
Environment
global_env
;
map
<
pair
<
string
,
size_t
>
,
Function
>
function_env
;
vector
<
char
*>
source_refs
;
// all the source c-strings
vector
<
vector
<
Node
>*>
registry
;
// all the child vectors
vector
<
string
>
include_paths
;
size_t
ref_count
;
string
sass_path
;
string
css_path
;
void
collect_include_paths
(
const
char
*
paths_str
);
Context
(
const
char
*
paths_str
=
0
);
...
...
eval_apply.cpp
View file @
5e1d4feb
...
...
@@ -45,7 +45,7 @@ namespace Sass {
}
break
;
case
Node
:
:
root
:
{
for
(
in
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
eval
(
expr
[
i
],
env
,
f_env
,
registry
);
}
return
expr
;
...
...
@@ -54,7 +54,7 @@ namespace Sass {
case
Node
:
:
block
:
{
Environment
current
;
current
.
link
(
env
);
for
(
in
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
eval
(
expr
[
i
],
current
,
f_env
,
registry
);
}
return
expr
;
...
...
@@ -63,7 +63,7 @@ namespace Sass {
case
Node
:
:
assignment
:
{
Node
val
(
expr
[
1
]);
if
(
val
.
type
==
Node
::
comma_list
||
val
.
type
==
Node
::
space_list
)
{
for
(
in
t
i
=
0
;
i
<
val
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
val
.
size
();
++
i
)
{
if
(
val
[
i
].
eval_me
)
val
[
i
]
=
eval
(
val
[
i
],
env
,
f_env
,
registry
);
}
}
...
...
@@ -83,7 +83,7 @@ namespace Sass {
case
Node
:
:
rule
:
{
Node
rhs
(
expr
[
1
]);
if
(
rhs
.
type
==
Node
::
comma_list
||
rhs
.
type
==
Node
::
space_list
)
{
for
(
in
t
i
=
0
;
i
<
rhs
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
rhs
.
size
();
++
i
)
{
if
(
rhs
[
i
].
eval_me
)
rhs
[
i
]
=
eval
(
rhs
[
i
],
env
,
f_env
,
registry
);
}
}
...
...
@@ -104,7 +104,7 @@ namespace Sass {
case
Node
:
:
disjunction
:
{
Node
result
;
for
(
in
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
// if (expr[i].type == Node::relation ||
// expr[i].type == Node::function_call && expr[0].content.token.to_string() == "not") {
result
=
eval
(
expr
[
i
],
env
,
f_env
,
registry
);
...
...
@@ -116,7 +116,7 @@ namespace Sass {
case
Node
:
:
conjunction
:
{
Node
result
;
for
(
in
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
expr
.
size
();
++
i
)
{
result
=
eval
(
expr
[
i
],
env
,
f_env
,
registry
);
if
(
result
.
type
==
Node
::
boolean
&&
result
.
content
.
boolean_value
==
false
)
return
result
;
}
...
...
@@ -367,13 +367,13 @@ namespace Sass {
Node
body
(
mixin
[
2
].
clone
(
registry
));
Environment
bindings
;
// bind arguments
for
(
in
t
i
=
0
,
j
=
0
;
i
<
args
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
,
j
=
0
;
i
<
args
.
size
();
++
i
)
{
if
(
args
[
i
].
type
==
Node
::
assignment
)
{
Node
arg
(
args
[
i
]);
Token
name
(
arg
[
0
].
content
.
token
);
// check that the keyword arg actually names a formal parameter
bool
valid_param
=
false
;
for
(
in
t
k
=
0
;
k
<
params
.
size
();
++
k
)
{
for
(
size_
t
k
=
0
;
k
<
params
.
size
();
++
k
)
{
Node
param_k
=
params
[
k
];
if
(
param_k
.
type
==
Node
::
assignment
)
param_k
=
param_k
[
0
];
if
(
arg
[
0
]
==
param_k
)
{
...
...
@@ -421,7 +421,7 @@ namespace Sass {
{
map
<
Token
,
Node
>
bindings
;
// bind arguments
for
(
in
t
i
=
0
,
j
=
0
;
i
<
args
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
,
j
=
0
;
i
<
args
.
size
();
++
i
)
{
if
(
args
[
i
].
type
==
Node
::
assignment
)
{
Node
arg
(
args
[
i
]);
Token
name
(
arg
[
0
].
content
.
token
);
...
...
@@ -436,4 +436,4 @@ namespace Sass {
return
f
(
bindings
,
registry
);
}
}
\ No newline at end of file
}
functions.hpp
View file @
5e1d4feb
...
...
@@ -30,7 +30,7 @@ namespace Sass {
while
(
d
[
len
+
1
])
++
len
;
parameters
.
reserve
(
len
);
for
(
in
t
i
=
0
;
i
<
len
;
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
len
;
++
i
)
{
const
char
*
p
=
d
[
i
+
1
];
Token
name
(
Token
::
make
(
p
,
p
+
std
::
strlen
(
p
)));
parameters
.
push_back
(
name
);
...
...
node.cpp
View file @
5e1d4feb
...
...
@@ -23,7 +23,7 @@ namespace Sass {
n
.
content
.
children
=
new
vector
<
Node
>
;
++
allocations
;
n
.
content
.
children
->
reserve
(
size
());
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
n
<<
at
(
i
).
clone
(
registry
);
}
registry
.
push_back
(
n
.
content
.
children
);
...
...
@@ -37,7 +37,7 @@ namespace Sass {
{
case
selector_group
:
{
// really only needed for arg to :not
string
result
(
at
(
0
).
to_string
(
""
));
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
result
+=
", "
;
result
+=
at
(
i
).
to_string
(
""
);
}
...
...
@@ -63,7 +63,7 @@ namespace Sass {
Node
::
Type
t
=
at
(
0
).
type
;
result
+=
at
(
0
).
to_string
(
at
(
0
).
has_backref
?
prefix
:
""
);
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
Node
::
Type
t
=
at
(
i
).
type
;
result
+=
" "
;
result
+=
at
(
i
).
to_string
(
at
(
i
).
has_backref
?
prefix
:
""
);
...
...
@@ -86,7 +86,7 @@ namespace Sass {
result
+=
prefix
;
result
+=
" "
;
}
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
Node
::
Type
t
=
at
(
i
).
type
;
result
+=
at
(
i
).
to_string
(
t
==
backref
?
prefix
:
""
);
}
...
...
@@ -114,7 +114,7 @@ namespace Sass {
string
result
(
prefix
);
if
(
!
prefix
.
empty
())
result
+=
" "
;
result
+=
at
(
0
).
to_string
(
""
);
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
result
+=
at
(
i
).
to_string
(
""
);
}
result
+=
')'
;
...
...
@@ -125,7 +125,7 @@ namespace Sass {
string
result
(
prefix
);
if
(
!
prefix
.
empty
())
result
+=
" "
;
result
+=
"["
;
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
result
+=
at
(
i
).
to_string
(
prefix
);
}
result
+=
']'
;
return
result
;
...
...
@@ -137,7 +137,7 @@ namespace Sass {
case
comma_list
:
{
string
result
(
at
(
0
).
to_string
(
prefix
));
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
if
(
at
(
i
).
type
==
nil
)
continue
;
result
+=
", "
;
result
+=
at
(
i
).
to_string
(
prefix
);
...
...
@@ -147,7 +147,7 @@ namespace Sass {
case
space_list
:
{
string
result
(
at
(
0
).
to_string
(
prefix
));
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
if
(
at
(
i
).
type
==
nil
)
continue
;
result
+=
" "
;
result
+=
at
(
i
).
to_string
(
prefix
);
...
...
@@ -158,7 +158,7 @@ namespace Sass {
case
expression
:
case
term
:
{
string
result
(
at
(
0
).
to_string
(
prefix
));
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
if
(
!
(
at
(
i
).
type
==
add
||
// at(i).type == sub || // another edge case -- consider uncommenting
at
(
i
).
type
==
mul
))
{
...
...
@@ -199,7 +199,7 @@ namespace Sass {
stringstream
ss
;
if
(
size
()
>
0
)
{
ss
<<
at
(
0
).
to_string
(
""
);
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
ss
<<
", "
;
ss
<<
at
(
i
).
to_string
(
""
);
}
...
...
@@ -269,7 +269,7 @@ namespace Sass {
{
stringstream
ss
;
ss
<<
'#'
<<
std
::
setw
(
2
)
<<
std
::
setfill
(
'0'
)
<<
std
::
hex
;
for
(
in
t
i
=
0
;
i
<
3
;
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
3
;
++
i
)
{
double
x
=
at
(
i
).
content
.
numeric_value
;
if
(
x
>
0xff
)
x
=
0xff
;
else
if
(
x
<
0
)
x
=
0
;
...
...
@@ -281,7 +281,7 @@ namespace Sass {
else
{
stringstream
ss
;
ss
<<
"rgba("
<<
static_cast
<
unsigned
long
>
(
at
(
0
).
content
.
numeric_value
);
for
(
in
t
i
=
1
;
i
<
3
;
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
3
;
++
i
)
{
ss
<<
", "
<<
static_cast
<
unsigned
long
>
(
at
(
i
).
content
.
numeric_value
);
}
ss
<<
", "
<<
at
(
3
).
content
.
numeric_value
<<
')'
;
...
...
@@ -321,13 +321,13 @@ namespace Sass {
case
value_schema
:
{
string
result
;
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
result
+=
at
(
i
).
to_string
(
""
);
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
result
+=
at
(
i
).
to_string
(
""
);
return
result
;
}
break
;
case
string_schema
:
{
string
result
;
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
result
+=
at
(
i
).
to_string
(
""
);
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
result
+=
at
(
i
).
to_string
(
""
);
return
result
;
}
break
;
...
...
@@ -352,13 +352,13 @@ namespace Sass {
break
;
case
selector_group
:
at
(
0
).
echo
(
buf
,
depth
);
for
(
in
t
i
=
1
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
size
();
++
i
)
{
buf
<<
", "
;
at
(
i
).
echo
(
buf
,
depth
);
}
break
;
case
selector
:
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
at
(
i
).
echo
(
buf
,
depth
);
}
break
;
...
...
@@ -367,7 +367,7 @@ namespace Sass {
else
buf
<<
' '
<<
string
(
content
.
token
)
<<
' '
;
break
;
case
simple_selector_sequence
:
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
buf
<<
at
(
i
).
to_string
(
string
());
}
break
;
...
...
@@ -376,7 +376,7 @@ namespace Sass {
break
;
case
block
:
buf
<<
" {"
<<
endl
;
for
(
in
t
i
=
0
;
i
<
size
();
at
(
i
++
).
echo
(
buf
,
depth
+
1
))
;
for
(
size_
t
i
=
0
;
i
<
size
();
at
(
i
++
).
echo
(
buf
,
depth
+
1
))
;
buf
<<
indentation
<<
"}"
<<
endl
;
break
;
case
rule
:
...
...
@@ -390,7 +390,7 @@ namespace Sass {
buf
<<
string
(
content
.
token
);
break
;
case
values
:
for
(
in
t
i
=
0
;
i
<
size
();
at
(
i
++
).
echo
(
buf
,
depth
))
;
for
(
size_
t
i
=
0
;
i
<
size
();
at
(
i
++
).
echo
(
buf
,
depth
))
;
break
;
case
value
:
buf
<<
' '
<<
string
(
content
.
token
);
...
...
@@ -408,7 +408,7 @@ namespace Sass {
if
(
at
(
0
).
has_expansions
)
{
flatten
();
}
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
at
(
i
).
emit_nested_css
(
buf
,
depth
,
prefixes
);
if
(
at
(
i
).
type
==
css_import
)
buf
<<
endl
;
}
...
...
@@ -421,14 +421,14 @@ namespace Sass {
vector
<
string
>
new_prefixes
;
if
(
prefixes
.
empty
())
{
new_prefixes
.
reserve
(
sel_group_size
);
for
(
in
t
i
=
0
;
i
<
sel_group_size
;
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
sel_group_size
;
++
i
)
{
new_prefixes
.
push_back
(
sel_group_size
>
1
?
sel_group
[
i
].
to_string
(
string
())
:
sel_group
.
to_string
(
string
()));
}
}
else
{
new_prefixes
.
reserve
(
prefixes
.
size
()
*
sel_group_size
);
for
(
in
t
i
=
0
;
i
<
prefixes
.
size
();
++
i
)
{
for
(
in
t
j
=
0
;
j
<
sel_group_size
;
++
j
)
{
for
(
size_
t
i
=
0
;
i
<
prefixes
.
size
();
++
i
)
{
for
(
size_
t
j
=
0
;
j
<
sel_group_size
;
++
j
)
{
new_prefixes
.
push_back
(
sel_group_size
>
1
?
sel_group
[
j
].
to_string
(
prefixes
[
i
])
:
sel_group
.
to_string
(
prefixes
[
i
]));
}
}
...
...
@@ -437,11 +437,11 @@ namespace Sass {
if
(
block
[
0
].
has_expansions
)
block
.
flatten
();
if
(
block
[
0
].
has_statements
)
{
buf
<<
string
(
2
*
depth
,
' '
)
<<
new_prefixes
[
0
];
for
(
in
t
i
=
1
;
i
<
new_prefixes
.
size
();
++
i
)
{
for
(
size_
t
i
=
1
;
i
<
new_prefixes
.
size
();
++
i
)
{
buf
<<
", "
<<
new_prefixes
[
i
];
}
buf
<<
" {"
;
for
(
in
t
i
=
0
;
i
<
block
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
block
.
size
();
++
i
)
{
Type
stm_type
=
block
[
i
].
type
;
if
(
stm_type
==
comment
||
stm_type
==
rule
||
stm_type
==
css_import
||
stm_type
==
propset
)
{
block
[
i
].
emit_nested_css
(
buf
,
depth
+
1
);
// NEED OVERLOADED VERSION FOR COMMENTS AND RULES
...
...
@@ -454,7 +454,7 @@ namespace Sass {
++
depth
;
// if we printed content at this level, we need to indent any nested rulesets
}
if
(
block
[
0
].
has_blocks
)
{
for
(
in
t
i
=
0
;
i
<
block
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
block
.
size
();
++
i
)
{
if
(
block
[
i
].
type
==
ruleset
)
{
block
[
i
].
emit_nested_css
(
buf
,
depth
,
new_prefixes
);
}
...
...
@@ -496,7 +496,7 @@ namespace Sass {
break
;
case
values
:
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
buf
<<
" "
<<
string
(
at
(
i
).
content
.
token
);
}
break
;
...
...
@@ -527,7 +527,7 @@ namespace Sass {
has_prefix
=
true
;
}
Node
rules
(
at
(
1
));
for
(
in
t
i
=
0
;
i
<
rules
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
rules
.
size
();
++
i
)
{
if
(
rules
[
i
].
type
==
propset
)
{
rules
[
i
].
emit_propset
(
buf
,
depth
+
1
,
new_prefix
);
}
...
...
@@ -556,7 +556,7 @@ namespace Sass {
// buf << string(token) << ":";
// break;
// case values:
// for (
in
t i = 0; i < children.size(); ++i) {
// for (
size_
t i = 0; i < children.size(); ++i) {
// buf << " " << string(children[i].token);
// }
// break;
...
...
@@ -569,11 +569,11 @@ namespace Sass {
// case clauses:
// if (children.size() > 0) {
// buf << " {" << endl;
// for (
in
t i = 0; i < children.size(); ++i)
// for (
size_
t i = 0; i < children.size(); ++i)
// children[i].emit_expanded_css(buf, prefix);
// buf << "}" << endl;
// }
// for (
in
t i = 0; i < opt_children.size(); ++i)
// for (
size_
t i = 0; i < opt_children.size(); ++i)
// opt_children[i].emit_expanded_css(buf, prefix);
// break;
// case ruleset:
...
...
@@ -593,7 +593,7 @@ namespace Sass {
void
Node
::
flatten
()
{
if
(
type
!=
block
&&
type
!=
expansion
&&
type
!=
root
)
return
;
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
if
(
at
(
i
).
type
==
expansion
)
{
Node
expn
=
at
(
i
);
if
(
expn
[
0
].
has_expansions
)
expn
.
flatten
();
...
...
@@ -611,7 +611,7 @@ namespace Sass {
// void flatten_block(Node& block)
// {
//
// for (
in
t i = 0; i < block.size(); ++i) {
// for (
size_
t i = 0; i < block.size(); ++i) {
//
// if (block[i].type == Node::expansion
//
...
...
@@ -621,4 +621,4 @@ namespace Sass {
//
// }
}
\ No newline at end of file
}
node.hpp
View file @
5e1d4feb
...
...
@@ -190,7 +190,7 @@ namespace Sass {
Node
&
operator
+=
(
const
Node
&
n
)
{
for
(
in
t
i
=
0
;
i
<
n
.
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
n
.
size
();
++
i
)
{
content
.
children
->
push_back
(
n
[
i
]);
}
return
*
this
;
...
...
@@ -278,4 +278,4 @@ namespace Sass {
~
Node
()
{
++
destructed
;
}
};
}
\ No newline at end of file
}
node_comparisons.cpp
View file @
5e1d4feb
...
...
@@ -25,7 +25,7 @@ namespace Sass {
case
space_list
:
case
expression
:
case
term
:
{
for
(
in
t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
size
();
++
i
)
{
if
(
at
(
i
)
==
rhs
[
i
])
continue
;
else
return
false
;
}
...
...
@@ -101,4 +101,4 @@ namespace Sass {
bool
Node
::
operator
>=
(
const
Node
&
rhs
)
const
{
return
!
(
*
this
<
rhs
);
}
}
\ No newline at end of file
}
sass_interface.cpp
View file @
5e1d4feb
...
...
@@ -47,8 +47,7 @@ extern "C" {
// cerr << "Destructions:\t" << Node::destructed << endl;
// cerr << "Registry size:\t" << doc.context.registry.size() << endl;
int
i
;
for
(
i
=
0
;
i
<
doc
.
context
.
registry
.
size
();
++
i
)
{
for
(
size_t
i
=
0
;
i
<
doc
.
context
.
registry
.
size
();
++
i
)
{
delete
doc
.
context
.
registry
[
i
];
}
// cerr << "Deallocations:\t" << i << endl;
...
...
@@ -133,4 +132,4 @@ extern "C" {
return
1
;
}
}
\ No newline at end of file
}
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