class AndExpression extends BinaryOperationExpression {


    private static final long serialVersionUID = -6085038102412415337L;

    private static final Logger logger = LoggerFactory.getLogger(AndExpression.class);
    
    private static final String OPERATOR = "and";
    static final String[] OPERATORS = new String[] {OPERATOR};
    private static final boolean[] LENIENCIES = new boolean[] { false };
    @SuppressWarnings("unchecked")
    private static final Class<? extends BinaryOperationExpression>[] OPERATOR_CLASSES = 
        (Class<? extends BinaryOperationExpression>[]) new Class<?>[] { AndExpression.class };

    private static final Method LEFT_ALLOWED_METHOD;
    private static final Method RIGHT_ALLOWED_METHOD;


    static {
        try {
            LEFT_ALLOWED_METHOD = AndExpression.class.getDeclaredMethod("isLeftAllowed", IStandardExpression.class);
            RIGHT_ALLOWED_METHOD = AndExpression.class.getDeclaredMethod("isRightAllowed", IStandardExpression.class);
        } catch (final NoSuchMethodException e) {
            throw new ExceptionInInitializerError(e);
        }
    }



    public AndExpression(final IStandardExpression left, final IStandardExpression right) {
        super(left, right);
    }

    
    @Override
    public String getStringRepresentation() {
        return getStringRepresentation(OPERATOR);
    }



    static boolean isRightAllowed(final IStandardExpression right) {
        return right != null && !(right instanceof Token && !(right instanceof BooleanTokenExpression));
    }

    static boolean isLeftAllowed(final IStandardExpression left) {
        return left != null && !(left instanceof Token && !(left instanceof BooleanTokenExpression));
    }

    
    
    
    static ExpressionParsingState composeAndExpression(
            final ExpressionParsingState state, final int nodeIndex) {<FILL_FUNCTION_BODY>}
    
    
    

    
    static Object executeAnd(
            final IExpressionContext context,
            final AndExpression expression, final StandardExpressionExecutionContext expContext) {

        if (logger.isTraceEnabled()) {
            logger.trace("[THYMELEAF][{}] Evaluating AND expression: \"{}\"", TemplateEngine.threadIndex(), expression.getStringRepresentation());
        }
        
        final Object leftValue = expression.getLeft().execute(context, expContext);

        // Short circuit
        final boolean leftBooleanValue = EvaluationUtils.evaluateAsBoolean(leftValue);
        if (!leftBooleanValue) {
            return Boolean.FALSE;
        }

        final Object rightValue = expression.getRight().execute(context, expContext);
        
        final boolean rightBooleanValue = EvaluationUtils.evaluateAsBoolean(rightValue);
        return Boolean.valueOf(rightBooleanValue);
        
    }



}

        return composeBinaryOperationExpression(
                state, nodeIndex, OPERATORS, LENIENCIES, OPERATOR_CLASSES, LEFT_ALLOWED_METHOD, RIGHT_ALLOWED_METHOD);
    
<methods>public org.thymeleaf.standard.expression.IStandardExpression getLeft() ,public org.thymeleaf.standard.expression.IStandardExpression getRight() <variables>private final non-sealed org.thymeleaf.standard.expression.IStandardExpression left,private final non-sealed org.thymeleaf.standard.expression.IStandardExpression right,private static final long serialVersionUID