// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/Transferable.java
// public enum FieldType {
// 	String('s'), Number('i'), Double('d'), List('l'), Map('m'), Transferable(
// 			'o'), Boolean('b'), Null('n');
// 
// 	private char code;
// 
// 	private FieldType(char code) {
// 		this.code = code;
// 	}
// 
// 	public char getCode() {
// 		return code;
// 	}
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/BooleanFieldWriter.java
// public class BooleanFieldWriter implements FieldWriter<Boolean> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Boolean;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Boolean value) {
// 		t.getBuffer().append(value ? 1 : 0);
// 		t.getBuffer().append(',');
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/DoubleFieldWriter.java
// public class DoubleFieldWriter implements FieldWriter<Double> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Double;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Double value) {
// 		t.getBuffer().append(value.toString());
// 		t.getBuffer().append(',');
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/ListFieldWriter.java
// public class ListFieldWriter<T> implements FieldWriter<List<T>> {
// 
// 	private FieldWriter<T> itemWriter;
// 
// 	public ListFieldWriter(FieldWriter<T> itemWriter) {
// 		this.itemWriter = itemWriter;
// 	}
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.List;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, List<T> value) {
// 		t.writeInt(value.size());
// 		for (T item : value) {
// 			t.writeField(null, item, itemWriter);
// 		}
// 	}
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/MapFieldWriter.java
// public class MapFieldWriter<T> implements FieldWriter<Map<String, T>> {
// 
// 	private FieldWriter<T> itemWriter;
// 	private StringFieldWriter nameWriter = new StringFieldWriter();
// 
// 	public MapFieldWriter(FieldWriter<T> itemWriter) {
// 		this.itemWriter = itemWriter;
// 	}
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Map;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Map<String, T> value) {
// 		t.writeInt(value.size());
// 		for (Entry<String, T> item : value.entrySet()) {
// 			t.writeField(null, item.getKey(), nameWriter);
// 			t.writeField(null, item.getValue(), itemWriter);
// 		}
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/NumberFieldWriter.java
// public class NumberFieldWriter implements FieldWriter<Number> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Number;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Number value) {
// 		t.writeInt(value.intValue());
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/StringFieldWriter.java
// public class StringFieldWriter implements FieldWriter<String> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.String;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, String value) {
// 		t.writeStr(value);
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/TransferableFieldWriter.java
// public class TransferableFieldWriter implements FieldWriter<Transferable> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Transferable;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Transferable value) {
// 		// for (Package p : value.getClass().getPackage().) {
// 		// t.getBuffer().append(p.getName().charAt(0));
// 		// t.getBuffer().append('.');
// 		// }
// 		t.writeStr(value.getClass().getSimpleName());
// 		value.writeTo(t);
// 		t.endWrite();
// 	}
// 
// }


import java.util.List;
import java.util.Map;
import org.kvj.vimtouch.ext.Transferable.FieldType;
import org.kvj.vimtouch.ext.impl.write.BooleanFieldWriter;
import org.kvj.vimtouch.ext.impl.write.DoubleFieldWriter;
import org.kvj.vimtouch.ext.impl.write.ListFieldWriter;
import org.kvj.vimtouch.ext.impl.write.MapFieldWriter;
import org.kvj.vimtouch.ext.impl.write.NumberFieldWriter;
import org.kvj.vimtouch.ext.impl.write.StringFieldWriter;
import org.kvj.vimtouch.ext.impl.write.TransferableFieldWriter;
package org.kvj.vimtouch.ext;





public class OutgoingTransfer {

	private StringBuilder buffer = null;

	public void beginWrite() {
		buffer = new StringBuilder();
	}

	public StringBuilder getBuffer() {
		return buffer;
	}

	public void writeInt(int value) {
		buffer.append(value);
		buffer.append(',');
	}

	public void writeStr(String value) {
		writeInt(value.length());
		buffer.append(value);
		buffer.append(',');
	}

	public <T> void writeField(String name, T value, FieldWriter<T> writer) {
		if (null != name) {
			writeStr(name);
		}
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/Transferable.java
// public enum FieldType {
// 	String('s'), Number('i'), Double('d'), List('l'), Map('m'), Transferable(
// 			'o'), Boolean('b'), Null('n');
// 
// 	private char code;
// 
// 	private FieldType(char code) {
// 		this.code = code;
// 	}
// 
// 	public char getCode() {
// 		return code;
// 	}
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/BooleanFieldWriter.java
// public class BooleanFieldWriter implements FieldWriter<Boolean> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Boolean;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Boolean value) {
// 		t.getBuffer().append(value ? 1 : 0);
// 		t.getBuffer().append(',');
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/DoubleFieldWriter.java
// public class DoubleFieldWriter implements FieldWriter<Double> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Double;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Double value) {
// 		t.getBuffer().append(value.toString());
// 		t.getBuffer().append(',');
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/ListFieldWriter.java
// public class ListFieldWriter<T> implements FieldWriter<List<T>> {
// 
// 	private FieldWriter<T> itemWriter;
// 
// 	public ListFieldWriter(FieldWriter<T> itemWriter) {
// 		this.itemWriter = itemWriter;
// 	}
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.List;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, List<T> value) {
// 		t.writeInt(value.size());
// 		for (T item : value) {
// 			t.writeField(null, item, itemWriter);
// 		}
// 	}
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/MapFieldWriter.java
// public class MapFieldWriter<T> implements FieldWriter<Map<String, T>> {
// 
// 	private FieldWriter<T> itemWriter;
// 	private StringFieldWriter nameWriter = new StringFieldWriter();
// 
// 	public MapFieldWriter(FieldWriter<T> itemWriter) {
// 		this.itemWriter = itemWriter;
// 	}
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Map;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Map<String, T> value) {
// 		t.writeInt(value.size());
// 		for (Entry<String, T> item : value.entrySet()) {
// 			t.writeField(null, item.getKey(), nameWriter);
// 			t.writeField(null, item.getValue(), itemWriter);
// 		}
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/NumberFieldWriter.java
// public class NumberFieldWriter implements FieldWriter<Number> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Number;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Number value) {
// 		t.writeInt(value.intValue());
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/StringFieldWriter.java
// public class StringFieldWriter implements FieldWriter<String> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.String;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, String value) {
// 		t.writeStr(value);
// 	}
// 
// }
// 
// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/impl/write/TransferableFieldWriter.java
// public class TransferableFieldWriter implements FieldWriter<Transferable> {
// 
// 	@Override
// 	public FieldType getType() {
// 		return FieldType.Transferable;
// 	}
// 
// 	@Override
// 	public void write(OutgoingTransfer t, Transferable value) {
// 		// for (Package p : value.getClass().getPackage().) {
// 		// t.getBuffer().append(p.getName().charAt(0));
// 		// t.getBuffer().append('.');
// 		// }
// 		t.writeStr(value.getClass().getSimpleName());
// 		value.writeTo(t);
// 		t.endWrite();
// 	}
// 
// }


// Path: plugins/BasePlugin/src/org/kvj/vimtouch/ext/OutgoingTransfer.java
import java.util.List;
import java.util.Map;
import org.kvj.vimtouch.ext.Transferable.FieldType;
import org.kvj.vimtouch.ext.impl.write.BooleanFieldWriter;
import org.kvj.vimtouch.ext.impl.write.DoubleFieldWriter;
import org.kvj.vimtouch.ext.impl.write.ListFieldWriter;
import org.kvj.vimtouch.ext.impl.write.MapFieldWriter;
import org.kvj.vimtouch.ext.impl.write.NumberFieldWriter;
import org.kvj.vimtouch.ext.impl.write.StringFieldWriter;
import org.kvj.vimtouch.ext.impl.write.TransferableFieldWriter;

package org.kvj.vimtouch.ext;





public class OutgoingTransfer {

	private StringBuilder buffer = null;

	public void beginWrite() {
		buffer = new StringBuilder();
	}

	public StringBuilder getBuffer() {
		return buffer;
	}

	public void writeInt(int value) {
		buffer.append(value);
		buffer.append(',');
	}

	public void writeStr(String value) {
		writeInt(value.length());
		buffer.append(value);
		buffer.append(',');
	}

	public <T> void writeField(String name, T value, FieldWriter<T> writer) {
		if (null != name) {
			writeStr(name);
		}
		if (null == value) {