Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
79de6352
Commit
79de6352
authored
Aug 09, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Show() improvements
parent
c1e3416a
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
173 additions
and
68 deletions
+173
-68
base_struct.cpp
common/base_struct.cpp
+1
-0
class_board.cpp
pcbnew/class_board.cpp
+46
-15
class_edge_mod.cpp
pcbnew/class_edge_mod.cpp
+7
-6
class_equipot.cpp
pcbnew/class_equipot.cpp
+17
-0
class_equipot.h
pcbnew/class_equipot.h
+51
-29
class_module.cpp
pcbnew/class_module.cpp
+10
-10
class_pad.cpp
pcbnew/class_pad.cpp
+2
-5
class_track.cpp
pcbnew/class_track.cpp
+30
-3
class_track.h
pcbnew/class_track.h
+9
-0
No files found.
common/base_struct.cpp
View file @
79de6352
...
@@ -259,6 +259,7 @@ SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart,
...
@@ -259,6 +259,7 @@ SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart,
// see base_struct.h
// see base_struct.h
// many classes inherit this method, be careful:
SEARCH_RESULT
EDA_BaseStruct
::
Visit
(
INSPECTOR
*
inspector
,
const
void
*
testData
,
SEARCH_RESULT
EDA_BaseStruct
::
Visit
(
INSPECTOR
*
inspector
,
const
void
*
testData
,
const
KICAD_T
scanTypes
[]
)
const
KICAD_T
scanTypes
[]
)
{
{
...
...
pcbnew/class_board.cpp
View file @
79de6352
...
@@ -267,22 +267,52 @@ bool BOARD::ComputeBoundaryBox( void )
...
@@ -267,22 +267,52 @@ bool BOARD::ComputeBoundaryBox( void )
*/
*/
void
BOARD
::
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
void
BOARD
::
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
{
{
EDA_BaseStruct
*
p
;
// for now, make it look like XML:
// for now, make it look like XML:
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
// specialization of the output:
// specialization of the output:
EDA_BaseStruct
*
p
=
m_Modules
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<modules>
\n
"
;
p
=
m_Modules
;
for
(
;
p
;
p
=
p
->
Pnext
)
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
1
,
os
);
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</modules>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<pdrawings>
\n
"
;
p
=
m_Drawings
;
p
=
m_Drawings
;
for
(
;
p
;
p
=
p
->
Pnext
)
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
1
,
os
);
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</pdrawings>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<nets>
\n
"
;
p
=
m_Equipots
;
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</nets>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<tracks>
\n
"
;
p
=
m_Track
;
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</tracks>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<zones>
\n
"
;
p
=
m_Zone
;
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</zones>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<edgezones>
\n
"
;
p
=
m_CurrentLimitZone
;
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</edgezones>
\n
"
;
EDA_BaseStruct
*
kid
=
m_Son
;
p
=
m_Son
;
for
(
;
kid
;
kid
=
kid
->
Pnext
)
for
(
;
p
;
p
=
p
->
Pnext
)
{
{
kid
->
Show
(
nestLevel
+
1
,
os
);
p
->
Show
(
nestLevel
+
1
,
os
);
}
}
NestedSpace
(
nestLevel
,
os
)
<<
"</"
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
NestedSpace
(
nestLevel
,
os
)
<<
"</"
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
...
@@ -299,10 +329,8 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
...
@@ -299,10 +329,8 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
int
layer
;
int
layer
;
PadOrModule
(
int
alayer
)
:
PadOrModule
(
int
alayer
)
:
found
(
0
),
// found is NULL
found
(
0
),
layer
(
alayer
)
layer
(
alayer
)
{}
{
}
SEARCH_RESULT
Inspect
(
EDA_BaseStruct
*
testItem
,
const
void
*
testData
)
SEARCH_RESULT
Inspect
(
EDA_BaseStruct
*
testItem
,
const
void
*
testData
)
{
{
...
@@ -326,14 +354,17 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
...
@@ -326,14 +354,17 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
{
{
if
(
testItem
->
HitTest
(
refPos
)
)
if
(
testItem
->
HitTest
(
refPos
)
)
{
{
// save regardless of layer test, but only quit if
// layer matches, otherwise use this item if no future
// layer match.
found
=
testItem
;
if
(
layer
==
mlayer
)
if
(
layer
==
mlayer
)
{
found
=
testItem
;
return
SEARCH_QUIT
;
return
SEARCH_QUIT
;
}
}
// layer mismatch, save in case we don't find a
// future layer match hit.
if
(
!
found
)
found
=
testItem
;
}
}
}
}
}
return
SEARCH_CONTINUE
;
return
SEARCH_CONTINUE
;
...
...
pcbnew/class_edge_mod.cpp
View file @
79de6352
...
@@ -515,7 +515,7 @@ bool EDGE_MODULE::HitTest( const wxPoint& ref_pos )
...
@@ -515,7 +515,7 @@ bool EDGE_MODULE::HitTest( const wxPoint& ref_pos )
*/
*/
void
EDGE_MODULE
::
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
void
EDGE_MODULE
::
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
{
{
const
char
*
cp
=
"???"
;
const
char
*
cp
;
switch
(
m_Shape
)
switch
(
m_Shape
)
{
{
...
@@ -528,16 +528,17 @@ void EDGE_MODULE::Show( int nestLevel, std::ostream& os )
...
@@ -528,16 +528,17 @@ void EDGE_MODULE::Show( int nestLevel, std::ostream& os )
case
S_SPOT_CIRCLE
:
cp
=
"spot_circle"
;
break
;
case
S_SPOT_CIRCLE
:
cp
=
"spot_circle"
;
break
;
case
S_SPOT_RECT
:
cp
=
"spot_rect"
;
break
;
case
S_SPOT_RECT
:
cp
=
"spot_rect"
;
break
;
case
S_POLYGON
:
cp
=
"polygon"
;
break
;
case
S_POLYGON
:
cp
=
"polygon"
;
break
;
default
:
cp
=
"??EDGE??"
;
break
;
}
}
// for now, make it look like XML:
// for now, make it look like XML:
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
" type=
\"
"
<<
cp
<<
"
\"
>
\n
"
;
" type=
\"
"
<<
cp
<<
"
\"
>"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<start"
<<
m_Start0
<<
"/>
\n
"
;
os
<<
" <start"
<<
m_Start0
<<
"/>
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<end"
<<
m_End0
<<
"/>
\n
"
;
os
<<
" <end"
<<
m_End0
<<
"/>
"
;
NestedSpace
(
nestLevel
,
os
)
<<
"
</"
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
os
<<
"
</"
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
}
}
#endif
#endif
pcbnew/class_equipot.cpp
View file @
79de6352
...
@@ -146,3 +146,20 @@ int EQUIPOT:: WriteEquipotDescr( FILE* File )
...
@@ -146,3 +146,20 @@ int EQUIPOT:: WriteEquipotDescr( FILE* File )
fprintf
(
File
,
"$EndEQUIPOT
\n
"
);
fprintf
(
File
,
"$EndEQUIPOT
\n
"
);
return
1
;
return
1
;
}
}
#if defined(DEBUG)
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void
EQUIPOT
::
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
{
// for now, make it look like XML:
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
" name=
\"
"
<<
m_Netname
.
mb_str
()
<<
'"'
<<
" netcode=
\"
"
<<
m_NetCode
<<
"
\"
/>
\n
"
;
}
#endif
pcbnew/class_equipot.h
View file @
79de6352
/*************************************************************************/
/*************************************************************************/
/* classe EQUIPOT: definition des elements relatifs aux equipotentielles */
/* classe EQUIPOT: definition des elements relatifs aux equipotentielles */
/*************************************************************************/
/*************************************************************************/
/* Representation des descriptions des equipotentielles */
/* Representation des descriptions des equipotentielles */
class
EQUIPOT
:
public
EDA_BaseStruct
class
EQUIPOT
:
public
EDA_BaseStruct
{
{
public
:
public
:
wxString
m_Netname
;
// nom du net
wxString
m_Netname
;
// nom du net
...
@@ -17,20 +17,42 @@ public:
...
@@ -17,20 +17,42 @@ public:
int
m_Masque_Layer
;
// couches interdites (bit 0 = layer 0...)
int
m_Masque_Layer
;
// couches interdites (bit 0 = layer 0...)
int
m_Masque_Plan
;
// couches mises en plan de cuivre
int
m_Masque_Plan
;
// couches mises en plan de cuivre
int
m_ForceWidth
;
// specific width (O = default width)
int
m_ForceWidth
;
// specific width (O = default width)
LISTE_PAD
*
m_PadzoneStart
;
// pointeur sur debut de liste pads du net
LISTE_PAD
*
m_PadzoneStart
;
// pointeur sur debut de liste pads du net
LISTE_PAD
*
m_PadzoneEnd
;
// pointeur sur fin de liste pads du net
LISTE_PAD
*
m_PadzoneEnd
;
// pointeur sur fin de liste pads du net
CHEVELU
*
m_RatsnestStart
;
// pointeur sur debut de liste ratsnests du net
CHEVELU
*
m_RatsnestStart
;
// pointeur sur debut de liste ratsnests du net
CHEVELU
*
m_RatsnestEnd
;
// pointeur sur fin de liste ratsnests du net
CHEVELU
*
m_RatsnestEnd
;
// pointeur sur fin de liste ratsnests du net
EQUIPOT
(
EDA_BaseStruct
*
StructFather
);
EQUIPOT
(
EDA_BaseStruct
*
StructFather
);
~
EQUIPOT
(
void
);
~
EQUIPOT
(
void
);
/* Effacement memoire de la structure */
/* Effacement memoire de la structure */
void
UnLink
(
void
);
void
UnLink
(
void
);
/* Readind and writing data on files */
/* Readind and writing data on files */
int
ReadEquipotDescr
(
FILE
*
File
,
int
*
LineNum
);
int
ReadEquipotDescr
(
FILE
*
File
,
int
*
LineNum
);
int
WriteEquipotDescr
(
FILE
*
File
);
int
WriteEquipotDescr
(
FILE
*
File
);
};
#if defined(DEBUG)
/**
* Function GetClass
* returns the class name.
* @return wxString
*/
wxString
GetClass
()
const
{
return
wxT
(
"NET"
);
}
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
virtual
void
Show
(
int
nestLevel
,
std
::
ostream
&
os
);
#endif
};
pcbnew/class_module.cpp
View file @
79de6352
...
@@ -1192,17 +1192,17 @@ void MODULE::Show( int nestLevel, std::ostream& os )
...
@@ -1192,17 +1192,17 @@ void MODULE::Show( int nestLevel, std::ostream& os )
EDA_BaseStruct
*
p
;
EDA_BaseStruct
*
p
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<pads>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<
m
pads>
\n
"
;
p
=
m_Pads
;
p
=
m_Pads
;
for
(
;
p
;
p
=
p
->
Pnext
)
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</pads>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</
m
pads>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<drawings>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<
m
drawings>
\n
"
;
p
=
m_Drawings
;
p
=
m_Drawings
;
for
(
;
p
;
p
=
p
->
Pnext
)
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</drawings>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</
m
drawings>
\n
"
;
p
=
m_Son
;
p
=
m_Son
;
for
(
;
p
;
p
=
p
->
Pnext
)
for
(
;
p
;
p
=
p
->
Pnext
)
...
@@ -1228,6 +1228,12 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
...
@@ -1228,6 +1228,12 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
if
(
SEARCH_QUIT
==
inspector
->
Inspect
(
this
,
testData
)
)
if
(
SEARCH_QUIT
==
inspector
->
Inspect
(
this
,
testData
)
)
return
SEARCH_QUIT
;
return
SEARCH_QUIT
;
}
}
else
if
(
stype
==
TYPEPAD
)
{
if
(
SEARCH_QUIT
==
IterateForward
(
m_Pads
,
inspector
,
testData
,
scanTypes
)
)
return
SEARCH_QUIT
;
}
else
if
(
stype
==
TYPETEXTEMODULE
)
else
if
(
stype
==
TYPETEXTEMODULE
)
{
{
if
(
SEARCH_QUIT
==
inspector
->
Inspect
(
m_Reference
,
testData
)
)
if
(
SEARCH_QUIT
==
inspector
->
Inspect
(
m_Reference
,
testData
)
)
...
@@ -1241,12 +1247,6 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
...
@@ -1241,12 +1247,6 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR* inspector, const void* testData,
testData
,
scanTypes
)
)
testData
,
scanTypes
)
)
return
SEARCH_QUIT
;
return
SEARCH_QUIT
;
}
}
else
if
(
stype
==
TYPEPAD
)
{
if
(
SEARCH_QUIT
==
IterateForward
(
m_Pads
,
inspector
,
testData
,
scanTypes
)
)
return
SEARCH_QUIT
;
}
else
if
(
stype
==
TYPEEDGEMODULE
)
else
if
(
stype
==
TYPEEDGEMODULE
)
{
{
// iterate over m_Drawings
// iterate over m_Drawings
...
...
pcbnew/class_pad.cpp
View file @
79de6352
...
@@ -1019,16 +1019,13 @@ void D_PAD::Show( int nestLevel, std::ostream& os )
...
@@ -1019,16 +1019,13 @@ void D_PAD::Show( int nestLevel, std::ostream& os )
char
padname
[
5
]
=
{
m_Padname
[
0
],
m_Padname
[
1
],
m_Padname
[
2
],
m_Padname
[
3
],
0
};
char
padname
[
5
]
=
{
m_Padname
[
0
],
m_Padname
[
1
],
m_Padname
[
2
],
m_Padname
[
3
],
0
};
char
layerMask
[
16
];
char
layerMask
[
16
];
sprintf
(
layerMask
,
"0x%08X"
,
m_Masque_Layer
);
sprintf
(
layerMask
,
"%08X"
,
m_Masque_Layer
);
// for now, make it look like XML:
// for now, make it look like XML:
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
" num=
\"
"
<<
padname
<<
'"'
<<
" num=
\"
"
<<
padname
<<
'"'
<<
" net=
\"
"
<<
m_Netname
.
mb_str
()
<<
'"'
<<
" net=
\"
"
<<
m_Netname
.
mb_str
()
<<
'"'
<<
" layerMask=
\"
"
<<
layerMask
<<
'"'
<<
" layerMask=
\"
"
<<
layerMask
<<
'"'
<<
m_Pos
<<
"/>
\n
"
;
" pos=
\"
("
<<
m_Pos
.
x
<<
','
<<
m_Pos
.
y
<<
")
\"
"
<<
"/>
\n
"
;
// NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n';
// NestedSpace( nestLevel+1, os ) << m_Text.mb_str() << '\n';
...
...
pcbnew/class_track.cpp
View file @
79de6352
...
@@ -33,6 +33,7 @@ TRACK::TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
...
@@ -33,6 +33,7 @@ TRACK::TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype ) :
}
}
SEGZONE
::
SEGZONE
(
EDA_BaseStruct
*
StructFather
)
:
SEGZONE
::
SEGZONE
(
EDA_BaseStruct
*
StructFather
)
:
TRACK
(
StructFather
,
TYPEZONE
)
TRACK
(
StructFather
,
TYPEZONE
)
{
{
...
@@ -459,9 +460,8 @@ TRACK* TRACK:: Copy( int NbSegm )
...
@@ -459,9 +460,8 @@ TRACK* TRACK:: Copy( int NbSegm )
bool
TRACK
::
WriteTrackDescr
(
FILE
*
File
)
bool
TRACK
::
WriteTrackDescr
(
FILE
*
File
)
/********************************************/
/********************************************/
{
{
int
type
;
int
type
=
0
;
type
=
0
;
if
(
m_StructType
==
TYPEVIA
)
if
(
m_StructType
==
TYPEVIA
)
type
=
1
;
type
=
1
;
...
@@ -474,6 +474,7 @@ bool TRACK::WriteTrackDescr( FILE* File )
...
@@ -474,6 +474,7 @@ bool TRACK::WriteTrackDescr( FILE* File )
fprintf
(
File
,
"De %d %d %d %lX %X
\n
"
,
fprintf
(
File
,
"De %d %d %d %lX %X
\n
"
,
m_Layer
,
type
,
m_NetCode
,
m_Layer
,
type
,
m_NetCode
,
m_TimeStamp
,
ReturnStatus
()
);
m_TimeStamp
,
ReturnStatus
()
);
return
TRUE
;
return
TRUE
;
}
}
...
@@ -674,3 +675,29 @@ bool TRACK::HitTest( const wxPoint& ref_pos )
...
@@ -674,3 +675,29 @@ bool TRACK::HitTest( const wxPoint& ref_pos )
return
false
;
return
false
;
}
}
#if defined(DEBUG)
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void
TRACK
::
Show
(
int
nestLevel
,
std
::
ostream
&
os
)
{
NestedSpace
(
nestLevel
,
os
)
<<
'<'
<<
GetClass
().
Lower
().
mb_str
()
<<
" shape=
\"
"
<<
m_Shape
<<
'"'
<<
" layer=
\"
"
<<
m_Layer
<<
'"'
<<
" width=
\"
"
<<
m_Width
<<
'"'
<<
" drill=
\"
"
<<
m_Drill
<<
'"'
<<
" netcode=
\"
"
<<
m_NetCode
<<
"
\"
>"
<<
"<start"
<<
m_Start
<<
"/>"
<<
"<end"
<<
m_End
<<
"/>"
;
os
<<
"</"
<<
GetClass
().
Lower
().
mb_str
()
<<
">
\n
"
;
}
#endif
pcbnew/class_track.h
View file @
79de6352
...
@@ -95,6 +95,15 @@ public:
...
@@ -95,6 +95,15 @@ public:
return
wxT
(
"TRACK"
);
return
wxT
(
"TRACK"
);
}
}
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void
Show
(
int
nestLevel
,
std
::
ostream
&
os
);
#endif
#endif
};
};
...
...
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