1110000101001110000101101011111111100001011011000110011000110010000100000010011010101000110010011101111001011110100001010111000111110000101111011001000110010110101110100011000111100101011000010011000011010001010000100000000101000000100001011111010100011011000100111001000110011001011011101100101111101010101010001001001110011010001101011000101111110001010100001001100111010100100011100110101110011011 1111111011101100000000001100111010011110110111111100111010010000101000001010111101101100100001110010011100101101011111101101110011010111010100101011000100010011011100011110110101110010010010101000101011111101111001111100011010111000100010110111100110100000001111111111010111001010101001101101111010111010111101011111101101001101100110001011110100001100111000100010101000010011001001100110000000110011 1001110111010010101101001111110010011000010010101111101001110101101000000101010011101010100011011011110101011000110101010110100000111110100101110011011100111110111011100010010010010101010111011011011011101001011001010010101000101011001100000100001101101111101110011010000001101101101001010111000100010011001011011111010111011101010000010011110010111111001101101000000010011101111011010010010010011000 0011110111001001010111011100100001100110011101010110101010000000111110100011011111011011001101010111000000011010100110000110110001100101100110110111110111011111110100010100010001001010011000010100100000101001110101111101001010010101101111110001010011010001101111000010010100001110101111000110100101111010110100000000000010001011011111011010100100001101111000010000010100000011100101010010111101011110 0010010101010100100010000101100011100001100110010110010001101011101010101110100101001000000011011000100111110011000111100101010001101101011101110001001100001001010100010010100011100111110001001010100100101100111100000111010010111111011101100001111001101010111011101011001110110111111110011000001111111001010011100111101110001111111111110000000001101110111111110100110111010000100100010011101010010110 0111001100011110110011001101000010101101111000110000010000110001100111111010011100000000000111110110101000001111011100101110100101010000001010110001001010001010011101110100010101110111101000001010010111010100001000011100010101001110000111000010110110110000000000100110001110001110110001100011000010110100110010100011010001101001000110011111101011011101001001111010001110100111010001011101101101010110 1010000111001101000001101010101110100111101110101011011111001110001111000000101111000000100010011000101010101010100000000001010011101101101011111010010110101001110101010101001100011000111100110001110110111111010100010001010111101010101111010011000010101111111010100011001110111101001001001010001000001010000001111111100000111010101111100100110110100000101001101101110100110011010001000011110110111101 0100101101001111001011111001011101111100101001110111001110001010100110001010111011000000001110011111010100101101100100010110110110101010111011010010101110100111010111111011110000011101000010111010110000011101111011010110100001101011011011010011101111100110001110001010101100001011101001001011010101111011111100001011111101100010110001000001111000011000101010001010000000110101010001101000110000011110 0111010111110111011100011010101101011101101111001100011100011010111000100110011110101110111000111111001101001100001100001111000111001101001010111111010101111101001100100011101001000011000101110100111111000001010110101101010100010011001001001110101000111011010000111011100111011000001111100011001111011010001010010010101111111001110011011111101110010100011011001011101010101111100001101100011110100101 0110001101010110101111110011010011000011111100001010000011110100100001000000101010111010010000001101111111100100001111101100101111110101100011010110101001010100000111110110101111000001011000111011111000110001000110001001101010001100111111000111010110010111101110100010100100011101011010000100100100011011110000011100011001100000001101101010000010010110111100101011001101010011000111010011001110100111 0011011100101111101111011100111110110101010111110000010010110000010000110000000011101000100001001110100010001010000011100101110111001000011101110011110000101000101101111111110011100101110100100010101000101010110111000010001100100011000100000110110010110111110110011101010110110100010110110001110010011100111101100110001001000000010001001111011110100110111111010001100101001110100100111111011111101100 0110010110101011100101111011111010011111101110111011011110000110111100001011110010111010111010101011011101110101111000110111011100000111111001010101101000010000001011010110000000111101101001100001110011110100001001000001101101010100010010110111010111001110101011110110010101000100101100011100111000000100110011011110000001011110111101000110011101101110000011111011001100001000111011101010011101101001 1000111110110011011110001101110110000101110100110100011110010111110010111101110111110101101001100001000110001000011101011010101001010110011100010110011011000111110001101111010010010100000001110101110011100110101111101110110000101111101101111110000111100101001010011000110000010111001010111111001011000011001000011011011001010011000011001101001011110111011110111010010011011001011100001111110110011000 0110000101011111100111011010010100001000010001101001011110101111110000100101110001000001111111101100111011100010110010011101101000101001010001100001100011011000001011001001101010000010010100011000100111111001000010001001011001101001001101001110100100101001101101100011010100000010101110100111010010011000011000101111111111101001111010000110011101110100101001010000101101001111101011111011000111000011 0101001100001110001111001010000110111010001011110111000111010000110000011000100011111011111100100110011101010110101001110101011010100111010101110111010110010010101100110011010000111100110001111010100001111100010001100010111010100111010000110100000001110010011110111011001001010011111101100110000011111011110100011101100000111100111000000001100010011100111110111111010111010000100001101010111110100110 0001100110000010110010000111101101101110011011100010010100100101111101000110010010110001101010110001000111010001101001111001011101101101011100100000100111011101111111101000011110110010110101010100111111110111101010000111111111110000010110111111011010001101111110100001101111011010011010111000001111011001001111111101010000101111010011100111001001001100111111010011101001100100000000000011111011010111 1010001101001111111000000100101001010010101110001101110111010001100010100111001010011100010011001110111100001000111101010110111110010101100011010001011100001000000011011111111001101001001101100001110111101101100110111010001110110010000000010001001001011101001100001110001111010100101010010110110111001100101111101001001101001111100111011110101100101000100000110100001001110100101110110001110100011110 1001001111001111001111001010100010111011110000111000111000010000110011011000101110110100111010101111011000100000011011011111001001101101111111011101110101001111011010010010110101001110110110111001100001011000111110010000110000101001100101100111111001101111010101000110111001001100101001000100110001001111111011001100000011010000001111011011010011100111000001110010100001111100100110011000000001011101 0001111101111001110100000011111011011010001110000111100100001011011001011101100100100000010011000011011110101011100000000001100000101111100100100111101100101011001101101000000011111111100101000010001111111000101110010010011000010001110110001001011100111101101100001000110001110001011100010001001010110011011111111101001011001000111110110111110010010011000100101011001010011110101100101110011101111100 1001111111101101001001011111000001011110110001111000110101111011000011001000100100101011000011011110010110110100010110101110111100101100010111101110101111100100000000001111111010000100000110001101111110110011101111010110001101100110110100001110001101011101011100001010001011100110001101010100110010111010011111001101010100000011110110110000110110100111000111011000010001110001000100011101010111001110 1001101111101100011100111011010000001101001100001111010100100001000110100101101110011011010100011100110101001110111001000000000100010100101011001110101000100011111111000001110101011001001101011011111010010111100110001001110110101101010001011101000000101011110110110111100111110000001101010111111111001100011001011010010011011100000001000011110010111011010101111101101010001011010001010111101111011100 1001110010011101001000011010011101010101100000001000011101001001101110101111100000010010010001101011111101010010000001010110101100011011011011110011000000000100100101001101101001101000100110010011101011100110100010111100010010011011011100100000001100101110011111000101010101111100101001001110101110000001101001100111011111001010001101010001001100101111010101010001101010000001011010011000100111110001 1000010001111011010011100101101010010111111000111010101110101100010110100111100100111001001000001100101010000011010101001100000011011001001110011100011011111111000010000100100011011111001100101110000011000011010010100010101100011111000001111101101001000111001000011010000101001010000011011000111111101000001001011100010100101001111011111011100001100111010101000100010100110111111110100101100110001010 0000101010111000010100001100101100011101101000001101010110011010001110101101101110111000010101011101011101010011110011101010000111100011001111100100000000000010010100111001001101100110010110010011001111101011110001111010100111000010101111110101010111010111100011010101011001000001001001110111000100100001001010100001111010001110110000001111000111111010100010001011101011100010011000001100100111110011 0101000010010111101100011111001001111010111100110000001011101001001100010110100110000100110110101000011110001110111000001000000110100010101101010111110011100110110010010010001110011010001101000001001110011010101100000110111000111010110011101010100000001100100111110101100001001101011111000000100101100100000010001100001110000000100101001111000110111000110111000010110001000111101011001110001111000010 0111111001010110001010100000100011011110111111101000001111110000011001100101110100110110001100000010001101111000101000011100111010111001000111010111011000111100110011010000000110111001010001111010110110010100000100100010011010101011010010101011001111000110101000001101111001110111000001110101110100110101010111001011000010111011110001001010001001000011000001111100011010111000000000101001001011111111 0001110101110100111011010100110001001000111010000000101000111110110010110101000101001111010111011001000111100110001101001110100111110110011001010000101101111001000011110110100011101100010000110010100001010110100001111001000100000001111000111000110100010110011011010111100001001101011110011111100000010011110100100110110001000100001111110010100011111010100001111010000011001011111101001100101010101000 0001111111111000111111101010101011110101110001111000111010111100100011101100110101110011110101011110111100111001010000010110011001101011010111011101110001100111000111111100000111111001111000111111000011011110000101010111111010111111100110011101111100101010111011100010001100000101100111010001110110111011110001000100100100100011100010010110010110010111000111000100010111111110111110100101011000101110 1011000001110010110100011110101101011011000100000111111110111110101010111000100111001111011101111100110111111001011110101011011000011011111111110001011001010011100100101111101100100011100101011000011111111010010011110100111110110011101101111011000010100111111111000000110001101001110011000001001101101011100010011100111110100000000010110111011000101111001001110001001111011000010011101110111000001001 1100011110101110010100010101100000011100010101000011101010111010001101010110100001000001000001101110001000001110001101010001100001011100011111010110110110000010001011011110101101011111011011100101011111110011010111100011101111001100101101100010010100001101010010011001110000000011011011110010100000000111110000011100110101101011000100111011001100000100100101101001010101111111101010010001100000111101 1101111000001100010011001110010100100101100000011101001001100010110001001111010111100110011100110101000011001001000000011001101000101101110000011000100010110011111011101011110101000110101000100111101011100010011001011110110010100100110010101001101101101010111110111001110011011010001101101011111001010111111001011001010111100111110100011010111101111110000101100010010011111100001110101110101100000101 0011100101110100101010111001000100000011011101110101101010001100011001111000111110110000101101000101110110010101010000011010000001101100110010001101110011110100010001101000110010011000011101110000101100000001100111101011111100010010101010001001100011001001100110101001111010011000111000110010101001001000101010000011010010011111111000010011101011010101000000010100001101011000011111001111110001101101 0011111101101110100011101000011100100010010010111010101000001001011110000011101101000011001100101100110100010111111110001100001101100110110001001011000010111010101101001110000011000000100011101100110110000111101101101111001000011100011110110010111011111011110101110110010000111100011001110001100110100110101010111100111001110101000100011010111110110100001100101010111010111110100111011100111011010011 1000001010001000001000100110010110101000010011010100010010001001101111011011100101100100000110100010010100100110001110000011111001000100111111110101001010100000101011100000100010111000110001000111100011100110010101000011000100011010111011100110101010010011011101000110011101010101110010011110010001000000010111000101010000101000101000010101111010110011010110010011100111010001100001010010010101101011 0000111100111110110110000111101010100011010101100001000001001010010111100110001100010000101011100101110000101111011000001010110101010000100101110101110100110111011110011010100100100011011001111110010010011100011000101110101110010010011010100001010000001010101100010000010100010011000110100110110000011000110111100110101010110100001011001000011010001110101110010011011011000011000000000101001010110101 0100010001001101101111101110101101101101001011011100011010000101011000010101010011101011010111110101000011111001100000110000110000110010010000100101010010111101101100100100010100000111001000101011101010100110110110100010000000011010000001001111011110100011110100000101000000000110011010101010110101001010011001001100111010011011000000011100111111100111110101001001111110000000101011111001001011111100 0100101010010011001101010011001111010111000111011000101011010000101101110011000001111010110111010111101110001010001101000110010011100110110110001110010011010111110001000001101111001111110000001110010101001010110000100000001010111000111101001011100110001111001110010011100110111011011000111101111000111011111001010100001100011110110110100001000101010001000010101101001100001101110101000000110100000011 1000010000110010001101000101010100101101000011010101101000011111111110101001101100000001101011010001000001000111010100111001110100001011011001100111010100000000000111001001111000001100100100000010001111110011100000101110101101101110001000101111001110110000110111100110111010000100001101000011111000000011100110100001100001110011000101011010100101010010001100001111100000110001111010000110100100011111 0111011000001011100001011111100110001111010001101011101111110000100001011010111110001100011010111000100110000010010001001010100011011100001001110101001100101110111010000011000011000001100100101000000111011110010011001010010110000000011001100000011001101110011100010111111001000111011111011000101101001111101011001011001001100010001111011111111000111011110001111100110000111100010000001001001010000101 1010000110110110100100000101111011011010100001000100000110110011111001101011000001001011100011101101000011100001000011010100010001101000010100011001011110010110001001001110100011001100101000011010101100110111001100111101100000100100010101100011000110100111100101111101001100001111011001111010100001111101101101010111111001010111001111001101101001011101010011101111101010110001010010100110110100010111 0011111101001101100001101111011111100110000110111111010111010001101001101110110000010011011000000100111111011110101111100110000110011101010101000010000100111010011011001101000001011100100110111100010101001110011111110110100001111111100011110000001110100010100111000110100000001110100111011000000101111101110101011011010000100011011010111000000110100111011101011001000101010011001001001100110000010010 0000111111110100101110111010100111001110010001110100101111101110100101010000101001010001011110001111101101000110111010010111100000010011001100101000010001110111011010000010111010011111101111011011111110010110010000100001011011111000100100011100001110111000110000001011011110101100111010100110100010110010111100110100110111000101001000100111101100110001111000111010010111010001100000101010101101100010 1111100110110110001011011011111011010001000101001101100011111000000011111001010001000101111101000111100100110100111111111110100011010100001011110010111110001110011001000110010010111001110000001110011100100010001100100010011000010011110100010001110011111100010110100010010011000110011001001111101010001101000111100011010010111011001110111110110001010101001000101100001010010001000101001010110011100000 1110110011100101100101010011100001001000100011011101000100010101101010110000100110100100001101111011100110101110010110001011011000000101101110111110110000110100011001000000101110101011101011111011111010001000011011101110111101011101000001010001110011000010111100100011100010011011011001111000111111110101111001110110001010011101000110011010100110011011001010111010011100100101000100110110011000110011 1110101101101100100001011110110100100101011011100100001000000010110011111101011010000100000101110010011000110101110011101100001111110100001110110100010001011000000100100101100010110110010111010011110000001010100110100001110011011011111100011111010010100111010100100101010000001100100111100000010000001011110011111100111000110101111010011110000010011100000011101001100000110010100100001100110110000111 1111001011000110101111100100111110101111110011000111110011010001101101100100001011100111010111000100001100100100011000111010111101001000101000100000011001010101111010001111110011010100110100011011011110110100100011111111000101111110001110011000101010011010111111111011011001011000010010110001111101001111010001100111111011100000000100110000011100000110100000100010101011110111101011111110011110110011 1000101111010111000110111111000000110011001100111000100001001101011001111010000110001010110111001100101110010000101011001011110000010101000100011010110111111101011111101110110100000001001111011110000011100001100111010001010010000011011001100000000101111001110111011110110101111011000011101010111110100111100010011111001100000111001010011001011110000010010001111100010100100011000111100110011000101111 0101100011010111000111100101101011101111110001010111011110001001000000111000011010100000101101101110110011100111011110110011000100111011110110101000111000010011000010100100011001001010011011001000010111000011000000111011010011001001111111110001110010111100001101111010010110100000111110010000100100100110010100111000011110001100101010100010111111101010101010001010001000101010101101111001111111010001 1000011001101010011001010001010101100011111011111101010011010111101110001000001111101011001111100100100001111111001010100101011010101101110000100001111001100110111010001001000101000001111000111110001101111101010101011110100001111101011011101011100101011010110001010111110111000000101011100000001100011010111100101011110001011000010000100111010010001111110110011100011011111100010101011111001100100000 1101100010110010110010011110110111000010010011010100101101010011111101001000001001001111110111100011100101100000101011000100110100000011101010000010001001111110011111110001110001000100010111111110010011001011111100101000010100101100011110010101010110001101010010101111000100111010100001101001011001001010101010111111111001101011000110100111010101110001111111100100101111010100011010011101110010000111 1101001010110100111101101111101111100001010010001100100100001100010100011111101111101011000110011000111011011011011011000100010001111011011111101001000111100110101000011010110010001101011000010011010000110111111011101111111001010100011010000001110001010111001010110000101011000110001110010111001010100010010110101011111001010001001110110001111110010000111100100110110110111110011001111110000011111000 0001001110111100100000001100011010111110100111001110011110011101110001101011101100111101111101111100110111010100111000100100011111111011000011110001111111110001110000100011010111100010100011110010000000111110001001000101101111000011010110010111110110001001110110011111101111001101111001011100110101010000010000010011010011001001101000101011001100101111110100101001011100010111100111011111101100001110 1010001100101100111111000001000000110001100110011001000011101001100001100100110001000110000010010010011111100011011000001011101100000001011110001100010100011101000100001101100111100010000010110000010101110010110110111101001101100001101111010000000100101110100101111100010111011000101101001110111010011111000011100000010111101110000001111101110111111010110001011101000100011101011000000101110011010000 1100011100101101110011110111101100001001011100101001100110110001110100100101101110110100101000110110000101110010010110010010010101010000110010010110000111111111111000110011010010011111001011001111110101010100011001011001110001010000010010101110111000010010100000000000001100111100010000111100001010100100101101001100111010100110110100000000010010010101110001000001001000100001101011010011000100010111 0111000011011100111110011000001100101110001000001111101010111100110001001111110110100011101101111101100001111000011111111001101000011001000110000101000000000111110110100011011100011000011101011100100110011011001000000110111110110000101001010101100111010010111010001100010000011100111110101100001110001000101011100011000110111010010010010110010011111111110110011001001001101000111001010010111111000100 1010000111100010011001100100010011111000101111111011000001001011011111000100011010110010101001101000111110010100101010011111111010001010101010001101000001101111111100100010100011010010000011011001011010101001001100100011001101001101011101001111010110011001110001001011011100111111001011101011001110110000110001101001110110111010111001100000010100110011000111011011100100001110010101111110100011110100 0111001100100000000100101101101101101111001110000110100100001001111110101110000100111001110010000101001000000110111011100110110111000110001000010001100110011011110111011011110000000111011100100110100011110110010101101011001011100111000011010011011011001000010101011111110100110001000100000001111001110000111101101000101101101110100110001010011111000100010010111011010111101000011011010111100111101010 1011000110011110010000010111000000011110000001011010001011011010110110010000110111100111110110101011010010101010011011110011010101101000100110011000100010110010011111001111101010111000111010000110100000100001110011001001100101100110000110101111111101111100101111100000101001101101100001011100101110001000100000100101110100111110000100010110101111100010110001011100110110100011001001110101010110001000 1100110111111010101010011011011101110010001011010011111010100011000110111110110010000111001110111110100011110110111001110111000110001100001001100101001001001001110110100000000011010001100010110011110100000100000010011010000001011001100100110001000001000000000011001000100011100101010010011100100010010110111110110011101001000110100100110010010100001010100111110011010110000000101001010101100000010001 0000111101111111111101000101001000100010100011011110100010100001000101000001001000100111010011110110001010101001000000111110111100101101000001100111100011100110100101100110010000101111100011111100000101011001000111001001010001000000111101100001000001100110101011101011110011110001000010101001100001010101000111010110110101000001111101000100101011110101101110011001011101010101111000000001100011011000 1011100101000001111001011110001101010001011001110010011100000111011100011000110011111100101100000110000000111110100001100000110100001100100110001001110111110000110101001101101000101010001001000000011110101011000000100001000011010100100101101010000000001111011110100100101010111101110100000010110110110101100111100110101100111000110110001010101110100111100010010001111110100000100101000100010010011100 0100110110101110111100101110001001101010000101011111001110010100010000000110010110100111011010100010100100001101101101001100000000100001000100000000110110001100101110000010001110111110001010011101001110100101010110010110001110000000011011111011101001111010011000101000001000110111001001110101010011111011011001010011000101110100101010110100110000101010111010000110111000100101101101011001001000111011 1000011000000101011010010010111100100011001011000100010110101010110111010101010101100100101100010110011001110101100100101010110010101000001110111110111000001110111011101101001101100010001001100101100111010010100010010111000001110101010100101010110010001010001000001010101000111000000101111011011011100101100111001001110101111011101101001000001100111000011110111011001001110000100111100101011011101000 0111011100101011010101001101011101010000010011000111010100111111011111000101000100101011100011010111000101100001001001111101001000000010111110001010001010101001110110011010101111100001011011001011010100100110110111100010001110110110111011101110100110101100100011111101111001111101001010111010011100011101110010110101110110101010010001010011000110011011101101111010010101101000010100001110110010010001 1010100111000101000111111000001100100011111011011111110110010101011010101000111011110110001111001011111011011000111101001101110011100100000100101100111010100110111000001111101100100000110111100111111001001100101010010011000000111001010100101000010101010101101100010001111010000001100111011101111100101110000101100111010111010011100011110100000110010011011110001101001011010000111000110111101001101011 1111000011011010100000000100011001010111100101000010001111101001101110111011110110100000011010100011110110100100010000001100110001010100000011000011111001100000111001111010110100001010001011011011101010101110110001000110011110000010101010111111111101111111100100101011111111001011010110001010111000101011000010111110111101001010110100100011100001000011111010111101010110000100110010000000011010000100 1000110010111010010011100011110101110001101011011101000001100011010000101110111111010010011001100101101100111000011010101100100100001000011110111011001011000001100111001100000110101100011000101011000000010110101001001101100001101110001101100100100000000001000101011000101010010001001011010101101000111101101001101010111111010000001101000110001000110010111011001011011010001111000101001101010010010010 0111100000010011010011010010011000011000000001110100100111000100001000111100010101010100111110010000110001100101011000000110101001000010011001101101011100000001010000000000100001001110010111001000000011010001011011101000111010101001111111100101101001000001010000010101111011000110101100111111010001100110101101110011100001001110011100100000100101001110111010111111111010000100101110000001000110000000 1001101010101110010100100000010110100001000010110110110010001111100010101111001100011010000011111010001001000100101110110101110011101000000000000111100100111000010110101101110001000000011011110110001111110100110101010000101011010010100100010000101100100110101010101001100000101001000011011001000000001011111001001111010100000010100101101010001010001110011111010001110100100011011110011100101010100111 1011000110110010100011010010100011111111001110101010000010011100011000101001011101001011001100000000001001011000111100111001110100010111011101000101000101000001101000110001010100110001100110110001110100001000110000010111110010110101011010001101001001110010010111101111111111100001001110000110111110101011110010000100111100100110111110001111101101101001101101010011101111111100100010111010000110110110 1000110001100011111000001111100100100110001000111011000010010100111000111101100001001110011001000101001011000111000101100011001111010101011101001011000011000111111111101110000011010111010000100101111100110111110010001111100101111111111011100101001111110110100011011100001000000011000100000010110011001110011011011101011110110100011011100011001001101110101010111111111011000001110011100001100111010010 1010110011010001110001100000110101011001001010010100110001001101101001100001000000010110101010101111000100010100110111111001010010001010100110110000110101000111001000111111100101111100110111011011100011100000111000001100010100000110001011010000011100110111100100101101101011010110101101011110101111100101100001011110110011111000101001010111111110100111111011001011100111110100101011111001001010110110 1110110101100000100000110010100000001001101011001001001011010110110010101010001011111001111010011101111011010101010011101101110111010101011111010011100101000111010100011010011110110001110100101000111100000000010000100101110010101111010011100101101101111000100100010101000011010011110100010010001100010101111111110011100101000000100011010111000100011111011000001111101011101001110101101011101101000110 0000000001011000000111100011110101001100011001110001110000110000000111101110001110111011000111110110100001111010111110111011101101001101011101100001010100111000010111000000011011111110111010011101000100111001011111110001001011011110001101011101100110111001110101010100111101101100011000111011110010100110011010100100110101111100000110111101001011000000110101100101010100100000100000111001100101000010 0001111000001101010011001111001110100011010000110110101000010011010101101000101101110010100110011101101010000110110011000101001011001110001011110111000010010111001000110101100100101101100110101001000010001110111111111100100000100101101110001100010001100011011000011110100100101001101001000000001001110001110111010000001111111101100101101001101011010010011011001001010010111011110001001011011001111000 0011001111110010100011001011000101110111010000000111001001110110111111101011001101001010100100000100011000101110110110111000011011101100000110100001011100111101101111010000101010000100001101111000011001011010000010000010000100011010111111011100110110111101110011101110011110110100100001100010001011110111001010000101000001101100100010101000000111110001000010111001111000000001011010010001001000010100 1000111000100010110011001000010000111010110011001101010110101110010110101010111101110111010111010000011000001110111101100000111000010010010110001000100010010110000000110111010110110100001010100110010011010100011101100010110000010010111000011111001110101100110000110010000100101110011001100101001101101100001010001010001010000001000101010101100010111100010001001110000010100110011111100110101011001010 0011110100111110111100010011011000100010011011110100100101001110010111001111111010001110001011111010000101110010001100011011101001000100000111111001000111010010100110001111100100011001111111111110011111011101010100100101001100101011000101100101111101100000101000010010110111011110010100011011111001011011101100100001000110101100110101001101110100011111000010100100100110110111000000010001001101011110 1011100110111101000101000000111011100101011001111010101000000000101110111011010010111000001100101010110011100010000000010000101101011101111110100110111100111101110001001010000000001101101100010110100110011110101111100111011100110001110101101010100000111101011001010000011011010101111000001001101000110011101011110100111011100010001010100000011001001100001011101101111101111011010010001101001001000110 1101100101100000101011001011011110101110010111001110101001111100011110101101011100011101101101010001101001110111000010010111111010101111100001100001010101000000011011101111011000010001011010010000111100011011100000111010001111010000100011110001000110000001000100000100111010101010111010110010110000001011100010110111110100101101000110001011000001101000000101101010010010011011000110000111111110110110 1111000110001011001101000010101011010100000111101100100101001100000100101101011010001011110001011110101010110110111000100100000000011111101000110101001001001110101001011000000011110011000011011100111101100001110110111111010100100100111010110100100101010001000010001111101110100100011100011011110011110110100100110101000001010001010110001100001110100001110000010101100010001000001000000101000110001000 1011011000010000000011010000110100000011011010101110110010101101000001010101110111011101100011111001011011111001111110100100100101011001010000011001111011111100100110010100101110001011101000101011101000110001000001001101010101101001010010001101010110011101001001010111100000110010101000111110001110110001100011100010010111101100101100101000111110100011010110011100011000011011110110100011101000101101 1100010100101000111011101000011000100011000101111001100101100010000000110101110100111011011100100110110000000110111110100100110101100101100111010000011111111010011100001111101011111000100100101011110010110010110110101111100011000000111100000001011111100000111110011111100010000000010001101111111101001110011110010000000100001100100111110011011001010100010101101111101010000011001110001010010100000000 0010000111111001101001001111011001111011011101001010110001100100001101110100111001001011011000011110111000001000001000111001000110101000111010010010000100110101100100010111100111000011100000001010001000011110110111100001101101011100001111110001100110111011010111001100110110011010011100000110111100111100100011011000011110011101111110111101011111110111101010110111100111111010010010110000001110000010 1010100010110110111100010100010101010000001011100100111100101111111010110011100110100000111010001010101101100000000000101110110100001101000000010011110010011010111110111000011000110001000010001001010000011010110011010111010101100101111000010000010100111010101100110010000010001001100110001001111001011000101000000000110010110011110010110100001110000111101001101000110101101000010000100001101110110110 1100100001001010110011000101001110100100101111110100110000010101110000110101111001011000100110100001010001111000000011111000011011101010000110110011000011111000001010000101101010001110001101101001101100100010101011110100110111101110111101010011010011111011101110000111001010000101011000100100111011000000101110110011111011111000110110110011111011010111101111010000000100101100100001110111110100110001 0101100111011001011111111111001101010010110100111001000110001011101001011010111101010010101100011000110110111010011111101110000100101101011010111101010000000010111110011010011001110011110010000010001100001000101000001101110111010010000101001011110101000000011100101110001100110011010011011011010000111011001010110110011110100010100011101000010001111011001010111001100010100100110010001111000011000000 0111011101110111011010111111000001000111000010100000010010011011110010000011111011011011100111001111001101011100001111011011101101010111010101111000010101011100011111100100000111100001111010111010100100010111010101001100100001110000001100100011100111111100100000011011000110001001000111011100011111001010000101000101110000101110000100001001100100000110001110001111111000100111000101001001001100111001 0111011000111011101100100110110110101111000101111010100001110010110101101100011101001010010000011000110100110101110010000001000000010101110010011011000110011001111110010000101110101010011000000010010000110111010101011110000011001011100100101101010111010011011001001101011000110011011001011100011100110110101001000110100001110111111101111111010001110111111001111000111100110111010010110100000111111000 1110111011111111101010011000100110100011101010110101011110111101010010000111100010000110100101111111000110100111100100011110000001000101011011101101011101011001011100101001110100011111010010111111001000000111100010100010110001110100101010110100100111101110011110110011011001010001110111001100000000100011001100010011100000110001001101110010001000010011101101001100010000000010011001010011001001000010 1010000011100000001111010001110100011001101101101100000011011000010111010010011010111101001100100000110001100111101110100011011011100010110011100011110100000010010111101001111001111011001100011111100001111010011101001101000010110110010100101100001110000101010101011100111100100101011001011010001011001101110100101101100110001100000010111011100101111101001100010001010011000101100010101001111100000010 0011110000001110101100111010001100000000010110011111001110100111101010100110000010111010110100001100101010110110101101111101101100110011110011111001101010111011011011011110010110000011010100101001101111101000101100001110101001010100011111011001010111100111000001111111000101000001111110010001011101010011000011110110110100010001100010000100101001010111000000001001100111010010100101000111010011100000 0001100110100110110010110000011110101100010110001010000100000010001110000110001010000101010101011111110011100101101101010000111110101001111011101000000101110000001000100101010000000000111000111110111111101111100001011110010111110010001111010101001000110111110000011011100111100110110110011011101001110001110000011101111010001111000110101100011010101000100101110001001100011100001010000010110111000111 1000110110001110100101000111111101111101110001000000011100010011001010011011010001001101100101101010001001111010101110011101110010001110001100100100101010011010100101101100110101111110000111101111001101110111110000110101100111111100010100111110110011110001010000000011111110100111000011111100110111110001011100111100100111001000001100111000010110011110011010101001110010101111010111110111011001111111 1010110101011010110101101011110000101010100110100100010000010101010101000001001100111010100010001011011011000110101000001011000010111001101111000000010000110110011011001110100110001001000100100000100000010101110111010101010111010001100001100001111100110001100011100010111011100011110110100010100000001010100101101101111101000111110111100000100100000100000010111001100000110101011000111100101111111101 1010010010011110001011001111101001110110110000111100100000100010110000001000010110101110111000001111010010110000000110000010110001101001111000100100001111011001100111000010100111101111010011001111011001100000110100011010001101110010101101000100111001111011111010001100010001000000010111110100010101111011010010100111100000011101011010011110110111101010010000111100101111101101111001110000101100000111 0000001011010000011111101100000101000110100111111100000100110110110010100011111011011100110011101100000001000000100010110110110001100110010000000011100111110011010000100010010011001111100000101111000001011100000011101100011100111111011111101001101111000110001000011011110000001001110010100011111001011101001001111010110101010000101111011011100000101101000000010111001101101100100001110111001110110100 0100110100010101011101000101100101010000011111111100110111110110110110000101110010111010011101101010101001001111110000000101100110100011001001000100010110100111001001101011001111000110111111101111001100000001011110100010100001010100111011100101010010101000011011110011101101110010010111100110010101010100001111111000110100010100010101000010001010101101101010100110101110111011110011101001001100101110 1000101111110100001100110001101000100101111110100110011001001011111001111000001101111000110101101000010010000010001000101111110110100011101100110100111100011001000010100011010111111011001101101001000001100111000101011011001101001010111010001110111100110110101110100101111011000111010111011011000010100101010101010101011000011101000001011110100110010000010011100100101011100101011001001011111011011000 1110111000101101011010111110101100101011000001110011010110001101010111101011111110111000101110111100000011001001011000110100010111001110111111100001011001100000001000100000110101101010101100110100100011101111100010101011010001111111111010101111000000100100110110001000111001101100011101011111011001101010000100001010000100001101010001101101000010111111010010000010101111100010110011111001111010010011
cTrader AlgocTrader

