Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
paciencia
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Matheus Rotondano De Camargo
paciencia
Commits
0d0460f0
Commit
0d0460f0
authored
8 years ago
by
Matheus Rotondano De Camargo
Browse files
Options
Downloads
Patches
Plain Diff
Upload new file
parent
ea285411
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/main.c
+495
-0
495 additions, 0 deletions
src/main.c
with
495 additions
and
0 deletions
src/main.c
0 → 100644
+
495
−
0
View file @
0d0460f0
#include
"baralho.h"
#include
"mesa.h"
int
main
(
void
)
{
FILE
*
placar
,
*
save
;
Baralho
bar
;
/* Mesa é uma matriz de montes.
[00]..[15] = periferia
[16]..[19] = decrescente
[20]..[23] = crescente */
Monte
mesa
[
24
];
int
cartas_restantes
;
//[1..96], 96 posições
int
modo
;
int
embaralhamentos
;
int
jogada
;
time_t
tempo_atual
;
int
tempo_de_jogo
,
inicio
,
atual
;
char
lixo
;
int
test1
,
test2
;
Carta
busca_ori
,
busca_dest
;
Carta
mao_ori
,
mao_dest
;
int
i
,
j
;
int
saveNum
,
qtdeSaves
;
time_t
tempoSave
;
tm
*
tempoSaveLocal
;
/* 0 = ganhou, 1 = perdeu, 2 = esta jogando */
int
perdeu
;
time
(
&
tempoSave
);
tempoSaveLocal
=
localtime
(
&
tempoSave
);
//inicializa a carta NADA, que foi uma forma que eu criei para representar NULL
NADA
.
valor
=
'0'
;
NADA
.
naipe
=
'0'
;
placar
=
fopen
(
"PLACAR.txt"
,
"r+"
);
mkdir
(
"../SAVES"
,
0777
);
//esse printf funciona como um clear screen
printf
(
"\e[H\e[2J"
);
printf
(
"Voce quer carregar um jogo antigo? [0/1]: "
);
scanf
(
"%d"
,
&
load
);
/* Iniciou um jogo novo */
if
(
load
==
0
)
{
perdeu
=
2
;
cartas_restantes
=
96
;
embaralhamentos
=
5
;
i
=
0
;
//parte de gerar o tabuleiro
bar
=
init
(
"baralho.ppm"
,
71
,
96
,
'2'
,
"PECO"
);
bar
=
geraBaralho
(
bar
);
inicializa_mesa
(
mesa
);
cria_blocos_centrais
(
mesa
);
distribui_periferia
(
mesa
,
bar
,
cartas_restantes
);
embaralha_periferia
(
mesa
);
printf
(
"\e[H\e[2J"
);
saveNum
=
numero_do_save
();
//parte de escolher o modo de jogo
printf
(
"Qual vai ser o tipo de jogo? 0-Modo livre
\n
"
);
printf
(
" 1-Contra o tempo
\n
"
);
scanf
(
"%d"
,
&
modo
);
if
(
modo
)
{
printf
(
"Quanto tempo voce quer? (entre com o valor em minutos) "
);;
scanf
(
"%d"
,
&
tempo_de_jogo
);
if
(
tempo_de_jogo
==
0
)
tempo_de_jogo
=
20
*
60
;
else
tempo_de_jogo
=
tempo_de_jogo
*
60
;
time
(
&
tempo_atual
);
inicio
=
segundos
(
localtime
(
&
tempo_atual
));
}
printf
(
"\e[H\e[2J"
);
imprime_tabuleiro
(
mesa
,
bar
);
if
(
modo
)
{
time
(
&
tempo_atual
);
atual
=
segundos
(
localtime
(
&
tempo_atual
));
printf
(
"Voce tem %d minutos e %d segundos restantes.
\n
"
,
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
)),
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
);
}
//escolhe as jogadas
printf
(
"Qual vai ser a sua jogada? [0/1/2/3/4]: "
);
scanf
(
"%d"
,
&
jogada
);
lixo
=
getchar
();
/* Esse lasso se repete enquanto o usuário não entrar com o número 3,
ou seja, ele se repete enquanto o usuário não desistir da partida. */
while
(
jogada
!=
0
)
{
test1
=
1
;
test2
=
1
;
/* Caso o usuário entre com o número 1 o programa passa
a executar esse trecho que se refere ao movimento
das cartas */
if
(
jogada
==
1
)
{
/* test1 e test2 são duas variáveis para controlar o lasso.
O lasso do test1 se quebra quando as cartas de origem e
destino são encontradas.
O lasso do test2 se quebra quando a carta de origem é
encontrada. */
while
(
test1
)
{
while
(
test2
)
{
if
(
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
))
<=
0
&&
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
<=
0
)
{
printf
(
"Tempo esgotado, voce perdeu. :(
\n
"
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
else
exit
(
1
);
}
printf
(
"Voce quer mover qual carta? [entre com 00 para voltar ao menu]: "
);
scanf
(
"%c %c"
,
&
busca_ori
.
valor
,
&
busca_ori
.
naipe
);
lixo
=
getchar
();
if
(
busca_ori
.
valor
==
'0'
&&
busca_ori
.
naipe
==
'0'
)
{
break
;
}
if
(
jogada_possivel_ori
(
mesa
,
busca_ori
,
bar
))
{
i
=
posicao_ori
(
mesa
,
busca_ori
,
bar
);
mao_ori
=
verificaTopo
(
mesa
[
i
],
bar
);
test2
=
0
;
}
else
{
printf
(
"Carta nao encontrada, tente outra.
\n
"
);
test2
=
1
;
}
}
if
(
busca_ori
.
valor
==
'0'
&&
busca_ori
.
naipe
==
'0'
)
{
break
;
}
printf
(
"Para onde voce quer mover a carta? "
);
scanf
(
"%c %c"
,
&
busca_dest
.
valor
,
&
busca_dest
.
naipe
);
lixo
=
getchar
();
if
(
jogada_possivel_dest
(
mesa
,
mao_ori
,
busca_dest
,
bar
))
{
mao_dest
=
verificaTopo
(
mesa
[
i
],
bar
);
j
=
posicao_dest
(
mesa
,
busca_dest
,
bar
);
mesa
[
j
]
=
colocaCarta
(
2
,
mao_dest
,
mesa
[
j
]);
tiraCarta
(
mesa
[
i
],
bar
);
test1
=
0
;
printf
(
"\e[H\e[2J"
);
imprime_tabuleiro
(
mesa
,
bar
);
if
(
modo
)
{
time
(
&
tempo_atual
);
atual
=
segundos
(
localtime
(
&
tempo_atual
));
/* O argumento do primeiro %d calcula quantos minutos restam até
que o tempo estipulado pelo usuário se esgote, através da conta
TEMPO_ESTIPULADO - TEMPO_DECORRIDO.
O argumento do segundo %d tem a mesma lógica do primeiro %d
porém o número resultande é o resto da divisão por 60, o que
indica o número de segundos restantes. */
printf
(
"Voce tem %d minutos e %d segundos restantes.
\n
"
,
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
)),
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
);
}
cartas_restantes
--
;
}
else
{
printf
(
"Destino nao encontrado ou impossivel de empilhar.
\n
"
);
test1
=
1
;
test2
=
1
;
}
/* Caso o usuário tenha ganhado o jogo no modo
contra o tempo, o tempo dele é análisado e
caso seja melhor que um dos 10 primeiros, ele
é adicionado à lista de melhores tempos */
if
(
ganhou
(
mesa
,
bar
))
{
printf
(
"VOCE GANHOU!!
\n
"
);
perdeu
=
0
;
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
if
(
modo
)
analiza_tempo
(
placar
,
inicio
,
atual
);
printf
(
"MELHORES TEMPOS:
\n
"
);
imrpime_melhores_tempos
(
placar
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
else
exit
(
1
);
}
else
{
if
(
modo
)
{
/* Verifica se o tempo estipulado pelo usuário
já se esgotou pelo cálculo: TEMPO_ESTIPULADO - TEMPO_DECORRIDO
(o mesmo cálculo é feito com os segundos, porém usando o resto
da divsão por 60).
Caso ambos os cálculos resultem em 0 o programa é abortado e
o usuário perde. */
if
(
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
))
<=
0
&&
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
<=
0
)
{
printf
(
"Tempo esgotado, voce perdeu. :(
\n
"
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
else
exit
(
1
);
}
}
}
}
}
else
{
if
(
jogada
==
2
)
{
/* Esse if ocorre caso a jogada escolhida seja 2
(embaralhamento) e o usuário tenha embaralhamentos
restantes.
A periferia é embaralhada com a função rand e
depois é colocada de volta na mesa. */
if
(
embaralhamentos
!=
0
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
mesa
[
i
]
=
embaralha
(
mesa
[
i
]);
embaralhamentos
--
;
printf
(
"\e[H\e[2J"
);
imprime_tabuleiro
(
mesa
,
bar
);
if
(
modo
)
{
time
(
&
tempo_atual
);
atual
=
segundos
(
localtime
(
&
tempo_atual
));
printf
(
"Voce tem %d minutos e %d segundos restantes.
\n
"
,
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
)),
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
);
}
printf
(
"Voce tem %d embaralhamentos restantes.
\n
"
,
embaralhamentos
);
}
else
printf
(
"Voce nao tem mais embaralhamentos.
\n
"
);
}
else
{
if
(
jogada
==
3
)
{
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
printf
(
"Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d
\n
"
,
saveNum
,
tempoSaveLocal
->
tm_hour
,
tempoSaveLocal
->
tm_min
,
tempoSaveLocal
->
tm_sec
,
tempoSaveLocal
->
tm_mday
,
tempoSaveLocal
->
tm_mon
,
tempoSaveLocal
->
tm_year
+
1900
);
}
else
{
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
printf
(
"Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d
\n
"
,
saveNum
,
tempoSaveLocal
->
tm_hour
,
tempoSaveLocal
->
tm_min
,
tempoSaveLocal
->
tm_sec
,
tempoSaveLocal
->
tm_mday
,
tempoSaveLocal
->
tm_mon
,
tempoSaveLocal
->
tm_year
+
1900
);
exit
(
1
);
}
}
}
printf
(
"Qual vai ser a sua jogada? [0/1/2/3/4]: "
);
if
(
ganhou
(
mesa
,
bar
))
{
printf
(
"VOCE GANHOU!!
\n
"
);
perdeu
=
0
;
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
if
(
modo
)
analiza_tempo
(
placar
,
inicio
,
atual
);
printf
(
"MELHORES TEMPOS:
\n
"
);
imrpime_melhores_tempos
(
placar
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
else
exit
(
1
);
}
else
{
scanf
(
"%d"
,
&
jogada
);
lixo
=
getchar
();
}
}
perdeu
=
1
;
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
printf
(
"Fim de jogo.
\n
"
);
printf
(
"MELHORES TEMPOS:
\n
"
);
imrpime_melhores_tempos
(
placar
);
fclose
(
placar
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
}
/* Carregou um jogo antigo */
else
{
printf
(
"Saves encontrados: "
);
qtdeSaves
=
saves_encontrados
();
if
(
qtdeSaves
==
0
)
{
printf
(
"Nenhum save foi encontrado!"
);
main
();
}
//parte de gerar o tabuleiro
bar
=
init
(
"baralho.ppm"
,
71
,
96
,
'2'
,
"PECO"
);
bar
=
geraBaralho
(
bar
);
inicializa_mesa
(
mesa
);
LASSO:
printf
(
"Qual save voce quer carregar? [1..%d]: "
,
qtdeSaves
);
scanf
(
"%d"
,
&
saveNum
);
lixo
=
getchar
();
while
(
saveNum
>
qtdeSaves
||
saveNum
==
0
)
{
printf
(
"Save nao encontrado, tente outro: "
);
scanf
(
"%d"
,
&
saveNum
);
lixo
=
getchar
();
}
carrega_jogo
(
mesa
,
bar
,
&
modo
,
&
embaralhamentos
,
&
tempo_de_jogo
,
&
atual
,
&
inicio
,
saveNum
,
&
perdeu
);
if
(
perdeu
==
1
)
{
printf
(
"Voce perdeu esse jogo, ele nao pode ser carregado. Tente outro.
\n
"
);
goto
LASSO
;
}
printf
(
"\e[H\e[2J"
);
//printf("%c%c ", mesa[0][0][0], mesa[0][0][1]);
printf
(
"\e[H\e[2J"
);
time
(
&
tempo_atual
);
inicio
=
segundos
(
localtime
(
&
tempo_atual
));
imprime_tabuleiro
(
mesa
,
bar
);
if
(
modo
)
{
time
(
&
tempo_atual
);
atual
=
segundos
(
localtime
(
&
tempo_atual
));
printf
(
"Voce tem %d minutos e %d segundos restantes.
\n
"
,
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
)),
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
);
}
//escolhe as jogadas
printf
(
"Qual vai ser a sua jogada? [0/1/2/3/4]: "
);
scanf
(
"%d"
,
&
jogada
);
lixo
=
getchar
();
/* Esse lasso se repete enquanto o usuário não entrar com o número 3,
ou seja, ele se repete enquanto o usuário não desistir da partida. */
while
(
jogada
!=
0
)
{
test1
=
1
;
test2
=
1
;
/* Caso o usuário entre com o número 1 o programa passa
a executar esse trecho que se refere ao movimento
das cartas */
if
(
jogada
==
1
)
{
/* test1 e test2 são duas variáveis para controlar o lasso.
O lasso do test1 se quebra quando as cartas de origem e
destino são encontradas.
O lasso do test2 se quebra quando a carta de origem é
encontrada. */
while
(
test1
)
{
while
(
test2
)
{
if
(
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
))
<=
0
&&
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
<=
0
)
{
printf
(
"Tempo esgotado, voce perdeu. :(
\n
"
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
else
exit
(
1
);
}
printf
(
"Voce quer mover qual carta? [entre com 00 para voltar ao menu]: "
);
scanf
(
"%c %c"
,
&
busca_ori
.
valor
,
&
busca_ori
.
naipe
);
lixo
=
getchar
();
if
(
busca_ori
.
valor
==
'0'
&&
busca_ori
.
naipe
==
'0'
)
{
break
;
}
if
(
jogada_possivel_ori
(
mesa
,
busca_ori
,
bar
))
{
i
=
posicao_ori
(
mesa
,
busca_ori
,
bar
);
mao_ori
=
verificaTopo
(
mesa
[
i
],
bar
);
test2
=
0
;
}
else
{
printf
(
"Carta nao encontrada, tente outra.
\n
"
);
test2
=
1
;
}
}
if
(
busca_ori
.
valor
==
'0'
&&
busca_ori
.
naipe
==
'0'
)
{
break
;
}
printf
(
"Para onde voce quer mover a carta? "
);
scanf
(
"%c %c"
,
&
busca_dest
.
valor
,
&
busca_dest
.
naipe
);
lixo
=
getchar
();
if
(
jogada_possivel_dest
(
mesa
,
mao_ori
,
busca_dest
,
bar
))
{
mao_dest
=
verificaTopo
(
mesa
[
i
],
bar
);
j
=
posicao_dest
(
mesa
,
busca_dest
,
bar
);
mesa
[
j
]
=
colocaCarta
(
2
,
mao_dest
,
mesa
[
j
]);
tiraCarta
(
mesa
[
i
],
bar
);
test1
=
0
;
printf
(
"\e[H\e[2J"
);
imprime_tabuleiro
(
mesa
,
bar
);
if
(
modo
)
{
time
(
&
tempo_atual
);
atual
=
segundos
(
localtime
(
&
tempo_atual
));
/* O argumento do primeiro %d calcula quantos minutos restam até
que o tempo estipulado pelo usuário se esgote, através da conta
TEMPO_ESTIPULADO - TEMPO_DECORRIDO.
O argumento do segundo %d tem a mesma lógica do primeiro %d
porém o número resultande é o resto da divisão por 60, o que
indica o número de segundos restantes. */
printf
(
"Voce tem %d minutos e %d segundos restantes.
\n
"
,
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
)),
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
);
}
cartas_restantes
--
;
}
else
{
printf
(
"Destino nao encontrado ou impossivel de empilhar.
\n
"
);
test1
=
1
;
test2
=
1
;
}
/* Caso o usuário tenha ganhado o jogo no modo
contra o tempo, o tempo dele é análisado e
caso seja melhor que um dos 10 primeiros, ele
é adicionado à lista de melhores tempos */
if
(
ganhou
(
mesa
,
bar
))
{
if
(
modo
)
analiza_tempo
(
placar
,
inicio
,
atual
);
printf
(
"Voce ganhou!!!
\n
"
);
test1
=
0
;
test2
=
0
;
}
else
{
if
(
modo
)
{
/* Verifica se o tempo estipulado pelo usuário
já se esgotou pelo cálculo: TEMPO_ESTIPULADO - TEMPO_DECORRIDO
(o mesmo cálculo é feito com os segundos, porém usando o resto
da divsão por 60).
Caso ambos os cálculos resultem em 0 o programa é abortado e
o usuário perde. */
if
(
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
))
<=
0
&&
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
<=
0
)
{
printf
(
"Tempo esgotado, voce perdeu. :(
\n
"
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
else
exit
(
1
);
}
}
}
}
}
else
{
if
(
jogada
==
2
)
{
/* Esse if ocorre caso a jogada escolhida seja 2
(embaralhamento) e o usuário tenha embaralhamentos
restantes.
A periferia é embaralhada com a função rand e
depois é colocada de volta na mesa. */
if
(
embaralhamentos
!=
0
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
mesa
[
i
]
=
embaralha
(
mesa
[
i
]);
embaralhamentos
--
;
printf
(
"\e[H\e[2J"
);
imprime_tabuleiro
(
mesa
,
bar
);
if
(
modo
)
{
time
(
&
tempo_atual
);
atual
=
segundos
(
localtime
(
&
tempo_atual
));
printf
(
"Voce tem %d minutos e %d segundos restantes.
\n
"
,
converte_minutos
(
tempo_de_jogo
-
(
atual
-
inicio
)),
(
tempo_de_jogo
-
(
atual
-
inicio
))
%
60
);
}
printf
(
"Voce tem %d embaralhamentos restantes.
\n
"
,
embaralhamentos
);
}
else
printf
(
"Voce nao tem mais embaralhamentos.
\n
"
);
}
else
{
/* Esse if ocorre caso a jogada escolhida seja 3
(salvar o jogo) */
if
(
jogada
==
3
)
{
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
printf
(
"Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d
\n
"
,
saveNum
,
tempoSaveLocal
->
tm_hour
,
tempoSaveLocal
->
tm_min
,
tempoSaveLocal
->
tm_sec
,
tempoSaveLocal
->
tm_mday
,
tempoSaveLocal
->
tm_mon
,
tempoSaveLocal
->
tm_year
+
1900
);
}
/* Esse else ocorre caso a jogada esja 4 (interromper o jogo) */
else
{
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
printf
(
"Jogo %d salvo. %2.2d:%2.2d:%2.2d %2.2d/%2.2d/%d
\n
"
,
saveNum
,
tempoSaveLocal
->
tm_hour
,
tempoSaveLocal
->
tm_min
,
tempoSaveLocal
->
tm_sec
,
tempoSaveLocal
->
tm_mday
,
tempoSaveLocal
->
tm_mon
,
tempoSaveLocal
->
tm_year
+
1900
);
exit
(
1
);
}
}
}
printf
(
"Qual vai ser a sua jogada? [0/1/2/3/4]: "
);
if
(
ganhou
(
mesa
,
bar
))
jogada
=
0
;
else
{
scanf
(
"%d"
,
&
jogada
);
lixo
=
getchar
();
}
}
perdeu
=
1
;
salva_jogo
(
mesa
,
bar
,
modo
,
embaralhamentos
,
tempo_de_jogo
,
atual
,
inicio
,
saveNum
,
perdeu
);
printf
(
"Fim de jogo.
\n
"
);
printf
(
"MELHORES TEMPOS:
\n
"
);
imrpime_melhores_tempos
(
placar
);
fclose
(
placar
);
printf
(
"Quer jogar de novo? [0/1]: "
);
scanf
(
"%d"
,
&
i
);
if
(
i
)
main
();
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment