

import java.io.IOException;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	}

	/**
	 * 余りを求める。
	 * @param a
	 * @param b
	 * @return 余り。余りがマイナスの時はプラスで返す。
	 */
	public static long myMod(long a, long b) {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	}

	/**
	 * 乗数を求める ※mod対応
	 * @param kisu 基数
	 * @param josu 乗数
	 * @param primeNumMod_0 法 mod値 使わない場合は「0」
	 * @return
	 */
	public static long myPowWithMod(long kisu, long josu, long primeNumMod_0) {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	}

} import java.io.IOException; IOException java.io import java.util.Scanner; Scanner java.util public class Main {

	public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	}

	/**
	 * 余りを求める。
	 * @param a
	 * @param b
	 * @return 余り。余りがマイナスの時はプラスで返す。
	 */
	public static long myMod(long a, long b) {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	}

	/**
	 * 乗数を求める ※mod対応
	 * @param kisu 基数
	 * @param josu 乗数
	 * @param primeNumMod_0 法 mod値 使わない場合は「0」
	 * @return
	 */
	public static long myPowWithMod(long kisu, long josu, long primeNumMod_0) {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	}

} Main public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	} main {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	} Scanner scan = new Scanner(System.in); scan new Scanner(System.in) String s; s s = scan.next() s scan.next() scan.next scan String strReverse; strReverse char[] moto = s.toCharArray(); moto s.toCharArray() s.toCharArray s char[] reverse = new char[moto.length]; reverse new char[moto.length] moto.length moto moto.length int j = 0; j 0 for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		} int i = moto.length - 1; int i = moto.length - 1; i moto.length - 1 moto.length moto moto.length 1 i >= 0 i 0 i-- i-- i {
			reverse[j] = moto[i];
			j++;

		} {
			reverse[j] = moto[i];
			j++;

		} reverse[j] = moto[i] reverse[j] reverse j moto[i] moto i j++ j strReverse = String.valueOf(reverse) strReverse String.valueOf(reverse) String.valueOf String reverse if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		} !s.equals(strReverse) s.equals(strReverse) s.equals s strReverse {
			System.out.println("No");

			return;
		} System.out.println("No") System.out.println System.out System System.out "No" return; String zenhan = s.substring(0, (s.length() - 1) / 2); zenhan s.substring(0, (s.length() - 1) / 2) s.substring s 0 (s.length() - 1) / 2 (s.length() - 1) s.length() s.length s 1 2 char[] zenhan_rev = new char[zenhan.length()]; zenhan_rev new char[zenhan.length()] zenhan.length() zenhan.length zenhan j = 0 j 0 for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		} int i = zenhan.length() - 1; int i = zenhan.length() - 1; i zenhan.length() - 1 zenhan.length() zenhan.length zenhan 1 i >= 0 i 0 i-- i-- i {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		} {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		} zenhan_rev[j] = zenhan.charAt(i) zenhan_rev[j] zenhan_rev j zenhan.charAt(i) zenhan.charAt zenhan i j++ j String strZenhanRev = String.valueOf(zenhan_rev); strZenhanRev String.valueOf(zenhan_rev) String.valueOf String zenhan_rev if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		} !zenhan.equals(strZenhanRev) zenhan.equals(strZenhanRev) zenhan.equals zenhan strZenhanRev {
			System.out.println("No");

			return;
		} System.out.println("No") System.out.println System.out System System.out "No" return; zenhan = s.substring((s.length() + 3) / 2 - 1, s.length()) zenhan s.substring((s.length() + 3) / 2 - 1, s.length()) s.substring s (s.length() + 3) / 2 - 1 (s.length() + 3) / 2 (s.length() + 3) s.length() s.length s 3 2 1 s.length() s.length s zenhan_rev = new char[zenhan.length()] zenhan_rev new char[zenhan.length()] zenhan.length() zenhan.length zenhan j = 0 j 0 for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		} int i = zenhan.length() - 1; int i = zenhan.length() - 1; i zenhan.length() - 1 zenhan.length() zenhan.length zenhan 1 i >= 0 i 0 i-- i-- i {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		} {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		} zenhan_rev[j] = zenhan.charAt(i) zenhan_rev[j] zenhan_rev j zenhan.charAt(i) zenhan.charAt zenhan i j++ j strZenhanRev = String.valueOf(zenhan_rev) strZenhanRev String.valueOf(zenhan_rev) String.valueOf String zenhan_rev if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		} !zenhan.equals(strZenhanRev) zenhan.equals(strZenhanRev) zenhan.equals zenhan strZenhanRev {
			System.out.println("No");

			return;
		} System.out.println("No") System.out.println System.out System System.out "No" return; System.out.println("Yes") System.out.println System.out System System.out "Yes" return; String[] args args /**
	 * 余りを求める。
	 * @param a
	 * @param b
	 * @return 余り。余りがマイナスの時はプラスで返す。
	 */
	public static long myMod(long a, long b) {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	} myMod {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	} long ret = 0; ret 0 ret = a % b ret a % b a b if (ret < 0) {
			ret += b;
		} ret < 0 ret 0 {
			ret += b;
		} ret += b ret b return ret; ret long a a long b b /**
	 * 乗数を求める ※mod対応
	 * @param kisu 基数
	 * @param josu 乗数
	 * @param primeNumMod_0 法 mod値 使わない場合は「0」
	 * @return
	 */
	public static long myPowWithMod(long kisu, long josu, long primeNumMod_0) {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	} myPowWithMod {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	} long ans = 1; ans 1 if (josu == 0)
			return 1; josu == 0 josu 0 return 1; 1 if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		} primeNumMod_0 == 0 primeNumMod_0 0 {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			} josu > 0 josu 0 {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			} if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				} josu % 2 == 0 josu % 2 josu 2 0 {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} kisu *= kisu kisu kisu josu = josu / 2 josu josu / 2 josu 2 {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				} ans *= kisu ans kisu josu-- josu return ans; ans {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		} kisu = myMod(kisu, primeNumMod_0) kisu myMod(kisu, primeNumMod_0) myMod kisu primeNumMod_0 while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			} josu > 0 josu 0 {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			} if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				} josu % 2 == 0 josu % 2 josu 2 0 {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} kisu *= myMod(kisu, primeNumMod_0) kisu myMod(kisu, primeNumMod_0) myMod kisu primeNumMod_0 josu = josu / 2 josu josu / 2 josu 2 {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				} ans *= myMod(kisu, primeNumMod_0) ans myMod(kisu, primeNumMod_0) myMod kisu primeNumMod_0 josu-- josu return myMod(ans, primeNumMod_0); myMod(ans, primeNumMod_0) myMod ans primeNumMod_0 long kisu kisu long josu josu long primeNumMod_0 primeNumMod_0 public class Main {

	public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	}

	/**
	 * 余りを求める。
	 * @param a
	 * @param b
	 * @return 余り。余りがマイナスの時はプラスで返す。
	 */
	public static long myMod(long a, long b) {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	}

	/**
	 * 乗数を求める ※mod対応
	 * @param kisu 基数
	 * @param josu 乗数
	 * @param primeNumMod_0 法 mod値 使わない場合は「0」
	 * @return
	 */
	public static long myPowWithMod(long kisu, long josu, long primeNumMod_0) {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	}

} public class Main {

	public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	}

	/**
	 * 余りを求める。
	 * @param a
	 * @param b
	 * @return 余り。余りがマイナスの時はプラスで返す。
	 */
	public static long myMod(long a, long b) {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	}

	/**
	 * 乗数を求める ※mod対応
	 * @param kisu 基数
	 * @param josu 乗数
	 * @param primeNumMod_0 法 mod値 使わない場合は「0」
	 * @return
	 */
	public static long myPowWithMod(long kisu, long josu, long primeNumMod_0) {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	}

} Main