【cTrader】VS CodeでcBotを作る方法【Automate】

8/11/2022 8/13/2023

この記事の内容は古くなっています。
cTrader4.8以降ではより手軽にVSCodeが利用できるようになっています。(記事内追記部分)
またcTrader5.3以降では組込環境でもMonacoが採用されたため、そのままでもそこそこ使いやすくなっています。

cTraderがなくてもcBotが作れる!

cTraderなしにcBot作る人なんているのかわかりませんが、まぁとにかくcTrader4.2からはcBotやインジケーターを作る際にcTrader本体は不要になりました

これにより開発環境の縛りが一切なくなったため、普段使い慣れた環境でcBotやインジケーターが作成できます。

ここではVS CodeでのcBot開発方法を紹介しようと思います。Windows前提で話は進めますが、MacやLinuxでも適宜読み替えていただければ開発自体は可能です。

あえて「VS Codeで開発したい!!」と思う人なんてVS Code使ってる人以外にはいないと思うので、VS Codeについては詳しく説明しませんし、この記事はある程度プログラム経験がある方向けと思って書きます。

 

cTrader公式ページ

なお、VisualStudio Codeを使った開発方法については公式でもちゃんと説明があります。

Using Visual Studio / Other .NET IDEs – cTrader Automate API

以下はこの公式の情報を参考に手順を解説したものです。

 

