Sign in to follow this  
Followers 0

Captcha Code

18 posts in this topic

Posted (edited)

Hiya!

This is my first time EVER creating such thing, any suggestions, tips, etc. would be helpfull.

I have no idea how hard it is to crack such thing... Oh well.

Syntax

_CaptchaCode($iNumOfTries)

Screenshot

Posted Image

Example

#include <EditConstants.au3>
#include "CaptchaCode.au3"

$GUI = GUICreate("Register Form", 210, 110)
GUICtrlCreateLabel("Userame:", 10, 10)
GUICtrlCreateLabel("Email:", 10, 30)
GUICtrlCreateLabel("Password:", 10, 50)
$Username = GUICtrlCreateInput("", 100, 7, 100)
$Email = GUICtrlCreateInput("", 100, 27, 100)
$Password = GUICtrlCreateInput("", 100, 47, 100, 20, $ES_PASSWORD)
$Register = GUICtrlCreateButton("Register", 10, 75, 90)
$Clear = GUICtrlCreateButton("Clear", 110, 75, 90)

GUISetState()
While 1
	Switch GUIGetMsg()
	Case -3
		Exit
		
	Case $Register
		If GUICtrlRead($Username) <> "" And GUICtrlRead($Email) <> "" And GUICtrlRead($Password) <> "" Then
			If _CaptchaCode(3) Then
				MsgBox(64, Default, "Registration done!")
				$Data = ""
				$Data &= "Username	: " & GUICtrlRead($Username) & @CRLF
				$Data &= "Email		: " & GUICtrlRead($Email) & @CRLF
				$Data &= "Password	: " & GUICtrlRead($Password) & @CRLF
				FileWrite(@DesktopDir & "\register_form.txt", $Data)
			Else
				MsgBox(16, Default, "Tries maxed out, exiting program.")
				Exit
			EndIf
		Else
			MsgBox(16, Default, "Please fill in every information.")
		EndIf
		
	Case $Clear
		GUICtrlSetData($Username, "")
		GUICtrlSetData($Email, "")
		GUICtrlSetData($Password, "")
		
	EndSwitch
WEnd

CaptchaCode.au3

#include <GUIConstantsEx.au3>

; MD5 UDF: http://www.autoitscript.com/forum/index.php?showtopic=10590

$iOptOld = Opt("GUIEventOptions",0)
Opt("GUIEventOptions", $iOptOld)

Global $__CaptchaCode_cCharacter[6], $c__CaptchaCode_Label[5], $c__CaptchaCode_Line[2], $a__CaptchaCode_Font[6]
Global $__CaptchaCode_Tries

Func _CaptchaCode($iNumOfTries)
	Local $sCaptchaCode
	
	$__CaptchaCode_Tries = 0
	
	$hWnd = GUICreate("       * ENTER CODE *", 175, 150, -1, -1, 0x00080000)
	$cBg = GUICtrlCreateLabel("", 10, 10, 150, 50)
	GUICtrlSetState($cBg, 128)
	GUICtrlSetBkColor($cBg, 0x000000)
	$cInput = GUICtrlCreateInput("", 10, 70, 150, 20)
	$cCheck = GUICtrlCreateButton("Check", 10, 95, 70)
	$cNew = GUICtrlCreateButton("New", 90, 95, 70)
	
	$sCaptchaCode = __CaptchaCode_Create()
	
	$cFg = GUICtrlCreateLabel("", 10, 10, 150, 50)
    GUICtrlSetBkColor($cFg, -2)
		
	GUISetState()
	While 1
		Switch GUIGetMsg()
		Case -3
			
		Case $cNew
			__CaptchaCode_Delete()
			$sCaptchaCode = __CaptchaCode_Create()
			GUICtrlSetData($cInput, "")
			
		Case $cCheck
			If $__CaptchaCode_Tries == $iNumOfTries - 1 Then
				__CaptchaCode_Delete()
				GUIDelete($hWnd)
				Return False
				ExitLoop
			Else
				If (GUICtrlRead($cInput) == $sCaptchaCode) Then
					__CaptchaCode_Delete()
					GUIDelete($hWnd)
					Return True
					ExitLoop
				Else
					$__CaptchaCode_Tries += 1
					MsgBox(16, "* ERROR *", "Wrong Code!")
					__CaptchaCode_Delete()
					$sCaptchaCode = __CaptchaCode_Create()
					GUICtrlSetData($cInput, "")
				EndIf
			EndIf
			
		EndSwitch
		
	WEnd
