0010011100010101010101100011110110111111010001100111011001001011110000001010100110010001010110110110111001101101010100100111001001111101001111010010111111000101011100111100111011110011101100000001010111100011110011111111101111111011101010110101111010001111100101100011100100001000000010111101010001110100000111101010111011011010000110100100001011010000011111001001111011001100010110010001111101011110 1111100001001110101100111011010111110011001010100010100110000110010000011000111100010010111110010111010010111101101001001111110000000101111011100100100110110000011100101101010100001110111010010011010011110010110101101000011111000010110001000100110011110000110000111001111011111101000100000101001011110101000010000110010011111001001001001100000010000110011010000011011011101101101101011000001011100000 1000101011000110111101000001110010010100001101110011101111110010100111111010001101100110001000100011100001001010110000000111110111100101111111101111010101111111100111000000001011101110101001000100101111100101010100110101100100101011100010110100110111100000110011101001101111110001001011110000001001110100000100111101110001010000100100000000101101100100110110111100100111010111101000010100110000010001 1110110100110011111111001001010110100000110000100000001011001000100101011000000101010101001001100101110011100010101111101001101000100111110101000001001110011100001100111001110011011001001101011100111001010101100001000001001000100111001101000110010111011011011000001000001101011101110101111000010110010000000011000101011111010101111001100000011001111100001011100010001111101111000011000100000101100101 1101000010010110000001010111001110010110001010100111110100011101011101010010001110010001010000000011111010010101011001011100111001111000111010010001011100001010101101101111010011001010110110100111111010110101010000100101001111111111011111000011100111000010011101100100111111010011010110101011000011010011001010111011010111011100001101111010011100110100011100010100100001110101011011001011001001001000 1010010111000001000110111000000101010011110101100101000101010100100000001011100010110011100101011111011011100000110101111011001010001101011101101000101111010000100011111010010110000010010101001011111001111010000010001110010101101111010010011000010100111011001010000010101011100000000000001000001101000010100100001000111010101010111010001110101010001101100010010010011101000010010100000010100010000101 0111110100110101011001011101110001111111110111001001001111011101001111011101110011010110011110100110011111110000000100110100011110010101100100101010100001110001111111111001001001111000111100000011001000111110101010011000110000000101001100101001100111001101100110100110010100011010010000110110100110111010101001001010110100101011111111100000110111110100010000101111111100101001000011101100101010111111 1000000101101011001011100010101011110101011000100000010000110111011000101110001110111000110110010011111101011101100100001010011001001111101000001110001111100111010011011101101000000101111001010001111110011000100011000000000011001000100111100111001010101111100011001101011111110100000110100001000111110101010011110100111100110001111000111110010010000111111000110000110110101101110000110011110111001001 0010100100010010010011100101110110101111011010010101010110100100010010000011110011111111000101101110000111100011100011110011001011000010101000100001000100100000101001101111111111101100010011010011111101010001110101111011001111111000111111000000110111101000111111011101101110100010111110001010101000101101101011101100001110001000100100011000101101110110000100011110011010010001010000001001000000101101 1001001101100000100001101010011100101001110000011000010110110011101101011101101011001010101110101001000001010101100001100000100001110110110001101101000101101100000100100110101010011011010011111110101101011011100010000011010100000111010010010001011110011000110101111110111011111001011100010100110001000011011001011001000100100100000000110110100001110100110100100110111010100001110101111111001101100000 1001111010101011110101001010100100100101111100001001001000011111110110010101111011001110100001111011010010111111111100100110010001011011111111010000100101100110001101100100010101011110111010110001011110010100001010111111111011011001010111111100111111011111111000100000011110101101100111001000011000111011001101110111101001101011001001111011011011101110001011010010110111011000000001111100100000010101 1011111000011001000101101100101100111001010000000011100100101110000001011011011111011010110111101100111001010000101101001101111111111101011001101110001110101000100111000110100101010100011100111000001101001011100011111111000000000110001000001110101011110111000001001110101010101100100001000110101000100100100110011010111000110101010111110100111000110011110111001011010001000100100001000110010001100100 0110100100011110001010011011101101110111110000010110000111110011110110001010010111110010110011011011110010100011001101111010010000000101011010010111101001001101100010010010011110010000011110000110011110110010001101001010011101010101000000000100001101011001011000100001110110011011010000000000010111111011100100110010011010101100010011000101110000110101111010101111011111101010111011000000101110001110 0101010001001101100001110010111000101001000011110011100010001110110101100101110011001010001000001101000111010011010100101110000100110110011100010001001110101011111100000101010011100110011100000000111001010011000111011100100110000111001010100001101000110100111011001010000010001101010100110001001110001010011101111110010110000100101000110100111100110011111010110001000111100100100001000000110000111001 1000010001100010101000000110000100011101100111100011010011110001101010001111001000000000011111001010111110010110111110000011000001101011010101110011110001000100101010111100001101000011001100111010000101001011110001000000011000111000100110010100111101001100111101110001011001011011110001000100110100101010110101011010000101010001101100101001011101110000011111111011101110010010011010011010011011000110 0110011001111100100011101100001001100000110000110001101011101111000101110111011101111100001010001110001110010101010011101111111111001111101100001110101001100110100110101100111111011001011000000001100011010110100101011111011000010101011011110000011101000010110011011010100100101011101100110011000000111001001010000000110111111100111001000010101011110111110010001000110110010110000110101110100000111101 0100001001011011001111101001001110000010110100011001001010001110111110101111100110000111101011011011111110010010000000100010001100111001111110000101001000100101011010100001011110011011011010111000000101111101000001111100011100100011101000011111011111111111110001110010100001111001001001110001110000101110101010000000000110100010001000000010101011111011101000011110100001110111010000001101011010011000 0001001000010110101100101101001110101111100101011010101110110000111011100010110100011010101000111000110110111001011110101011111111111111111111101111111000000111001000111111100111101011010101001001101000111101111001001010001110000101100100100001001011110100101111101000001110110110111111010101111001001100101111011001001110100111100010010011110110100101000110111011100011010000011011011101001010000101 1000000010001000111100011100000101110001111010000001000111110111101010001011111000001100100000100100010000001001101111111110011010100000001100100100111100011101001101110000110001000000111111000011000101101001001000001111000010001001001001101111010111111000000010100001010010000111000011111000010011001110101010111110001010000010101111110101011111011001001011001110011011111100100011011101101011000010 0101101101101100110001101000101111100011000010110100000110000101001001000100000000110010000101010000010000100011011101001101110111101110100001100100101011111100010100010110000000011010101110010011000011000101111110101010110110111010101111101100101000011000100001110111000111001100101110011100100100101011010110110110000110101101111010101011110011010101000101111011000001101111001000000010100011101101 0100010101010101101110011111110111000111111010011111101111110011100001101110101111110101011110101000001010110001010001110101000010001001101001010100100110111010011101000000110000111001101110100000001000001000111111001000101010111010001011011111011110101110101010001110000100100111010101101101111001010011101111011011111010110010001110010001000111011110000100100101101111001110001100110011011111110010 0000000000101110011010111001111001000100100100000100100000001001000101010011100111100010011000000000111010100000010010111101011000000101000011100111111001010100111101011000110010000101010001010001001101010101111010010110011000101000011101101100010110100001101111110101001010011111110001001000110010101100111000111110010000101000100101001000000001101100011000100111110011011110010011001010011110110101 1010010011110100101000100011010010000100001010111110101001111010100100110100011010000011010010111111111010001101011110011000111001000110010110010111110100111010000011111011111111001100001110001110101110000001100011110100001110011111011001000111011101111100010011111010010111110111101110101110001111001100001110100110111001000001111101110111001110010111011111001110001010000010001111001100110110111111 1001111000010010110010011111110010010001111101011001110010000110100000011110000101001010011110100010010000001111001111101111101100010110010010111111111101110000101110110110111010001110011101101100101011100101011011000011001100111010011100010001110101101001001000000010001111111111001111100000001000101001100111001101110101011101001000101001010111110000101111111000100111110010001011000111100010011111 1110001110101000100110001100011000000001011101011010000000101001111111101110110000111001111000111100000101101100000001101010010010100111110011001001101111111010100110000010000010011111001111110011010011101010111011100010001110100011000011010111110000000110011010111110011110001100101000011111110001110001010001011110011111100000010100110000000000101100110011111100001110011000100011100011000010010011 0110000011111001110000111110111011000000001010010100010011100000010011010111110111011101111100011101011101101000011000101111100001010011010100111101100011001000000100110000101100000010111110101110101011101000001100001111100101010011010010100111101010111000100110000111110010101000101011000001000010111001110101110111110001111001110000001110111100010110110011011101101111011000000101100011110101101010 0000100100100101100010000111110100010011100111101011000110010000111011010101110001111010011110100111100010001110011101100011100010001000000110011111010111101010010111111111001111101010010000011011111000000000101011100000001100010010111010111100100101011111111011000100100011000100111100011101011011101110101000011101101101110001100111010000010010001111110010110111010111010001001000001110011110010010 0101010100101111101011010000011100110001100111100001101111110101101101010000001101010100101010000101100101101001111101010100011101000100011110001000110001111101101100001011101111010001100011100111101001110101101011011001010011101010101110100010100111001101001011110100001101000100011011100000111001001011010100111001111011011001001100111010000110011110101001001100001100100110100110100001001011010111 0110011100000010000101010110111000000010000110100110010001011111000111100100111111110001111010000010000000011111001000000101111111000100010101110010010011010011100101011000101011101010100011100100001111101101000111110111111101110000010000100000110011010111010010100101110010010110000001010000001010101101001110100100100110001010100001000011110100101110001000010010001111101100100111111000011011001100 0011111101011011110101010101000101100111010000110010100100100100011110110101011000000100111001110111000111011010111100111011101101101101010001010010111101111011000101101011111101100100100101110110100100111010000111001010111111010001110101001011100111000001100001111100000011010010001001001010111000000111001000101111001001100010010101010111000010111100101000111011100111011010101111000110011011110111 0001011010101000100011010101011010111101110100100100110010000101000010011000011111000100100011001100011000001111111101010110100111000010111111110011111101011011011110101100100100111001001010010111110011000011111101010001000100111001110111010101110011111000010001100010000100101101101000101000010001100101110000010101100000011011110110111000111111110001101110111100100001001111110001100101000001000000 0101111111111111000010010101001110011101111111110000010110010110110100111101001111001101100100000000000010000000000111001110010100111000100010011001011100000000101111100111111100000111100001100010101011010101100111011000010111010101010101001100100100010010000101110011100011100011010110001111111001011100010110000110000011110111010101110000000110101100000111010111100101001010011001101110101101100000 0000110000011011101011110010100000011101011101110011111101001111011111000011000101000100010100100111001111010110010110011111101011100111110100100101100110011010010001101001100011111001011010111110100101000011001110001110101100000110001100000111000010110110000100111110100111000100100110111001110110001111100011101111001110010111011110101001111010101101001010010110000010001001000010001011010110011100 0110011001010101100011111111011000111001011111110110010110101100110000000000001100101000100010110110000111010110100011111000010110110111110001010100010011011101011000101110100111011000000111110100001001100000011111100101011111011110110011000001000100001111110101101101100111000100010100100011110011110000110111010011001101100011011010011101110101001011101110010101001110001010000011011011000110101011 0010110000011111010110100001011001101010110010101110010110111100011110101001000100111111100010000001111101100000111011110011010011100000111100100111010100111001001000011100100010011010000010111010011110010100100000001100110100010100111010111110110011010110010000000000001111011000101001110101010010111101101100011010101001101101001111001000001101101000110100001100010001011001001011010101011111001000 0011000111011000000010100001010000101010110011101001111001000011100100111101000101100110011000000101001011011011111110010010000011001111111101110000100010010001010111011011100111010111100001001011010001000101011101010010101011101010000000101010110101100001111110100001100000111000111001100010100111000010100000001001110100110001100110001111010011100011000111100111011001110000001101010100000110011011 1110110011011000100101110001001101010010110111011100111110010100001100100111111000101001010100110000111111000001100010111101110100101001110010000001011110101010000001111101001110111011101001100100011011000001111011101110010011110111000111011111001010011100101100010100000011000000010101011100100001110010110101111010010001000001011000011100000011001011111010000011101011010010100010110000110000111110 1111101010101001001001010001111110110101010101001010110001100010101000100010101100100000100101101101001100000101100110010010010000011111010110010010010010010111111110001000111011011110010000111101010111010001001011000010111100000110100111111100101000000011101000000110000000100110111001001110010000100111001101010001110001001010100110011010001100011011010101011001011001100011110101110001010100000100 0000001100001111111111101110110001010011110101011010010010111111000111101011101111010110001110011110011100100000100110001010001110010000101101011100011011110000110101110101001101111010001001111010110011010011111010000100000100100111011101000100011010111100101011101011100010111100000000100000110101011100111000001010110010101101011001010011111000100010001001101000010100000000011001101101011111100010 0010010011111000011100100001101010101011101111110100101111100101110100110011001011010100001111100111110111001011110111101010011010111111010000100010110010111000101100111011001101110010111010110111111100000110101100000110111010001100101111001010110000001000010000100100110111101100100110011111110101100111101000011101111010001101111000100110111011001000000111001010100111111110111011000110001000010100 1100010101110011010111111110101011100001010110011101110001010011001111101100101000001010001010011010010010101110010101000110100101010110010011010010011000111000011110001111011010111000101011011000001101010110100001001110100101010111001101010010110101111111111000100111111100100100110010010011010010011010000011101101010000101111011011000001010001101101000110101101100011010000010101000001110011100101 0111000101110100111010111100010101111011110100001100000100010100100011001011111101101100011010011110101111000110101000000001111110100000101111101101001001000011110100100000001101110101100110000000111000111100101001101011011100111001000000111110010011010011100101111000110101011110011011101100011111000110110011011111111011001101000100100010110010101011110001000101110110011111001111110101011101111101 0110110010101111101011001100110101110110111000000010001100100111010110100001101101110010111000001111000000000001010101111001110011011011010001100110001001001111110110010100011100110010011010101100010110101000111100000111011100111101101011011011101101110101000100110110100111100110111010100111111011110001100001011111010000110111001110101110100100011101100111111011000111101010001010111011011100101000 1000100110010110010010001010100110001111100010100001010100110001001110100001101110111100011010101010010010111000101010100001010000100100101111111000010011100000010001011111101110100110010001001111101000110010110100110100011001110010010110111111010101101101111011000010010100011101101000100111110010000000011001111100001110011101000101000010101011011000110111110001110101011011101011100111110110100101 1110011011001110010011000100101001110101000011000100110011001111010100011010011010001111000000101100100011101001101101100110101110001101110101110011110111011000001001111011000111100001011010110110001010001101000001011110101010101011011001011011100010001001010110110111101011010111101000100100001010101101101101000111011000001011001110000001111101100101010000110000101001011101101101110110000010101101 1111000100101010111101011011001010000100011101010001010110011101100011100001110110100110001111110010100011000000100011011000011101000101010011100100000010111101100001110100111110101111010001110010001010010100000111111011011111110000001110011101001011101010110011011110010010110000001111110010110111000110111110000111100010011101110010101111110100001010101001101010110011000010110110000100001110110011 1001011101101010000010010000101101100001000010000110001101101010100000011000010101001001111100110010011001000110011101100000101110010010011011100010100000011111011010111000011101011010001000110111100000001001100011100100111011100000101111110001111101100000111011100001010111100101111000111001000111110010010010010001010011000110110011000101101101101010101110010100010110010110100110110101101101100100 1101100001110100000010011111101001001010010001001000110110011100101000101100000011100000010000100010111111001100110001010111100110001101101111111110110011000111110100000101110101011001100011000110001100100000100010001101111101000100110101000011100010010010010001101011000000011010110111010000011111000000111110101100110010011010001100101100010011111001110011100111101101000011010111100110110001111100 0110001101001100100100000010111101100100101001011010011111010001100100110001110100010111001010100111100000110101001011111111001010110010001011000100110001001000111111101000111111000111100011111111110101110010110100001011000110010010011101111010110011001001010101110100111001010101110110001111011000000000100101011001110001010110001011100110000111110010001111110001000010111000011000010101111100110101 0000011101000110001100010001000101111101110110111101010001000001010010110111111110110000010001101110100100010010010000100101000011101110011111110010001110101011000011101101001011101000011000100011101101111100001111100101110110101101110001111000000011101111011010000101010110001101101000010110000111100101011101001000110110100001011011110100000100001111101001011111010111001011010111100011101100101110 1000100010110000010110000110101101101011110000001111110010010111001110100000101110011110011000011010111010000001010000101101110000010000111100011111001011101101111100100110101001101010011110110110011010011111001111010100011001101100000000011001100001011101001110101001010000101001010100101011011010100010000101010010010000011110101100110000000011001000110111100110110000010001000011100111111101000001 1111011101100101111100010111010101000010000001101111111100010100101011111110111111101110010111010100010111101101001111001110011010000011101110011111000111110001100001000001010001111111100111100001010101010111000100000100001100011000100111010110100101111111111010100011010000100000011001001100100010100101001110101001010111010001101011000011101100101111100111111100101100001110000001011111110101011110 0100100110000110111101000111000101100000110111010111110001111001011111110110111101111010011110101101000001010001000011001000110100111011111100001110001111111010001000010010101100011111100011110110000000110011111111100100110000111111011110100010110010000110110010101011101100101001111011001110000011111001101011010111110010000011010101000111000010111010001100001010100010101111110110011011100010100101 0010011010100011000001110000111101001100111101110111100111111010000111011101100100010110001101111110110100110011001101111111101111011010011011010000100100011101011100100101111011101000010000101001010110101000011001100001001011111111001000101110110000101001011001011010111001000010010010011111010111111110000011111100110101000010010100011011011001111010011011111101001010101000011000100111111110111100 0110000001001100111111010011000010001001111111111100011110101101110011111000100011111110010001100110110100110101111110010011010101111111000100101011110100101001100101010111011011111111111000101010100110000111010100001100000010001101101100110001111011111111110010101110001110111011110111101011011100111011000110101010100110110001011000100111110010000110101110101101111100000100101100111001111011011001 1100100000111001000010000010001110010010101010011000110010111101011110000000000000011000101111010111111011110000011011110110101000010000011111101110010010101010010100100011001010110110110100101110111010001100001010111000010110101000101110100010001011001111111000010110001100111100100001010001110110111000011011100001101100001000111001000110101110111110001110011101000101001011100000110100110000101000 0101110110111001100111111001001111110100000100110011000011101111110011000000111010101011101000011101000100001100010000101110011100011001100100110111011001101110111100010110011000011101100010001110011100000001101110011100101000100100100011111000111011100110100110001111111000000011111001110001010111001111100110011100000001001110001011011011110100110010110010010100001000011000010011111101111011101010 0001110000010001111110100000010000111101000011110101110110101010001001001011000101101101100001010100011001100111000110101011010011100001101010000001100000000101000100101001101110001110001000000110101000111001000000110110001010101011101101001101101011101011010111101100100100001110001101011110001011000100001110101010011110010100111010111010000110011111110110001100011000100110001000000010101110001110 0001001101010001011011101001101001111011001001101000010100101010001111110001000100101100001001011100111000111011110110000111000101001000011110000101000001000000101110111000011101011011011100110100110011010101001110000100100111101101110110101101101100101110110110010010000110011101101000101100000001101100111000000110111101010010111110111010010110001010110010010101011110110011111010100001100011110000 0010011111001100011010100010001101101000110011110101110110011011111100011011000110011100000000001110100110010011000101100101110101110001101110011001110111110001011100011101110010111110010100010001011000111100010101000110011100000110010010000011101100100100011010001000110001000111001100000110110000100001011111101100000000111011011111101001101110100111010111100010010010011011010111111101111010100101 1010011111100000101010100011010010111011011000100110110011000000010100110010001100111000101000011010000001100101111000101111110010100100101011011110111110001101110110110111000010001010100001111110100010110000001101000001101000111110000101110010100110110010011000111000100001010001011100101010100001001100000110100111010000000001001000100010110111010110001111111000100110010011110100110110001010101011 0001000101100000010010100100111011001001111110101101000010001100010010101110101001111010111111010010010111111001011110010000000010100010111000110100000101110011111111001000011111001111101111010000100101101010100100100001001000010111110111001000001100000010010001011011110000000110000000001000110010001001111011111010001010010010110100000101111011111011111011111011110110000111000000110111010011100110 0010110010101111111101111011101101111100011001110000110111100101110001110101111010010110101101111011011010100001110001000001011110111000111000011100001011101010110111101101010100110110011100011100000110100100011100100011011011110001011100011111011011100100001100011011000110101001010110000001100010110101100101011100100111111011100000110100100010100110001111110010101011111000111111111101100001011110 0100101101000001100011010010000101001000100111110010001000010010110001011001000011011011001001111001110110101101010110001011000011110110100100101110101011111001011010101110011100101110010101100101101000101010000101101100110010111001101100001101101010011111100011101011011100000000010110001111110101011000101111011100000000010111010010011010111011100010100001010100111010000100101111101010000011000110 0001011011100110010111011011011110101100000001011111101010110000110100000111010000011001010110000000100111110011100011001011010010010101101010000100111100001110011111100110100111101101001000101010001010110111110010001100111000000100101010110001111000000110101011110110110101001010001001010100111100110100010101101010111111110000000001111100011100011111100010000100111100011001111100010110011110001110 0100100000100111000011100101111101100010100111111010011101010010100000000101111111101110011001010111110100010100110110100100000000010100010100110101111101010101010101110010010011010001101001111101110010111011100100111101100110111001010011010100000000110010001001010111001010111010111110011000000111000111010001100011000100000011111000010011011100110100001110100101010100000001100011001011001101110110 1101100111010010100110100110101101100001111100100001011100001000001110010001010001000000001100001100110110000010110010011100000011100110001010010001011111100011011011110111011000001011010010010101101100001001101000000101010011011101111011110010100101001100100010111101110111110010111011101010110111011001111110111001110010001110110100000010000100011111110010000111110110000011010001100000100100111010 0001000100001101011100011001100000101011100100001100001100010111100110111101000001100110101111110111001010000010010010101010001101110010010000101100110010101101100100010110000111111001111001011111011001000111100110000011111111001000000001111110000110110001111000010001011101011100011110110101110010001111011010100011001101100111000000100001101011111110010100110000000010111001111100010011110000011101 0000000011100000001100110010000000111110000011001010011101001000100110101010111111111001011101100110111010101011101101110101110110100010111000110000010111101101011100000110010001010010111001110001010101111001100001101100100011000001100111000110001011010011010101011001110110001110001101100111000011101010010010011001000100001001101101110100011001011011111001101101011101100101111011100010100010011110 1101011100011101100001001000101110110010111110000110101100000101111111111010111100101001110111100011101101110000011110111111000101001111000010111101101101110111010111100011110100101101011010010111011011011000111001011111101011111110011110111101011110001010100101010011011100111001001111001010111010100001001110000010101100010011100001001110110010100101001111001111000010101100100000111100100010111110 1011000000101100100001101111110111100101011000110001010011101110011011000000010110001011100000001010011100111101100000111100011011000001110011101110001011101001110001110000011001111011011001101000110111011101000011100001110011101011110100011101011101110001000000011111100110101011110111010111001111110111010010001010111000110100111001100001010001100000011000000000011101011101101000001110100110111101 1101110111100101010111011001001000101011111011010010111010101011010110011100100110010111000011111001010010011100100011110100010110010000001100111000010100111110011101111110001000011010010011100111101110110101001110110100110101001101011011001111110011101011101101011110101101101001110110000111111101111111000100101100010010000101101110101100000001011101100011101110110110001101001000111111011001101001 0010101110001101010010011110001110100000000100110010011011101110110100001000001111011000100110101000010001011011101011110100101111101100000001000010011100000101001111100000111101011001101000001011100110110100100001011111001011110011010011111110000101011101110011010111110011010001101111001001100000111110100011100000101011000010111000011100000110010011110011011001010100000101011010101110101101101110 1000111010000100100101111011101101111000001110101100110110011000010011100001101010110100000011011010001111010111111111110110110011110000010100010110010101110011000010011000010111100011111000111110101101101100011111110111101011100000001100000010001100110110110100100000100110110110100100111101111001011001101111101001100101010111100110110001001011101110100000011010010011110011100000010001010111001011 0101110010110010100010011101110001001101111001010010111010011111100100110110101000100010100111101100010101011001101110010110000000111001011010010111101100001000010001110110110111111111110100100000010001110001101001010110011111100110001111000010010110101000010000101000001011110110010001111010000101011000100011001010101001000111010111001011100000100111011001000101011101101110011011111101101000111011 0110000000000101110111101001000010111000100110010000110101011001101011111010101000000000010110100100110010110111101000011010111011101010000111110110011001111001101101100100100000010101110100111110110111110110100001111101110000111110001000000000000001110110111111111000100101001000000111110010110100000010110111111111000011001000001000010111101110000010110011000011010100001100010110101101001110101000 1101101010001001110000011111100111001010100101001110101010110101000111001001100111010111011010100010010101111100110111001101100100001111000001011010010101010111000010110010000000000001001011000101011101101010101010101111010111011111111001010000111100100001000000011011111000001001110010011111000101110111011101000101100010000101001010111010110100011010001001001000000010010110010011101110001101111110 1101110001100010100111000111011001000111111111101101000010011111011101111010101110111101111100010100100110000111000001110001011010110110110000000001011111100000101110010110011010100111110010111111000000100110001110011001110010111101011010000010110001000000100001000011010010101010101010101110110101101101011100000111100101011011000111111110010001000100010010101111010000101101001001101001000101011110 0011010100010111101110101000100001111010001010010010111101011110000111111110101001000110110001110001101100110000000111101110100100111001101110110101100001011100011110010100100010100100011111111011110110001011001100000001011011110010011111001001000000110110010101000111001001110100111110011111100000100100110001010000110100011111110001100011010110011011100111000011111100101000000000011011000001010100 0101101100111001000110000110001101011011101000010001110100000100100000000001111111110001010000000000011001011100110100110110100000101000000101010101100000011110110000111010111000110010110111110101101110011100110001001011101101000100001101000001110001100010101110111001100010101011101110000110101001011101000001001101010000100110011100111010110010110010111101000001001011000111001010011001001000011111 1000001011111111101111000111000101011011001011011110111010111011110110011110011110011101110011110100010100110111011101110000100000100010010000100011010001001001010111110001010100101011111110100000110101000011011101011101011001000111110000100001101111010110101010010000110110110111101011101000011010111010011110001001011001111101011101100011110100000110010101000110110010111110111010000100100011000101 1011000000001011000001101101001101100111000001101100011000110111000001011010011111011111100101011110101011000111000110110101101001110101000001010100011100110111001011110001010111001100011100010011000000111001000110000110111110101110000111110111010110001001010100000000010010000001011001010100001010010011010111111011011001001001000011010101000010100100111010111010101101001001101011111100001011011010 1100100001011110110011010100000010011111111001111111100101110001100101010011000000100100000001000101011101010101100100001101101001100001001111011100011101111011000010101010000010101100001010101001010111010011110111111011101010010010001001100110100010010101011100100100100100000100100001100100101010011101011100010001001000101000100011101101101101110111011100111111010101100010010111010100000100100101 0011011000110000111100110001101001010011111110100110110110100010101011111110001001100101111000100000001101101010011000110000100010111101111110100010111011010010100100100000100110000001001001000010001100011100101001010110110011000110001010010110010001001100011011011101110001111110010011000010000010011111000100101001100100111111000110110110100100001101101011010100100000110111111000100011001100100000 0100010100111010100010101011100101010100110011000011000011100011100000100110100100101010110110111111101101001111001110110011110011111011011010010100010111001000110101000001100011110101111010000101010001110001100101011101110000110000010010000011100111111001111100000100011010001001011101111110011011010110101011011100101111111010101110000000111001011110010110010010110010001011000110000001111010001010 0011110000110110011011011110101111110100100001100000000001101011010110011000010001100111011010000101000111110010011000100011011101101001000000010100000001010101101100010100110000000010000000011111101010100100110111011000110011110110011101000100100010010111000100110100011011110101100001001100011100011011010111010100011111011110010100000010000100100100110100100101100001100100100001101101100111010000 1100100010110011000000010110111101111000010001000100001010011110110101000010110110011100011000111100001101111110001010011000111111110011110111100101000111000011100111111000111100100010001001011000001111011101000111110100001000000000111010011001101111010111001001110010001011111100010001001001001010011101100100001110001000011011001100000000011101010010011101110111101001101011010101110000000100011110 1000100000001100100100010100101111000010110110001111000011011000100011011101101001011101100000101100011010101111111010101000000010000000010001001111111011000011011110001000001101111110110010011100111111010101100000111110001111011101100010101111000111111110100000110001110100010001000001100001100101010100100001011100100010100101001011100000111011100001000001101101001111110101011000001001010001100111 0111001011001001101110111001110110111101100101110111001011101111100011001000110000001101110101011100100001010100000010110111110101111110010100010001011100010000001001010100011100000101101001011110101111101100111110000010001011110001010011111010000010111000111011000101111101111011110101110101011001001100011101111111010000000001101001010101101000001111111011100100010010000111001100010001101000011110 0111011000001111001010010100000000010011000010101100110111110010110010000000110010000000110010100110111001000010010100110111110111101001011011100101010010011111000110000000010100100001101010101101110100001000011111101101001100101110010110001101011010010010110100011000010110111100101110011010101000000110000010010110010011110001101010011101011000100101000110101111110000011011011101110110111100000101 1000000100110100100000011010001101100000011011101101110010100000010111101101101000001101101010110101101111111101110111001000110010010001111010010000111110101011011011101011011101100000000001000101010001100110011001010100000001100100001010111111110101111110100000111111101001010101110011100101111011000001111111101101100000010100010101001010111100011111100011000010001010111110101100001111011010000001 1001110110110001111010001010000110001001111001010111011010011100000011111001111001111010000110111001110111100110111000000111111000111000111110100000111010100100111100001001101001010111000110001111100101010000000111100100011000011000100010101100000101101010000011010000100110110010110000100101000110000101100100101011000100001100001100010100011001001010000010001001011000000110000110001011111000000001 1010100001110001101011011010110010011011010100000110010011101110110110000110110001111010000011111010101001000111001111001100000111010111110111101100101101001101011110011110001001100001001101111110111011001110000100111100100000000101011101100101001001100111111011011101011001100010101101010001100101000000100111000100001100000010100010011011010111000001111110111110011110101001110111010101110010100101 0101101100110011011001101101001100001001000010001111011111000000010110000110111001101011101110100001010100001011101001010100000111011010100110010000111110000100100111111110011001011101111011100110100110011001000010000001111100100110100010010010000000011000000011101001101010011010110101011111000100100110100011011001110100110001110110101110000000011100111100000110100011110010011110110011101000111111 0100110000001000010111001110011100011010101110010111011001010010011011010100101000011011111010111011011110100001010010111001000011000110110111110010111011100100001001111011111011001100010101110000011101001101110011110001101011101100100011101100000100000111000010001001111000100101101111100011010111101011110011101001000101100011101110100011011111010010101110001111100101101111101111110101001101010001 1110011100011101001001001111011010011111100011000101110000010101011110001110111110111110001100001101000000101111011000111110100110001101111110110001111100101000111101101111100111000001101011000100000110000000010010001100101011010011011100111010101111111100000110100100000100011011000110100000100100010001110100101111011110110111001011001001010111001000101011101011011111010111011100101011100000110011 0110001000010110111000111001000000110111111111010001001111000000110011011001010101000000011101000001110110001101101010010111111111110011110011010010101011111100111011010011101111010010011101010011000100010010001001011011010101011100100000111010100000111010110100001111011001010111000101110010011100100100111011101110010101001000001111001110011111011000000011001010010011011001100110101011010001110111 1101001010000101100001001111001100111111001001000001010111110101111010000101100110000100000100000111110010101101010111010110101111100001001001100000000110001111111100010101001110111101001011111110100110010110101000100100000011000100001111001010010000100000010010111100001010100111001001000110100000000101100111001100101010011110101100011100110100000001101110100001101100111011101001111000101111001100 0010101110000110101111101111010000111100101101110110100101001010100110001101110100111110110011111011011001100011010000110111001101100011111000111111000101101011101100011110111111100100010101101111100001101110100001110010001111011101101110000101111011000011101010111000000010011010000101100000100110101111011111011010101100011101110011100010100001001011111010001000110010110110001000100001001111011111 0111010001000001100101100100100111011110001100011101100011111110111010000110100110010100011100110010001010110100100010100000011110000110010001100010101011011000000111111001001000100001000101111001101001001110101110110101000011011110111101110011001010001010001010111011111001000111110011000110101010000010011010110010111100100110011011000000101010010011001101000110010110000101101110111111101000010001
cTrader Algo

