#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class A:
    def __init__(self):
        pass

    def delete(self):
        pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class B:
    def __init__(self):
        pass

    def delete(self):
        pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class C:
    def __init__(self):
        pass

    def delete(self):
        pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from abc import ABC


class I(ABC):
    pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from J import J


class X(J):
    def __init__(self):
        self._ies = []

    def getY(self, index):
        return self._ies[index]

    def getIes(self):
        return tuple(self._ies)

    def numberOfIes(self):
        return len(self._ies)

    def hasIes(self):
        return len(self._ies) > 0

    def indexOfY(self, aY):
        return next((i for i, x in enumerate(self._ies) if x is aY), -1)

    @staticmethod
    def minimumNumberOfIes():
        return 0

    def addY(self, aY):
        if any(x is aY for x in self._ies):
            return False
        self._ies.append(aY)
        if aY.indexOfX(self) == -1 and not aY.addX(self):
            del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
            return False
        return True

    def removeY(self, aY):
        oldIndex = next((i for i, x in enumerate(self._ies) if x is aY), -1)
        if oldIndex == -1:
            return False
        del self._ies[oldIndex]
        if aY.indexOfX(self) != -1 and not aY.removeX(self):
            self._ies.insert(oldIndex, aY)
            return False
        return True

    def addYAt(self, aY, index):
        if not self.addY(aY):
            return False
        if index < 0:
            index = 0
        if index > self.numberOfIes():
            index = self.numberOfIes() - 1
        del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
        self._ies.insert(index, aY)
        return True

    def addOrMoveYAt(self, aY, index):
        if not any(x is aY for x in self._ies):
            return self.addYAt(aY, index)
        if index < 0:
            index = 0
        if index > self.numberOfIes():
            index = self.numberOfIes() - 1
        del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
        self._ies.insert(index, aY)
        return True

    def delete(self):
        copyOfIes = tuple(self._ies)
        self._ies.clear()
        for aY in copyOfIes:
            aY.removeX(self)

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Y:
    def __init__(self):
        self._xs = []

    def getX(self, index):
        return self._xs[index]

    def getXs(self):
        return tuple(self._xs)

    def numberOfXs(self):
        return len(self._xs)

    def hasXs(self):
        return len(self._xs) > 0

    def indexOfX(self, aX):
        return next((i for i, x in enumerate(self._xs) if x is aX), -1)

    @staticmethod
    def minimumNumberOfXs():
        return 0

    def addX(self, aX):
        if any(x is aX for x in self._xs):
            return False
        self._xs.append(aX)
        if aX.indexOfY(self) == -1 and not aX.addY(self):
            del self._xs[next((i for i, x in enumerate(self._xs) if x is aX), -1)]
            return False
        return True

    def removeX(self, aX):
        oldIndex = next((i for i, x in enumerate(self._xs) if x is aX), -1)
        if oldIndex == -1:
            return False
        del self._xs[oldIndex]
        if aX.indexOfY(self) != -1 and not aX.removeY(self):
            self._xs.insert(oldIndex, aX)
            return False
        return True

    def addXAt(self, aX, index):
        if not self.addX(aX):
            return False
        if index < 0:
            index = 0
        if index > self.numberOfXs():
            index = self.numberOfXs() - 1
        del self._xs[next((i for i, x in enumerate(self._xs) if x is aX), -1)]
        self._xs.insert(index, aX)
        return True

    def addOrMoveXAt(self, aX, index):
        if not any(x is aX for x in self._xs):
            return self.addXAt(aX, index)
        if index < 0:
            index = 0
        if index > self.numberOfXs():
            index = self.numberOfXs() - 1
        del self._xs[next((i for i, x in enumerate(self._xs) if x is aX), -1)]
        self._xs.insert(index, aX)
        return True

    def delete(self):
        copyOfXs = tuple(self._xs)
        self._xs.clear()
        for aX in copyOfXs:
            aX.removeY(self)

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from abc import ABC


class I(ABC):
    pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from I import I


class J(I):
    pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class A:
    def __init__(self):
        pass

    def delete(self):
        pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class B:
    def __init__(self, aX):
        self._x = aX

    def setX(self, aX):
        self._x = aX
        return True

    def getX(self):
        return self._x

    def delete(self):
        pass

    def __str__(self):
        return (super().__str__() + "["
                + "x:" + str(self.getX())
                + "]")

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from abc import ABC