EndFunc

Func __CaptchaCode_Create()
	Local $sCaptcha = __CaptchaCode_Generate()
	Local $iX = Random(15, 25, 1)
	Local $iY = Random(15, 40, 1)
	
	$a__CaptchaCode_Font[0] = "Arial Black"
	$a__CaptchaCode_Font[1] = "Comic Sans MS"
	$a__CaptchaCode_Font[2] = "Impact"
	$a__CaptchaCode_Font[3] = "Tahoma"
	$a__CaptchaCode_Font[4] = "System"
	$a__CaptchaCode_Font[5] = "Verdama"
	
	$aSplit = StringSplit($sCaptcha, "")
	For $x = 0 To 5
		$__CaptchaCode_cCharacter[$x] = GUICtrlCreateLabel($aSplit[$x + 1], $iX, $iY)
		$iX += 20 + Random(1, 5, 1)
		$iY = Random(15, 40, 1)
		
		GUICtrlSetBkColor($__CaptchaCode_cCharacter[$x], -2)
		GUICtrlSetColor($__CaptchaCode_cCharacter[$x], Random(0x808080, 0xC0C0C0))
		
		$iNum = Random(1, 7, 1)
		Switch $iNum
		Case 1
			$iStyle = 2 ;2
		Case 2
			$iStyle = 4 ;4
		Case 3
			$iStyle = 8 ;8
		Case 4
			$iStyle = 2 + 4 ;6
		Case 5
			$iStyle = 4 + 8 ;12
		Case 6
			$iStyle = 2 + 8 ;10
		Case 7
			$iStyle = 2 + 4 + 8 ;16
		EndSwitch
		
		GUICtrlSetFont($__CaptchaCode_cCharacter[$x], 13, Random(350, 450, 1), $iStyle, $a__CaptchaCode_Font[Random(0, 5, 1)])
		
		Sleep(10)
	Next
	
	$iX = 15 + Random(1, 10, 1)
	$iY = 5 + Random(1, 10, 1)
	For $z = 0 To 4
		$c__CaptchaCode_Label[$z] = GUICtrlCreateLabel("", $iX, $iY, 1, 30)
		$iX += 25 + Random(1, 10, 1)
		$iY = 5 + Random(1, 30, 1)
		
		GUICtrlSetBkColor($c__CaptchaCode_Label[$z], Random(0x808080, 0xC0C0C0))
	Next
	
	$iX = 5 + Random(1, 25, 1)
	$iY = 20 + Random(1, 10, 1)
	For $b = 0 To 1
		$c__CaptchaCode_Line[$b] = GUICtrlCreateLabel("", $iX, $iY, 130, 1)
		$iX = 5 + Random(1, 10, 1)
		$iY += 10 + Random(1, 10, 1)
		
		GUICtrlSetBkColor($c__CaptchaCode_Line[$b], Random(0x808080, 0xC0C0C0))
	Next
	
	Return $sCaptcha
EndFunc

Func __CaptchaCode_Delete()
	For $y = 0 To 5
		GUICtrlDelete($__CaptchaCode_cCharacter[$y])
	Next
	
	For $a = 0 To 4
		GUICtrlDelete($c__CaptchaCode_Label[$a])
	Next
	
	For $c = 0 To 1
		GUICtrlDelete($c__CaptchaCode_Line[$c])
	Next
EndFunc

Func __CaptchaCode_Generate()
	Local $sCharacters = StringSplit("BCDFGHJKLMNPQRSTVWXYZ1234567890", "")
	Local $sCode = ""
	
	For $i = 1 To 6
		$sCode &= $sCharacters[Random(1, $sCharacters[0], 1)]
	Next
	
	Return $sCode	
EndFunc

UPDATE 09-04-10: Changed variable names, function names, added a tries system

Edited by AlmarM

Share this post


Link to post
Share on other sites



Posted (edited)

