function buyTokens(address _participant, uint _weiAmount) public payable returns(bool success) {
	    
		require(isInCrowdsale == true);
		
		require(_weiAmount >= minimumContribution);
		require(_weiAmount <= maximumContribution);
		
		
		
		validatePurchase(_participant, _weiAmount);

		uint currentLevelTokens;
		uint nextLevelTokens;
		
		(currentLevelTokens, nextLevelTokens) = calculateAndCreateTokens(_weiAmount);
		uint tokensAmount = currentLevelTokens.add(nextLevelTokens);
		
		
		if(totalSoldTokens.add(tokensAmount) > TOKENS_HARD_CAP) {
			isInCrowdsale = false;
			return;
		}
		
		
		benecifiary.transfer(_weiAmount);
		
		
		contributedInWei[_participant] = contributedInWei[_participant].add(_weiAmount);
		
		
		if(threeHotHoursEnd > block.timestamp) {
			threeHotHoursTokens[_participant] = threeHotHoursTokens[_participant].add(currentLevelTokens);
			isCalculated[_participant] = false;
			
			
			if(nextLevelTokens > 0) {
				vernamCrowdsaleToken.mintToken(_participant, nextLevelTokens);
			} 
		} else {	
			vernamCrowdsaleToken.mintToken(_participant, tokensAmount);        
		}
		
		
		totalSoldTokens = totalSoldTokens.add(tokensAmount);
		
		
		totalContributedWei = totalContributedWei.add(_weiAmount);
		
		emit TokensBought(_participant, _weiAmount, tokensAmount);
		
		return true;
	}