@Override
	public byte[] runBinaryMacro(HTTPRequest httpReq, String parm, HTTPResponse httpResp) throws HTTPServerException
	{
		final ByteArrayOutputStream bout=new ByteArrayOutputStream();
		try
		{
			synchronized(sync)
			{
				final boolean imageRequest=httpReq.isUrlParameter("IMAGE");
				if(imageRequest)
				{
					final MIMEType mimeType = MIMEType.All.getMIMEType(getFilename(httpReq,""));
					if(mimeType != null)
						httpResp.setHeader("Content-Type", mimeType.getType());
				}
				final SLinkedList<ImgCacheEntry> cache = getVerifyCache();
				String value=null;
				String key=null;
				final String hisIp=httpReq.getClientAddress().getHostAddress();
				if(imageRequest)
				{
					for(final Iterator<ImageVerificationImage.ImgCacheEntry> p =cache.descendingIterator();p.hasNext();)
					{
						final ImageVerificationImage.ImgCacheEntry entry=p.next();
						if(entry.ip.equalsIgnoreCase(hisIp))
						{
							value=entry.value;
							key=entry.key;
							break;
						}
					}
				}
				final ImageVerificationImage  img=new ImageVerificationImage(value,bout);
				if(key==null)
					key=Long.toHexString(Math.round(Math.abs(rand.nextDouble() * (Long.MAX_VALUE/2.0))));
				if(value==null)
				{
					final ImgCacheEntry entry=new ImgCacheEntry();
					entry.ip=hisIp;
					entry.key=key;
					entry.value=img.getVerificationValue();
					cache.addLast(entry);
				}
				if(!imageRequest)
				{
					bout.reset();
					bout.write(key.getBytes());
				}
				httpReq.addFakeUrlParameter("IMGVERKEY", key);
			}
		}
		catch(final IOException ioe)
		{
			Log.errOut("ImgVerWM",ioe);
		}
		return bout.toByteArray();
	}