Looks nice :(...

I recommend that you add

$iOptOld = Opt("GUIEventOptions",0)

Opt("GUIEventOptions",$iOptOld)

at the beginning and end of the _CreateCaptcha() function.

Edit:

And also you should rename the global variables used to a more UDF related name, something like

Global $__CaptchaCode_cCharacter[6], $c__CaptchaCode_Label[5], $c__CaptchaCode_Line[2], $a__CaptchaCode_Font[6]

And maybe the functions too...

_CaptchaCode()

__CaptchaCode_Create()

__CaptchaCode_Delete()

__CaptchaCode_Generate()

Edited by KaFu

Share this post


Link to post
Share on other sites

Posted

I would make it have a return type of true / false rather than calling a function. Just opinion. I would also work on the spelling of 'success' :( . If you intend to use this properly then lots of labels will not work, as simply going through all the windows children looking for controls with the class 'Static' and reading those will crack it. An easy solution is to give the lines their own text, but that will also be easy enough to figure out from the size. Ultimately, GUICtrlCreateGraphic is the solution... Or disable all the labels and put another label over the top. I haven't tried that but it could work.... (I had to try it out :) see spoiler)

#include <GUIConstantsEx.au3>

Global $cCharacter[6], $cLabel[5], $cLine[2], $aFont[6]

_CaptchaCode("Succes")

Func Succes()
    MsgBox(0, "Succes!", "Captcha was correct!")
EndFunc

Func _CaptchaCode($sFunctionName)
    Local $sCaptchaCode

    $hWnd = GUICreate("       * ENTER CODE *", 175, 150, -1, -1, 0x00080000)
    $cBg = GUICtrlCreateLabel("", 10, 10, 150, 50)
    GUICtrlSetBkColor($cBg, 0x000000)
	GUICtrlSetState($cBg, 128)
    $cInput = GUICtrlCreateInput("", 10, 70, 150, 20)
    $cCheck = GUICtrlCreateButton("Check", 10, 95, 70)
    $cNew = GUICtrlCreateButton("New", 90, 95, 70)

    $sCaptchaCode = _CreateCaptcha()
	$cFg = GUICtrlCreateLabel("", 10, 10, 150, 50)
	GUICtrlSetBkColor($cFg, -2)

    GUISetState()
    While 1
        Switch GUIGetMsg()
        Case -3
            Exit

        Case $cNew
            _DeleteCaptcha()
            $sCaptchaCode = _CreateCaptcha()

        Case $cCheck
            If (GUICtrlRead($cInput) == $sCaptchaCode) Then
                _DeleteCaptcha()
                GUIDelete($hWnd)

                Call($sFunctionName)

                ExitLoop
            Else
                MsgBox(16, "* ERROR *", "Wrong Code!")
                _DeleteCaptcha()
                $sCaptchaCode = _CreateCaptcha()
                GUICtrlSetData($cInput, "")
            EndIf

        EndSwitch
    WEnd
EndFunc

Func _CreateCaptcha()
    Local $sCaptcha = _GenerateCaptcha()
    Local $iX = Random(15, 25, 1)
    Local $iY = Random(15, 40, 1)

    $aFont[0] = "Arial Black"
    $aFont[1] = "Comic Sans MS"
    $aFont[2] = "Impact"
    $aFont[3] = "Tahoma"
    $aFont[4] = "System"
    $aFont[5] = "Verdama"

    $aSplit = StringSplit($sCaptcha, "")
    For $x = 0 To 5
        $cCharacter[$x] = GUICtrlCreateLabel($aSplit[$x + 1], $iX, $iY)
        $iX += 20 + Random(1, 5, 1)
        $iY = Random(15, 40, 1)

        GUICtrlSetBkColor($cCharacter[$x], -2)
        GUICtrlSetColor($cCharacter[$x], Random(0x808080, 0xC0C0C0))

        $iNum = Random(1, 7, 1)
        Switch $iNum
        Case 1
            $iStyle = 2
        Case 2
            $iStyle = 2
        Case 3
            $iStyle = 4
        Case 4
            $iStyle = 2 + 4
        Case 5
            $iStyle = 4 + 8
        Case 6
            $iStyle = 2 + 8
        Case 7
            $iStyle = 2 + 4 + 8
        EndSwitch

        GUICtrlSetFont($cCharacter[$x], "", Random(350, 450, 1), $iStyle, $aFont[Random(0, 5, 1)])

        Sleep(10)
    Next

    $iX = 15 + Random(1, 10, 1)
    $iY = 5 + Random(1, 10, 1)
    For $z = 0 To 4
        $cLabel[$z] = GUICtrlCreateLabel("", $iX, $iY, 1, 30)
        $iX += 25 + Random(1, 10, 1)
        $iY = 5 + Random(1, 30, 1)

        GUICtrlSetBkColor($cLabel[$z], Random(0x808080, 0xC0C0C0))
    Next

    $iX = 5 + Random(1, 25, 1)
    $iY = 20 + Random(1, 10, 1)
    For $b = 0 To 1
        $cLine[$b] = GUICtrlCreateLabel("", $iX, $iY, 130, 1)
        $iX = 5 + Random(1, 10, 1)
        $iY += 10 + Random(1, 10, 1)

        GUICtrlSetBkColor($cLine[$b], Random(0x808080, 0xC0C0C0))
    Next

    Return $sCaptcha
EndFunc

Func _DeleteCaptcha()
    For $y = 0 To 5
        GUICtrlDelete($cCharacter[$y])
    Next

    For $a = 0 To 4
        GUICtrlDelete($cLabel[$a])
    Next

    For $c = 0 To 1
        GUICtrlDelete($cLine[$c])
    Next
EndFunc

Func _GenerateCaptcha()
    Local $sCharacters = StringSplit("BCDFGHJKLMNPQRSTVWXYZ1234567890", "")
    Local $sCode = ""

    For $i = 1 To 6
        $sCode &= $sCharacters[Random(1, $sCharacters[0], 1)]
    Next

    Return $sCode
EndFunc

In answer to your remark of: 'I have no idea how hard it is to crack such thing... Oh well.', it would be easy enough. But it looks impressive.

Share this post


Link to post
Share on other sites

Posted

Well, I tinkered around a PHP captcha a while ago. To make that work, one way is to create a captach from a string, then encypt this string with a one-way algo. (e.g. md5()), send that as a cookie, and finally compare the md5() value of the users input with the value of the cookie... might be an issue here too, if you want to make it hacker proof :( (I guess it might be possible to read the unencrypted string directly from memory).

Share this post


Link to post
Share on other sites

Posted

Nice, there is few similar examples of generating captcha: http://www.autoitscript.com/forum/index.php?showtopic=85143

Share this post


Link to post
Share on other sites

Posted

Pretty cool! :(

Share this post


Link to post
Share on other sites

Posted (edited)

Looks nice :)...

I recommend that you add

$iOptOld = Opt("GUIEventOptions",0)

Opt("GUIEventOptions",$iOptOld)

at the beginning and end of the _CreateCaptcha() function.

Edit:

And also you should rename the global variables used to a more UDF related name, something like

Global $__CaptchaCode_cCharacter[6], $c__CaptchaCode_Label[5], $c__CaptchaCode_Line[2], $a__CaptchaCode_Font[6]

And maybe the functions too...

_CaptchaCode()

__CaptchaCode_Create()

__CaptchaCode_Delete()

__CaptchaCode_Generate()

Thanks! And, yeah... Probably a good idea.

I would make it have a return type of true / false rather than calling a function.

True... *changes*

Well, I tinkered around a PHP captcha a while ago. To make that work, one way is to create a captach from a string, then encypt this string with a one-way algo. (e.g. md5()), send that as a cookie, and finally compare the md5() value of the users input with the value of the cookie... might be an issue here too, if you want to make it hacker proof :) (I guess it might be possible to read the unencrypted string directly from memory).

I wanted to encrypt it at first thought, not a good idea though, so I will try your way. :(

Nice, there is few similar examples of generating captcha: http://www.autoitscript.com/forum/index.php?showtopic=85143

Oh, thanks for showing! :D

Pretty cool! ;)

Thanks! B) Edited by AlmarM

Share this post


Link to post
Share on other sites

Posted (edited)

Updated! See first post.

Well, I tinkered around a PHP captcha a while ago. To make that work, one way is to create a captach from a string, then encypt this string with a one-way algo. (e.g. md5()), send that as a cookie, and finally compare the md5() value of the users input with the value of the cookie... might be an issue here too, if you want to make it hacker proof (I guess it might be possible to read the unencrypted string directly from memory).

Eh, I failed at that part. :)