(2023/8/13追記)

cTrader 4.8以降ではVS Codeでの編集に対応済み

cTrader4.8からは組み込み開発環境のツールバーから「Visual Studio Codeで編集」を選ぶだけでVS Codeが利用できるようになりました

下記の手順は基本的にcTrader 4.7以前をお使いの方向けの説明です。

(cTrader4.8以降だとしても.Net 6 SDK & C#拡張機能までは必要です。)

 

VS Codeを使ったcBot開発

ちなみにIndicatorも最初にフォルダ作る場所が違うのと、コピペするテンプレートが違う以外は完全に同じです。

前準備

.Net 6のSDKが必要です。SDKだけ入れてもいいですが、何も考えずにVisual Studio 2022をインストールしてしまうのが楽です。

Visual Studio 2022 の新機能 | 無料ダウンロード – Visual Studio (microsoft.com)

画像のCommunity2022をクリックするとダウンロードされますので、それを実行します。

インストーラーが準備されこの画面がでたら.Netデスクトップ開発だけチェック入れてインストールしておけば必要なものが一式入ります。

 

VS Codeの拡張機能

VS Codeはインストール済みですよね?

C#拡張機能が必要です。入ってない場合は追加しておいてください。

必須の拡張機能はこれだけです。

この先も一応説明しますが、この後の手順は自動化スクリプトを用意しましたので、よかったら記事最後のダウンロードリンクからどうぞ。

 

フォルダ作成

マイドキュメントのcAlgo/Sources/Robotsに新しいフォルダを作成して好きな名前をつけます。HellocBotとでもしときましょうか。

そしたらこれを右クリックして「Codeで開く」を選択します。

「Codeで開く」がメニューになければシェルでも開いてcode ./HelloCBotとでもしてVSCodeでこのフォルダを開いてください

 

プロジェクト作成

VS Codeが開いたらターミナルを開いておいてください。Ctrl+Jで開くはず。

あとはここに公式にある通りのdotnetコマンドをひたすら打ち込むべし。

dotnetコマンドはVisualStudio入れてれば使えるようになってるはずです。(多分SDKだけでも使えるはず。)

HelloCBotの部分は自分でつけた名前に読み替えてくださいね。

dotnet new sln
dotnet new classlib --name HelloCBot -f net6.0
dotnet sln add .\HelloCBot\HelloCBot.csproj
dotnet add .\HelloCBot\HelloCBot.csproj package cTrader.Automate

順番にソリューションの作成 – クラスライブラリプロジェクトの作成 – プロジェクトをソリューションに追加- cTrader用のNugetPackageを追加しています。

(cTraderのcBotやインジケーターの実態はライブラリなのでクラスライブラリプロジェクトとして作成します。)

 

テンプレートをコピペ

Class1.csというファイルにcBotテンプレートをコピペします。Class1.csという名前が気に食わなければ変えても構いません。

このファイルがcBotのメインソースコードになり、cTrader組み込みの環境で開いたときはこのファイルが表示されます。

ここにcBot用テンプレートをコピペします。

using cAlgo.API;

namespace cAlgo.Robots;

[Robot(AccessRights = AccessRights.None)]
public class MyRobot : Robot
{
    [Parameter(DefaultValue = "Hello world!")]
    public string Message { get; set; }

    protected override void OnStart()
    {
        // To learn more about cTrader Automate visit our Help Center:
        // https://help.ctrader.com/ctrader-automate

        Print(Message);
    }

    protected override void OnTick()
    {
        // Handle price updates here
    }

    protected override void OnStop()
    {
        // Handle cBot stop here
    }
}

インジケーターならこっち。


using cAlgo.API;

namespace cAlgo;

[Indicator(AccessRights = AccessRights.None)]
public class MyIndicator : Indicator
{
    [Parameter(DefaultValue = "Hello world!")]
    public string Message { get; set; }

    [Output("Main")]
    public IndicatorDataSeries Result { get; set; }

    protected override void Initialize()
    {
        // To learn more about cTrader Automate visit our Help Center:
        // https://help.ctrader.com/ctrader-automate

        Print(Message);
    }

    public override void Calculate(int index)
    {
        // Calculate value at specified index
        // Result[index] =
    }
}

 

cTraderで「新規作成」したときにでてくる初期テンプレートですね。

ここからあとは好きに編集してください。

 

ビルド

ビルドもコマンドで一発

dotnet build --configuration Release

ソースコード付きならこう

dotnet build --configuration Release -p:IncludeSource=True

 

出来上がり

ここまでで(Windows環境なら)もうcTraderで使える形で配置されています。

実際は作ったものを動かしてみないとなんとも言えないのでcTraderを一切開かずに開発するというのは非現実的ですが、ちょっとしたインジケーターであればAutomate画面は一切開かずに作れちゃいますね。

 

一つずつコマンド打つのが面倒な人へ

「VS Codeは使いたいけどdotnetコマンドで一つずつ作ってくのめんどくない?」という私のようなものぐささんのために(というか私のために)コマンド一発で新しいcBotやインジケーターのテンプレートを作成するスクリプトを用意しました。Windows専用です。

 

ダウンロード方法

下記リンクをクリックするとブラウザ上に中身が表示されます。コマンドが羅列してあるだけなので、なんとなく何してるかわかると思います。

(2023/5/7 追記) PCに.net7が入ってると7を使おうとしてしまいビルドできないため、フレームワークを.net6指定にしました。 (追記終わり)

使用する場合は右クリックから「名前をつけてリンク先を保存」を選んでパスの通ってるところにダウンロードしてください。

 

使い方

ctindi 新indicator名
ctbot 新cbot名

このコマンドで勝手にプロジェクト作成からテンプレート挿入、VS Codeを開くところまで一気にやってくれます。

ついでにビルドタスクも作るのでVS CodeでCtrl+Shift+Bでビルド可能になります。

 

使用上の注意

コマンド実行用です。ダブルクリックしないでください。(多分何も起きません)

また、実行には.Net6 SDKとVisualStudioCodeがインストールされてる必要があります。ない状態で実行すると中途半端にフォルダとか作られた状態で落ちると思いますのでご注意ください。

ざっと作って自分で使ってるだけであまりテストしてません。自己責任のもと利用いただけるようお願いします。

なにを血迷ったかbatファイルなんぞで書いてしまったのであまり編集したくないのですが、おかしなところくらいは直しますので言ってください。

使う人が多いようであればなんかしら別の方法でちゃんと作ります。

 

(2023/5/9 追記)

Windows11での注意点

Windows11ではOneDrive同期が自動的に有効になっており、そのままだとcAlgoフォルダがOneDriveフォルダ内に作られてしまうことがあるようです。この場合はbatファイルはそのままでは使えません。(動きますが、ソースコードが別のところに入ってしまいます)

そもそもこの機能、無料のままではすぐに容量不足のエラーに見舞われるやっかいなものですので、OneDriveに課金予定のない方はWindows11を使い始めたらまずはOneDrive同期機能をOFFにすることのをお忘れなく。(私は気づかずあとから面倒なことになりました・・・)

OneDrive有料会員の方は同期機能を使う方もいるかもしれません。その場合に上記batファイルを使うなら内部のフォルダ名を書き換えて利用してください。

 

(2022/8/17 追記)

新規作成後インテリセンスがうまく効かない場合

私の環境だけかもしれませんが、新規作成後にomniSharpのエラーがでてインテリセンスが効かないことがあったので、解決方法をメモしておきます。どうもスクリプトの使用有無にかかわらずときどき起きる現象のようです。

  • dotnet clean
  • obj/Debug下の.Net6.0をフォルダごと削除
  • ビルド
  • コマンドパレットから restart omniSharp  する

これでインテリセンスが効くようになるはずです。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori