<image>

For given three points p0, p1, p2, print


COUNTER_CLOCKWISE


if p0, p1, p2 make a counterclockwise turn (1),


CLOCKWISE


if p0, p1, p2 make a clockwise turn (2),


ONLINE_BACK


if p2 is on a line p2, p0, p1 in this order (3),


ONLINE_FRONT


if p2 is on a line p0, p1, p2 in this order (4),


ON_SEGMENT


if p2 is on a segment p0p1 (5).

Constraints

* 1 ≤ q ≤ 1000
* -10000 ≤ xi, yi ≤ 10000
* p0 and p1 are not identical.

Input


xp0 yp0 xp1 yp1
q
xp20 yp20
xp21 yp21
...
xp2q-1 yp2q-1


In the first line, integer coordinates of p0 and p1 are given. Then, q queries are given for integer coordinates of p2.

Output

For each query, print the above mentioned status.

Examples

Input

0 0 2 0
2
-1 1
-1 -1


Output

COUNTER_CLOCKWISE
CLOCKWISE


Input

0 0 2 0
3
-1 0
0 0
3 0


Output

ONLINE_BACK
ON_SEGMENT
ONLINE_FRONT
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll read()
{
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
struct Point{double x,y;}p0,p1,p2;
Point operator -(Point a,Point b){return (Point){a.x-b.x,a.y-b.y};}
double cross(Point a,Point b){return a.x*b.y-a.y*b.x;}
double dot(Point a,Point b){return a.x*b.x+a.y*b.y;}
double norm(Point a){return a.x*a.x+a.y*a.y;}
void read(Point &p){p.x=read(),p.y=read();}
int Clockwise(Point p0,Point p1,Point p2)
{
	Point v1=p1-p0,v2=p2-p0;
	if(cross(v1,v2)>0)return -2;
	if(cross(v1,v2)<0)return 2;
	if(dot(v1,v2)<0)return -1;
	if(norm(v1)<norm(v2))return 1;
	return 0;
}
int main()
{
	read(p0),read(p1);
	int q=read();while(q--)
	{
		read(p2);
		switch(Clockwise(p0,p1,p2))
		{
			case -2:printf("COUNTER_CLOCKWISE\n");break;
			case -1:printf("ONLINE_BACK\n");break;
			case 0:printf("ON_SEGMENT\n");break;
			case 1:printf("ONLINE_FRONT\n");break;
			case 2:printf("CLOCKWISE\n");break;
		}
	}
	return 0;
}