Or disable all the labels and put another label over the top.

Thanks for that! :(

Ouch. I actualy DO need graphics... :)

If WinExists(WinGetTitle("", "New")) Then
	$Text = WinGetText(WinGetTitle("", "New"))
	
	$Split = StringSplit($Text, Chr(10))
	For $i = 3 To $Split[0]
		ControlSend(WinGetTitle("", "New"), "", "[CLASS:Edit; INSTANCE:1]", StringUpper($Split[$i]))
	Next
EndIf
Edited by AlmarM

Share this post


Link to post
Share on other sites

Posted

You've put the $iOptOld = Opt("GUIEventOptions", 0) and Opt("GUIEventOptions", $iOptOld) at the wrong place. Additionally I added the md5 crypt I meant...

#include <GUIConstantsEx.au3>
#include <Crypt.au3>

Global $__CaptchaCode_cCharacter[6], $c__CaptchaCode_Label[5], $c__CaptchaCode_Line[2], $a__CaptchaCode_Font[6]
Global $__CaptchaCode_Tries

Func _CaptchaCode($iNumOfTries)
	$iOptOld = Opt("GUIEventOptions", 0)

	Local $sCaptchaCode

	$__CaptchaCode_Tries = 0

	$hWnd = GUICreate("ENTER CODE", 175, 160, -1, -1, 0x00080000)
	$cBg = GUICtrlCreateLabel("", 10, 10, 150, 50)
	GUICtrlSetState($cBg, 128)
	GUICtrlSetBkColor($cBg, 0x000000)
	$cInput = GUICtrlCreateInput("", 10, 70, 150, 20)
	$cCheck = GUICtrlCreateButton("Check", 10, 95, 70)
	$cNew = GUICtrlCreateButton("New", 90, 95, 70)

	$sCaptchaCode = __CaptchaCode_Create()

	$cFg = GUICtrlCreateLabel("", 10, 10, 150, 50)
	GUICtrlSetBkColor($cFg, -2)

	GUISetState()
	While 1
		Switch GUIGetMsg()
			Case -3
				ExitLoop

			Case $cNew
				__CaptchaCode_Delete()
				$sCaptchaCode = __CaptchaCode_Create()
				GUICtrlSetData($cInput, "")

			Case $cCheck
				If $__CaptchaCode_Tries == $iNumOfTries - 1 Then
					ExitLoop
				Else
					If (_Crypt_HashData(GUICtrlRead($cInput),$CALG_MD5) == $sCaptchaCode) Then
						__CaptchaCode_Delete()
						GUIDelete($hWnd)
						Opt("GUIEventOptions", $iOptOld)
						Return True
					Else
						$__CaptchaCode_Tries += 1
						MsgBox(16, "* ERROR *", "Wrong Code!")
						__CaptchaCode_Delete()
						$sCaptchaCode = __CaptchaCode_Create()
						GUICtrlSetData($cInput, "")
					EndIf
				EndIf
		EndSwitch
	WEnd

	__CaptchaCode_Delete()
	GUIDelete($hWnd)
	Opt("GUIEventOptions", $iOptOld)
	Return False