class I(ABC):
    pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from m.J import J


class X(J):
    def __init__(self):
        self._ies = []

    def getY(self, index):
        return self._ies[index]

    def getIes(self):
        return tuple(self._ies)

    def numberOfIes(self):
        return len(self._ies)

    def hasIes(self):
        return len(self._ies) > 0

    def indexOfY(self, aY):
        return next((i for i, x in enumerate(self._ies) if x is aY), -1)

    @staticmethod
    def minimumNumberOfIes():
        return 0

    def addY(self, aY):
        if any(x is aY for x in self._ies):
            return False
        self._ies.append(aY)
        if aY.indexOfX(self) == -1 and not aY.addX(self):
            del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
            return False
        return True

    def removeY(self, aY):
        oldIndex = next((i for i, x in enumerate(self._ies) if x is aY), -1)
        if oldIndex == -1:
            return False
        del self._ies[oldIndex]
        if aY.indexOfX(self) != -1 and not aY.removeX(self):
            self._ies.insert(oldIndex, aY)
            return False
        return True

    def addYAt(self, aY, index):
        if not self.addY(aY):
            return False
        if index < 0:
            index = 0
        if index > self.numberOfIes():
            index = self.numberOfIes() - 1
        del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
        self._ies.insert(index, aY)
        return True

    def addOrMoveYAt(self, aY, index):
        if not any(x is aY for x in self._ies):
            return self.addYAt(aY, index)
        if index < 0:
            index = 0
        if index > self.numberOfIes():
            index = self.numberOfIes() - 1
        del self._ies[next((i for i, x in enumerate(self._ies) if x is aY), -1)]
        self._ies.insert(index, aY)
        return True

    def delete(self):
        copyOfIes = tuple(self._ies)
        self._ies.clear()
        for aY in copyOfIes:
            aY.removeX(self)

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!


class Y:
    def __init__(self):
        self._xs = []

    def getX(self, index):
        return self._xs[index]

    def getXs(self):
        return tuple(self._xs)

    def numberOfXs(self):
        return len(self._xs)

    def hasXs(self):
        return len(self._xs) > 0

    def indexOfX(self, aX):
        return next((i for i, x in enumerate(self._xs) if x is aX), -1)

    @staticmethod
    def minimumNumberOfXs():
        return 0

    def addX(self, aX):
        if any(x is aX for x in self._xs):
            return False
        self._xs.append(aX)
        if aX.indexOfY(self) == -1 and not aX.addY(self):
            del self._xs[next((i for i, x in enumerate(self._xs) if x is aX), -1)]
            return False
        return True

    def removeX(self, aX):
        oldIndex = next((i for i, x in enumerate(self._xs) if x is aX), -1)
        if oldIndex == -1:
            return False
        del self._xs[oldIndex]
        if aX.indexOfY(self) != -1 and not aX.removeY(self):
            self._xs.insert(oldIndex, aX)
            return False
        return True

    def addXAt(self, aX, index):
        if not self.addX(aX):
            return False
        if index < 0:
            index = 0
        if index > self.numberOfXs():
            index = self.numberOfXs() - 1
        del self._xs[next((i for i, x in enumerate(self._xs) if x is aX), -1)]
        self._xs.insert(index, aX)
        return True

    def addOrMoveXAt(self, aX, index):
        if not any(x is aX for x in self._xs):
            return self.addXAt(aX, index)
        if index < 0:
            index = 0
        if index > self.numberOfXs():
            index = self.numberOfXs() - 1
        del self._xs[next((i for i, x in enumerate(self._xs) if x is aX), -1)]
        self._xs.insert(index, aX)
        return True

    def delete(self):
        copyOfXs = tuple(self._xs)
        self._xs.clear()
        for aX in copyOfXs:
            aX.removeY(self)

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from abc import ABC


class I(ABC):
    pass

#PLEASE DO NOT EDIT THIS CODE
#This code was generated using the UMPLE 1.38.0.8942.247e17422 modeling language!

from m.I import I


class J(I):
    pass