// Path: src/api/java/org/java_websocket/exceptions/InvalidDataException.java
// public class InvalidDataException extends Exception {
// 	/**
// 	 * Serializable
// 	 */
// 	private static final long serialVersionUID = 3731842424390998726L;
// 
// 	private int closecode;
// 
// 	public InvalidDataException(int closecode) {
// 		this.closecode = closecode;
// 	}
// 
// 	public InvalidDataException(int closecode, String s) {
// 		super(s);
// 		this.closecode = closecode;
// 	}
// 
// 	public InvalidDataException(int closecode, String s, Throwable t) {
// 		super(s, t);
// 		this.closecode = closecode;
// 	}
// 
// 	public InvalidDataException(int closecode, Throwable t) {
// 		super(t);
// 		this.closecode = closecode;
// 	}
// 
// 	public int getCloseCode() {
// 		return closecode;
// 	}
// 
// }
// 
// Path: src/api/java/org/java_websocket/exceptions/InvalidFrameException.java
// public class InvalidFrameException extends InvalidDataException {
// 
// 	/**
// 	 * Serializable
// 	 */
// 	private static final long serialVersionUID = -9016496369828887591L;
// 
// 	public InvalidFrameException() {
// 		super(CloseFrame.PROTOCOL_ERROR);
// 	}
// 
// 	public InvalidFrameException(String arg0) {
// 		super(CloseFrame.PROTOCOL_ERROR, arg0);
// 	}
// 
// 	public InvalidFrameException(String arg0, Throwable arg1) {
// 		super(CloseFrame.PROTOCOL_ERROR, arg0, arg1);
// 	}
// 
// 	public InvalidFrameException(Throwable arg0) {
// 		super(CloseFrame.PROTOCOL_ERROR, arg0);
// 	}
// }
// 
// Path: src/api/java/org/java_websocket/util/Charsetfunctions.java
// public class Charsetfunctions {
// 
// 	public static CodingErrorAction codingErrorAction = CodingErrorAction.REPORT;
// 
// 	/*
// 	 * @return ASCII encoding in bytes
// 	 */
// 	public static byte[] asciiBytes(String s) {
// 		try {
// 			return s.getBytes("ASCII");
// 		} catch (UnsupportedEncodingException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	public static void main(String[] args) throws InvalidDataException {
// 		stringUtf8(utf8Bytes("\0"));
// 		stringAscii(asciiBytes("\0"));
// 	}
// 
// 	public static String stringAscii(byte[] bytes) {
// 		return stringAscii(bytes, 0, bytes.length);
// 	}
// 
// 	public static String stringAscii(byte[] bytes, int offset, int length) {
// 		try {
// 			return new String(bytes, offset, length, "ASCII");
// 		} catch (UnsupportedEncodingException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	public static String stringUtf8(byte[] bytes) throws InvalidDataException {
// 		return stringUtf8(ByteBuffer.wrap(bytes));
// 	}
// 
// 	/*
// 	 * public static String stringUtf8( byte[] bytes, int off, int length )
// 	 * throws InvalidDataException { CharsetDecoder decode = Charset.forName(
// 	 * "UTF8" ).newDecoder(); decode.onMalformedInput( codingErrorAction );
// 	 * decode.onUnmappableCharacter( codingErrorAction ); //decode.replaceWith(
// 	 * "X" ); String s; try { s = decode.decode( ByteBuffer.wrap( bytes, off,
// 	 * length ) ).toString(); } catch ( CharacterCodingException e ) { throw new
// 	 * InvalidDataException( CloseFrame.NO_UTF8, e ); } return s; }
// 	 */
// 
// 	public static String stringUtf8(ByteBuffer bytes)
// 			throws InvalidDataException {
// 		CharsetDecoder decode = Charset.forName("UTF8").newDecoder();
// 		decode.onMalformedInput(codingErrorAction);
// 		decode.onUnmappableCharacter(codingErrorAction);
// 		// decode.replaceWith( "X" );
// 		String s;
// 		try {
// 			bytes.mark();
// 			s = decode.decode(bytes).toString();
// 			bytes.reset();
// 		} catch (CharacterCodingException e) {
// 			throw new InvalidDataException(CloseFrame.NO_UTF8, e);
// 		}
// 		return s;
// 	}
// 
// 	/*
// 	 * @return UTF-8 encoding in bytes
// 	 */
// 	public static byte[] utf8Bytes(String s) {
// 		try {
// 			return s.getBytes("UTF8");
// 		} catch (UnsupportedEncodingException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// }


import java.nio.ByteBuffer;
import org.java_websocket.exceptions.InvalidDataException;
import org.java_websocket.exceptions.InvalidFrameException;
import org.java_websocket.util.Charsetfunctions;

	@Override
	public ByteBuffer getPayloadData() {
		if (code == NOCODE)
			return emptybytebuffer;
		return super.getPayloadData();
	}

	private void initCloseCode() throws InvalidFrameException {
		code = CloseFrame.NOCODE;
		ByteBuffer payload = super.getPayloadData();
		payload.mark();
		if (payload.remaining() >= 2) {
			ByteBuffer bb = ByteBuffer.allocate(4);
			bb.position(2);
			bb.putShort(payload.getShort());
			bb.position(0);
			code = bb.getInt();

			if (code == CloseFrame.ABNORMAL_CLOSE
					|| code == CloseFrame.TLS_ERROR
					|| code == CloseFrame.NOCODE || code > 4999 || code < 1000
					|| code == 1004) {
				throw new InvalidFrameException(
						"closecode must not be sent over the wire: " + code);
			}
		}
		payload.reset();
	}