EndFunc   ;==>_CaptchaCode

Func __CaptchaCode_Create()
	Local $sCaptcha = __CaptchaCode_Generate()
	Local $iX = Random(15, 25, 1)
	Local $iY = Random(15, 40, 1)

	$a__CaptchaCode_Font[0] = "Arial Black"
	$a__CaptchaCode_Font[1] = "Comic Sans MS"
	$a__CaptchaCode_Font[2] = "Impact"
	$a__CaptchaCode_Font[3] = "Tahoma"
	$a__CaptchaCode_Font[4] = "System"
	$a__CaptchaCode_Font[5] = "Verdama"

	$aSplit = StringSplit($sCaptcha, "")
	For $x = 0 To 5
		$__CaptchaCode_cCharacter[$x] = GUICtrlCreateLabel($aSplit[$x + 1], $iX, $iY)
		$iX += 20 + Random(1, 5, 1)
		$iY = Random(15, 40, 1)

		GUICtrlSetBkColor($__CaptchaCode_cCharacter[$x], -2)
		GUICtrlSetColor($__CaptchaCode_cCharacter[$x], Random(0x808080, 0xC0C0C0))

		$iNum = Random(1, 7, 1)
		Switch $iNum
			Case 1
				$iStyle = 2 ;2
			Case 2
				$iStyle = 4 ;4
			Case 3
				$iStyle = 8 ;8
			Case 4
				$iStyle = 2 + 4 ;6
			Case 5
				$iStyle = 4 + 8 ;12
			Case 6
				$iStyle = 2 + 8 ;10
			Case 7
				$iStyle = 2 + 4 + 8 ;16
		EndSwitch

		GUICtrlSetFont($__CaptchaCode_cCharacter[$x], 13, Random(350, 450, 1), $iStyle, $a__CaptchaCode_Font[Random(0, 5, 1)])

		Sleep(10)
	Next

	$iX = 15 + Random(1, 10, 1)
	$iY = 5 + Random(1, 10, 1)
	For $z = 0 To 4
		$c__CaptchaCode_Label[$z] = GUICtrlCreateLabel("", $iX, $iY, 1, 30)
		$iX += 25 + Random(1, 10, 1)
		$iY = 5 + Random(1, 30, 1)
		GUICtrlSetBkColor($c__CaptchaCode_Label[$z], Random(0x808080, 0xC0C0C0))
	Next

	$iX = 5 + Random(1, 25, 1)
	$iY = 20 + Random(1, 10, 1)
	For $b = 0 To 1
		$c__CaptchaCode_Line[$b] = GUICtrlCreateLabel("", $iX, $iY, 130, 1)
		$iX = 5 + Random(1, 10, 1)
		$iY += 10 + Random(1, 10, 1)

		GUICtrlSetBkColor($c__CaptchaCode_Line[$b], Random(0x808080, 0xC0C0C0))
	Next

	Return _Crypt_HashData($sCaptcha,$CALG_MD5)
