EPIX KIERAN FISHER FIGURED THE TRUE THE DEFINTION OF LIFE (In Desc.)
This is a satirical website. Don't take it Seriously. It's a joke.
2059 87285 Shares
Sunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunksunk
This is a satirical website. Don't take it Seriously. It's a joke.
Most Popular
-
1
a monkey escapes from the miami zoo and throws bananas from a tree Mario a monkey from the Miami Zoo has escaped last Friday from his cage when he escaped, he threw bananas at people from all over Los Angeles. This has led to a video called "banana rain going viral" right now this little criminal monkey is found in prison.
-
2
octopus teaches math at harvard They hire octopus to teach math at harvard, the octopus is called arnold and it is said that he is paid 3000 dollars per class. here are some images