#include<cmath>
#include<vector>
#include<algorithm>

#define	EPS	1e-8

enum {CCW=1,CW=-1,ON=0};

#define	mp	make_pair
#define	pb	push_back

using namespace std;

class Point{
public:
	double x,y;
	Point(){}
	Point(double xx,double yy):x(xx),y(yy){}
};

class Line:public vector<Point>{
public:
	Line(const Point &a,const Point &b){
		pb(a),pb(b);
	}
};

class Segment:public Line{
public:
	Segment(const Point &a,const Point &b):Line(a,b){}
};

class Polygon:public vector<Point>{};

class Circle{
public:
	Point c;
	double r;
	Circle(const Point &cc,double rr) : c(cc),r(rr){}
};

Point &operator +=(Point &a,const Point &b){
	a.x+=b.x,a.y+=b.y;
	return a;
}

Point &operator -=(Point &a,const Point &b){
	a.x-=b.x,a.y-=b.y;
	return a;
}

Point &operator *=(Point &a,double c){
	a.x*=c,a.y*=c;
	return a;
}

Point operator +(const Point &a,const Point &b){
	Point c=a;
	return c+=b;
}

Point operator -(const Point &a,const Point &b){
	Point c=a;
	return c-=b;
}

Point operator *(double c,const Point &a){
	Point b=a;
	return b*=c;
}

bool operator <(const Point &a,const Point &b){
	return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
}

bool operator >(const Point &a,const Point &b){
	return b<a;
}

double dot(const Point &a,const Point &b){
	return a.x*b.x+a.y*b.y;
}

double cross(const Point &a,const Point &b){
	return a.x*b.y-a.y*b.x;
}

double dis2(const Point &a,const Point &b){
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

int ccw(const Point &a,Point b,Point c){
	b-=a,c-=a;
	double rotdir=cross(b,c);
	if(rotdir>EPS)		return CCW;
	if(rotdir<-EPS)		return CW;
	return ON;
}

Polygon ConvexHull(vector<Point> ps){
	int n=ps.size();
	sort(ps.begin(),ps.end());

	vector<Point> ch_u(n);
	int n_u=0;
	for(int i=n-1;i>=0;i--){
		ch_u[n_u++]=ps[i];
		while(n_u>=3 && ccw(ch_u[n_u-3],ch_u[n_u-2],ch_u[n_u-1])!=CCW){
			ch_u[n_u-2]=ch_u[n_u-1];
			n_u--;
		}
	}

	vector<Point> ch_l(n);
	int n_l=0;
	for(int i=0;i<n;i++){
		ch_l[n_l++]=ps[i];
		while(n_l>=3 && ccw(ch_l[n_l-3],ch_l[n_l-2],ch_l[n_l-1])!=CCW){
			ch_l[n_l-2]=ch_l[n_l-1];
			n_l--;
		}
	}

	Polygon ch;
	for(int i=0;i<n_u-1;i++)	ch.pb(ch_u[i]);
	for(int i=0;i<n_l-1;i++)	ch.pb(ch_l[i]);
	return ch;
}

bool parallel(const Line &l,const Line &m){
	return abs(cross(l[1]-l[0],m[1]-m[0]))<EPS;
}

bool orthogonal(const Line &l,const Line &m){
	return abs(dot(l[1]-l[0],m[1]-m[0]))<EPS;
}

bool intersect(const Line &l,const Line &m,Point *p=NULL){
	// this routine also returns true in case "M is on L", "M sessuru L", etc,.
	return cross(l[1]-l[0],m[0]-l[0])*cross(l[1]-l[0],m[1]-l[0])<EPS;
}

bool intersect(const Segment &s,const Segment &t,Point *p=NULL){
	if(ccw(s[0],s[1],t[0])*ccw(s[0],s[1],t[1])<=0
	&& ccw(t[0],t[1],s[0])*ccw(t[0],t[1],s[1])<=0){
		return true;
	}
	return false;
}

Point perp_foot(const Point &p,const Line &l){
	double a,b,c;	// l : ax+by+c=0
	a=l[0].y-l[1].y;
	b=l[1].x-l[0].x;
	c=l[0].x*l[1].y-l[1].x*l[0].y;
	return p-(a*p.x+b*p.y+c)/(a*a+b*b)*Point(a,b);
}

Line perp_bisector(const Point &a,const Point &b){
	return Line(Point((a.x+a.y+b.x-b.y)/2,(b.x+b.y-a.x+a.y)/2),
				Point((b.x+b.y+a.x-a.y)/2,(a.x+a.y-b.x+b.y)/2));
}

double area(const Point &a,const Point &b,const Point &c){
	return abs(cross(b-a,c-a))/2;
}

double area(Polygon &pl){
	int n=pl.size();
	double a=0;
	for(int i=0;i<n-2;i++)	a+=area(pl[0],pl[i+1],pl[i+2]);
	return a;
}

#include<cstdio>

int main(){
	for(double x1,y1,x2,y2,x3,y3;
	~scanf("%lf%*c%lf%*c%lf%*c%lf%*c%lf%*c%lf",&x1,&y1,&x2,&y2,&x3,&y3);){
		Point a(x1,y1),b(x2,y2),c(x3,y3);
		Point d=perp_foot(c,Line(a,b));
		d=c+2*(d-c);
		printf("%f %f\n",d.x,d.y);
	}
	return 0;
}

Measured memory_bytes: 0