def main():
    internal_config = get_internal_config()
    parsed_args = singer.utils.parse_args(REQUIRED_CONFIG_KEYS)

    # OAuth has precedence
    creds = oauth_auth(parsed_args) or api_token_auth(parsed_args)
    session = get_session(parsed_args.config)
    client = Zenpy(session=session,
                   ratelimit=internal_config['rate_limit'],
                   **creds)
    client.internal_config = internal_config

    add_session_hooks(client.tickets.session)

    if not client:
        LOGGER.error("""No suitable authentication keys provided.""")

    if parsed_args.discover:
        do_discover(client)
    elif parsed_args.catalog:
        state = parsed_args.state
        do_sync(client, parsed_args.catalog, state,
                parsed_args.config['start_date'])