【cAlgo】過去のBarsやTicksのロードする【Tips】

4/7/2021

4年以上前の記事です。内容が古くなっている可能性があります。

LoadMoerHistory

もっと昔の価格情報を使いたい

cBotやインジケーター内で最初に読み込まれているより昔の価格情報を使いたい場合はBars.LoadMoreHistoryメソッドで明示的にロードしてあげないといけません。

少し前の情報なら1回BarsプロパティのLoadMoreHistoryメソッドを呼び出すだけでいいのですが、ずーっと前の情報となるとこんな感じでループ回して呼び出すことになります。targetDateTimeに欲しい日時が入ってると思ってください。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 ||  count != 0) {
    count = Bars.LoadMoreHistory();
}

Bars.OpenTimes.GetIndexByTimeメソッドは対象の時間がBarsにないと-1を返すので、Barsにない場合は延々とLoadMoreHistoryを繰り返させるコードです。

ただ条件式がこれだけだと、最後まで読み込んでも対象の時間のデータがなかったときに無限ループになってしまうので、LoadMoreHistory()で読めるデータがなくなった時点でループを抜けるようにしてます。

LoadMoreHistoryメソッドは追加で読み込んだローソク足の本数を返しますので、これが0を返した場合、これ以上のデータはないということになります。

このコード自体は問題ないのですが、ご想像のとおりものすごく時間がかかります。たぶん知らない人が見たらフリーズしてると思うでしょう。自分で使うにしてもフリーズしてるか処理中かわからなくなるのはあまり好ましくないですよね。

 

