          """
          retval: Dict[Literal["a", "b"], Generator[BatchType, None, None]] = {}
          for side in get_args(Literal["a", "b"]):
              logger.debug("Setting preview feed: (side: '%s')", side)
              preview_images = int(self._config.get("preview_images", 14))
              preview_images = min(max(preview_images, 2), 16)
              batchsize = min(len(self._images[side]), preview_images)
              retval[side] = self._load_generator(side,
                                                  True,
                                                  batch_size=batchsize).minibatch_ab()
          return retval
 
</s> remove         num_images = min(image_count, int(self._config.get("preview_images", 14)))
 </s> add         num_images = self._config.get("preview_images", 14)
        assert isinstance(num_images, int)
        num_images = min(image_count, num_images) </s> remove         self._config: Dict[str, Union[str, float, int, bool, None]] = {}
 </s> add         self._config: Dict[str, "ConfigValueType"] = {} </s> remove               config: Optional["ConfigType"] = None,
 </s> add               config: Optional[Dict[str, "ConfigValueType"]] = None, </s> remove         if None in (title, info):
            raise ValueError("Default config sections must have a title and "
                             "information text")
        self.defaults[title] = OrderedDict()
        self.defaults[title]["helptext"] = info

    def add_item(self, section=None, title=None, datatype=str, default=None, info=None,
                 rounding=None, min_max=None, choices=None, gui_radio=False, fixed=True,
                 group=None):
 </s> add         self.defaults[title] = ConfigSection(helptext=info, items=OrderedDict())

    def add_item(self,
                 section: Optional[str] = None,
                 title: Optional[str] = None,
                 datatype: type = str,
                 default: ConfigValueType = None,
                 info: Optional[str] = None,
                 rounding: Optional[int] = None,
                 min_max: Optional[Union[Tuple[int, int], Tuple[float, float]]] = None,
                 choices: Optional[Union[str, List[str]]] = None,
                 gui_radio: bool = False,
                 fixed: bool = True,
                 group: Optional[str] = None) -> None:
            preview_images = min(max(num_images, 2), 16)
          """
          retval: Dict[Literal["a", "b"], Generator[BatchType, None, None]] = {}
          for side in get_args(Literal["a", "b"]):
              logger.debug("Setting preview feed: (side: '%s')", side)
            preview_images = min(max(num_images, 2), 16)
            preview_images = min(max(num_images, 2), 16)
              batchsize = min(len(self._images[side]), preview_images)
              retval[side] = self._load_generator(side,
                                                  True,
                                                  batch_size=batchsize).minibatch_ab()
          return retval
keep keep keep keep replace replace keep keep keep keep keep
 Preview - Allow mask color/opacity configuration
  - typing: lib.config
  - docs: lib.config
  - bugfix: popup_configure - keep assets on top 
plugins/train/trainer/_base.py