EndFunc   ;==>__CaptchaCode_Create

Func __CaptchaCode_Delete()
	For $y = 0 To 5
		GUICtrlDelete($__CaptchaCode_cCharacter[$y])
	Next

	For $a = 0 To 4
		GUICtrlDelete($c__CaptchaCode_Label[$a])
	Next

	For $c = 0 To 1
		GUICtrlDelete($c__CaptchaCode_Line[$c])
	Next
EndFunc   ;==>__CaptchaCode_Delete

Func __CaptchaCode_Generate()
	Local $sCharacters = StringSplit("BCDFGHJKLMNPQRSTVWXYZ1234567890", "")
	Local $sCode = ""

	For $i = 1 To 6
		$sCode &= $sCharacters[Random(1, $sCharacters[0], 1)]
	Next

	Return $sCode
EndFunc   ;==>__CaptchaCode_Generate

Ouch. I actualy DO need graphics... :)

Definitly, maybe Yashied has something in his vault for you :(...

Share this post


Link to post
Share on other sites

Posted

Indead has been done before http://www.autoitscript.com/forum/index.php?showtopic=104580&pid=739784&st=0&#entry739784

rgds

ptrex

Share this post


Link to post
Share on other sites

Posted

send that as a cookie, and finally compare the md5() value of the users input with the value of the cookie...

Why would you store such data in a cookie? Sessions are much better for this type of thing.

Share this post


Link to post
Share on other sites

Posted

Why would you store such data in a cookie? Sessions are much better for this type of thing.

If I remember correctly I've had some trouble with Session ID at that time. But why not use a one way encrypted / hashed value instead in a cookie? At least I can't see no security risk there, worst possible case is that cookie's blocked... users fault.

Share this post


Link to post
Share on other sites

Posted

If I remember correctly I've had some trouble with Session ID at that time. But why not use a one way encrypted / hashed value instead in a cookie? At least I can't see no security risk there, worst possible case is that cookie's blocked... users fault.

Not very user accessible is it.

Share this post


Link to post
Share on other sites

Posted

Harry, you're talking bullshit...

Share this post


Link to post
Share on other sites

Posted

Harry, you're talking bullshit...

Pardon?

Share this post


Link to post
Share on other sites

Posted

Ah yes, thanks for the MD5 version!

Share this post


Link to post
Share on other sites

Posted

Btw it's not to hard to crack if you are trying to extract the string from the image because it does just use standard fonts and no distortion, etc :(

Share this post


Link to post
Share on other sites

Posted

Btw it's not to hard to crack if you are trying to extract the string from the image because it does just use standard fonts and no distortion, etc :(

Oh well... it's still pretty cool.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0




  • Recently Browsing   0 members

    No registered users viewing this page.