contract SpecialManager is Owner {

	// Special Managers Addresses
	mapping ( address => bool ) public specialManagerAddressMap;
	// Special Manager Address/Number Mapping
	mapping ( address => uint256 ) public specialManagerAddressNumberMap;
	// Special Managers List
	mapping ( uint256 => address ) public specialManagerListMap;
	// Special Manager Amount
	uint256 public specialManagerCountInt = 0;
	
	// Special Manager or Owner modifier
	modifier isSpecialManagerOrOwner {
        require( specialManagerAddressMap[msg.sender]==true || ownerAddressMap[msg.sender]==true );
        _;
    }
	
	// Special Manager creation/actination
	function specialManagerOn( address _onSpecialManagerAddress ) external isOwner returns (bool retrnVal) {
		// Check if it's a non-zero address
		require( _onSpecialManagerAddress != address(0) );
		// If this special manager already exists
		if ( specialManagerAddressNumberMap[ _onSpecialManagerAddress ]>0 )
		{
			// If this special manager disabled, activate him again
			if ( !specialManagerAddressMap[ _onSpecialManagerAddress ] )
			{
				specialManagerAddressMap[ _onSpecialManagerAddress ] = true;
				retrnVal = true;
			}
			else
			{
				retrnVal = false;
			}
		}
		// If this special manager doesn`t exist
		else
		{
			specialManagerAddressMap[ _onSpecialManagerAddress ] = true;
			specialManagerAddressNumberMap[ _onSpecialManagerAddress ] = specialManagerCountInt;
			specialManagerListMap[ specialManagerCountInt ] = _onSpecialManagerAddress;
			specialManagerCountInt++;
			retrnVal = true;
		}
	}
	
	// Special manager disactivation
	function specialManagerOff( address _offSpecialManagerAddress ) external isOwner returns (bool retrnVal) {
		// If this special manager exists and he is non-zero and also active 
		// 0-number manager can`t be disactivated
		if ( specialManagerAddressNumberMap[ _offSpecialManagerAddress ]>0 && specialManagerAddressMap[ _offSpecialManagerAddress ] )
		{
			specialManagerAddressMap[ _offSpecialManagerAddress ] = false;
			retrnVal = true;
		}
		else
		{
			retrnVal = false;
		}
	}


	// Constructor adds owner to superowner list
	function SpecialManager() public {
		// owner creation
		specialManagerAddressMap[ msg.sender ] = true;
		specialManagerAddressNumberMap[ msg.sender ] = specialManagerCountInt;
		specialManagerListMap[ specialManagerCountInt ] = msg.sender;
		specialManagerCountInt++;
	}
}
function specialManagerOn( address _onSpecialManagerAddress ) external isOwner returns (bool retrnVal) {
	// Check if it's a non-zero address
	require( _onSpecialManagerAddress != address(0) );
	// If this special manager already exists
	if ( specialManagerAddressNumberMap[ _onSpecialManagerAddress ]>0 )
	{
		// If this special manager disabled, activate him again
		if ( !specialManagerAddressMap[ _onSpecialManagerAddress ] )
		{
			specialManagerAddressMap[ _onSpecialManagerAddress ] = true;
			retrnVal = true;
		}
		else
		{
			retrnVal = false;
		}
	}
	// If this special manager doesn`t exist
	else
	{
		specialManagerAddressMap[ _onSpecialManagerAddress ] = true;
		specialManagerAddressNumberMap[ _onSpecialManagerAddress ] = specialManagerCountInt;
		specialManagerListMap[ specialManagerCountInt ] = _onSpecialManagerAddress;
		specialManagerCountInt++;
		retrnVal = true;
	}
}

// Special Manager creation/actination