import java.io.IOException;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		String s;
		s = scan.next();

		String strReverse;

		char[] moto = s.toCharArray();
		char[] reverse = new char[moto.length];
		int j = 0;

		for (int i = moto.length - 1; i >= 0; i--) {
			reverse[j] = moto[i];
			j++;

		}

		//①回文か確認
		strReverse = String.valueOf(reverse);

		if (!s.equals(strReverse)) {
			System.out.println("No");

			return;
		}

		//前半取得
		String zenhan = s.substring(0, (s.length() - 1) / 2);
		//前半の回文
		char[] zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		String strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		//後半取得
		//前半取得
		zenhan = s.substring((s.length() + 3) / 2 - 1, s.length());
		//前半の回文
		zenhan_rev = new char[zenhan.length()];

		j = 0;
		for (int i = zenhan.length() - 1; i >= 0; i--) {
			zenhan_rev[j] = zenhan.charAt(i);
			j++;
		}
		strZenhanRev = String.valueOf(zenhan_rev);
		if (!zenhan.equals(strZenhanRev)) {
			System.out.println("No");

			return;
		}

		System.out.println("Yes");
		return;
	}

	/**
	 * 余りを求める。
	 * @param a
	 * @param b
	 * @return 余り。余りがマイナスの時はプラスで返す。
	 */
	public static long myMod(long a, long b) {
		long ret = 0;

		ret = a % b;

		if (ret < 0) {
			ret += b;
		}

		return ret;
	}

	/**
	 * 乗数を求める ※mod対応
	 * @param kisu 基数
	 * @param josu 乗数
	 * @param primeNumMod_0 法 mod値 使わない場合は「0」
	 * @return
	 */
	public static long myPowWithMod(long kisu, long josu, long primeNumMod_0) {

		long ans = 1;

		//乗数が0の場合→1
		if (josu == 0)
			return 1;

		if (primeNumMod_0 == 0) {
			//modを使わないとき

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= kisu;
					josu = josu / 2;
				} else {
					//累乗が奇数の時
					ans *= kisu;
					josu--;
				}
			}

			return ans;

		} else {
			//modを使うとき

			//初めに桁を落とす
			kisu = myMod(kisu, primeNumMod_0);

			while (josu > 0) {

				if (josu % 2 == 0) {
					//累乗が偶数の時

					kisu *= myMod(kisu, primeNumMod_0);
					josu = josu / 2;

				} else {
					//累乗が奇数の時
					ans *= myMod(kisu, primeNumMod_0);
					josu--;

				}
			}

			return myMod(ans, primeNumMod_0);

		}

	}

}