ロード中であることを示したい

これをやるならチャート上にロード中である旨を表示させておく方が親切でしょう。ついついこんな風に書きたくなってしまうかもしれません。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 || count != 0) {
    count = Bars.LoadMoreHistory();
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
}
Chart.RemoveObject("loading_text");

1回読み込むたびにチャート上に1本目のバー(読み込んだ一番昔のローソク足)の時間を表示させようとしています。が、実はこれでは何も表示されません

DrawStaticTextで追加したテキストはcTrader側に処理が戻ってからチャート上に表示されるのです。このコードだとロード中は処理を戻さないため、ロード中のテキストは表示されずに、ロード終了後に消されてしまうのです。

なので、読み込むたびにテキストを表示させたり更新させたりしたい場合は、一度読み込むたびに処理を抜ける必要があるのです。非同期メソッドの出番ですね。

 

LoadMoreHistoryAsync

非同期ローディング

非同期でロードさせることのできるこのメソッドは処理が終わり次第実行するコールバックを引数に指定することができるため、これを利用して連続読み込みを行います。

具体的にはこんなメソッドを用意してあげるといいでしょう。

private void LoadMoreBars(DateTime targetDateTime) {
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
    Bars.LoadMoreHistoryAsync(args => {
        if (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1) {
            if (args.Count != 0) {
                LoadMoreBars(targetDateTime);
            } else {
                // 全部読んでも欲しいデータがなかった時の処理
            }
        } else {
            // 欲しいデータまで読み終えた後にする処理
        }
    });
}

