_amaru() {
    local i cur prev opts cmd
    COMPREPLY=()
    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
        cur="$2"
    else
        cur="${COMP_WORDS[COMP_CWORD]}"
    fi
    prev="$3"
    cmd=""
    opts=""

    for i in "${COMP_WORDS[@]:0:COMP_CWORD}"
    do
        case "${cmd},${i}" in
            ",$1")
                cmd="amaru"
                ;;
            amaru,bootstrap)
                cmd="amaru__subcmd__bootstrap"
                ;;
            amaru,create-snapshots)
                cmd="amaru__subcmd__create__subcmd__snapshots"
                ;;
            amaru,dump-chain-db)
                cmd="amaru__subcmd__dump__subcmd__chain__subcmd__db"
                ;;
            amaru,dump-traces-schema)
                cmd="amaru__subcmd__dump__subcmd__traces__subcmd__schema"
                ;;
            amaru,fetch-chain-headers)
                cmd="amaru__subcmd__fetch__subcmd__chain__subcmd__headers"
                ;;
            amaru,help)
                cmd="amaru__subcmd__help"
                ;;
            amaru,migrate-chain-db)
                cmd="amaru__subcmd__migrate__subcmd__chain__subcmd__db"
                ;;
            amaru,remove-chain)
                cmd="amaru__subcmd__remove__subcmd__chain"
                ;;
            amaru,remove-validation-status)
                cmd="amaru__subcmd__remove__subcmd__validation__subcmd__status"
                ;;
            amaru,reset-to-epoch)
                cmd="amaru__subcmd__reset__subcmd__to__subcmd__epoch"
                ;;
            amaru,run)
                cmd="amaru__subcmd__run"
                ;;
            amaru,shell-completions)
                cmd="amaru__subcmd__shell__subcmd__completions"
                ;;
            amaru__subcmd__help,bootstrap)
                cmd="amaru__subcmd__help__subcmd__bootstrap"
                ;;
            amaru__subcmd__help,create-snapshots)
                cmd="amaru__subcmd__help__subcmd__create__subcmd__snapshots"
                ;;
            amaru__subcmd__help,dump-chain-db)
                cmd="amaru__subcmd__help__subcmd__dump__subcmd__chain__subcmd__db"
                ;;
            amaru__subcmd__help,dump-traces-schema)
                cmd="amaru__subcmd__help__subcmd__dump__subcmd__traces__subcmd__schema"
                ;;
            amaru__subcmd__help,fetch-chain-headers)
                cmd="amaru__subcmd__help__subcmd__fetch__subcmd__chain__subcmd__headers"
                ;;
            amaru__subcmd__help,help)
                cmd="amaru__subcmd__help__subcmd__help"
                ;;
            amaru__subcmd__help,migrate-chain-db)
                cmd="amaru__subcmd__help__subcmd__migrate__subcmd__chain__subcmd__db"
                ;;
            amaru__subcmd__help,remove-chain)
                cmd="amaru__subcmd__help__subcmd__remove__subcmd__chain"
                ;;
            amaru__subcmd__help,remove-validation-status)
                cmd="amaru__subcmd__help__subcmd__remove__subcmd__validation__subcmd__status"
                ;;
            amaru__subcmd__help,reset-to-epoch)
                cmd="amaru__subcmd__help__subcmd__reset__subcmd__to__subcmd__epoch"
                ;;
            amaru__subcmd__help,run)
                cmd="amaru__subcmd__help__subcmd__run"
                ;;
            amaru__subcmd__help,shell-completions)
                cmd="amaru__subcmd__help__subcmd__shell__subcmd__completions"
                ;;
            *)
                ;;
        esac
    done

    case "${cmd}" in
        amaru)
            opts="-q -h -V --with-open-telemetry --with-json-traces --color --quiet --help --version bootstrap dump-chain-db remove-validation-status remove-chain dump-traces-schema fetch-chain-headers create-snapshots shell-completions migrate-chain-db reset-to-epoch run help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --color)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__bootstrap)
            opts="-f -h --chain-dir --force --ledger-dir --epoch --network --consensus-security-param --epoch-length-scale-factor --active-slot-coeff-inverse --max-lovelace-supply --slots-per-kes-period --max-kes-evolution --system-start --help-global-parameters --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --chain-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --ledger-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --epoch)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --consensus-security-param)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --epoch-length-scale-factor)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --active-slot-coeff-inverse)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --max-lovelace-supply)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --slots-per-kes-period)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --max-kes-evolution)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --system-start)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__create__subcmd__snapshots)
            opts="-f -h --network --epoch --dist-dir --snapshot-dir --force --cardano-node-config-dir --cardano-node-db --snapshot --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --epoch)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --dist-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --snapshot-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --cardano-node-config-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --cardano-node-db)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --snapshot)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__dump__subcmd__chain__subcmd__db)
            opts="-H -p -n -B -b -a -f -c -h --chain-dir --network --headers --parents-children --nonces --blocks --best-chain --ancestors --find-best-candidate --children --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --chain-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --ancestors)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -a)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --children)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -c)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__dump__subcmd__traces__subcmd__schema)
            opts="-c -h --compact --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__fetch__subcmd__chain__subcmd__headers)
            opts="-h --headers-dir --network --parent --peer-address --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --headers-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --parent)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --peer-address)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help)
            opts="bootstrap dump-chain-db remove-validation-status remove-chain dump-traces-schema fetch-chain-headers create-snapshots shell-completions migrate-chain-db reset-to-epoch run help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__bootstrap)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__create__subcmd__snapshots)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__dump__subcmd__chain__subcmd__db)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__dump__subcmd__traces__subcmd__schema)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__fetch__subcmd__chain__subcmd__headers)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__help)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__migrate__subcmd__chain__subcmd__db)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__remove__subcmd__chain)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__remove__subcmd__validation__subcmd__status)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__reset__subcmd__to__subcmd__epoch)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__run)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__help__subcmd__shell__subcmd__completions)
            opts=""
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__migrate__subcmd__chain__subcmd__db)
            opts="-h --chain-dir --network --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --chain-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__remove__subcmd__chain)
            opts="-h --from-point --only-blocks --only-validation-results --chain-dir --network --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --from-point)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --chain-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__remove__subcmd__validation__subcmd__status)
            opts="-h --chain-dir --network --help [SLOT.HEADER_HASH or HEADER_HASH]..."
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --chain-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__reset__subcmd__to__subcmd__epoch)
            opts="-h --ledger-dir --network --help <UINT>"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --ledger-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__run)
            opts="-h --network --chain-dir --migrate-chain-db --ledger-dir --listen-address --submit-api-address --peer-address --upstream-peers --downstream-peers --max-extra-ledger-snapshots --peer-removal-cooldown-secs --pid-file --trace-buffer --dump-trace-buffer --era-history --consensus-security-param --epoch-length-scale-factor --active-slot-coeff-inverse --max-lovelace-supply --slots-per-kes-period --max-kes-evolution --system-start --help-global-parameters --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --network)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --chain-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --ledger-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --listen-address)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --submit-api-address)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --peer-address)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --upstream-peers)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --downstream-peers)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --max-extra-ledger-snapshots)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --peer-removal-cooldown-secs)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --pid-file)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --trace-buffer)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --dump-trace-buffer)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --era-history)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --consensus-security-param)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --epoch-length-scale-factor)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --active-slot-coeff-inverse)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --max-lovelace-supply)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --slots-per-kes-period)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --max-kes-evolution)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --system-start)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
        amaru__subcmd__shell__subcmd__completions)
            opts="-h --output-dir --help"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --output-dir)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
    esac
}

if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
    complete -F _amaru -o nosort -o bashdefault -o default amaru
else
    complete -F _amaru -o bashdefault -o default amaru
fi