// Path: src/api/java/org/java_websocket/exceptions/InvalidDataException.java
// public class InvalidDataException extends Exception {
// 	/**
// 	 * Serializable
// 	 */
// 	private static final long serialVersionUID = 3731842424390998726L;
// 
// 	private int closecode;
// 
// 	public InvalidDataException(int closecode) {
// 		this.closecode = closecode;
// 	}
// 
// 	public InvalidDataException(int closecode, String s) {
// 		super(s);
// 		this.closecode = closecode;
// 	}
// 
// 	public InvalidDataException(int closecode, String s, Throwable t) {
// 		super(s, t);
// 		this.closecode = closecode;
// 	}
// 
// 	public InvalidDataException(int closecode, Throwable t) {
// 		super(t);
// 		this.closecode = closecode;
// 	}
// 
// 	public int getCloseCode() {
// 		return closecode;
// 	}
// 
// }
// 
// Path: src/api/java/org/java_websocket/exceptions/InvalidFrameException.java
// public class InvalidFrameException extends InvalidDataException {
// 
// 	/**
// 	 * Serializable
// 	 */
// 	private static final long serialVersionUID = -9016496369828887591L;
// 
// 	public InvalidFrameException() {
// 		super(CloseFrame.PROTOCOL_ERROR);
// 	}
// 
// 	public InvalidFrameException(String arg0) {
// 		super(CloseFrame.PROTOCOL_ERROR, arg0);
// 	}
// 
// 	public InvalidFrameException(String arg0, Throwable arg1) {
// 		super(CloseFrame.PROTOCOL_ERROR, arg0, arg1);
// 	}
// 
// 	public InvalidFrameException(Throwable arg0) {
// 		super(CloseFrame.PROTOCOL_ERROR, arg0);
// 	}
// }
// 
// Path: src/api/java/org/java_websocket/util/Charsetfunctions.java
// public class Charsetfunctions {
// 
// 	public static CodingErrorAction codingErrorAction = CodingErrorAction.REPORT;
// 
// 	/*
// 	 * @return ASCII encoding in bytes
// 	 */
// 	public static byte[] asciiBytes(String s) {
// 		try {
// 			return s.getBytes("ASCII");
// 		} catch (UnsupportedEncodingException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	public static void main(String[] args) throws InvalidDataException {
// 		stringUtf8(utf8Bytes("\0"));
// 		stringAscii(asciiBytes("\0"));
// 	}
// 
// 	public static String stringAscii(byte[] bytes) {
// 		return stringAscii(bytes, 0, bytes.length);
// 	}
// 
// 	public static String stringAscii(byte[] bytes, int offset, int length) {
// 		try {
// 			return new String(bytes, offset, length, "ASCII");
// 		} catch (UnsupportedEncodingException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	public static String stringUtf8(byte[] bytes) throws InvalidDataException {
// 		return stringUtf8(ByteBuffer.wrap(bytes));
// 	}
// 
// 	/*
// 	 * public static String stringUtf8( byte[] bytes, int off, int length )
// 	 * throws InvalidDataException { CharsetDecoder decode = Charset.forName(
// 	 * "UTF8" ).newDecoder(); decode.onMalformedInput( codingErrorAction );
// 	 * decode.onUnmappableCharacter( codingErrorAction ); //decode.replaceWith(
// 	 * "X" ); String s; try { s = decode.decode( ByteBuffer.wrap( bytes, off,
// 	 * length ) ).toString(); } catch ( CharacterCodingException e ) { throw new
// 	 * InvalidDataException( CloseFrame.NO_UTF8, e ); } return s; }
// 	 */
// 
// 	public static String stringUtf8(ByteBuffer bytes)
// 			throws InvalidDataException {
// 		CharsetDecoder decode = Charset.forName("UTF8").newDecoder();
// 		decode.onMalformedInput(codingErrorAction);
// 		decode.onUnmappableCharacter(codingErrorAction);
// 		// decode.replaceWith( "X" );
// 		String s;
// 		try {
// 			bytes.mark();
// 			s = decode.decode(bytes).toString();
// 			bytes.reset();
// 		} catch (CharacterCodingException e) {
// 			throw new InvalidDataException(CloseFrame.NO_UTF8, e);
// 		}
// 		return s;
// 	}
// 
// 	/*
// 	 * @return UTF-8 encoding in bytes
// 	 */
// 	public static byte[] utf8Bytes(String s) {
// 		try {
// 			return s.getBytes("UTF8");
// 		} catch (UnsupportedEncodingException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// }


// Path: src/api/java/org/java_websocket/framing/CloseFrameBuilder.java
import java.nio.ByteBuffer;
import org.java_websocket.exceptions.InvalidDataException;
import org.java_websocket.exceptions.InvalidFrameException;
import org.java_websocket.util.Charsetfunctions;


	@Override
	public ByteBuffer getPayloadData() {
		if (code == NOCODE)
			return emptybytebuffer;
		return super.getPayloadData();
	}

	private void initCloseCode() throws InvalidFrameException {
		code = CloseFrame.NOCODE;
		ByteBuffer payload = super.getPayloadData();
		payload.mark();
		if (payload.remaining() >= 2) {
			ByteBuffer bb = ByteBuffer.allocate(4);
			bb.position(2);
			bb.putShort(payload.getShort());
			bb.position(0);
			code = bb.getInt();

			if (code == CloseFrame.ABNORMAL_CLOSE
					|| code == CloseFrame.TLS_ERROR
					|| code == CloseFrame.NOCODE || code > 4999 || code < 1000
					|| code == 1004) {
				throw new InvalidFrameException(
						"closecode must not be sent over the wire: " + code);
			}
		}
		payload.reset();
	}

	private void initMessage() throws InvalidDataException {