使い方は欲しい時間を指定してMoreLoadBarsを呼び出してあげるだけです。

動きとしては

1.MoreLoadBarsが呼び出されたら、チャートに状況テキスト表示して非同期でLoadMoreHistoryして処理終える。

2.LoadMoreHistoryが終わり次第、コールバックが呼び出され、目的のデータがあるか確認される

3.データがあるか、全部読み終えてもなければelse内に進む。再読み込みが必要なら再度MoreLoadBarsを呼び出し、1に戻る

この場合は1が終われば一旦cTraderに処理が戻るため、ロード状況を示すStaticTextが表示されるようになります。

 

 

Ticksでも同様だが要注意

Ticksデータが欲しい場合はまず最初にこんな感じでMarketDataプロパティから取得します。

var ticks = MarketData.GetTicks();

これで取得できるのは直近のTicksデータのみですが、あとはBars同様LoadMoreHistoryメソッドで過去にさかのぼって読み込みが可能です。

ただし、Tickは数が多いため、昔のデータが必要な場合は非常に時間がかかります。残念ながら特定期間だけ読み込むということはできず、常に現在のデータから過去にたどっていく形となります。

そしてここが一番要注意なのですが、途中で接続が切断されるとReloadが発生し、最初からやり直しになるようです。

どういうことかというと

