diff --git a/modules/calib3d/src/dls.cpp b/modules/calib3d/src/dls.cpp index 5641d8e086..9075fc2f4c 100644 --- a/modules/calib3d/src/dls.cpp +++ b/modules/calib3d/src/dls.cpp @@ -19,6 +19,8 @@ using namespace std; +void pause__(){ cin.get(); } + void printSize(const cv::Mat& mat) { cout << mat.rows << "x" << mat.cols << endl; @@ -48,8 +50,8 @@ void print(T var) { cout << var << endl; } dls::dls(const cv::Mat& opoints, const cv::Mat& ipoints) { N = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F)); - p = cv::Mat(3, N, opoints.depth()); - z = cv::Mat(3, N, ipoints.depth()); + p = cv::Mat(3, N, CV_64F); + z = cv::Mat(3, N, CV_64F); cost__ = std::numeric_limits::infinity(); @@ -60,14 +62,14 @@ dls::dls(const cv::Mat& opoints, const cv::Mat& ipoints) if (opoints.depth() == ipoints.depth()) { if (opoints.depth() == CV_32F) - init_points(opoints, ipoints); + init_points(opoints, ipoints); else - init_points(opoints, ipoints); + init_points(opoints, ipoints); } else if (opoints.depth() == CV_32F) - init_points(opoints, ipoints); + init_points(opoints, ipoints); else - init_points(opoints, ipoints); + init_points(opoints, ipoints); norm_z_vector(); @@ -93,58 +95,218 @@ void dls::norm_z_vector() z.at(1, i) /= sr; z.at(2, i) /= sr; } +} - // OK +bool dls::compute_pose(cv::Mat& R, cv::Mat& t) +{ + + std::vector R_; + R_.push_back(rotx(CV_PI/2)); + R_.push_back(roty(CV_PI/2)); + R_.push_back(rotz(CV_PI/2)); + + cv::Mat t_mean = this->mean(p); + + // version that calls dls 3 times, to avoid Cayley singularity + for (int i = 0; i < 3; ++i) + { + // Make a random rotation + cv::Mat pp = R_[i] * ( p - cv::repeat(t_mean, 1, p.cols) ); + + // clear for new data + C_est_.clear(); + t_est_.clear(); + cost_.clear(); + + this->run_kernel(pp); // run dls_pnp() + + // find global minimum + for (unsigned int j = 0; j < cost_.size(); ++j) + { + if( cost_[j] < cost__ ) + { + t_est__ = t_est_[j] - C_est_[j] * R_[i] * t_mean; + C_est__ = C_est_[j] * R_[i]; + cost__ = cost_[j]; + } + } + + } + + if(C_est__.cols > 0 && C_est__.rows > 0) + { + C_est__.copyTo(R); + t_est__.copyTo(t); + return true; + } + + return false; +} + +void dls::run_kernel(const cv::Mat& pp) +{ + + cv::Mat Mtilde(27, 27, CV_64F); + cv::Mat D = cv::Mat::zeros(9, 9, CV_64F); + build_coeff_matrix(pp, Mtilde, D); + + cv::Mat eigenval_r, eigenval_i, eigenvec_r, eigenvec_i; + compute_eigenvec(Mtilde, eigenval_r, eigenval_i, eigenvec_r, eigenvec_i); + + + /* + * Now check the solutions + */ + + // extract the optimal solutions from the eigen decomposition of the + // Multiplication matrix + + cv::Mat sols = cv::Mat::zeros(3, 27, CV_64F); + std::vector cost; + int count = 0; + for (int k = 0; k < 27; ++k) + { + // TODO: solve implementation for complex numbers + + // V(:,k) = V(:,k)/V(1,k); + cv::Mat V_kA = eigenvec_r.col(k); // 27x1 + cv::Mat V_kB = cv::Mat(1, 1, z.depth(), V_kA.at(0)); // 1x1 + cv::Mat V_k; cv::solve(V_kB.t(), V_kA.t(), V_k); // A/B = B'\A' + cv::Mat( V_k.t()).copyTo( eigenvec_r.col(k) ); + + // TODO: check imaginari part to filter solutions + + //if (imag(V(2,k)) == 0) + //const double epsilon = 1e-4; + //if( eigenvec_i.at(1,k) >= -epsilon && eigenvec_i.at(1,k) <= epsilon ) + { // it should work without checking imaginari part + + double stmp[3]; + stmp[0] = eigenvec_r.at(9, k); + stmp[1] = eigenvec_r.at(3, k); + stmp[2] = eigenvec_r.at(1, k); + + cv::Mat H = Hessian(stmp); + + cv::Mat eigenvalues, eigenvectors; + cv::eigen(H, eigenvalues, eigenvectors); + + if(positive_eigenvalues(&eigenvalues)) + { + + // sols(:,i) = stmp; + cv::Mat stmp_mat(3, 1, CV_64F, &stmp); + + stmp_mat.copyTo( sols.col(count) ); + + cv::Mat Cbar = cayley2rotbar(stmp_mat); + cv::Mat Cbarvec = Cbar.reshape(1,1).t(); + + // cost(i) = CbarVec' * D * CbarVec; + cv::Mat cost_mat = Cbarvec.t() * D * Cbarvec; + cost.push_back( cost_mat.at(0) ); + + count++; + } + } + } + + // extract solutions + sols = sols.clone().colRange(0, count); + + std::vector C_est, t_est; + for (int j = 0; j < sols.cols; ++j) + { + // recover the optimal orientation + // C_est(:,:,j) = 1/(1 + sols(:,j)' * sols(:,j)) * cayley2rotbar(sols(:,j)); + + cv::Mat sols_j = sols.col(j); + double sols_mult = 1./(1.+cv::Mat( sols_j.t() * sols_j ).at(0)); + cv::Mat C_est_j = cayley2rotbar(sols_j).mul(sols_mult); + C_est.push_back( C_est_j ); + + cv::Mat A2 = cv::Mat::zeros(3, 3, CV_64F); + cv::Mat b2 = cv::Mat::zeros(3, 1, CV_64F); + for (int i = 0; i < N; ++i) + { + cv::Mat eye = cv::Mat::eye(3, 3, CV_64F); + cv::Mat z_mul = z.col(i)*z.col(i).t(); + + A2 += eye - z_mul; + b2 += (z_mul - eye) * C_est_j * pp.col(i); + } + + // recover the optimal translation + cv::Mat X2; cv::solve(A2, b2, X2); // A\B + t_est.push_back(X2); + + } + + // check that the points are infront of the center of perspectivity + for (int k = 0; k < sols.cols; ++k) + { + cv::Mat cam_points = C_est[k] * pp + cv::repeat(t_est[k], 1, pp.cols); // OK + cv::Mat cam_points_k = cam_points.row(2); + + if(is_empty(&cam_points_k)) // OK + { + cv::Mat C_valid = C_est[k], t_valid = t_est[k]; // OK + double cost_valid = cost[k];// OK + + C_est_.push_back(C_valid); + t_est_.push_back(t_valid); + cost_.push_back(cost_valid); + } + } } void dls::build_coeff_matrix(const cv::Mat& pp, cv::Mat& Mtilde, cv::Mat& D) { - cv::Mat eye = cv::Mat::eye(3, 3, z.depth()); + cv::Mat eye = cv::Mat::eye(3, 3, CV_64F); // build coeff matrix // An intermediate matrix, the inverse of what is called "H" in the paper // (see eq. 25) - cv::Mat H = cv::Mat::zeros(3, 3, z.depth()); - cv::Mat A = cv::Mat::zeros(3, 9, z.depth()); + cv::Mat H = cv::Mat::zeros(3, 3, CV_64F); + cv::Mat A = cv::Mat::zeros(3, 9, CV_64F); for (int i = 0; i < N; ++i) { cv::Mat z_dot = z.col(i)*z.col(i).t(); H += eye - z_dot; A += ( z_dot - eye ) * LeftMultVec(pp.col(i)); - }// OK + } // A\B - cv::solve(H, A, A); // OK + cv::solve(H, A, A); for (int i = 0; i < N; ++i) { cv::Mat z_dot = z.col(i)*z.col(i).t(); D += cv::Mat( LeftMultVec(pp.col(i)) + A ).t() * (eye-z_dot) * ( LeftMultVec(pp.col(i)) + A ); - } // OK + } // fill the coefficients fill_coeff(&D); // generate random samples - std::vector u; - //cv::randn(u, 100, 0.1); - u.push_back(0.0); u.push_back(129.0); u.push_back(64.0); u.push_back(-33.0); u.push_back(-193.0); + std::vector u(5); + cv::randn(u, 0, 200); cv::Mat M2 = cayley_LS_M(f1coeff, f2coeff, f3coeff, u); - cv::Mat M2_1 = M2(cv::Range(0,27), cv::Range(0,27)); // OK - cv::Mat M2_2 = M2(cv::Range(0,27), cv::Range(27,120)); // OK - cv::Mat M2_3 = M2(cv::Range(27,120), cv::Range(27,120)); // OK - cv::Mat M2_4 = M2(cv::Range(27,120), cv::Range(0,27)); // OK + cv::Mat M2_1 = M2(cv::Range(0,27), cv::Range(0,27)); + cv::Mat M2_2 = M2(cv::Range(0,27), cv::Range(27,120)); + cv::Mat M2_3 = M2(cv::Range(27,120), cv::Range(27,120)); + cv::Mat M2_4 = M2(cv::Range(27,120), cv::Range(0,27)); // A/B = B'\A' cv::Mat M2_5; cv::solve(M2_3.t(), M2_2.t(), M2_5); // construct the multiplication matrix via schur compliment of the Macaulay // matrix - Mtilde = M2_1 - M2_5.t()*M2_4; // 27x27 non-symmetric // OK + Mtilde = M2_1 - M2_5.t()*M2_4; } @@ -164,13 +326,13 @@ void dls::compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Ma Eigen::ComplexEigenSolver ces; ces.compute(Mtilde_eig_cmplx); - Eigen::MatrixXd eigval_real = ces.eigenvalues().real(); // OK - Eigen::MatrixXd eigval_imag = ces.eigenvalues().imag();// OK + Eigen::MatrixXd eigval_real = ces.eigenvalues().real(); + Eigen::MatrixXd eigval_imag = ces.eigenvalues().imag(); Eigen::MatrixXd eigvec_real = ces.eigenvectors().real(); Eigen::MatrixXd eigvec_imag = ces.eigenvectors().imag(); - cv::eigen2cv(eigval_real, eigenval_real); // OK - cv::eigen2cv(eigval_imag, eigenval_imag); // OK + cv::eigen2cv(eigval_real, eigenval_real); + cv::eigen2cv(eigval_imag, eigenval_imag); cv::eigen2cv(eigvec_real, eigenvec_real); cv::eigen2cv(eigvec_imag, eigenvec_imag); @@ -178,6 +340,7 @@ void dls::compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Ma void dls::fill_coeff(const cv::Mat * D_mat) { + // TODO: shift D and coefficients one position to left double D[10][10]; // put D_mat into array @@ -263,177 +426,16 @@ void dls::fill_coeff(const cv::Mat * D_mat) } -void dls::run_kernel(const cv::Mat& pp) -{ - - cv::Mat Mtilde(27, 27, z.depth()); - cv::Mat D = cv::Mat::zeros(9, 9, z.depth()); - build_coeff_matrix(pp, Mtilde, D); - - cv::Mat eigenval_r, eigenval_i, eigenvec_r, eigenvec_i; - compute_eigenvec(Mtilde, eigenval_r, eigenval_i, eigenvec_r, eigenvec_i); - - //printMat(eigenval_r); - //printMat(eigenval_i); - - /* - * Now check the solutions - */ - - // extract the optimal solutions from the eigen decomposition of the - // Multiplication matrix - - cv::Mat sols = cv::Mat::zeros(3, 27, z.depth()); - std::vector cost; - int count = 0; - for (int k = 0; k < 27; ++k) - { - - // V(:,k) = V(:,k)/V(1,k); - cv::Mat V_kA = eigenvec_r.col(k); // 27x1 - cv::Mat V_kB = cv::Mat(1, 1, z.depth(), V_kA.at(0)); // 1x1 - cv::Mat V_k; cv::solve(V_kB.t(), V_kA.t(), V_k); // A/B = B'\A' - cv::Mat( V_k.t()).copyTo( eigenvec_r.col(k) ); - - //if (imag(V(2,k)) == 0) - const double epsilon = 1e-4; - // if( eigenvec_i.at(1,k) >= -epsilon && eigenvec_i.at(1,k) <= epsilon ) - { // it should work without checking imaginari part - - double stmp[3]; - stmp[0] = eigenvec_r.at(9, k); - stmp[1] = eigenvec_r.at(3, k); - stmp[2] = eigenvec_r.at(1, k); - - cv::Mat H = Hessian(stmp); // OK is symmetric - - cv::Mat eigenvalues, eigenvectors; - cv::eigen(H, eigenvalues, eigenvectors); - - if(positive_eigenvalues(eigenvalues)) - { - - // sols(:,i) = stmp; - cv::Mat(3, 1, z.depth(), &stmp).copyTo( sols.col(count) ); - - cv::Mat Cbar = cayley2rotbar(stmp); - cv::Mat Cbarvec = Cbar.t(); - Cbarvec = Cbarvec.reshape(1,1).t(); - - // cost(i) = CbarVec' * D * CbarVec; - cv::Mat cost_mat = Cbarvec.t() * D * Cbarvec; - cost.push_back( cost_mat.at(0) ); - - count++; - } - } - } - - sols = sols.clone().colRange(0, count); - -// printMat(sols); -// printMat(cv::Mat(cost_)); - - // until here seems OK. must check with eigenvectors from octave - - std::vector C_est, t_est; - for (int j = 0; j < sols.cols; ++j) - { - // recover the optimal orientation - // C_est(:,:,j) = 1/(1 + sols(:,j)' * sols(:,j)) * cayley2rotbar(sols(:,j)); - - cv::Mat sols_j = sols.col(j); - double sols_j_[3] = { sols_j.at(0), sols_j.at(1), sols_j.at(2) }; - double sols_mul = cv::Mat( sols_j.t() * sols_j ).at(0); - cv::Mat C_est_j = cayley2rotbar(sols_j_).mul(1./(1.+sols_mul)); - C_est.push_back( C_est_j ); - - cv::Mat A2 = cv::Mat::zeros(3, 3, z.depth()); - cv::Mat b2 = cv::Mat::zeros(3, 1, z.depth()); - for (int i = 0; i < N; ++i) - { - cv::Mat eye = cv::Mat::eye(3, 3, z.depth()); - cv::Mat z_mul = z.col(i)*z.col(i).t(); - - A2 += eye - z_mul; - b2 += (z_mul - eye) * C_est_j * pp.col(i); - } - - // recover the optimal translation - cv::Mat X2; cv::solve(A2, b2, X2); // A\B - t_est.push_back(X2); - } - - - - // check that the points are infront of the center of perspectivity - for (int k = 0; k < sols.cols; ++k) - { - cv::Mat cam_points = C_est[k] * pp + cv::repeat(t_est[k], 1, pp.cols); - cv::Mat cam_points_k = cam_points.row(2); - - if(is_empty(&cam_points_k)) - { - cv::Mat C_valid = C_est[k], t_valid = t_est[k]; - double cost_valid = cost[k]; - - C_est_.push_back(C_valid); - t_est_.push_back(t_valid); - cost_.push_back(cost_valid); - } - } -} - - -void dls::compute_pose(cv::Mat& R, cv::Mat& t) -{ - - std::vector R_; - R_.push_back(rotx(CV_PI/2)); - R_.push_back(roty(CV_PI/2)); - R_.push_back(rotz(CV_PI/2)); // OK - - cv::Mat t_mean = this->mean(p); // OK - - // version that calls dls 3 times, to avoid Cayley singularity - for (int i = 0; i < 3; ++i) - { - // Make a random rotation - cv::Mat pp = R_[i] * ( p - cv::repeat(t_mean, 1, p.cols) ); // OK - - // clear for the new data - C_est_.clear(); - t_est_.clear(); - cost_.clear(); - - this->run_kernel(pp); // run dls_pnp() - - for (unsigned int j = 0; j < cost_.size(); ++j) - { - t_est_[j] = t_est_[j] - C_est_[j] * R_[i] * t_mean; - C_est_[j] = C_est_[j] * R_[i]; - } - - if( min_val(cost_) < cost__ ) - { - C_est__ = C_est_[i]; - t_est__ = t_est_[i]; - cost__ = cost_[i]; - } - } - - C_est__.copyTo(R); - t_est__.copyTo(t); -} - cv::Mat dls::LeftMultVec(const cv::Mat& v) { cv::Mat mat, row1, row2, row3; + cv::Mat zeros16 = cv::Mat::zeros(1, 6, CV_64F); + cv::Mat zeros13 = cv::Mat::zeros(1, 3, CV_64F); - cv::hconcat(v.clone().t(), cv::Mat::zeros(1, 6, v.depth()), row1); // first row - cv::hconcat(cv::Mat::zeros(1, 3, v.depth()), v.clone().t(), row2); // second row - cv::hconcat(row2, cv::Mat::zeros(1, 3, v.depth()), row2); // second ror - cv::hconcat(cv::Mat::zeros(1, 6, v.depth()), v.clone().t(), row3); // third row + cv::hconcat(v.clone().t(), zeros16, row1); // first row + cv::hconcat(zeros13, v.clone().t(), row2); // second row + cv::hconcat(row2, zeros13, row2); // second row + cv::hconcat(zeros16, v.clone().t(), row3); // third row mat.push_back(row1); mat.push_back(row2); @@ -444,9 +446,9 @@ cv::Mat dls::LeftMultVec(const cv::Mat& v) cv::Mat dls::cayley_LS_M(const std::vector& a, const std::vector& b, const std::vector& c, const std::vector& u) { + // TODO: input matrix pointer + // TODO: shift coefficients one position to left - //cv::Mat M = (cv::Mat_(120,120) << u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], a[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[10], 0, 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], a[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, b[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[14], 0, u[3], 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, 0, b[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], c[1], 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], a[5], 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, 0, 0, 0, a[10], 0, 0, 0, 0, b[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, b[10], 0, 0, 0, 0, 0, 0, b[5], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[5], c[10], 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[5], a[12], 0, 0, 0, 0, 0, a[1], 0, a[10], 0, 0, 0, 0, 0, a[14], 0, a[11], 0, 0, b[5], 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, b[11], 0, 0, 0, 0, 0, b[10], 0, 0, 0, 0, b[14], 0, 0, 0, 0, 0, 0, b[12], 0, 0, 0, 0, 0, c[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[5], c[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, c[12], c[14], 0, 0, 0, u[3], 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, 0, 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], b[11], 0, 0, 0, 0, 0, 0, b[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], c[11], 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], 0, 0, 0, a[15], a[6], 0, 0, 0, 0, 0, 0, 0, a[11], 0, a[1], 0, 0, 0, a[5], 0, 0, 0, 0, b[15], 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, 0, 0, b[11], 0, 0, 0, b[10], b[5], 0, 0, 0, 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], c[11], 0, 0, 0, 0, 0, 0, c[10], 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, c[6], c[5], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], 0, 0, 0, a[6], 0, 0, 0, 0, 0, 0, a[11], 0, a[5], 0, a[10], a[1], 0, 0, a[12], 0, a[15], 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, b[11], b[10], 0, b[15], b[1], 0, 0, 0, 0, b[5], 0, 0, 0, b[14], b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], c[5], 0, c[1], 0, 0, 0, 0, c[14], 0, 0, 0, c[11], c[10], 0, 0, 0, 0, 0, 0, c[12], u[2], 0, 0, 0, 0, 0, 0, 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[9], a[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], b[1], 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], a[9], a[4], a[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[4], b[10], 0, 0, 0, c[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], c[4], 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, 0, 0, a[10], a[4], a[8], a[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[9], 0, 0, b[4], 0, 0, b[1], 0, b[10], 0, 0, 0, 0, 0, b[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[8], b[14], 0, 0, 0, c[14], c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, c[10], c[8], 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[3], a[11], 0, 0, a[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], 0, 0, b[1], 0, 0, 0, b[3], b[11], 0, 0, 0, c[11], 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[3], c[9], 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], a[3], a[17], a[5], 0, 0, a[10], 0, 0, 0, a[9], 0, 0, 0, a[1], 0, a[4], 0, 0, 0, 0, b[3], 0, 0, 0, 0, b[11], b[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], 0, 0, 0, 0, b[4], 0, 0, b[10], 0, 0, 0, b[17], b[5], 0, 0, 0, c[5], 0, c[1], 0, 0, 0, 0, 0, c[10], 0, 0, c[3], c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], c[17], c[4], 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], 0, 0, 0, 0, a[5], a[17], 0, a[12], 0, 0, a[14], 0, a[9], a[1], a[4], 0, 0, 0, a[10], 0, a[8], 0, a[3], 0, 0, b[17], 0, b[1], b[11], 0, b[5], b[10], 0, b[9], 0, 0, b[3], 0, 0, 0, 0, 0, b[4], 0, 0, 0, 0, b[8], 0, 0, b[14], 0, 0, 0, 0, b[12], 0, 0, 0, c[12], c[3], c[10], 0, 0, 0, 0, 0, c[14], 0, 0, c[17], c[4], 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, c[9], 0, 0, c[11], 0, 0, c[5], 0, c[8], 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], a[9], 0, 0, 0, 0, a[18], a[15], 0, 0, a[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], b[9], b[3], 0, 0, b[11], 0, 0, 0, b[18], b[15], 0, 0, 0, c[15], 0, 0, 0, 0, 0, c[1], 0, c[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[18], c[3], 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], a[4], 0, 0, a[15], a[18], 0, a[6], 0, 0, a[5], 0, 0, 0, a[3], a[1], a[9], 0, a[11], 0, a[17], 0, 0, 0, 0, b[18], 0, 0, 0, 0, b[15], b[11], 0, 0, b[9], 0, 0, 0, 0, b[1], 0, 0, b[3], 0, 0, b[10], b[4], b[17], 0, 0, b[5], 0, 0, 0, 0, b[6], 0, 0, 0, c[6], 0, c[11], 0, 0, 0, c[10], 0, c[5], c[1], 0, c[18], c[3], 0, 0, 0, 0, 0, 0, c[4], 0, 0, 0, 0, c[9], 0, 0, 0, 0, c[15], 0, c[17], 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], a[14], a[8], 0, 0, a[6], 0, 0, 0, 0, 0, a[12], 0, a[3], a[11], a[17], a[10], a[4], a[9], a[5], 0, 0, 0, a[18], 0, 0, 0, 0, b[11], b[15], 0, b[6], b[5], 0, b[3], b[4], 0, b[18], b[9], 0, b[10], 0, 0, b[17], 0, 0, b[14], b[8], 0, 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[18], c[5], 0, 0, 0, c[14], 0, c[12], c[10], 0, 0, c[17], 0, c[9], 0, 0, 0, c[11], c[8], 0, 0, 0, c[3], c[4], 0, c[15], 0, 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], a[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], b[13], b[9], 0, 0, c[1], c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], a[9], a[13], a[19], a[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], b[13], 0, 0, 0, 0, b[9], 0, b[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[10], b[19], b[4], 0, 0, c[10], c[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], c[9], c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, u[4], u[1], 0, 0, 0, 0, 0, 0, a[1], a[9], 0, 0, 0, a[10], a[4], a[19], 0, a[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], 0, a[14], b[19], b[1], 0, b[9], 0, b[4], 0, b[10], 0, 0, 0, b[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, b[8], 0, 0, c[14], c[8], c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], c[9], 0, c[10], c[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, 0, u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], a[3], 0, a[1], a[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], 0, 0, 0, a[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], 0, b[1], b[9], 0, 0, b[11], b[2], b[3], 0, 0, c[11], c[3], 0, 0, 0, c[1], 0, 0, 0, c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[2], c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], a[3], a[2], 0, a[17], 0, a[10], a[4], a[1], 0, 0, a[13], 0, 0, 0, a[9], 0, a[19], 0, 0, 0, a[5], b[2], 0, 0, 0, 0, b[3], b[9], b[11], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], b[1], 0, 0, 0, b[19], 0, b[10], b[4], 0, 0, b[5], 0, b[17], 0, 0, c[5], c[17], 0, c[9], 0, c[10], 0, 0, c[1], c[4], 0, 0, c[2], c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], c[3], 0, c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, a[11], a[3], 0, 0, 0, a[5], a[17], 0, 0, 0, 0, a[14], a[8], a[10], a[13], a[9], a[19], 0, 0, 0, a[4], 0, 0, 0, a[2], 0, a[12], 0, b[11], b[9], b[3], 0, b[17], b[4], b[5], b[13], 0, 0, b[2], 0, 0, 0, 0, 0, b[19], b[10], 0, 0, 0, 0, 0, b[14], b[8], 0, 0, b[12], 0, 0, 0, 0, c[12], 0, c[2], c[4], 0, c[14], 0, 0, c[10], c[8], 0, 0, 0, c[19], 0, 0, 0, 0, 0, c[9], 0, 0, 0, 0, c[13], 0, c[11], c[3], 0, c[5], c[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, 0, u[1], 0, 0, 0, 0, a[9], a[13], 0, 0, 0, 0, 0, a[18], 0, a[11], a[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], 0, 0, a[1], a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], b[9], b[13], b[2], 0, b[11], b[3], 0, 0, b[15], 0, b[18], 0, 0, c[15], c[18], 0, 0, 0, c[11], c[1], c[9], 0, c[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], 0, 0, 0, a[4], a[19], 0, a[15], a[18], 0, 0, 0, 0, a[5], a[17], a[11], 0, 0, a[2], a[9], a[13], 0, a[3], 0, 0, 0, 0, a[10], a[6], 0, 0, 0, 0, 0, b[18], b[3], b[15], 0, b[13], 0, 0, 0, 0, b[9], 0, 0, b[2], b[11], b[10], b[4], b[19], 0, 0, b[5], b[17], 0, 0, b[6], 0, 0, 0, 0, c[6], 0, 0, c[3], 0, c[5], c[10], c[4], c[11], c[17], c[9], 0, 0, c[2], 0, 0, 0, 0, 0, 0, c[19], 0, 0, 0, 0, c[13], 0, 0, 0, c[15], c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, u[3], 0, u[4], u[1], a[15], a[18], a[8], 0, 0, a[6], 0, 0, 0, 0, 0, a[12], 0, a[5], a[2], a[3], 0, a[4], a[19], a[13], a[17], 0, 0, 0, 0, a[14], 0, 0, b[15], b[3], b[18], 0, 0, b[17], b[6], b[2], b[19], 0, 0, b[13], 0, b[4], 0, 0, 0, b[5], b[14], b[8], 0, 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[17], 0, c[12], c[14], c[8], c[5], 0, c[4], 0, 0, 0, 0, c[13], 0, 0, 0, c[3], 0, 0, 0, 0, c[2], c[19], c[15], c[18], 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], a[3], 0, 0, 0, 0, 0, a[7], 0, 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], b[1], 0, 0, 0, b[11], b[3], b[18], 0, 0, b[15], 0, 0, 0, 0, b[7], 0, 0, 0, c[7], 0, 0, c[1], 0, 0, c[11], 0, c[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[3], 0, 0, c[9], 0, 0, 0, 0, 0, 0, 0, 0, c[18], 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, 0, b[11], b[15], 0, 0, 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, c[7], c[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, a[3], a[2], 0, 0, 0, 0, 0, 0, 0, a[15], a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[11], a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], b[9], 0, 0, b[11], b[3], b[2], 0, 0, b[15], b[18], 0, 0, b[7], 0, 0, 0, 0, c[7], 0, 0, 0, c[9], c[15], c[11], c[3], 0, c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[2], 0, 0, c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, b[2], 0, 0, 0, b[18], 0, 0, 0, b[7], 0, 0, 0, c[7], 0, 0, 0, 0, 0, c[20], 0, c[2], 0, 0, 0, 0, c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], 0, 0, 0, 0, 0, 0, 0, a[15], a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, a[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], b[13], 0, 0, b[3], b[2], 0, 0, b[15], b[18], 0, b[7], 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, c[13], c[18], c[3], c[2], 0, 0, 0, c[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[9], 0, a[13], 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], b[9], b[20], 0, 0, c[9], c[13], c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], a[18], 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], 0, 0, 0, 0, b[3], b[11], 0, 0, 0, b[15], b[18], 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], 0, 0, c[15], 0, c[7], 0, 0, 0, 0, 0, 0, c[9], 0, 0, 0, c[18], 0, 0, c[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], 0, 0, 0, 0, b[2], b[3], 0, 0, b[15], b[18], 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[3], c[7], c[15], c[18], 0, 0, 0, 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, 0, 0, b[2], 0, 0, b[18], 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[2], 0, c[18], 0, 0, 0, 0, c[7], 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, a[10], 0, a[14], 0, 0, 0, 0, 0, a[16], 0, a[5], 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, b[10], 0, 0, b[5], 0, 0, 0, 0, 0, b[14], 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[5], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[12], c[14], c[1], 0, 0, 0, 0, 0, 0, 0, c[11], 0, c[10], 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, u[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], 0, 0, b[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, c[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, 0, 0, 0, b[11], 0, 0, 0, 0, 0, b[15], b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], 0, 0, 0, c[15], 0, 0, c[11], 0, 0, 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[8], 0, 0, 0, 0, 0, b[14], 0, b[16], 0, 0, 0, 0, 0, b[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], 0, 0, c[10], c[4], 0, 0, 0, 0, c[14], 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], a[8], 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, b[8], 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], 0, 0, c[4], c[19], 0, 0, 0, c[14], c[8], 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[11], 0, 0, 0, 0, b[15], 0, 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], 0, 0, 0, c[7], 0, 0, c[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[8], 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[8], 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, c[19], 0, 0, 0, 0, c[8], 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[3], 0, 0, 0, 0, b[18], b[15], 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, c[3], 0, 0, 0, 0, 0, 0, c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[4], 0, 0, c[14], c[8], 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[19], 0, 0, c[8], 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[2], 0, 0, 0, 0, 0, b[18], 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[18], 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, a[18], 0, 0, 0, 0, 0, 0, 0, a[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[19], 0, 0, b[2], b[18], 0, b[17], 0, b[7], b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[17], 0, c[6], 0, c[7], 0, c[18], 0, 0, 0, 0, 0, c[19], c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[15], b[10], 0, 0, b[11], 0, b[5], 0, b[7], 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], 0, 0, c[10], c[11], 0, 0, c[6], 0, 0, c[5], 0, c[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, a[16], a[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[12], b[16], 0, 0, b[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[5], c[14], 0, 0, c[15], 0, 0, 0, c[6], 0, c[12], c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[14], 0, 0, 0, c[5], 0, 0, 0, c[12], 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[18], 0, 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], 0, 0, 0, a[12], a[5], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[6], b[12], 0, 0, b[5], b[14], 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], c[5], 0, c[14], 0, 0, 0, 0, c[7], c[16], c[6], c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[15], 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[14], 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[17], 0, 0, b[18], b[7], 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, c[17], c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[6], 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[12], 0, b[7], b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], c[12], c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[5], 0, a[12], 0, a[14], a[10], 0, 0, 0, 0, a[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[5], b[14], 0, b[6], b[10], 0, 0, 0, 0, b[12], 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[12], c[11], c[10], 0, 0, 0, 0, c[16], 0, c[15], 0, c[5], c[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, a[6], 0, a[5], a[11], 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[15], b[5], 0, b[7], b[11], b[10], 0, b[14], 0, b[6], 0, 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], 0, c[11], 0, c[10], 0, 0, c[12], 0, 0, c[14], c[15], c[5], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, 0, 0, c[17], c[16], 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[12], b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], c[12], 0, c[16], c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, b[6], b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], c[6], c[16], c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[12], c[16], 0, 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], 0, a[16], 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, 0, b[12], 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], c[10], 0, 0, 0, c[11], 0, 0, 0, c[5], 0, c[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], 0, 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, b[2], 0, 0, 0, b[18], 0, 0, 0, c[18], 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, a[9], a[13], 0, 0, a[10], a[4], a[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], a[20], 0, a[8], 0, b[9], 0, b[13], b[10], b[19], 0, b[4], 0, 0, 0, b[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, b[8], 0, 0, 0, c[14], c[8], 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], c[13], c[10], c[4], c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[7], b[5], 0, 0, b[15], 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[5], c[15], 0, 0, 0, 0, 0, c[6], 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, a[6], a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[7], b[6], b[14], 0, b[15], b[5], 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], c[14], c[5], 0, 0, 0, 0, 0, c[12], c[7], c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], b[13], 0, 0, 0, c[13], c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, a[17], 0, 0, a[7], 0, 0, 0, 0, 0, a[6], 0, a[15], 0, 0, 0, a[3], a[2], 0, a[18], 0, 0, 0, 0, a[5], 0, 0, 0, 0, 0, 0, 0, b[18], b[7], 0, b[2], 0, 0, 0, b[13], b[3], b[19], b[4], 0, b[15], b[5], b[17], 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[18], c[4], c[6], c[5], c[17], c[15], 0, c[3], 0, 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, 0, c[19], 0, c[2], 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], a[1], a[9], a[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], a[11], 0, 0, a[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], b[1], b[9], b[13], b[11], 0, b[3], 0, b[2], 0, c[11], c[3], c[2], 0, 0, 0, c[9], 0, 0, 0, c[13], 0, c[1], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, c[1], 0, 0, 0, c[10], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[17], 0, 0, 0, a[12], 0, 0, 0, 0, 0, a[16], 0, 0, a[8], 0, a[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[17], b[19], 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[8], 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, 0, c[16], 0, 0, c[20], 0, 0, 0, 0, c[19], 0, c[2], 0, 0, 0, 0, c[17], 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, a[16], 0, a[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[8], 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, c[17], c[8], 0, 0, c[18], c[12], 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[5], 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, a[16], 0, a[4], a[10], a[8], 0, 0, 0, a[14], 0, 0, 0, a[17], 0, 0, 0, 0, b[10], b[5], 0, b[12], b[14], 0, b[4], 0, 0, b[17], 0, 0, 0, 0, 0, b[8], 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[17], c[14], 0, 0, 0, 0, 0, c[16], 0, 0, 0, c[8], c[9], 0, 0, 0, 0, c[10], 0, c[11], c[3], 0, c[4], 0, 0, c[5], 0, 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[3], a[2], 0, 0, 0, 0, a[4], a[19], 0, a[13], 0, 0, 0, 0, 0, 0, a[20], a[5], 0, a[17], 0, 0, 0, 0, 0, 0, 0, b[3], 0, b[20], b[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], 0, 0, 0, 0, b[4], b[19], 0, b[17], b[5], 0, 0, 0, c[5], c[17], 0, 0, 0, c[20], 0, c[19], 0, 0, c[13], 0, 0, c[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[3], c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], a[18], 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[7], 0, 0, b[18], b[4], 0, 0, b[3], b[15], b[17], b[5], 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], c[5], 0, 0, c[6], 0, 0, c[15], 0, 0, 0, 0, 0, c[4], c[3], 0, 0, 0, 0, 0, c[17], 0, c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], a[18], 0, 0, 0, a[6], 0, 0, 0, 0, 0, a[12], 0, 0, a[17], 0, a[2], 0, a[19], 0, a[20], 0, 0, 0, 0, 0, a[8], 0, 0, b[18], b[2], 0, b[6], 0, 0, 0, 0, 0, 0, 0, b[20], 0, b[19], 0, 0, 0, b[17], b[8], 0, 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, c[17], 0, c[19], c[12], 0, 0, 0, c[20], 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, c[18], 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[5], a[17], 0, 0, a[7], 0, 0, 0, 0, 0, a[6], 0, 0, 0, a[18], a[11], a[3], 0, a[15], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[7], b[15], 0, 0, b[3], 0, 0, 0, b[9], b[11], b[4], b[10], b[18], 0, 0, b[5], b[17], 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[15], c[10], 0, 0, c[5], 0, c[6], c[11], 0, 0, c[18], 0, 0, 0, c[9], 0, 0, c[17], 0, 0, c[4], 0, c[3], 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, a[19], 0, a[15], a[18], 0, 0, 0, 0, a[5], a[17], 0, a[3], 0, 0, 0, a[13], a[20], 0, a[2], 0, 0, a[6], 0, a[4], 0, 0, 0, 0, 0, b[15], 0, b[2], b[18], 0, b[20], 0, 0, 0, 0, b[13], 0, 0, 0, b[3], b[4], b[19], 0, 0, b[5], b[17], 0, b[6], 0, 0, 0, 0, 0, c[6], 0, 0, 0, c[2], 0, c[17], c[4], c[19], c[3], 0, c[13], c[5], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, c[15], c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], 0, 0, 0, 0, 0, a[17], 0, 0, a[2], 0, 0, 0, a[20], 0, 0, 0, a[6], 0, 0, 0, a[19], 0, 0, 0, 0, 0, b[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, b[2], b[19], 0, 0, 0, b[17], 0, 0, 0, b[6], 0, 0, 0, c[6], 0, 0, 0, 0, 0, 0, 0, c[19], 0, c[2], 0, c[20], c[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, 0, a[11], a[3], a[2], 0, 0, 0, a[10], a[4], a[19], a[9], 0, 0, a[20], 0, 0, 0, a[13], 0, 0, a[5], 0, 0, a[17], 0, 0, 0, 0, b[11], b[2], b[13], b[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], b[9], 0, 0, 0, 0, b[10], b[4], b[19], b[5], 0, b[17], 0, 0, 0, c[5], c[17], 0, 0, c[13], 0, c[4], 0, 0, c[9], c[19], 0, c[10], 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[11], c[3], c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], 0, 0, 0, a[17], 0, 0, 0, 0, 0, a[8], 0, 0, a[19], 0, a[20], 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, b[2], b[20], 0, b[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[19], 0, 0, 0, 0, b[8], 0, 0, 0, b[12], 0, 0, 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[19], 0, 0, c[8], 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, c[2], 0, c[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, 0, 0, 0, 0, a[6], 0, 0, a[18], 0, 0, 0, a[2], 0, 0, 0, 0, 0, 0, 0, a[17], 0, 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, b[20], b[2], 0, b[19], 0, b[18], b[17], 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[19], 0, c[17], 0, c[18], 0, c[2], c[6], 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, a[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[12], b[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, c[19], 0, 0, 0, c[2], c[8], 0, c[17], 0, 0, 0, 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, a[3], a[2], 0, 0, a[5], a[17], 0, 0, 0, 0, a[14], a[8], 0, a[4], a[20], a[13], 0, 0, 0, 0, a[19], 0, 0, a[12], 0, 0, 0, 0, b[3], b[13], b[2], b[5], 0, b[19], b[17], b[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[4], 0, 0, 0, 0, b[14], b[8], 0, b[12], 0, 0, 0, 0, 0, c[12], 0, 0, 0, c[19], 0, c[8], 0, 0, c[4], 0, 0, c[14], 0, 0, 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, c[20], 0, c[3], c[2], c[5], c[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[17], a[5], 0, a[14], a[8], a[4], a[12], 0, 0, 0, 0, 0, 0, 0, 0, b[5], b[6], 0, 0, b[12], 0, b[17], b[8], 0, 0, b[4], 0, b[14], 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[12], 0, 0, 0, c[16], 0, 0, c[14], 0, 0, 0, c[3], c[4], 0, 0, 0, c[5], 0, c[15], c[18], 0, c[17], c[8], 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], a[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[18], a[15], 0, a[5], a[17], a[3], a[6], 0, 0, 0, 0, 0, 0, 0, 0, b[15], b[7], 0, 0, b[6], 0, b[18], b[17], 0, 0, b[3], b[4], b[5], b[8], b[14], 0, 0, 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[6], c[14], 0, 0, c[12], 0, 0, c[5], 0, 0, 0, 0, c[3], 0, c[4], 0, c[15], 0, 0, 0, c[8], c[18], c[17], 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], 0, 0, 0, 0, 0, a[19], 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, a[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, 0, b[19], 0, 0, 0, b[17], 0, 0, 0, c[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], a[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, a[17], 0, a[8], 0, a[19], 0, 0, 0, 0, 0, a[16], 0, 0, b[6], b[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[19], 0, b[8], 0, 0, 0, b[12], b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, c[12], 0, c[8], 0, 0, 0, c[2], c[19], 0, 0, 0, c[17], 0, c[18], 0, 0, 0, 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, a[5], a[17], 0, 0, 0, a[12], 0, 0, 0, 0, 0, a[16], 0, a[14], a[19], a[4], 0, 0, 0, 0, a[8], 0, 0, 0, 0, 0, 0, 0, b[5], b[4], b[17], 0, 0, b[8], b[12], b[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[14], 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, c[16], 0, 0, c[14], 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, c[4], 0, c[3], c[2], 0, c[19], 0, c[5], c[17], 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], 0, a[12], 0, a[17], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[17], b[8], b[12], 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, c[12], 0, 0, 0, c[18], c[17], 0, c[8], 0, c[6], 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[8], a[14], 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, b[14], b[12], 0, 0, b[16], 0, b[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[4], 0, 0, 0, c[3], c[14], 0, c[5], c[17], 0, c[8], 0, 0, c[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[7], 0, a[6], 0, a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, b[8], 0, b[18], b[17], b[6], 0, b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[12], 0, 0, 0, 0, 0, c[6], 0, 0, 0, 0, c[18], c[8], c[17], 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[10], 0, 0, 0, c[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[9], a[13], a[20], 0, 0, 0, 0, 0, 0, 0, 0, a[11], 0, a[3], 0, 0, a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], b[13], b[20], b[3], b[11], b[2], 0, 0, c[11], c[3], c[2], 0, 0, 0, 0, c[13], 0, 0, 0, c[20], 0, c[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[3], 0, a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], b[20], 0, b[2], b[3], 0, 0, 0, c[3], c[2], 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, b[2], 0, 0, 0, c[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], 0, 0, 0, 0, a[14], a[8], 0, a[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[4], 0, 0, b[8], 0, 0, b[10], 0, b[14], 0, 0, 0, 0, 0, b[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, c[16], c[4], 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, 0, 0, 0, 0, 0, 0, 0, c[1], c[9], 0, 0, 0, 0, c[10], 0, 0, c[14], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[4], 0, 0, 0, 0, 0, 0, a[10], a[4], 0, 0, 0, a[14], a[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[19], 0, a[16], 0, b[10], 0, b[4], 0, b[8], 0, b[14], 0, 0, 0, b[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, c[16], 0, c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], c[13], 0, 0, 0, c[10], c[4], 0, c[14], c[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[4], a[19], 0, 0, a[14], a[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, b[4], 0, b[19], b[14], 0, 0, b[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], c[20], 0, 0, 0, c[4], c[19], c[14], c[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[19], 0, 0, 0, a[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[16], 0, 0, 0, 0, 0, 0, b[19], 0, 0, b[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[16], 0, 0, 0, c[16], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, c[19], 0, c[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, a[9], 0, 0, a[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], b[1], b[13], 0, b[20], c[1], c[9], c[13], c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], a[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[6], 0, a[18], 0, a[17], 0, a[2], 0, 0, 0, 0, 0, a[12], 0, 0, b[7], b[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[2], b[19], b[17], 0, b[8], 0, b[6], b[12], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[8], 0, c[12], 0, c[6], 0, c[17], 0, 0, 0, 0, c[2], 0, c[19], 0, c[18], 0, 0, 0, 0, 0, 0, c[7], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[5], 0, 0, 0, a[7], 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, a[11], 0, 0, 0, a[6], 0, 0, 0, 0, b[7], 0, 0, 0, 0, 0, 0, 0, 0, b[11], 0, 0, 0, b[1], 0, b[10], 0, b[15], 0, 0, 0, b[5], b[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[7], c[15], 0, 0, 0, c[1], 0, 0, c[5], 0, 0, c[10], 0, c[11], 0, 0, 0, 0, 0, 0, c[6], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], a[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], 0, 0, a[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[1], 0, b[9], b[20], b[13], 0, c[1], c[9], c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[1], a[9], a[13], a[20], 0, a[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], 0, 0, a[4], b[20], 0, 0, 0, b[1], b[13], 0, b[9], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[10], 0, b[4], 0, b[19], 0, c[10], c[4], c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[1], c[9], c[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[9], a[13], a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[10], 0, a[4], 0, 0, a[19], 0, 0, 0, 0, b[9], b[20], 0, b[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[4], b[10], b[19], 0, 0, c[10], c[4], c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[9], c[13], c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[4], 0, a[19], 0, 0, 0, 0, 0, 0, 0, b[13], 0, 0, b[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[19], b[4], 0, 0, 0, c[4], c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, b[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[19], 0, 0, 0, c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, u[2], 0, 0, 0, 0, a[13], a[20], 0, 0, 0, 0, 0, 0, a[11], a[3], a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, a[9], a[18], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[9], b[13], b[20], 0, b[11], b[3], b[2], b[15], 0, b[18], 0, 0, 0, c[15], c[18], 0, 0, 0, 0, c[3], c[9], c[13], 0, c[2], 0, c[11], 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], 0, 0, 0, 0, 0, 0, 0, a[3], a[2], 0, 0, 0, 0, 0, 0, 0, 0, 0, a[15], 0, a[18], 0, a[13], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[13], b[20], 0, 0, b[3], b[2], 0, b[18], b[15], 0, 0, 0, c[15], c[18], 0, 0, 0, 0, 0, c[2], c[13], c[20], 0, 0, 0, c[3], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[13], a[20], 0, 0, a[4], a[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[14], 0, a[8], 0, 0, 0, 0, b[13], 0, b[20], b[4], 0, 0, b[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[8], b[14], 0, 0, 0, c[14], c[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[13], c[20], c[4], c[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[20], 0, 0, 0, a[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, a[8], 0, 0, 0, 0, 0, 0, b[20], 0, 0, b[19], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, b[8], 0, 0, 0, c[8], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, c[20], 0, c[19], 0, 0, 0, 0); - cv::Mat M = cv::Mat::zeros(120, 120, CV_64F); M.at(0,0)=u[1]; M.at(0,35)=a[1]; M.at(0,83)=b[1]; M.at(0,118)=c[1]; @@ -570,133 +572,11 @@ cv::Mat dls::cayley_LS_M(const std::vector& a, const std::vector M.at(118,27)=a[13]; M.at(118,28)=a[20]; M.at(118,31)=a[4]; M.at(118,32)=a[19]; M.at(118,48)=a[14]; M.at(118,50)=a[8]; M.at(118,55)=b[13]; M.at(118,57)=b[20]; M.at(118,58)=b[4]; M.at(118,61)=b[19]; M.at(118,80)=b[8]; M.at(118,81)=b[14]; M.at(118,85)=c[14]; M.at(118,86)=c[8]; M.at(118,113)=c[13]; M.at(118,114)=c[20]; M.at(118,115)=c[4]; M.at(118,116)=c[19]; M.at(119,27)=a[20]; M.at(119,31)=a[19]; M.at(119,48)=a[8]; M.at(119,55)=b[20]; M.at(119,58)=b[19]; M.at(119,81)=b[8]; M.at(119,85)=c[8]; M.at(119,113)=c[20]; M.at(119,115)=c[19]; - /*M[0][0]=u[1]; M[0][35]=a[1]; M[0][83]=b[1]; M[0][118]=c[1]; - M[1][0]=u[4]; M[1][1]=u[1]; M[1][34]=a[1]; M[1][35]=a[10]; M[1][54]=b[1]; M[1][83]=b[10]; M[1][99]=c[1]; M[1][118]=c[10]; - M[2][1]=u[4]; M[2][2]=u[1]; M[2][34]=a[10]; M[2][35]=a[14]; M[2][51]=a[1]; M[2][54]=b[10]; M[2][65]=b[1]; M[2][83]=b[14]; M[2][89]=c[1]; M[2][99]=c[10]; M[2][118]=c[14]; - M[3][0]=u[3]; M[3][3]=u[1]; M[3][35]=a[11]; M[3][49]=a[1]; M[3][76]=b[1]; M[3][83]=b[11]; M[3][118]=c[11]; M[3][119]=c[1]; - M[4][1]=u[3]; M[4][3]=u[4]; M[4][4]=u[1]; M[4][34]=a[11]; M[4][35]=a[5]; M[4][43]=a[1]; M[4][49]=a[10]; M[4][54]=b[11]; M[4][71]=b[1]; M[4][76]=b[10]; M[4][83]=b[5]; M[4][99]=c[11]; M[4][100]=c[1]; M[4][118]=c[5]; M[4][119]=c[10]; - M[5][2]=u[3]; M[5][4]=u[4]; M[5][5]=u[1]; M[5][34]=a[5]; M[5][35]=a[12]; M[5][41]=a[1]; M[5][43]=a[10]; M[5][49]=a[14]; M[5][51]=a[11]; M[5][54]=b[5]; M[5][62]=b[1]; M[5][65]=b[11]; M[5][71]=b[10]; M[5][76]=b[14]; M[5][83]=b[12]; M[5][89]=c[11]; M[5][99]=c[5]; M[5][100]=c[10]; M[5][111]=c[1]; M[5][118]=c[12]; M[5][119]=c[14]; - M[6][3]=u[3]; M[6][6]=u[1]; M[6][30]=a[1]; M[6][35]=a[15]; M[6][49]=a[11]; M[6][75]=b[1]; M[6][76]=b[11]; M[6][83]=b[15]; M[6][107]=c[1]; M[6][118]=c[15]; M[6][119]=c[11]; - M[7][4]=u[3]; M[7][6]=u[4]; M[7][7]=u[1]; M[7][30]=a[10]; M[7][34]=a[15]; M[7][35]=a[6]; M[7][43]=a[11]; M[7][45]=a[1]; M[7][49]=a[5]; M[7][54]=b[15]; M[7][63]=b[1]; M[7][71]=b[11]; M[7][75]=b[10]; M[7][76]=b[5]; M[7][83]=b[6]; M[7][99]=c[15]; M[7][100]=c[11]; M[7][107]=c[10]; M[7][112]=c[1]; M[7][118]=c[6]; M[7][119]=c[5]; - M[8][5]=u[3]; M[8][7]=u[4]; M[8][8]=u[1]; M[8][30]=a[14]; M[8][34]=a[6]; M[8][41]=a[11]; M[8][43]=a[5]; M[8][45]=a[10]; M[8][46]=a[1]; M[8][49]=a[12]; M[8][51]=a[15]; M[8][54]=b[6]; M[8][62]=b[11]; M[8][63]=b[10]; M[8][65]=b[15]; M[8][66]=b[1]; M[8][71]=b[5]; M[8][75]=b[14]; M[8][76]=b[12]; M[8][89]=c[15]; M[8][99]=c[6]; M[8][100]=c[5]; M[8][102]=c[1]; M[8][107]=c[14]; M[8][111]=c[11]; M[8][112]=c[10]; M[8][119]=c[12]; - M[9][0]=u[2]; M[9][9]=u[1]; M[9][35]=a[9]; M[9][36]=a[1]; M[9][83]=b[9]; M[9][84]=b[1]; M[9][88]=c[1]; M[9][118]=c[9]; - M[10][1]=u[2]; M[10][9]=u[4]; M[10][10]=u[1]; M[10][33]=a[1]; M[10][34]=a[9]; M[10][35]=a[4]; M[10][36]=a[10]; M[10][54]=b[9]; M[10][59]=b[1]; M[10][83]=b[4]; M[10][84]=b[10]; M[10][88]=c[10]; M[10][99]=c[9]; M[10][117]=c[1]; M[10][118]=c[4]; - M[11][2]=u[2]; M[11][10]=u[4]; M[11][11]=u[1]; M[11][28]=a[1]; M[11][33]=a[10]; M[11][34]=a[4]; M[11][35]=a[8]; M[11][36]=a[14]; M[11][51]=a[9]; M[11][54]=b[4]; M[11][57]=b[1]; M[11][59]=b[10]; M[11][65]=b[9]; M[11][83]=b[8]; M[11][84]=b[14]; M[11][88]=c[14]; M[11][89]=c[9]; M[11][99]=c[4]; M[11][114]=c[1]; M[11][117]=c[10]; M[11][118]=c[8]; - M[12][3]=u[2]; M[12][9]=u[3]; M[12][12]=u[1]; M[12][35]=a[3]; M[12][36]=a[11]; M[12][39]=a[1]; M[12][49]=a[9]; M[12][76]=b[9]; M[12][79]=b[1]; M[12][83]=b[3]; M[12][84]=b[11]; M[12][88]=c[11]; M[12][96]=c[1]; M[12][118]=c[3]; M[12][119]=c[9]; - M[13][4]=u[2]; M[13][10]=u[3]; M[13][12]=u[4]; M[13][13]=u[1]; M[13][33]=a[11]; M[13][34]=a[3]; M[13][35]=a[17]; M[13][36]=a[5]; M[13][39]=a[10]; M[13][43]=a[9]; M[13][47]=a[1]; M[13][49]=a[4]; M[13][54]=b[3]; M[13][59]=b[11]; M[13][60]=b[1]; M[13][71]=b[9]; M[13][76]=b[4]; M[13][79]=b[10]; M[13][83]=b[17]; M[13][84]=b[5]; M[13][88]=c[5]; M[13][90]=c[1]; M[13][96]=c[10]; M[13][99]=c[3]; M[13][100]=c[9]; M[13][117]=c[11]; M[13][118]=c[17]; M[13][119]=c[4]; - M[14][5]=u[2]; M[14][11]=u[3]; M[14][13]=u[4]; M[14][14]=u[1]; M[14][28]=a[11]; M[14][33]=a[5]; M[14][34]=a[17]; M[14][36]=a[12]; M[14][39]=a[14]; M[14][41]=a[9]; M[14][42]=a[1]; M[14][43]=a[4]; M[14][47]=a[10]; M[14][49]=a[8]; M[14][51]=a[3]; M[14][54]=b[17]; M[14][56]=b[1]; M[14][57]=b[11]; M[14][59]=b[5]; M[14][60]=b[10]; M[14][62]=b[9]; M[14][65]=b[3]; M[14][71]=b[4]; M[14][76]=b[8]; M[14][79]=b[14]; M[14][84]=b[12]; M[14][88]=c[12]; M[14][89]=c[3]; M[14][90]=c[10]; M[14][96]=c[14]; M[14][99]=c[17]; M[14][100]=c[4]; M[14][106]=c[1]; M[14][111]=c[9]; M[14][114]=c[11]; M[14][117]=c[5]; M[14][119]=c[8]; - M[15][6]=u[2]; M[15][12]=u[3]; M[15][15]=u[1]; M[15][29]=a[1]; M[15][30]=a[9]; M[15][35]=a[18]; M[15][36]=a[15]; M[15][39]=a[11]; M[15][49]=a[3]; M[15][74]=b[1]; M[15][75]=b[9]; M[15][76]=b[3]; M[15][79]=b[11]; M[15][83]=b[18]; M[15][84]=b[15]; M[15][88]=c[15]; M[15][94]=c[1]; M[15][96]=c[11]; M[15][107]=c[9]; M[15][118]=c[18]; M[15][119]=c[3]; - M[16][7]=u[2]; M[16][13]=u[3]; M[16][15]=u[4]; M[16][16]=u[1]; M[16][29]=a[10]; M[16][30]=a[4]; M[16][33]=a[15]; M[16][34]=a[18]; M[16][36]=a[6]; M[16][39]=a[5]; M[16][43]=a[3]; M[16][44]=a[1]; M[16][45]=a[9]; M[16][47]=a[11]; M[16][49]=a[17]; M[16][54]=b[18]; M[16][59]=b[15]; M[16][60]=b[11]; M[16][63]=b[9]; M[16][68]=b[1]; M[16][71]=b[3]; M[16][74]=b[10]; M[16][75]=b[4]; M[16][76]=b[17]; M[16][79]=b[5]; M[16][84]=b[6]; M[16][88]=c[6]; M[16][90]=c[11]; M[16][94]=c[10]; M[16][96]=c[5]; M[16][97]=c[1]; M[16][99]=c[18]; M[16][100]=c[3]; M[16][107]=c[4]; M[16][112]=c[9]; M[16][117]=c[15]; M[16][119]=c[17]; - M[17][8]=u[2]; M[17][14]=u[3]; M[17][16]=u[4]; M[17][17]=u[1]; M[17][28]=a[15]; M[17][29]=a[14]; M[17][30]=a[8]; M[17][33]=a[6]; M[17][39]=a[12]; M[17][41]=a[3]; M[17][42]=a[11]; M[17][43]=a[17]; M[17][44]=a[10]; M[17][45]=a[4]; M[17][46]=a[9]; M[17][47]=a[5]; M[17][51]=a[18]; M[17][56]=b[11]; M[17][57]=b[15]; M[17][59]=b[6]; M[17][60]=b[5]; M[17][62]=b[3]; M[17][63]=b[4]; M[17][65]=b[18]; M[17][66]=b[9]; M[17][68]=b[10]; M[17][71]=b[17]; M[17][74]=b[14]; M[17][75]=b[8]; M[17][79]=b[12]; M[17][89]=c[18]; M[17][90]=c[5]; M[17][94]=c[14]; M[17][96]=c[12]; M[17][97]=c[10]; M[17][100]=c[17]; M[17][102]=c[9]; M[17][106]=c[11]; M[17][107]=c[8]; M[17][111]=c[3]; M[17][112]=c[4]; M[17][114]=c[15]; M[17][117]=c[6]; - M[18][9]=u[2]; M[18][18]=u[1]; M[18][35]=a[13]; M[18][36]=a[9]; M[18][53]=a[1]; M[18][82]=b[1]; M[18][83]=b[13]; M[18][84]=b[9]; M[18][87]=c[1]; M[18][88]=c[9]; M[18][118]=c[13]; - M[19][10]=u[2]; M[19][18]=u[4]; M[19][19]=u[1]; M[19][32]=a[1]; M[19][33]=a[9]; M[19][34]=a[13]; M[19][35]=a[19]; M[19][36]=a[4]; M[19][53]=a[10]; M[19][54]=b[13]; M[19][59]=b[9]; M[19][61]=b[1]; M[19][82]=b[10]; M[19][83]=b[19]; M[19][84]=b[4]; M[19][87]=c[10]; M[19][88]=c[4]; M[19][99]=c[13]; M[19][116]=c[1]; M[19][117]=c[9]; M[19][118]=c[19]; - M[20][11]=u[2]; M[20][19]=u[4]; M[20][20]=u[1]; M[20][27]=a[1]; M[20][28]=a[9]; M[20][32]=a[10]; M[20][33]=a[4]; M[20][34]=a[19]; M[20][36]=a[8]; M[20][51]=a[13]; M[20][53]=a[14]; M[20][54]=b[19]; M[20][55]=b[1]; M[20][57]=b[9]; M[20][59]=b[4]; M[20][61]=b[10]; M[20][65]=b[13]; M[20][82]=b[14]; M[20][84]=b[8]; M[20][87]=c[14]; M[20][88]=c[8]; M[20][89]=c[13]; M[20][99]=c[19]; M[20][113]=c[1]; M[20][114]=c[9]; M[20][116]=c[10]; M[20][117]=c[4]; - M[21][12]=u[2]; M[21][18]=u[3]; M[21][21]=u[1]; M[21][35]=a[2]; M[21][36]=a[3]; M[21][38]=a[1]; M[21][39]=a[9]; M[21][49]=a[13]; M[21][53]=a[11]; M[21][76]=b[13]; M[21][78]=b[1]; M[21][79]=b[9]; M[21][82]=b[11]; M[21][83]=b[2]; M[21][84]=b[3]; M[21][87]=c[11]; M[21][88]=c[3]; M[21][92]=c[1]; M[21][96]=c[9]; M[21][118]=c[2]; M[21][119]=c[13]; - M[22][13]=u[2]; M[22][19]=u[3]; M[22][21]=u[4]; M[22][22]=u[1]; M[22][32]=a[11]; M[22][33]=a[3]; M[22][34]=a[2]; M[22][36]=a[17]; M[22][38]=a[10]; M[22][39]=a[4]; M[22][40]=a[1]; M[22][43]=a[13]; M[22][47]=a[9]; M[22][49]=a[19]; M[22][53]=a[5]; M[22][54]=b[2]; M[22][59]=b[3]; M[22][60]=b[9]; M[22][61]=b[11]; M[22][71]=b[13]; M[22][72]=b[1]; M[22][76]=b[19]; M[22][78]=b[10]; M[22][79]=b[4]; M[22][82]=b[5]; M[22][84]=b[17]; M[22][87]=c[5]; M[22][88]=c[17]; M[22][90]=c[9]; M[22][92]=c[10]; M[22][95]=c[1]; M[22][96]=c[4]; M[22][99]=c[2]; M[22][100]=c[13]; M[22][116]=c[11]; M[22][117]=c[3]; M[22][119]=c[19]; - M[23][14]=u[2]; M[23][20]=u[3]; M[23][22]=u[4]; M[23][23]=u[1]; M[23][27]=a[11]; M[23][28]=a[3]; M[23][32]=a[5]; M[23][33]=a[17]; M[23][38]=a[14]; M[23][39]=a[8]; M[23][40]=a[10]; M[23][41]=a[13]; M[23][42]=a[9]; M[23][43]=a[19]; M[23][47]=a[4]; M[23][51]=a[2]; M[23][53]=a[12]; M[23][55]=b[11]; M[23][56]=b[9]; M[23][57]=b[3]; M[23][59]=b[17]; M[23][60]=b[4]; M[23][61]=b[5]; M[23][62]=b[13]; M[23][65]=b[2]; M[23][71]=b[19]; M[23][72]=b[10]; M[23][78]=b[14]; M[23][79]=b[8]; M[23][82]=b[12]; M[23][87]=c[12]; M[23][89]=c[2]; M[23][90]=c[4]; M[23][92]=c[14]; M[23][95]=c[10]; M[23][96]=c[8]; M[23][100]=c[19]; M[23][106]=c[9]; M[23][111]=c[13]; M[23][113]=c[11]; M[23][114]=c[3]; M[23][116]=c[5]; M[23][117]=c[17]; - M[24][15]=u[2]; M[24][21]=u[3]; M[24][24]=u[1]; M[24][29]=a[9]; M[24][30]=a[13]; M[24][36]=a[18]; M[24][38]=a[11]; M[24][39]=a[3]; M[24][49]=a[2]; M[24][52]=a[1]; M[24][53]=a[15]; M[24][73]=b[1]; M[24][74]=b[9]; M[24][75]=b[13]; M[24][76]=b[2]; M[24][78]=b[11]; M[24][79]=b[3]; M[24][82]=b[15]; M[24][84]=b[18]; M[24][87]=c[15]; M[24][88]=c[18]; M[24][92]=c[11]; M[24][93]=c[1]; M[24][94]=c[9]; M[24][96]=c[3]; M[24][107]=c[13]; M[24][119]=c[2]; - M[25][16]=u[2]; M[25][22]=u[3]; M[25][24]=u[4]; M[25][25]=u[1]; M[25][29]=a[4]; M[25][30]=a[19]; M[25][32]=a[15]; M[25][33]=a[18]; M[25][38]=a[5]; M[25][39]=a[17]; M[25][40]=a[11]; M[25][43]=a[2]; M[25][44]=a[9]; M[25][45]=a[13]; M[25][47]=a[3]; M[25][52]=a[10]; M[25][53]=a[6]; M[25][59]=b[18]; M[25][60]=b[3]; M[25][61]=b[15]; M[25][63]=b[13]; M[25][68]=b[9]; M[25][71]=b[2]; M[25][72]=b[11]; M[25][73]=b[10]; M[25][74]=b[4]; M[25][75]=b[19]; M[25][78]=b[5]; M[25][79]=b[17]; M[25][82]=b[6]; M[25][87]=c[6]; M[25][90]=c[3]; M[25][92]=c[5]; M[25][93]=c[10]; M[25][94]=c[4]; M[25][95]=c[11]; M[25][96]=c[17]; M[25][97]=c[9]; M[25][100]=c[2]; M[25][107]=c[19]; M[25][112]=c[13]; M[25][116]=c[15]; M[25][117]=c[18]; - M[26][17]=u[2]; M[26][23]=u[3]; M[26][25]=u[4]; M[26][26]=u[1]; M[26][27]=a[15]; M[26][28]=a[18]; M[26][29]=a[8]; M[26][32]=a[6]; M[26][38]=a[12]; M[26][40]=a[5]; M[26][41]=a[2]; M[26][42]=a[3]; M[26][44]=a[4]; M[26][45]=a[19]; M[26][46]=a[13]; M[26][47]=a[17]; M[26][52]=a[14]; M[26][55]=b[15]; M[26][56]=b[3]; M[26][57]=b[18]; M[26][60]=b[17]; M[26][61]=b[6]; M[26][62]=b[2]; M[26][63]=b[19]; M[26][66]=b[13]; M[26][68]=b[4]; M[26][72]=b[5]; M[26][73]=b[14]; M[26][74]=b[8]; M[26][78]=b[12]; M[26][90]=c[17]; M[26][92]=c[12]; M[26][93]=c[14]; M[26][94]=c[8]; M[26][95]=c[5]; M[26][97]=c[4]; M[26][102]=c[13]; M[26][106]=c[3]; M[26][111]=c[2]; M[26][112]=c[19]; M[26][113]=c[15]; M[26][114]=c[18]; M[26][116]=c[6]; - M[27][15]=u[3]; M[27][29]=a[11]; M[27][30]=a[3]; M[27][36]=a[7]; M[27][39]=a[15]; M[27][49]=a[18]; M[27][69]=b[9]; M[27][70]=b[1]; M[27][74]=b[11]; M[27][75]=b[3]; M[27][76]=b[18]; M[27][79]=b[15]; M[27][84]=b[7]; M[27][88]=c[7]; M[27][91]=c[1]; M[27][94]=c[11]; M[27][96]=c[15]; M[27][107]=c[3]; M[27][110]=c[9]; M[27][119]=c[18]; - M[28][6]=u[3]; M[28][30]=a[11]; M[28][35]=a[7]; M[28][49]=a[15]; M[28][69]=b[1]; M[28][75]=b[11]; M[28][76]=b[15]; M[28][83]=b[7]; M[28][107]=c[11]; M[28][110]=c[1]; M[28][118]=c[7]; M[28][119]=c[15]; - M[29][24]=u[3]; M[29][29]=a[3]; M[29][30]=a[2]; M[29][38]=a[15]; M[29][39]=a[18]; M[29][52]=a[11]; M[29][53]=a[7]; M[29][69]=b[13]; M[29][70]=b[9]; M[29][73]=b[11]; M[29][74]=b[3]; M[29][75]=b[2]; M[29][78]=b[15]; M[29][79]=b[18]; M[29][82]=b[7]; M[29][87]=c[7]; M[29][91]=c[9]; M[29][92]=c[15]; M[29][93]=c[11]; M[29][94]=c[3]; M[29][96]=c[18]; M[29][107]=c[2]; M[29][110]=c[13]; - M[30][37]=a[18]; M[30][48]=a[7]; M[30][52]=a[2]; M[30][70]=b[20]; M[30][73]=b[2]; M[30][77]=b[18]; M[30][81]=b[7]; M[30][85]=c[7]; M[30][91]=c[20]; M[30][93]=c[2]; M[30][98]=c[18]; - M[31][29]=a[2]; M[31][37]=a[15]; M[31][38]=a[18]; M[31][50]=a[7]; M[31][52]=a[3]; M[31][69]=b[20]; M[31][70]=b[13]; M[31][73]=b[3]; M[31][74]=b[2]; M[31][77]=b[15]; M[31][78]=b[18]; M[31][80]=b[7]; M[31][86]=c[7]; M[31][91]=c[13]; M[31][92]=c[18]; M[31][93]=c[3]; M[31][94]=c[2]; M[31][98]=c[15]; M[31][110]=c[20]; - M[32][48]=a[9]; M[32][50]=a[13]; M[32][53]=a[20]; M[32][80]=b[13]; M[32][81]=b[9]; M[32][82]=b[20]; M[32][85]=c[9]; M[32][86]=c[13]; M[32][87]=c[20]; - M[33][29]=a[15]; M[33][30]=a[18]; M[33][39]=a[7]; M[33][64]=b[9]; M[33][69]=b[3]; M[33][70]=b[11]; M[33][74]=b[15]; M[33][75]=b[18]; M[33][79]=b[7]; M[33][91]=c[11]; M[33][94]=c[15]; M[33][96]=c[7]; M[33][103]=c[9]; M[33][107]=c[18]; M[33][110]=c[3]; - M[34][29]=a[18]; M[34][38]=a[7]; M[34][52]=a[15]; M[34][64]=b[13]; M[34][69]=b[2]; M[34][70]=b[3]; M[34][73]=b[15]; M[34][74]=b[18]; M[34][78]=b[7]; M[34][91]=c[3]; M[34][92]=c[7]; M[34][93]=c[15]; M[34][94]=c[18]; M[34][103]=c[13]; M[34][110]=c[2]; - M[35][37]=a[7]; M[35][52]=a[18]; M[35][64]=b[20]; M[35][70]=b[2]; M[35][73]=b[18]; M[35][77]=b[7]; M[35][91]=c[2]; M[35][93]=c[18]; M[35][98]=c[7]; M[35][103]=c[20]; - M[36][5]=u[4]; M[36][34]=a[12]; M[36][41]=a[10]; M[36][43]=a[14]; M[36][49]=a[16]; M[36][51]=a[5]; M[36][54]=b[12]; M[36][62]=b[10]; M[36][65]=b[5]; M[36][71]=b[14]; M[36][76]=b[16]; M[36][89]=c[5]; M[36][99]=c[12]; M[36][100]=c[14]; M[36][101]=c[1]; M[36][109]=c[11]; M[36][111]=c[10]; M[36][119]=c[16]; - M[37][2]=u[4]; M[37][34]=a[14]; M[37][35]=a[16]; M[37][51]=a[10]; M[37][54]=b[14]; M[37][65]=b[10]; M[37][83]=b[16]; M[37][89]=c[10]; M[37][99]=c[14]; M[37][109]=c[1]; M[37][118]=c[16]; - M[38][30]=a[15]; M[38][49]=a[7]; M[38][64]=b[1]; M[38][69]=b[11]; M[38][75]=b[15]; M[38][76]=b[7]; M[38][103]=c[1]; M[38][107]=c[15]; M[38][110]=c[11]; M[38][119]=c[7]; - M[39][28]=a[14]; M[39][33]=a[16]; M[39][51]=a[8]; M[39][57]=b[14]; M[39][59]=b[16]; M[39][65]=b[8]; M[39][89]=c[8]; M[39][105]=c[9]; M[39][108]=c[10]; M[39][109]=c[4]; M[39][114]=c[14]; M[39][117]=c[16]; - M[40][27]=a[14]; M[40][28]=a[8]; M[40][32]=a[16]; M[40][55]=b[14]; M[40][57]=b[8]; M[40][61]=b[16]; M[40][105]=c[13]; M[40][108]=c[4]; M[40][109]=c[19]; M[40][113]=c[14]; M[40][114]=c[8]; M[40][116]=c[16]; - M[41][30]=a[7]; M[41][64]=b[11]; M[41][69]=b[15]; M[41][75]=b[7]; M[41][103]=c[11]; M[41][107]=c[7]; M[41][110]=c[15]; - M[42][27]=a[8]; M[42][31]=a[16]; M[42][55]=b[8]; M[42][58]=b[16]; M[42][105]=c[20]; M[42][108]=c[19]; M[42][113]=c[8]; M[42][115]=c[16]; - M[43][29]=a[7]; M[43][64]=b[3]; M[43][69]=b[18]; M[43][70]=b[15]; M[43][74]=b[7]; M[43][91]=c[15]; M[43][94]=c[7]; M[43][103]=c[3]; M[43][110]=c[18]; - M[44][28]=a[16]; M[44][57]=b[16]; M[44][105]=c[4]; M[44][108]=c[14]; M[44][109]=c[8]; M[44][114]=c[16]; - M[45][27]=a[16]; M[45][55]=b[16]; M[45][105]=c[19]; M[45][108]=c[8]; M[45][113]=c[16]; - M[46][52]=a[7]; M[46][64]=b[2]; M[46][70]=b[18]; M[46][73]=b[7]; M[46][91]=c[18]; M[46][93]=c[7]; M[46][103]=c[2]; - M[47][40]=a[7]; M[47][44]=a[18]; M[47][52]=a[6]; M[47][64]=b[19]; M[47][67]=b[2]; M[47][68]=b[18]; M[47][70]=b[17]; M[47][72]=b[7]; M[47][73]=b[6]; M[47][91]=c[17]; M[47][93]=c[6]; M[47][95]=c[7]; M[47][97]=c[18]; M[47][103]=c[19]; M[47][104]=c[2]; - M[48][30]=a[6]; M[48][43]=a[7]; M[48][45]=a[15]; M[48][63]=b[15]; M[48][64]=b[10]; M[48][67]=b[11]; M[48][69]=b[5]; M[48][71]=b[7]; M[48][75]=b[6]; M[48][100]=c[7]; M[48][103]=c[10]; M[48][104]=c[11]; M[48][107]=c[6]; M[48][110]=c[5]; M[48][112]=c[15]; - M[49][41]=a[12]; M[49][45]=a[16]; M[49][46]=a[14]; M[49][62]=b[12]; M[49][63]=b[16]; M[49][66]=b[14]; M[49][101]=c[5]; M[49][102]=c[14]; M[49][105]=c[15]; M[49][109]=c[6]; M[49][111]=c[12]; M[49][112]=c[16]; - M[50][41]=a[16]; M[50][62]=b[16]; M[50][101]=c[14]; M[50][105]=c[5]; M[50][109]=c[12]; M[50][111]=c[16]; - M[51][64]=b[18]; M[51][70]=b[7]; M[51][91]=c[7]; M[51][103]=c[18]; - M[52][41]=a[6]; M[52][45]=a[12]; M[52][46]=a[5]; M[52][62]=b[6]; M[52][63]=b[12]; M[52][66]=b[5]; M[52][67]=b[14]; M[52][69]=b[16]; M[52][101]=c[15]; M[52][102]=c[5]; M[52][104]=c[14]; M[52][109]=c[7]; M[52][110]=c[16]; M[52][111]=c[6]; M[52][112]=c[12]; - M[53][64]=b[15]; M[53][69]=b[7]; M[53][103]=c[15]; M[53][110]=c[7]; - M[54][105]=c[14]; M[54][109]=c[16]; - M[55][44]=a[7]; M[55][64]=b[17]; M[55][67]=b[18]; M[55][68]=b[7]; M[55][70]=b[6]; M[55][91]=c[6]; M[55][97]=c[7]; M[55][103]=c[17]; M[55][104]=c[18]; - M[56][105]=c[8]; M[56][108]=c[16]; - M[57][64]=b[6]; M[57][67]=b[7]; M[57][103]=c[6]; M[57][104]=c[7]; - M[58][46]=a[7]; M[58][64]=b[12]; M[58][66]=b[7]; M[58][67]=b[6]; M[58][102]=c[7]; M[58][103]=c[12]; M[58][104]=c[6]; - M[59][8]=u[4]; M[59][30]=a[16]; M[59][41]=a[5]; M[59][43]=a[12]; M[59][45]=a[14]; M[59][46]=a[10]; M[59][51]=a[6]; M[59][62]=b[5]; M[59][63]=b[14]; M[59][65]=b[6]; M[59][66]=b[10]; M[59][71]=b[12]; M[59][75]=b[16]; M[59][89]=c[6]; M[59][100]=c[12]; M[59][101]=c[11]; M[59][102]=c[10]; M[59][107]=c[16]; M[59][109]=c[15]; M[59][111]=c[5]; M[59][112]=c[14]; - M[60][8]=u[3]; M[60][30]=a[12]; M[60][41]=a[15]; M[60][43]=a[6]; M[60][45]=a[5]; M[60][46]=a[11]; M[60][51]=a[7]; M[60][62]=b[15]; M[60][63]=b[5]; M[60][65]=b[7]; M[60][66]=b[11]; M[60][67]=b[10]; M[60][69]=b[14]; M[60][71]=b[6]; M[60][75]=b[12]; M[60][89]=c[7]; M[60][100]=c[6]; M[60][102]=c[11]; M[60][104]=c[10]; M[60][107]=c[12]; M[60][110]=c[14]; M[60][111]=c[15]; M[60][112]=c[5]; - M[61][42]=a[16]; M[61][56]=b[16]; M[61][101]=c[8]; M[61][105]=c[17]; M[61][106]=c[16]; M[61][108]=c[12]; - M[62][64]=b[7]; M[62][103]=c[7]; - M[63][105]=c[16]; - M[64][46]=a[12]; M[64][66]=b[12]; M[64][67]=b[16]; M[64][101]=c[6]; M[64][102]=c[12]; M[64][104]=c[16]; M[64][105]=c[7]; - M[65][46]=a[6]; M[65][64]=b[16]; M[65][66]=b[6]; M[65][67]=b[12]; M[65][101]=c[7]; M[65][102]=c[6]; M[65][103]=c[16]; M[65][104]=c[12]; - M[66][46]=a[16]; M[66][66]=b[16]; M[66][101]=c[12]; M[66][102]=c[16]; M[66][105]=c[6]; - M[67][101]=c[16]; M[67][105]=c[12]; - M[68][41]=a[14]; M[68][43]=a[16]; M[68][51]=a[12]; M[68][62]=b[14]; M[68][65]=b[12]; M[68][71]=b[16]; M[68][89]=c[12]; M[68][100]=c[16]; M[68][101]=c[10]; M[68][105]=c[11]; M[68][109]=c[5]; M[68][111]=c[14]; - M[69][37]=a[2]; M[69][48]=a[18]; M[69][52]=a[20]; M[69][73]=b[20]; M[69][77]=b[2]; M[69][81]=b[18]; M[69][85]=c[18]; M[69][93]=c[20]; M[69][98]=c[2]; - M[70][20]=u[2]; M[70][27]=a[9]; M[70][28]=a[13]; M[70][31]=a[10]; M[70][32]=a[4]; M[70][33]=a[19]; M[70][50]=a[14]; M[70][51]=a[20]; M[70][53]=a[8]; M[70][55]=b[9]; M[70][57]=b[13]; M[70][58]=b[10]; M[70][59]=b[19]; M[70][61]=b[4]; M[70][65]=b[20]; M[70][80]=b[14]; M[70][82]=b[8]; M[70][86]=c[14]; M[70][87]=c[8]; M[70][89]=c[20]; M[70][113]=c[9]; M[70][114]=c[13]; M[70][115]=c[10]; M[70][116]=c[4]; M[70][117]=c[19]; - M[71][45]=a[7]; M[71][63]=b[7]; M[71][64]=b[5]; M[71][67]=b[15]; M[71][69]=b[6]; M[71][103]=c[5]; M[71][104]=c[15]; M[71][110]=c[6]; M[71][112]=c[7]; - M[72][41]=a[7]; M[72][45]=a[6]; M[72][46]=a[15]; M[72][62]=b[7]; M[72][63]=b[6]; M[72][64]=b[14]; M[72][66]=b[15]; M[72][67]=b[5]; M[72][69]=b[12]; M[72][102]=c[15]; M[72][103]=c[14]; M[72][104]=c[5]; M[72][110]=c[12]; M[72][111]=c[7]; M[72][112]=c[6]; - M[73][48]=a[13]; M[73][50]=a[20]; M[73][80]=b[20]; M[73][81]=b[13]; M[73][85]=c[13]; M[73][86]=c[20]; - M[74][25]=u[3]; M[74][29]=a[17]; M[74][32]=a[7]; M[74][38]=a[6]; M[74][40]=a[15]; M[74][44]=a[3]; M[74][45]=a[2]; M[74][47]=a[18]; M[74][52]=a[5]; M[74][60]=b[18]; M[74][61]=b[7]; M[74][63]=b[2]; M[74][67]=b[13]; M[74][68]=b[3]; M[74][69]=b[19]; M[74][70]=b[4]; M[74][72]=b[15]; M[74][73]=b[5]; M[74][74]=b[17]; M[74][78]=b[6]; M[74][90]=c[18]; M[74][91]=c[4]; M[74][92]=c[6]; M[74][93]=c[5]; M[74][94]=c[17]; M[74][95]=c[15]; M[74][97]=c[3]; M[74][104]=c[13]; M[74][110]=c[19]; M[74][112]=c[2]; M[74][116]=c[7]; - M[75][21]=u[2]; M[75][36]=a[2]; M[75][37]=a[1]; M[75][38]=a[9]; M[75][39]=a[13]; M[75][49]=a[20]; M[75][50]=a[11]; M[75][53]=a[3]; M[75][76]=b[20]; M[75][77]=b[1]; M[75][78]=b[9]; M[75][79]=b[13]; M[75][80]=b[11]; M[75][82]=b[3]; M[75][84]=b[2]; M[75][86]=c[11]; M[75][87]=c[3]; M[75][88]=c[2]; M[75][92]=c[9]; M[75][96]=c[13]; M[75][98]=c[1]; M[75][119]=c[20]; - M[76][48]=a[20]; M[76][81]=b[20]; M[76][85]=c[20]; - M[77][34]=a[16]; M[77][51]=a[14]; M[77][54]=b[16]; M[77][65]=b[14]; M[77][89]=c[14]; M[77][99]=c[16]; M[77][105]=c[1]; M[77][109]=c[10]; - M[78][27]=a[17]; M[78][31]=a[12]; M[78][37]=a[16]; M[78][40]=a[8]; M[78][42]=a[19]; M[78][55]=b[17]; M[78][56]=b[19]; M[78][58]=b[12]; M[78][72]=b[8]; M[78][77]=b[16]; M[78][95]=c[8]; M[78][98]=c[16]; M[78][101]=c[20]; M[78][106]=c[19]; M[78][108]=c[2]; M[78][113]=c[17]; M[78][115]=c[12]; - M[79][42]=a[12]; M[79][44]=a[16]; M[79][46]=a[8]; M[79][56]=b[12]; M[79][66]=b[8]; M[79][68]=b[16]; M[79][97]=c[16]; M[79][101]=c[17]; M[79][102]=c[8]; M[79][105]=c[18]; M[79][106]=c[12]; M[79][108]=c[6]; - M[80][14]=u[4]; M[80][28]=a[5]; M[80][33]=a[12]; M[80][39]=a[16]; M[80][41]=a[4]; M[80][42]=a[10]; M[80][43]=a[8]; M[80][47]=a[14]; M[80][51]=a[17]; M[80][56]=b[10]; M[80][57]=b[5]; M[80][59]=b[12]; M[80][60]=b[14]; M[80][62]=b[4]; M[80][65]=b[17]; M[80][71]=b[8]; M[80][79]=b[16]; M[80][89]=c[17]; M[80][90]=c[14]; M[80][96]=c[16]; M[80][100]=c[8]; M[80][101]=c[9]; M[80][106]=c[10]; M[80][108]=c[11]; M[80][109]=c[3]; M[80][111]=c[4]; M[80][114]=c[5]; M[80][117]=c[12]; - M[81][31]=a[3]; M[81][32]=a[2]; M[81][37]=a[4]; M[81][38]=a[19]; M[81][40]=a[13]; M[81][47]=a[20]; M[81][48]=a[5]; M[81][50]=a[17]; M[81][58]=b[3]; M[81][60]=b[20]; M[81][61]=b[2]; M[81][72]=b[13]; M[81][77]=b[4]; M[81][78]=b[19]; M[81][80]=b[17]; M[81][81]=b[5]; M[81][85]=c[5]; M[81][86]=c[17]; M[81][90]=c[20]; M[81][92]=c[19]; M[81][95]=c[13]; M[81][98]=c[4]; M[81][115]=c[3]; M[81][116]=c[2]; - M[82][29]=a[6]; M[82][44]=a[15]; M[82][45]=a[18]; M[82][47]=a[7]; M[82][60]=b[7]; M[82][63]=b[18]; M[82][64]=b[4]; M[82][67]=b[3]; M[82][68]=b[15]; M[82][69]=b[17]; M[82][70]=b[5]; M[82][74]=b[6]; M[82][90]=c[7]; M[82][91]=c[5]; M[82][94]=c[6]; M[82][97]=c[15]; M[82][103]=c[4]; M[82][104]=c[3]; M[82][110]=c[17]; M[82][112]=c[18]; - M[83][26]=u[2]; M[83][27]=a[18]; M[83][31]=a[6]; M[83][37]=a[12]; M[83][40]=a[17]; M[83][42]=a[2]; M[83][44]=a[19]; M[83][46]=a[20]; M[83][52]=a[8]; M[83][55]=b[18]; M[83][56]=b[2]; M[83][58]=b[6]; M[83][66]=b[20]; M[83][68]=b[19]; M[83][72]=b[17]; M[83][73]=b[8]; M[83][77]=b[12]; M[83][93]=c[8]; M[83][95]=c[17]; M[83][97]=c[19]; M[83][98]=c[12]; M[83][102]=c[20]; M[83][106]=c[2]; M[83][113]=c[18]; M[83][115]=c[6]; - M[84][16]=u[3]; M[84][29]=a[5]; M[84][30]=a[17]; M[84][33]=a[7]; M[84][39]=a[6]; M[84][43]=a[18]; M[84][44]=a[11]; M[84][45]=a[3]; M[84][47]=a[15]; M[84][59]=b[7]; M[84][60]=b[15]; M[84][63]=b[3]; M[84][67]=b[9]; M[84][68]=b[11]; M[84][69]=b[4]; M[84][70]=b[10]; M[84][71]=b[18]; M[84][74]=b[5]; M[84][75]=b[17]; M[84][79]=b[6]; M[84][90]=c[15]; M[84][91]=c[10]; M[84][94]=c[5]; M[84][96]=c[6]; M[84][97]=c[11]; M[84][100]=c[18]; M[84][104]=c[9]; M[84][107]=c[17]; M[84][110]=c[4]; M[84][112]=c[3]; M[84][117]=c[7]; - M[85][25]=u[2]; M[85][29]=a[19]; M[85][31]=a[15]; M[85][32]=a[18]; M[85][37]=a[5]; M[85][38]=a[17]; M[85][40]=a[3]; M[85][44]=a[13]; M[85][45]=a[20]; M[85][47]=a[2]; M[85][50]=a[6]; M[85][52]=a[4]; M[85][58]=b[15]; M[85][60]=b[2]; M[85][61]=b[18]; M[85][63]=b[20]; M[85][68]=b[13]; M[85][72]=b[3]; M[85][73]=b[4]; M[85][74]=b[19]; M[85][77]=b[5]; M[85][78]=b[17]; M[85][80]=b[6]; M[85][86]=c[6]; M[85][90]=c[2]; M[85][92]=c[17]; M[85][93]=c[4]; M[85][94]=c[19]; M[85][95]=c[3]; M[85][97]=c[13]; M[85][98]=c[5]; M[85][112]=c[20]; M[85][115]=c[15]; M[85][116]=c[18]; - M[86][31]=a[18]; M[86][37]=a[17]; M[86][40]=a[2]; M[86][44]=a[20]; M[86][48]=a[6]; M[86][52]=a[19]; M[86][58]=b[18]; M[86][68]=b[20]; M[86][72]=b[2]; M[86][73]=b[19]; M[86][77]=b[17]; M[86][81]=b[6]; M[86][85]=c[6]; M[86][93]=c[19]; M[86][95]=c[2]; M[86][97]=c[20]; M[86][98]=c[17]; M[86][115]=c[18]; - M[87][22]=u[2]; M[87][31]=a[11]; M[87][32]=a[3]; M[87][33]=a[2]; M[87][37]=a[10]; M[87][38]=a[4]; M[87][39]=a[19]; M[87][40]=a[9]; M[87][43]=a[20]; M[87][47]=a[13]; M[87][50]=a[5]; M[87][53]=a[17]; M[87][58]=b[11]; M[87][59]=b[2]; M[87][60]=b[13]; M[87][61]=b[3]; M[87][71]=b[20]; M[87][72]=b[9]; M[87][77]=b[10]; M[87][78]=b[4]; M[87][79]=b[19]; M[87][80]=b[5]; M[87][82]=b[17]; M[87][86]=c[5]; M[87][87]=c[17]; M[87][90]=c[13]; M[87][92]=c[4]; M[87][95]=c[9]; M[87][96]=c[19]; M[87][98]=c[10]; M[87][100]=c[20]; M[87][115]=c[11]; M[87][116]=c[3]; M[87][117]=c[2]; - M[88][27]=a[2]; M[88][31]=a[17]; M[88][37]=a[8]; M[88][40]=a[19]; M[88][42]=a[20]; M[88][48]=a[12]; M[88][55]=b[2]; M[88][56]=b[20]; M[88][58]=b[17]; M[88][72]=b[19]; M[88][77]=b[8]; M[88][81]=b[12]; M[88][85]=c[12]; M[88][95]=c[19]; M[88][98]=c[8]; M[88][106]=c[20]; M[88][113]=c[2]; M[88][115]=c[17]; - M[89][31]=a[7]; M[89][37]=a[6]; M[89][40]=a[18]; M[89][44]=a[2]; M[89][52]=a[17]; M[89][58]=b[7]; M[89][67]=b[20]; M[89][68]=b[2]; M[89][70]=b[19]; M[89][72]=b[18]; M[89][73]=b[17]; M[89][77]=b[6]; M[89][91]=c[19]; M[89][93]=c[17]; M[89][95]=c[18]; M[89][97]=c[2]; M[89][98]=c[6]; M[89][104]=c[20]; M[89][115]=c[7]; - M[90][27]=a[12]; M[90][40]=a[16]; M[90][42]=a[8]; M[90][55]=b[12]; M[90][56]=b[8]; M[90][72]=b[16]; M[90][95]=c[16]; M[90][101]=c[19]; M[90][105]=c[2]; M[90][106]=c[8]; M[90][108]=c[17]; M[90][113]=c[12]; - M[91][23]=u[2]; M[91][27]=a[3]; M[91][28]=a[2]; M[91][31]=a[5]; M[91][32]=a[17]; M[91][37]=a[14]; M[91][38]=a[8]; M[91][40]=a[4]; M[91][41]=a[20]; M[91][42]=a[13]; M[91][47]=a[19]; M[91][50]=a[12]; M[91][55]=b[3]; M[91][56]=b[13]; M[91][57]=b[2]; M[91][58]=b[5]; M[91][60]=b[19]; M[91][61]=b[17]; M[91][62]=b[20]; M[91][72]=b[4]; M[91][77]=b[14]; M[91][78]=b[8]; M[91][80]=b[12]; M[91][86]=c[12]; M[91][90]=c[19]; M[91][92]=c[8]; M[91][95]=c[4]; M[91][98]=c[14]; M[91][106]=c[13]; M[91][111]=c[20]; M[91][113]=c[3]; M[91][114]=c[2]; M[91][115]=c[5]; M[91][116]=c[17]; - M[92][17]=u[4]; M[92][28]=a[6]; M[92][29]=a[16]; M[92][41]=a[17]; M[92][42]=a[5]; M[92][44]=a[14]; M[92][45]=a[8]; M[92][46]=a[4]; M[92][47]=a[12]; M[92][56]=b[5]; M[92][57]=b[6]; M[92][60]=b[12]; M[92][62]=b[17]; M[92][63]=b[8]; M[92][66]=b[4]; M[92][68]=b[14]; M[92][74]=b[16]; M[92][90]=c[12]; M[92][94]=c[16]; M[92][97]=c[14]; M[92][101]=c[3]; M[92][102]=c[4]; M[92][106]=c[5]; M[92][108]=c[15]; M[92][109]=c[18]; M[92][111]=c[17]; M[92][112]=c[8]; M[92][114]=c[6]; - M[93][17]=u[3]; M[93][28]=a[7]; M[93][29]=a[12]; M[93][41]=a[18]; M[93][42]=a[15]; M[93][44]=a[5]; M[93][45]=a[17]; M[93][46]=a[3]; M[93][47]=a[6]; M[93][56]=b[15]; M[93][57]=b[7]; M[93][60]=b[6]; M[93][62]=b[18]; M[93][63]=b[17]; M[93][66]=b[3]; M[93][67]=b[4]; M[93][68]=b[5]; M[93][69]=b[8]; M[93][70]=b[14]; M[93][74]=b[12]; M[93][90]=c[6]; M[93][91]=c[14]; M[93][94]=c[12]; M[93][97]=c[5]; M[93][102]=c[3]; M[93][104]=c[4]; M[93][106]=c[15]; M[93][110]=c[8]; M[93][111]=c[18]; M[93][112]=c[17]; M[93][114]=c[7]; - M[94][31]=a[2]; M[94][37]=a[19]; M[94][40]=a[20]; M[94][48]=a[17]; M[94][58]=b[2]; M[94][72]=b[20]; M[94][77]=b[19]; M[94][81]=b[17]; M[94][85]=c[17]; M[94][95]=c[20]; M[94][98]=c[19]; M[94][115]=c[2]; - M[95][26]=u[4]; M[95][27]=a[6]; M[95][40]=a[12]; M[95][42]=a[17]; M[95][44]=a[8]; M[95][46]=a[19]; M[95][52]=a[16]; M[95][55]=b[6]; M[95][56]=b[17]; M[95][66]=b[19]; M[95][68]=b[8]; M[95][72]=b[12]; M[95][73]=b[16]; M[95][93]=c[16]; M[95][95]=c[12]; M[95][97]=c[8]; M[95][101]=c[2]; M[95][102]=c[19]; M[95][106]=c[17]; M[95][108]=c[18]; M[95][113]=c[6]; - M[96][23]=u[4]; M[96][27]=a[5]; M[96][28]=a[17]; M[96][32]=a[12]; M[96][38]=a[16]; M[96][40]=a[14]; M[96][41]=a[19]; M[96][42]=a[4]; M[96][47]=a[8]; M[96][55]=b[5]; M[96][56]=b[4]; M[96][57]=b[17]; M[96][60]=b[8]; M[96][61]=b[12]; M[96][62]=b[19]; M[96][72]=b[14]; M[96][78]=b[16]; M[96][90]=c[8]; M[96][92]=c[16]; M[96][95]=c[14]; M[96][101]=c[13]; M[96][106]=c[4]; M[96][108]=c[3]; M[96][109]=c[2]; M[96][111]=c[19]; M[96][113]=c[5]; M[96][114]=c[17]; M[96][116]=c[12]; - M[97][42]=a[6]; M[97][44]=a[12]; M[97][46]=a[17]; M[97][56]=b[6]; M[97][66]=b[17]; M[97][67]=b[8]; M[97][68]=b[12]; M[97][70]=b[16]; M[97][91]=c[16]; M[97][97]=c[12]; M[97][101]=c[18]; M[97][102]=c[17]; M[97][104]=c[8]; M[97][106]=c[6]; M[97][108]=c[7]; - M[98][28]=a[12]; M[98][41]=a[8]; M[98][42]=a[14]; M[98][47]=a[16]; M[98][56]=b[14]; M[98][57]=b[12]; M[98][60]=b[16]; M[98][62]=b[8]; M[98][90]=c[16]; M[98][101]=c[4]; M[98][105]=c[3]; M[98][106]=c[14]; M[98][108]=c[5]; M[98][109]=c[17]; M[98][111]=c[8]; M[98][114]=c[12]; - M[99][42]=a[7]; M[99][44]=a[6]; M[99][46]=a[18]; M[99][56]=b[7]; M[99][64]=b[8]; M[99][66]=b[18]; M[99][67]=b[17]; M[99][68]=b[6]; M[99][70]=b[12]; M[99][91]=c[12]; M[99][97]=c[6]; M[99][102]=c[18]; M[99][103]=c[8]; M[99][104]=c[17]; M[99][106]=c[7]; - M[100][51]=a[16]; M[100][65]=b[16]; M[100][89]=c[16]; M[100][105]=c[10]; M[100][109]=c[14]; - M[101][37]=a[9]; M[101][38]=a[13]; M[101][39]=a[20]; M[101][48]=a[11]; M[101][50]=a[3]; M[101][53]=a[2]; M[101][77]=b[9]; M[101][78]=b[13]; M[101][79]=b[20]; M[101][80]=b[3]; M[101][81]=b[11]; M[101][82]=b[2]; M[101][85]=c[11]; M[101][86]=c[3]; M[101][87]=c[2]; M[101][92]=c[13]; M[101][96]=c[20]; M[101][98]=c[9]; - M[102][37]=a[13]; M[102][38]=a[20]; M[102][48]=a[3]; M[102][50]=a[2]; M[102][77]=b[13]; M[102][78]=b[20]; M[102][80]=b[2]; M[102][81]=b[3]; M[102][85]=c[3]; M[102][86]=c[2]; M[102][92]=c[20]; M[102][98]=c[13]; - M[103][37]=a[20]; M[103][48]=a[2]; M[103][77]=b[20]; M[103][81]=b[2]; M[103][85]=c[2]; M[103][98]=c[20]; - M[104][11]=u[4]; M[104][28]=a[10]; M[104][33]=a[14]; M[104][34]=a[8]; M[104][36]=a[16]; M[104][51]=a[4]; M[104][54]=b[8]; M[104][57]=b[10]; M[104][59]=b[14]; M[104][65]=b[4]; M[104][84]=b[16]; M[104][88]=c[16]; M[104][89]=c[4]; M[104][99]=c[8]; M[104][108]=c[1]; M[104][109]=c[9]; M[104][114]=c[10]; M[104][117]=c[14]; - M[105][20]=u[4]; M[105][27]=a[10]; M[105][28]=a[4]; M[105][32]=a[14]; M[105][33]=a[8]; M[105][51]=a[19]; M[105][53]=a[16]; M[105][55]=b[10]; M[105][57]=b[4]; M[105][59]=b[8]; M[105][61]=b[14]; M[105][65]=b[19]; M[105][82]=b[16]; M[105][87]=c[16]; M[105][89]=c[19]; M[105][108]=c[9]; M[105][109]=c[13]; M[105][113]=c[10]; M[105][114]=c[4]; M[105][116]=c[14]; M[105][117]=c[8]; - M[106][27]=a[4]; M[106][28]=a[19]; M[106][31]=a[14]; M[106][32]=a[8]; M[106][50]=a[16]; M[106][55]=b[4]; M[106][57]=b[19]; M[106][58]=b[14]; M[106][61]=b[8]; M[106][80]=b[16]; M[106][86]=c[16]; M[106][108]=c[13]; M[106][109]=c[20]; M[106][113]=c[4]; M[106][114]=c[19]; M[106][115]=c[14]; M[106][116]=c[8]; - M[107][27]=a[19]; M[107][31]=a[8]; M[107][48]=a[16]; M[107][55]=b[19]; M[107][58]=b[8]; M[107][81]=b[16]; M[107][85]=c[16]; M[107][108]=c[20]; M[107][113]=c[19]; M[107][115]=c[8]; - M[108][36]=a[20]; M[108][48]=a[1]; M[108][50]=a[9]; M[108][53]=a[13]; M[108][80]=b[9]; M[108][81]=b[1]; M[108][82]=b[13]; M[108][84]=b[20]; M[108][85]=c[1]; M[108][86]=c[9]; M[108][87]=c[13]; M[108][88]=c[20]; - M[109][26]=u[3]; M[109][27]=a[7]; M[109][40]=a[6]; M[109][42]=a[18]; M[109][44]=a[17]; M[109][46]=a[2]; M[109][52]=a[12]; M[109][55]=b[7]; M[109][56]=b[18]; M[109][66]=b[2]; M[109][67]=b[19]; M[109][68]=b[17]; M[109][70]=b[8]; M[109][72]=b[6]; M[109][73]=b[12]; M[109][91]=c[8]; M[109][93]=c[12]; M[109][95]=c[6]; M[109][97]=c[17]; M[109][102]=c[2]; M[109][104]=c[19]; M[109][106]=c[18]; M[109][113]=c[7]; - M[110][7]=u[3]; M[110][30]=a[5]; M[110][34]=a[7]; M[110][43]=a[15]; M[110][45]=a[11]; M[110][49]=a[6]; M[110][54]=b[7]; M[110][63]=b[11]; M[110][67]=b[1]; M[110][69]=b[10]; M[110][71]=b[15]; M[110][75]=b[5]; M[110][76]=b[6]; M[110][99]=c[7]; M[110][100]=c[15]; M[110][104]=c[1]; M[110][107]=c[5]; M[110][110]=c[10]; M[110][112]=c[11]; M[110][119]=c[6]; - M[111][18]=u[2]; M[111][35]=a[20]; M[111][36]=a[13]; M[111][50]=a[1]; M[111][53]=a[9]; M[111][80]=b[1]; M[111][82]=b[9]; M[111][83]=b[20]; M[111][84]=b[13]; M[111][86]=c[1]; M[111][87]=c[9]; M[111][88]=c[13]; M[111][118]=c[20]; - M[112][19]=u[2]; M[112][31]=a[1]; M[112][32]=a[9]; M[112][33]=a[13]; M[112][34]=a[20]; M[112][36]=a[19]; M[112][50]=a[10]; M[112][53]=a[4]; M[112][54]=b[20]; M[112][58]=b[1]; M[112][59]=b[13]; M[112][61]=b[9]; M[112][80]=b[10]; M[112][82]=b[4]; M[112][84]=b[19]; M[112][86]=c[10]; M[112][87]=c[4]; M[112][88]=c[19]; M[112][99]=c[20]; M[112][115]=c[1]; M[112][116]=c[9]; M[112][117]=c[13]; - M[113][31]=a[9]; M[113][32]=a[13]; M[113][33]=a[20]; M[113][48]=a[10]; M[113][50]=a[4]; M[113][53]=a[19]; M[113][58]=b[9]; M[113][59]=b[20]; M[113][61]=b[13]; M[113][80]=b[4]; M[113][81]=b[10]; M[113][82]=b[19]; M[113][85]=c[10]; M[113][86]=c[4]; M[113][87]=c[19]; M[113][115]=c[9]; M[113][116]=c[13]; M[113][117]=c[20]; - M[114][31]=a[13]; M[114][32]=a[20]; M[114][48]=a[4]; M[114][50]=a[19]; M[114][58]=b[13]; M[114][61]=b[20]; M[114][80]=b[19]; M[114][81]=b[4]; M[114][85]=c[4]; M[114][86]=c[19]; M[114][115]=c[13]; M[114][116]=c[20]; - M[115][31]=a[20]; M[115][48]=a[19]; M[115][58]=b[20]; M[115][81]=b[19]; M[115][85]=c[19]; M[115][115]=c[20]; - M[116][24]=u[2]; M[116][29]=a[13]; M[116][30]=a[20]; M[116][37]=a[11]; M[116][38]=a[3]; M[116][39]=a[2]; M[116][50]=a[15]; M[116][52]=a[9]; M[116][53]=a[18]; M[116][73]=b[9]; M[116][74]=b[13]; M[116][75]=b[20]; M[116][77]=b[11]; M[116][78]=b[3]; M[116][79]=b[2]; M[116][80]=b[15]; M[116][82]=b[18]; M[116][86]=c[15]; M[116][87]=c[18]; M[116][92]=c[3]; M[116][93]=c[9]; M[116][94]=c[13]; M[116][96]=c[2]; M[116][98]=c[11]; M[116][107]=c[20]; - M[117][29]=a[20]; M[117][37]=a[3]; M[117][38]=a[2]; M[117][48]=a[15]; M[117][50]=a[18]; M[117][52]=a[13]; M[117][73]=b[13]; M[117][74]=b[20]; M[117][77]=b[3]; M[117][78]=b[2]; M[117][80]=b[18]; M[117][81]=b[15]; M[117][85]=c[15]; M[117][86]=c[18]; M[117][92]=c[2]; M[117][93]=c[13]; M[117][94]=c[20]; M[117][98]=c[3]; - M[118][27]=a[13]; M[118][28]=a[20]; M[118][31]=a[4]; M[118][32]=a[19]; M[118][48]=a[14]; M[118][50]=a[8]; M[118][55]=b[13]; M[118][57]=b[20]; M[118][58]=b[4]; M[118][61]=b[19]; M[118][80]=b[8]; M[118][81]=b[14]; M[118][85]=c[14]; M[118][86]=c[8]; M[118][113]=c[13]; M[118][114]=c[20]; M[118][115]=c[4]; M[118][116]=c[19]; - M[119][27]=a[20]; M[119][31]=a[19]; M[119][48]=a[8]; M[119][55]=b[20]; M[119][58]=b[19]; M[119][81]=b[8]; M[119][85]=c[8]; M[119][113]=c[20]; M[119][115]=c[19]; -*/ return M.t(); } cv::Mat dls::Hessian(const double s[]) { - // the vector of monomials is // m = [ const ; s1^2 * s2 ; s1 * s2 ; s1 * s3 ; s2 * s3 ; s2^2 * s3 ; s2^3 ; ... // s1 * s3^2 ; s1 ; s3 ; s2 ; s2 * s3^2 ; s1^2 ; s3^2 ; s2^2 ; s3^3 ; ... @@ -734,51 +614,37 @@ cv::Mat dls::Hessian(const double s[]) Hs3[14]=0; Hs3[15]=3*s[2]*s[2]; Hs3[16]=s[0]*s[1]; Hs3[17]=0; Hs3[18]=s[0]*s[0]; Hs3[19]=0; // fill Hessian matrix - cv::Mat H(3, 3, z.depth()); - H.at(0,0) = cv::Mat(cv::Mat(f1coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs1)).at(0,0); - H.at(0,1) = cv::Mat(cv::Mat(f1coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs2)).at(0,0); - H.at(0,2) = cv::Mat(cv::Mat(f1coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs3)).at(0,0); + cv::Mat H(3, 3, CV_64F); + H.at(0,0) = cv::Mat(cv::Mat(f1coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs1)).at(0,0); + H.at(0,1) = cv::Mat(cv::Mat(f1coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs2)).at(0,0); + H.at(0,2) = cv::Mat(cv::Mat(f1coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs3)).at(0,0); - H.at(1,0) = cv::Mat(cv::Mat(f2coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs1)).at(0,0); - H.at(1,1) = cv::Mat(cv::Mat(f2coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs2)).at(0,0); - H.at(1,2) = cv::Mat(cv::Mat(f2coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs3)).at(0,0); + H.at(1,0) = cv::Mat(cv::Mat(f2coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs1)).at(0,0); + H.at(1,1) = cv::Mat(cv::Mat(f2coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs2)).at(0,0); + H.at(1,2) = cv::Mat(cv::Mat(f2coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs3)).at(0,0); - H.at(2,0) = cv::Mat(cv::Mat(f3coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs1)).at(0,0); - H.at(2,1) = cv::Mat(cv::Mat(f3coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs2)).at(0,0); - H.at(2,2) = cv::Mat(cv::Mat(f3coeff).rowRange(1,21).t()*cv::Mat(20, 1, z.depth(), &Hs3)).at(0,0); + H.at(2,0) = cv::Mat(cv::Mat(f3coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs1)).at(0,0); + H.at(2,1) = cv::Mat(cv::Mat(f3coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs2)).at(0,0); + H.at(2,2) = cv::Mat(cv::Mat(f3coeff).rowRange(1,21).t()*cv::Mat(20, 1, CV_64F, &Hs3)).at(0,0); - return H; // OK, is symmetric + return H; } -bool dls::positive_eigenvalues(const cv::Mat& eigenvalues) +cv::Mat dls::cayley2rotbar(const cv::Mat& s) { - return eigenvalues.at(0) > 0 && - eigenvalues.at(1) > 0 && - eigenvalues.at(2) > 0; + double s_mul1 = cv::Mat(s.t()*s).at(0,0); + cv::Mat s_mul2 = s*s.t(); + cv::Mat eye = cv::Mat::eye(3, 3, CV_64F); + + return cv::Mat( eye.mul(1.-s_mul1) + skewsymm(&s).mul(2.) + s_mul2.mul(2.) ).t(); } -cv::Mat dls::cayley2rotbar(const double s[]) +cv::Mat dls::skewsymm(const cv::Mat * X1) { - cv::Mat s_mat(3, 1, z.depth(), &s); // s -> 3x1 - double s_mul1 = cv::Mat(s_mat.t()*s_mat).at(0,0); - cv::Mat s_mul2 = s_mat*s_mat.t(); - cv::Mat eye = cv::Mat::eye(3, 3, z.depth()); - return cv::Mat( eye.mul(1.-s_mul1) + skewsymm(s).mul(2.) + s_mul2.mul(2.) ).t(); -} - -cv::Mat dls::skewsymm(const double X1[]) -{ - return (cv::Mat_(3,3) << 0, -X1[2], X1[1], X1[2], 0, -X1[0], -X1[1], X1[0], 0); -} - -bool dls::is_empty(const cv::Mat * M) -{ - cv::MatConstIterator_ it = M->begin(), it_end = M->end(); - for(; it != it_end; ++it) - { - if(*it < 0) return false; - } - return true; + cv::MatConstIterator_ it = X1->begin(); + return (cv::Mat_(3,3) << 0, -*(it+2), *(it+1), + *(it+2), 0, -*(it+0), + -*(it+1), *(it+0), 0); } cv::Mat dls::rotx(const double t) @@ -807,19 +673,31 @@ cv::Mat dls::rotz(const double t) cv::Mat dls::mean(const cv::Mat& M) { - cv::Mat m = cv::Mat::zeros(3, 1, p.depth()); + cv::Mat m = cv::Mat::zeros(3, 1, CV_64F); for (int i = 0; i < M.cols; ++i) m += M.col(i); return m.mul(1./(double)M.cols); } -double dls::min_val(const std::vector& values) +bool dls::is_empty(const cv::Mat * M) { - double min = std::numeric_limits::infinity(); - - std::vector::const_iterator iter = values.begin(); - for( ; iter != values.end() ; iter++) + cv::MatConstIterator_ it = M->begin(), it_end = M->end(); + for(; it != it_end; ++it) { - if(*iter < min) min = *iter; + if(*it < 0) return false; } - return min; + return true; } + +bool dls::positive_eigenvalues(const cv::Mat * eigenvalues) +{ + cv::MatConstIterator_ it = eigenvalues->begin(); + return *(it) > 0 && *(it+1) > 0 && *(it+2) > 0; +} + + + + + + + + diff --git a/modules/calib3d/src/dls.h b/modules/calib3d/src/dls.h index a586d1e9da..a8250fa5c0 100644 --- a/modules/calib3d/src/dls.h +++ b/modules/calib3d/src/dls.h @@ -12,52 +12,58 @@ public: dls(const cv::Mat& opoints, const cv::Mat& ipoints); ~dls(); - void compute_pose(cv::Mat& R, cv::Mat& t); + bool compute_pose(cv::Mat& R, cv::Mat& t); private: - template + // initialisation + template void init_points(const cv::Mat& opoints, const cv::Mat& ipoints) { for(int i = 0; i < N; i++) { - p.at(0,i) = opoints.at(0,i).x; - p.at(1,i) = opoints.at(0,i).y; - p.at(2,i) = opoints.at(0,i).z; + p.at(0,i) = opoints.at(0,i).x; + p.at(1,i) = opoints.at(0,i).y; + p.at(2,i) = opoints.at(0,i).z; - z.at(0,i) = ipoints.at(0,i).x; - z.at(1,i) = ipoints.at(0,i).y; - z.at(2,i) = (I)1; + z.at(0,i) = ipoints.at(0,i).x; + z.at(1,i) = ipoints.at(0,i).y; + z.at(2,i) = (double)1; } } void norm_z_vector(); + + // main algorithm + void run_kernel(const cv::Mat& pp); void build_coeff_matrix(const cv::Mat& pp, cv::Mat& Mtilde, cv::Mat& D); void compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Mat& eigenval_imag, cv::Mat& eigenvec_real, cv::Mat& eigenvec_imag); - double min_val(const std::vector& values); + void fill_coeff(const cv::Mat * D); + + // useful functions + cv::Mat LeftMultVec(const cv::Mat& v); + cv::Mat cayley_LS_M(const std::vector& a, const std::vector& b, + const std::vector& c, const std::vector& u); + cv::Mat Hessian(const double s[]); + cv::Mat cayley2rotbar(const cv::Mat& s); + cv::Mat skewsymm(const cv::Mat * X1); + + // extra functions cv::Mat rotx(const double t); cv::Mat roty(const double t); cv::Mat rotz(const double t); cv::Mat mean(const cv::Mat& M); - void fill_coeff(const cv::Mat * D); - cv::Mat LeftMultVec(const cv::Mat& v); - cv::Mat cayley_LS_M(const std::vector& a, const std::vector& b, - const std::vector& c, const std::vector& u); - bool positive_eigenvalues(const cv::Mat& eigenvalues); - cv::Mat Hessian(const double s[]); - cv::Mat cayley2rotbar(const double s[]); - cv::Mat skewsymm(const double X1[]); bool is_empty(const cv::Mat * v); - void run_kernel(const cv::Mat& pp); + bool positive_eigenvalues(const cv::Mat * eigenvalues); + cv::Mat p, z; // object-image points int N; // number of input points - std::vector f1coeff, f2coeff, f3coeff, cost_; - std::vector C_est_, t_est_; // vector to store candidate - cv::Mat C_est__, t_est__; // best found solution - double cost__; - + std::vector f1coeff, f2coeff, f3coeff, cost_; // coefficient for coefficients matrix + std::vector C_est_, t_est_; // optimal candidates + cv::Mat C_est__, t_est__; // optimal found solution + double cost__; // optimal found solution }; #endif // DLS_H diff --git a/modules/calib3d/src/solvepnp.cpp b/modules/calib3d/src/solvepnp.cpp index 2cfb72e23d..4c4ef36301 100644 --- a/modules/calib3d/src/solvepnp.cpp +++ b/modules/calib3d/src/solvepnp.cpp @@ -49,6 +49,11 @@ #include using namespace cv; +void MatrixSize(const cv::Mat& mat) +{ + cout << mat.rows << "x" << mat.cols << endl; +} + bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, InputArray _cameraMatrix, InputArray _distCoeffs, OutputArray _rvec, OutputArray _tvec, bool useExtrinsicGuess, int flags ) @@ -96,23 +101,16 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, } else if (flags == DLS) { - std::cout << "DLS" << std::endl; cv::Mat undistortedPoints; - //cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs); + cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs); + + dls PnP(opoints, undistortedPoints); cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat(); - - //dls PnP(opoints, undistortedPoints); - dls PnP(opoints, ipoints); // FOR TESTING - - PnP.compute_pose(R, tvec); - - cout << "after dls compute pose" << endl; - - //TODO: DO SOMETHING WITH R and t - //cv::Rodrigues(R, rvec); - - return true; + bool result = PnP.compute_pose(R, tvec); + if (result) + cv::Rodrigues(R, rvec); + return result; } else CV_Error(CV_StsBadArg, "The flags argument must be one of CV_ITERATIVE, CV_P3P or CV_EPNP");