Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
0b0804be
Kaydet (Commit)
0b0804be
authored
Haz 28, 1994
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Lots of new stuff
üst
9beb9327
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
204 additions
and
84 deletions
+204
-84
Canvas.py
Lib/lib-tk/Canvas.py
+102
-42
Canvas.py
Lib/tkinter/Canvas.py
+102
-42
No files found.
Lib/lib-tk/Canvas.py
Dosyayı görüntüle @
0b0804be
# This module exports classes for the various canvas item types
from
Tkinter
import
Canvas
,
_isfunctype
from
Tkinter
import
Canvas
,
_isfunctype
,
_flatten
StringType
=
type
(
''
)
DictionaryType
=
type
({})
class
CanvasItem
:
def
__init__
(
self
,
canvas
,
itemType
,
args
=
(),
cnf
=
{}
):
def
__init__
(
self
,
canvas
,
itemType
,
*
args
):
self
.
canvas
=
canvas
self
.
id
=
canvas
.
_create
(
itemType
,
args
+
(
cnf
,))
self
.
id
=
canvas
.
_create
(
itemType
,
args
)
if
not
hasattr
(
canvas
,
'items'
):
canvas
.
items
=
{}
canvas
.
items
[
self
.
id
]
=
self
def
__str__
(
self
):
return
str
(
self
.
id
)
def
__repr__
(
self
):
return
'<
%
s, id=
%
d>'
%
(
self
.
__class__
.
__name__
,
self
.
id
)
def
__del__
(
self
):
def
delete
(
self
):
del
self
.
canvas
.
items
[
self
.
id
]
self
.
canvas
.
delete
(
self
.
id
)
delete
=
__del__
def
__getitem__
(
self
,
key
):
v
=
self
.
canvas
.
tk
.
split
(
self
.
canvas
.
tk
.
call
(
self
.
canvas
.
_w
,
'itemconfigure'
,
s
tr
(
self
.
id
)
,
'-'
+
key
))
s
elf
.
id
,
'-'
+
key
))
return
v
[
4
]
def
__setitem__
(
self
,
key
,
value
):
self
.
canvas
.
_itemconfig
(
self
.
id
,
{
key
:
value
})
...
...
@@ -24,10 +30,10 @@ class CanvasItem:
if
not
hasattr
(
self
,
'_keys'
):
self
.
_keys
=
map
(
lambda
x
,
tk
=
self
.
canvas
.
tk
:
tk
.
splitlist
(
x
)[
0
][
1
:],
self
.
canvas
.
_
splitlist
(
self
.
canvas
.
cmd
(
self
.
canvas
.
tk
.
splitlist
(
self
.
canvas
.
_do
(
'itemconfigure'
,
self
.
id
)))
(
self
.
id
,)
)))
return
self
.
_keys
def
has_key
(
self
,
key
):
return
key
in
self
.
keys
()
...
...
@@ -38,6 +44,8 @@ class CanvasItem:
return
(
x1
,
y1
),
(
x2
,
y2
)
def
bind
(
self
,
sequence
=
None
,
command
=
None
):
return
self
.
canvas
.
bind
(
self
.
id
,
sequence
,
command
)
def
config
(
self
,
cnf
=
None
):
return
self
.
canvas
.
itemconfig
(
self
.
id
,
cnf
)
def
coords
(
self
,
pts
=
()):
flat
=
()
for
x
,
y
in
pts
:
flat
=
flat
+
(
x
,
y
)
...
...
@@ -68,49 +76,101 @@ class CanvasItem:
return
self
.
canvas
.
type
(
self
.
id
)
class
Arc
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
(
x2
,
y2
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'arc'
,
(
str
(
x1
),
str
(
y1
),
str
(
x2
),
str
(
y2
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'arc'
,
args
)
class
Bitmap
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'bitmap'
,
(
str
(
x1
),
str
(
y1
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'bitmap'
,
args
)
class
Line
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
pts
,
cnf
=
{}):
pts
=
reduce
(
lambda
a
,
b
:
a
+
b
,
map
(
lambda
pt
:
(
str
(
pt
[
0
]),
str
(
pt
[
1
])),
pts
))
CanvasItem
.
__init__
(
self
,
canvas
,
'line'
,
pts
,
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'line'
,
args
)
class
Oval
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
(
x2
,
y2
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'oval'
,
(
str
(
x1
),
str
(
y1
),
str
(
x2
),
str
(
y2
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'oval'
,
args
)
class
Polygon
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
pts
,
cnf
=
{}):
pts
=
reduce
(
lambda
a
,
b
:
a
+
b
,
map
(
lambda
pt
:
(
str
(
pt
[
0
]),
str
(
pt
[
1
])),
pts
))
CanvasItem
.
__init__
(
self
,
canvas
,
'polygon'
,
pts
,
cnf
)
class
Curve
(
Polygon
):
def
__init__
(
self
,
canvas
,
pts
,
cnf
=
{}):
cnf
[
'smooth'
]
=
'yes'
Polygon
.
__init__
(
self
,
canvas
,
pts
,
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'polygon'
,
args
)
class
Rectangle
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
(
x2
,
y2
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'rectangle'
,
(
str
(
x1
),
str
(
y1
),
str
(
x2
),
str
(
y2
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'rectangle'
,
args
)
# XXX Can't use name "Text" since that is already taken by the Text widget...
class
String
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'text'
,
(
str
(
x1
),
str
(
y1
)),
cnf
)
# XXX "Text" is taken by the Text widget...
class
CanvasText
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'text'
,
args
)
class
Window
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
where
,
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'window'
,
(
str
(
where
[
0
]),
str
(
where
[
1
])),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'window'
,
args
)
class
Group
:
def
__init__
(
self
,
canvas
,
tag
=
None
):
if
not
tag
:
tag
=
'Group
%
d'
%
id
(
self
)
self
.
tag
=
self
.
id
=
tag
self
.
canvas
=
canvas
self
.
canvas
.
dtag
(
self
.
tag
)
def
str
(
self
):
return
self
.
tag
def
_do
(
self
,
cmd
,
*
args
):
return
self
.
canvas
.
_do
(
cmd
,
(
self
.
tag
,)
+
_flatten
(
args
))
def
addtag_above
(
self
,
tagOrId
):
self
.
_do
(
'addtag'
,
'above'
,
tagOrId
)
def
addtag_all
(
self
):
self
.
_do
(
'addtag'
,
'all'
)
def
addtag_below
(
self
,
tagOrId
):
self
.
_do
(
'addtag'
,
'below'
,
tagOrId
)
def
addtag_closest
(
self
,
x
,
y
,
halo
=
None
,
start
=
None
):
self
.
_do
(
'addtag'
,
'closest'
,
x
,
y
,
halo
,
start
)
def
addtag_enclosed
(
self
,
x1
,
y1
,
x2
,
y2
):
self
.
_do
(
'addtag'
,
'enclosed'
,
x1
,
y1
,
x2
,
y2
)
def
addtag_overlapping
(
self
,
x1
,
y1
,
x2
,
y2
):
self
.
_do
(
'addtag'
,
'overlapping'
,
x1
,
y1
,
x2
,
y2
)
def
addtag_withtag
(
self
,
tagOrId
):
self
.
_do
(
'addtag'
,
'withtag'
,
tagOrId
)
def
bbox
(
self
):
return
self
.
_getints
(
self
.
_do
(
'bbox'
))
def
bind
(
self
,
sequence
=
None
,
command
=
None
):
# XXX args?
return
self
.
_do
(
'bind'
,
sequence
,
command
)
def
coords
(
self
,
*
pts
):
return
self
.
_do
(
'coords'
,
pts
)
def
dchars
(
self
,
first
,
last
=
None
):
self
.
_do
(
'dchars'
,
first
,
last
)
def
delete
(
self
):
self
.
_do
(
'delete'
)
def
dtag
(
self
,
tagToDelete
=
None
):
self
.
_do
(
'dtag'
,
tagToDelete
)
def
focus
(
self
):
self
.
_do
(
'focus'
)
def
gettags
(
self
):
return
self
.
canvas
.
tk
.
splitlist
(
self
.
_do
(
'gettags'
,
self
.
tag
))
def
icursor
(
self
,
index
):
return
self
.
_do
(
'icursor'
)
def
index
(
self
,
index
):
return
self
.
canvas
.
tk
.
getint
(
self
.
_do
(
'index'
,
index
))
def
insert
(
self
,
beforeThis
,
string
):
self
.
_do
(
'insert'
,
beforeThis
,
string
)
def
config
(
self
,
cnf
=
None
):
return
self
.
canvas
.
itemconfigure
(
self
.
tag
,
cnf
)
def
lower
(
self
,
belowThis
=
None
):
self
.
_do
(
'lower'
,
belowThis
)
def
move
(
self
,
xAmount
,
yAmount
):
self
.
_do
(
'move'
,
xAmount
,
yAmount
)
def
tkraise
(
self
,
aboveThis
=
None
):
self
.
_do
(
'raise'
,
aboveThis
)
lift
=
tkraise
def
scale
(
self
,
xOrigin
,
yOrigin
,
xScale
,
yScale
):
self
.
_do
(
'scale'
,
xOrigin
,
yOrigin
,
xScale
,
yScale
)
def
select_adjust
(
self
,
index
):
self
.
canvas
.
_do
(
'select'
,
(
'adjust'
,
self
.
tag
,
index
))
def
select_from
(
self
,
index
):
self
.
canvas
.
_do
(
'select'
,
(
'from'
,
self
.
tag
,
index
))
def
select_to
(
self
,
index
):
self
.
canvas
.
_do
(
'select'
,
(
'to'
,
self
.
tag
,
index
))
def
type
(
self
):
return
self
.
_do
(
'type'
)
Lib/tkinter/Canvas.py
Dosyayı görüntüle @
0b0804be
# This module exports classes for the various canvas item types
from
Tkinter
import
Canvas
,
_isfunctype
from
Tkinter
import
Canvas
,
_isfunctype
,
_flatten
StringType
=
type
(
''
)
DictionaryType
=
type
({})
class
CanvasItem
:
def
__init__
(
self
,
canvas
,
itemType
,
args
=
(),
cnf
=
{}
):
def
__init__
(
self
,
canvas
,
itemType
,
*
args
):
self
.
canvas
=
canvas
self
.
id
=
canvas
.
_create
(
itemType
,
args
+
(
cnf
,))
self
.
id
=
canvas
.
_create
(
itemType
,
args
)
if
not
hasattr
(
canvas
,
'items'
):
canvas
.
items
=
{}
canvas
.
items
[
self
.
id
]
=
self
def
__str__
(
self
):
return
str
(
self
.
id
)
def
__repr__
(
self
):
return
'<
%
s, id=
%
d>'
%
(
self
.
__class__
.
__name__
,
self
.
id
)
def
__del__
(
self
):
def
delete
(
self
):
del
self
.
canvas
.
items
[
self
.
id
]
self
.
canvas
.
delete
(
self
.
id
)
delete
=
__del__
def
__getitem__
(
self
,
key
):
v
=
self
.
canvas
.
tk
.
split
(
self
.
canvas
.
tk
.
call
(
self
.
canvas
.
_w
,
'itemconfigure'
,
s
tr
(
self
.
id
)
,
'-'
+
key
))
s
elf
.
id
,
'-'
+
key
))
return
v
[
4
]
def
__setitem__
(
self
,
key
,
value
):
self
.
canvas
.
_itemconfig
(
self
.
id
,
{
key
:
value
})
...
...
@@ -24,10 +30,10 @@ class CanvasItem:
if
not
hasattr
(
self
,
'_keys'
):
self
.
_keys
=
map
(
lambda
x
,
tk
=
self
.
canvas
.
tk
:
tk
.
splitlist
(
x
)[
0
][
1
:],
self
.
canvas
.
_
splitlist
(
self
.
canvas
.
cmd
(
self
.
canvas
.
tk
.
splitlist
(
self
.
canvas
.
_do
(
'itemconfigure'
,
self
.
id
)))
(
self
.
id
,)
)))
return
self
.
_keys
def
has_key
(
self
,
key
):
return
key
in
self
.
keys
()
...
...
@@ -38,6 +44,8 @@ class CanvasItem:
return
(
x1
,
y1
),
(
x2
,
y2
)
def
bind
(
self
,
sequence
=
None
,
command
=
None
):
return
self
.
canvas
.
bind
(
self
.
id
,
sequence
,
command
)
def
config
(
self
,
cnf
=
None
):
return
self
.
canvas
.
itemconfig
(
self
.
id
,
cnf
)
def
coords
(
self
,
pts
=
()):
flat
=
()
for
x
,
y
in
pts
:
flat
=
flat
+
(
x
,
y
)
...
...
@@ -68,49 +76,101 @@ class CanvasItem:
return
self
.
canvas
.
type
(
self
.
id
)
class
Arc
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
(
x2
,
y2
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'arc'
,
(
str
(
x1
),
str
(
y1
),
str
(
x2
),
str
(
y2
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'arc'
,
args
)
class
Bitmap
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'bitmap'
,
(
str
(
x1
),
str
(
y1
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'bitmap'
,
args
)
class
Line
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
pts
,
cnf
=
{}):
pts
=
reduce
(
lambda
a
,
b
:
a
+
b
,
map
(
lambda
pt
:
(
str
(
pt
[
0
]),
str
(
pt
[
1
])),
pts
))
CanvasItem
.
__init__
(
self
,
canvas
,
'line'
,
pts
,
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'line'
,
args
)
class
Oval
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
(
x2
,
y2
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'oval'
,
(
str
(
x1
),
str
(
y1
),
str
(
x2
),
str
(
y2
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'oval'
,
args
)
class
Polygon
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
pts
,
cnf
=
{}):
pts
=
reduce
(
lambda
a
,
b
:
a
+
b
,
map
(
lambda
pt
:
(
str
(
pt
[
0
]),
str
(
pt
[
1
])),
pts
))
CanvasItem
.
__init__
(
self
,
canvas
,
'polygon'
,
pts
,
cnf
)
class
Curve
(
Polygon
):
def
__init__
(
self
,
canvas
,
pts
,
cnf
=
{}):
cnf
[
'smooth'
]
=
'yes'
Polygon
.
__init__
(
self
,
canvas
,
pts
,
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'polygon'
,
args
)
class
Rectangle
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
(
x2
,
y2
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'rectangle'
,
(
str
(
x1
),
str
(
y1
),
str
(
x2
),
str
(
y2
)),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'rectangle'
,
args
)
# XXX Can't use name "Text" since that is already taken by the Text widget...
class
String
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
(
x1
,
y1
),
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'text'
,
(
str
(
x1
),
str
(
y1
)),
cnf
)
# XXX "Text" is taken by the Text widget...
class
CanvasText
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'text'
,
args
)
class
Window
(
CanvasItem
):
def
__init__
(
self
,
canvas
,
where
,
cnf
=
{}):
CanvasItem
.
__init__
(
self
,
canvas
,
'window'
,
(
str
(
where
[
0
]),
str
(
where
[
1
])),
cnf
)
def
__init__
(
self
,
canvas
,
*
args
):
CanvasItem
.
__init__
(
self
,
canvas
,
'window'
,
args
)
class
Group
:
def
__init__
(
self
,
canvas
,
tag
=
None
):
if
not
tag
:
tag
=
'Group
%
d'
%
id
(
self
)
self
.
tag
=
self
.
id
=
tag
self
.
canvas
=
canvas
self
.
canvas
.
dtag
(
self
.
tag
)
def
str
(
self
):
return
self
.
tag
def
_do
(
self
,
cmd
,
*
args
):
return
self
.
canvas
.
_do
(
cmd
,
(
self
.
tag
,)
+
_flatten
(
args
))
def
addtag_above
(
self
,
tagOrId
):
self
.
_do
(
'addtag'
,
'above'
,
tagOrId
)
def
addtag_all
(
self
):
self
.
_do
(
'addtag'
,
'all'
)
def
addtag_below
(
self
,
tagOrId
):
self
.
_do
(
'addtag'
,
'below'
,
tagOrId
)
def
addtag_closest
(
self
,
x
,
y
,
halo
=
None
,
start
=
None
):
self
.
_do
(
'addtag'
,
'closest'
,
x
,
y
,
halo
,
start
)
def
addtag_enclosed
(
self
,
x1
,
y1
,
x2
,
y2
):
self
.
_do
(
'addtag'
,
'enclosed'
,
x1
,
y1
,
x2
,
y2
)
def
addtag_overlapping
(
self
,
x1
,
y1
,
x2
,
y2
):
self
.
_do
(
'addtag'
,
'overlapping'
,
x1
,
y1
,
x2
,
y2
)
def
addtag_withtag
(
self
,
tagOrId
):
self
.
_do
(
'addtag'
,
'withtag'
,
tagOrId
)
def
bbox
(
self
):
return
self
.
_getints
(
self
.
_do
(
'bbox'
))
def
bind
(
self
,
sequence
=
None
,
command
=
None
):
# XXX args?
return
self
.
_do
(
'bind'
,
sequence
,
command
)
def
coords
(
self
,
*
pts
):
return
self
.
_do
(
'coords'
,
pts
)
def
dchars
(
self
,
first
,
last
=
None
):
self
.
_do
(
'dchars'
,
first
,
last
)
def
delete
(
self
):
self
.
_do
(
'delete'
)
def
dtag
(
self
,
tagToDelete
=
None
):
self
.
_do
(
'dtag'
,
tagToDelete
)
def
focus
(
self
):
self
.
_do
(
'focus'
)
def
gettags
(
self
):
return
self
.
canvas
.
tk
.
splitlist
(
self
.
_do
(
'gettags'
,
self
.
tag
))
def
icursor
(
self
,
index
):
return
self
.
_do
(
'icursor'
)
def
index
(
self
,
index
):
return
self
.
canvas
.
tk
.
getint
(
self
.
_do
(
'index'
,
index
))
def
insert
(
self
,
beforeThis
,
string
):
self
.
_do
(
'insert'
,
beforeThis
,
string
)
def
config
(
self
,
cnf
=
None
):
return
self
.
canvas
.
itemconfigure
(
self
.
tag
,
cnf
)
def
lower
(
self
,
belowThis
=
None
):
self
.
_do
(
'lower'
,
belowThis
)
def
move
(
self
,
xAmount
,
yAmount
):
self
.
_do
(
'move'
,
xAmount
,
yAmount
)
def
tkraise
(
self
,
aboveThis
=
None
):
self
.
_do
(
'raise'
,
aboveThis
)
lift
=
tkraise
def
scale
(
self
,
xOrigin
,
yOrigin
,
xScale
,
yScale
):
self
.
_do
(
'scale'
,
xOrigin
,
yOrigin
,
xScale
,
yScale
)
def
select_adjust
(
self
,
index
):
self
.
canvas
.
_do
(
'select'
,
(
'adjust'
,
self
.
tag
,
index
))
def
select_from
(
self
,
index
):
self
.
canvas
.
_do
(
'select'
,
(
'from'
,
self
.
tag
,
index
))
def
select_to
(
self
,
index
):
self
.
canvas
.
_do
(
'select'
,
(
'to'
,
self
.
tag
,
index
))
def
type
(
self
):
return
self
.
_do
(
'type'
)
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