var ticks = MarketData.GetTicks();
var count = 1;
while(count != 0) {
    count = ticks.LoadMoreHistory();
}

このコードは無限ループになる可能性があるということです。

実際サーバーにあるTicksをすべて読もうとしたら丸一日近くかかると思われるため、サーバーが安定してないと結構な確率で無限ループになります。

このような理由からLoadMoreHistory()で何年も前のTicksデータを取得するのはやめておいた方がいいでしょう。

 

 

過去のTicksデータを使いたいときはどうするか

「バックテスターのデータをPCに保存して使えばいいじゃん」

というのが公式の回答のようです。

どういうことかというと、バックテスト上のcBotでGetTicksを呼び出すと、そのバックテスト内時間のTicksデータが返ってくるのです。これを利用して

①内部でGetTicksして読み込んだTicksデータをローカルに保存するcBot作る。

②そのデータ保存用cBotをTicksデータが欲しい期間を指定し、バックテストで動かす。→ファイルが出来上がる。

③別のcBotから保存されたファイルを呼んで使う。

ということですね。言われてみれば確かにこうすれば可能ですが、ただ、配布するプログラムではちょっと使いにく方法です。ユーザー側でTicksデータ保存作業もやってもらう必要が出てきますし。

やっぱり特定期間のTicksデータだけ取得するメソッドが欲しいなぁ・・・


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

新しいコメント

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

cTrader's Life

© 2025 ajinori