from abc import ABCMeta, abstractmethod


class Attack(metaclass=ABCMeta):

    @abstractmethod
    def attack(self, model, adj, features, **kwargs):
        """

        :param model:
        :param features:
        :param adj:
        :param kwargs:
        :return:
        """


class ModificationAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def modification(self):
        """

        :return:
        """


class InjectionAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def injection(self, **kwargs):
        """

        :return:
        """

    @abstractmethod
    def update_features(self, **kwargs):
        """

        :return:
        """

158e0912bca3915a4172d24e303a6f3a05c821af
<mask token>


class ModificationAttack(Attack):
    <mask token>

    @abstractmethod
    def modification(self):
        """

        :return:
        """


class InjectionAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def injection(self, **kwargs):
        """

        :return:
        """

    @abstractmethod
    def update_features(self, **kwargs):
        """

        :return:
        """

<mask token>


class Attack(metaclass=ABCMeta):
    <mask token>


class ModificationAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def modification(self):
        """

        :return:
        """


class InjectionAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def injection(self, **kwargs):
        """

        :return:
        """

    @abstractmethod
    def update_features(self, **kwargs):
        """

        :return:
        """

<mask token>


class Attack(metaclass=ABCMeta):

    @abstractmethod
    def attack(self, model, adj, features, **kwargs):
        """

        :param model:
        :param features:
        :param adj:
        :param kwargs:
        :return:
        """


class ModificationAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def modification(self):
        """

        :return:
        """


class InjectionAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def injection(self, **kwargs):
        """

        :return:
        """

    @abstractmethod
    def update_features(self, **kwargs):
        """

        :return:
        """

from abc import ABCMeta, abstractmethod


class Attack(metaclass=ABCMeta):

    @abstractmethod
    def attack(self, model, adj, features, **kwargs):
        """

        :param model:
        :param features:
        :param adj:
        :param kwargs:
        :return:
        """


class ModificationAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def modification(self):
        """

        :return:
        """


class InjectionAttack(Attack):

    @abstractmethod
    def attack(self, **kwargs):
        """

        :param kwargs:
        :return:
        """

    @abstractmethod
    def injection(self, **kwargs):
        """

        :return:
        """

    @abstractmethod
    def update_features(self, **kwargs):
        """

        :return:
        """
