class Builder {

        /**
         * Utility constructor.
         */
        private Builder() {
        }

        /**
         * Create a new {@link XReadArgs} and set {@literal BLOCK}.
         *
         * @param milliseconds time to block.
         * @return new {@link XReadArgs} with {@literal BLOCK} set.
         * @see XReadArgs#block(long)
         */
        public static XReadArgs block(long milliseconds) {
            return new XReadArgs().block(milliseconds);
        }

        /**
         * Create a new {@link XReadArgs} and set {@literal BLOCK}.
         *
         * @param timeout time to block.
         * @return new {@link XReadArgs} with {@literal BLOCK} set.
         * @see XReadArgs#block(Duration)
         */
        public static XReadArgs block(Duration timeout) {

            LettuceAssert.notNull(timeout, "Block timeout must not be null");

            return block(timeout.toMillis());
        }

        /**
         * Create a new {@link XReadArgs} and set {@literal COUNT}.
         *
         * @param count
         * @return new {@link XReadArgs} with {@literal COUNT} set.
         */
        public static XReadArgs count(long count) {
            return new XReadArgs().count(count);
        }

        /**
         * Create a new {@link XReadArgs} and set {@literal NOACK}.
         *
         * @return new {@link XReadArgs} with {@literal NOACK} set.
         * @see XReadArgs#noack(boolean)
         */
        public static XReadArgs noack() {
            return noack(true);
        }

        /**
         * Create a new {@link XReadArgs} and set {@literal NOACK}.
         *
         * @param noack
         * @return new {@link XReadArgs} with {@literal NOACK} set.
         * @see XReadArgs#noack(boolean)
         */
        public static XReadArgs noack(boolean noack) {
            return new XReadArgs().noack(noack);
        }

    }

    /**
     * Perform a blocking read and wait up to {@code milliseconds} for a new stream message.
     *
     * @param milliseconds max time to wait.
     * @return {@code this}.
     */
    public XReadArgs block(long milliseconds) {

        this.block = milliseconds;
        return this;
    }

    /**
     * Perform a blocking read and wait up to a {@link Duration timeout} for a new stream message.
     *
     * @param timeout max time to wait.
     * @return {@code this}.
     */
    public XReadArgs block(Duration timeout) {

        LettuceAssert.notNull(timeout, "Block timeout must not be null");

        return block(timeout.toMillis());
    }

    /**
     * Limit read to {@code count} messages.
     *
     * @param count number of messages.
     * @return {@code this}.
     */
    public XReadArgs count(long count) {

        this.count = count;
        return this;
    }

    /**
     * Use NOACK option to disable auto-acknowledgement. Only valid for {@literal XREADGROUP}.
     *
     * @param noack {@code true} to disable auto-ack.
     * @return {@code this}.
     */
    public XReadArgs noack(boolean noack) {

        this.noack = noack;
        return this;
    }

    public <K, V> void build(CommandArgs<K, V> args) {<FILL_FUNCTION_BODY>


        if (block != null) {
            args.add(CommandKeyword.BLOCK).add(block);
        }

        if (count != null) {
            args.add(CommandKeyword.COUNT).add(count);
        }

        if (noack) {
            args.add(CommandKeyword.NOACK);
        }
    
<no_super_class>