using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(100);
ms.WriteByte(100);
ms.WriteByte(0);
ms.WriteByte(200);
ms.WriteByte(200);
ms.WriteByte(1);
ms.WriteByte(50);
ms.Seek(0, SeekOrigin.Begin);
Console.WriteLine(Factory.FromStream(ms));
Console.WriteLine(Factory.FromStream(ms));
}
}
public struct Point
{
public int X;
public int Y;
public override string ToString()
{
return string.Format("<Point(X={0}, Y={1})>", X, Y);
}
}
public class Shape
{
protected Point origin;
public Shape(Stream stream)
{
origin.X = stream.ReadByte();
origin.Y = stream.ReadByte();
}
public Shape(Shape shape)
{
origin.X = shape.origin.X;
origin.Y = shape.origin.Y;
}
public override string ToString()
{
return string.Format("<Shape(origin={0})>", origin);
}
}
public class Circle : Shape
{
private double r;
public Circle(Shape shape, int r) : base(shape)
{
this.r = r;
}
public override string ToString()
{
return string.Format("<Circle(origin={0}, r={1})>", origin, r);
}
}
public class Factory
{
public static Shape FromStream(Stream stream)
{
Shape shape = new Shape(stream);
switch (stream.ReadByte())
{
case 0:
return shape;
case 1:
return new Circle(shape, stream.ReadByte());
default:
throw new Exception();
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CgpjbGFzcyBQcm9ncmFtCnsKICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgIHsKICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CiAgICAgICAgbXMuV3JpdGVCeXRlKDEwMCk7CiAgICAgICAgbXMuV3JpdGVCeXRlKDEwMCk7CiAgICAgICAgbXMuV3JpdGVCeXRlKDApOwogICAgICAgIG1zLldyaXRlQnl0ZSgyMDApOwogICAgICAgIG1zLldyaXRlQnl0ZSgyMDApOwogICAgICAgIG1zLldyaXRlQnl0ZSgxKTsKICAgICAgICBtcy5Xcml0ZUJ5dGUoNTApOwoKICAgICAgICBtcy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKEZhY3RvcnkuRnJvbVN0cmVhbShtcykpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKEZhY3RvcnkuRnJvbVN0cmVhbShtcykpOwogICAgfQp9CgpwdWJsaWMgc3RydWN0IFBvaW50CnsKICAgIHB1YmxpYyBpbnQgWDsKCiAgICBwdWJsaWMgaW50IFk7CgogICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjxQb2ludChYPXswfSwgWT17MX0pPiIsIFgsIFkpOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgU2hhcGUKewogICAgcHJvdGVjdGVkIFBvaW50IG9yaWdpbjsKCiAgICBwdWJsaWMgU2hhcGUoU3RyZWFtIHN0cmVhbSkKICAgIHsKICAgICAgICBvcmlnaW4uWCA9IHN0cmVhbS5SZWFkQnl0ZSgpOwogICAgICAgIG9yaWdpbi5ZID0gc3RyZWFtLlJlYWRCeXRlKCk7CiAgICB9CgogICAgcHVibGljIFNoYXBlKFNoYXBlIHNoYXBlKQogICAgewogICAgICAgIG9yaWdpbi5YID0gc2hhcGUub3JpZ2luLlg7CiAgICAgICAgb3JpZ2luLlkgPSBzaGFwZS5vcmlnaW4uWTsKICAgIH0KCiAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiPFNoYXBlKG9yaWdpbj17MH0pPiIsIG9yaWdpbik7CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBDaXJjbGUgOiBTaGFwZQp7CiAgICBwcml2YXRlIGRvdWJsZSByOwoKICAgIHB1YmxpYyBDaXJjbGUoU2hhcGUgc2hhcGUsIGludCByKSA6IGJhc2Uoc2hhcGUpCiAgICB7CiAgICAgICAgdGhpcy5yID0gcjsKICAgIH0KCiAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiPENpcmNsZShvcmlnaW49ezB9LCByPXsxfSk+Iiwgb3JpZ2luLCByKTsKICAgIH0KfQoKcHVibGljIGNsYXNzIEZhY3RvcnkKewogICAgcHVibGljIHN0YXRpYyBTaGFwZSBGcm9tU3RyZWFtKFN0cmVhbSBzdHJlYW0pCiAgICB7CiAgICAgICAgU2hhcGUgc2hhcGUgPSBuZXcgU2hhcGUoc3RyZWFtKTsKICAgICAgICBzd2l0Y2ggKHN0cmVhbS5SZWFkQnl0ZSgpKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIHNoYXBlOwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENpcmNsZShzaGFwZSwgc3RyZWFtLlJlYWRCeXRlKCkpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwogICAgICAgIH0KICAgIH0KfQo=