async def METHOD_NAME(args: argparse.Namespace) -> None:
    """Entry point for script."""
    retry_count = args.retry_count
    timeout_seconds = args.timeout_seconds
    erase = not args.no_erase
    with open(args.dict) as fp:
        update_dict = json.load(fp)
    update_details: Dict[FirmwareTarget, str] = dict()
    for name, filepath in update_dict.items():
        try:
            name = name.replace("-", "_")
            target: FirmwareTarget = (
                NodeId[name] if name in NodeId.__members__ else USBTarget[name]
            )
            update_details[target] = filepath
        except KeyError:
            logger.warning(f"Invalid target {name}")
            continue
    if not update_details:
        logger.error("No update targets in details file.")
        return
    usb_messenger: Optional[BinaryMessenger] = None
    try:
        usb_driver: SerialUsbDriver = await (build_rear_panel_driver())
        usb_messenger = build_rear_panel_messenger(usb_driver)
        usb_messenger.start()
    except IOError as e:
        if USBTarget.rear_panel in update_details.keys():
            raise e
    async with build.can_messenger(build_settings(args)) as can_messenger:
        updater = RunUpdate(
            can_messenger=can_messenger,
            usb_messenger=usb_messenger,
            update_details=update_details,
            retry_count=retry_count,
            timeout_seconds=timeout_seconds,
            erase=erase,
        )
        async for progress in updater.run_updates():
            logger.info(f"{progress[0]} is {progress[1][0]} and {progress[1][1]} done")
    logger.info("Done")