// Path: src/main/java/epto/utils/Event.java
// public class Event implements Comparable<Event>{
// 
//     public UUID id;
// 
//     public LogicalClock timestamp;
// 
//     public int ttl;
// 
//     public long sourceId;
// 
//     public Event() {
//         id = UUID.randomUUID();
//     }
// 
//     public int compareTo(Event o) {
//         int comparisionLC = timestamp.compareTo(o.timestamp);
//         return (comparisionLC != 0)? comparisionLC : (int)(sourceId - o.sourceId);
//     }
// 
//     @Override
//     public String toString() {
//         return "{timestamp=" + timestamp + ", ttl=" + ttl + ", sourceId=" + sourceId + "}";
//     }
// }
// 
// Path: src/main/java/epto/utils/Message.java
// public class Message {
// 
//     public final static int PREBROADCAST = 0;
//     public final static int BROADCAST = 1;
//     public final static int DELIVER = 2;
//     public final static int DISSEMINATION = 3;
//     public final static int ORDER = 4;
// 
//     private int type;
//     private Object content;
// //    private Node source;
// //    private Node destination;
// 
//     public Message(int type, Object content) {
//         this.type = type;
//         this.content = content;
//     }
// 
//     public int getType() {
//         return type;
//     }
// 
//     public void setType(int type) {
//         this.type = type;
//     }
// 
//     public Object getContent() {
//         return content;
//     }
// 
//     public void setContent(Object content) {
//         this.content = content;
//     }
// 
// //    public Node getSource() {
// //        return source;
// //    }
// //
// //    public void setSource(Node source) {
// //        this.source = source;
// //    }
// //
// //    public Node getDestination() {
// //        return destination;
// //    }
// //
// //    public void setDestination(Node destination) {
// //        this.destination = destination;
// //    }
// }


import epto.utils.Event;
import epto.utils.Message;
import peersim.cdsim.CDProtocol;
import peersim.config.Configuration;
import peersim.core.CommonState;
import peersim.core.Node;
import peersim.edsim.EDProtocol;
import java.util.ArrayList;
            EpTOBroadcast(new Event(), node);
        }
    }

    public void EpTOBroadcast(Event event, Node node) {
//        Message m = new Message(Message.PREBROADCAST, event);
//        EDSimulator.add(10, m, node, EpTODissemination.PID);

        EpTODissemination EpTO_dissemination = (EpTODissemination) node.getProtocol(EpTODissemination.PID);
        EpTO_dissemination.EpTOBroadcast(event, node);
    }

    public Object clone() {
        EpTOApplication epToApplication = null;
        try {
            epToApplication = (EpTOApplication) super.clone();
            epToApplication.delivered = new ArrayList<Event>();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return epToApplication;
    }

    public void EpTODeliver(Event event, Node node) {
        delivered.add(event);
        System.out.println("Node " + node.getID() + " delivered : " + event);
        System.out.println("Node " + node.getID() + " delivered (till now) : " + delivered);
    }

    public void processEvent(Node node, int i, Object o) {
// Path: src/main/java/epto/utils/Event.java
// public class Event implements Comparable<Event>{
// 
//     public UUID id;
// 
//     public LogicalClock timestamp;
// 
//     public int ttl;
// 
//     public long sourceId;
// 
//     public Event() {
//         id = UUID.randomUUID();
//     }
// 
//     public int compareTo(Event o) {
//         int comparisionLC = timestamp.compareTo(o.timestamp);
//         return (comparisionLC != 0)? comparisionLC : (int)(sourceId - o.sourceId);
//     }
// 
//     @Override
//     public String toString() {
//         return "{timestamp=" + timestamp + ", ttl=" + ttl + ", sourceId=" + sourceId + "}";
//     }
// }
// 
// Path: src/main/java/epto/utils/Message.java
// public class Message {
// 
//     public final static int PREBROADCAST = 0;
//     public final static int BROADCAST = 1;
//     public final static int DELIVER = 2;
//     public final static int DISSEMINATION = 3;
//     public final static int ORDER = 4;
// 
//     private int type;
//     private Object content;
// //    private Node source;
// //    private Node destination;
// 
//     public Message(int type, Object content) {
//         this.type = type;
//         this.content = content;
//     }
// 
//     public int getType() {
//         return type;
//     }
// 
//     public void setType(int type) {
//         this.type = type;
//     }
// 
//     public Object getContent() {
//         return content;
//     }
// 
//     public void setContent(Object content) {
//         this.content = content;
//     }
// 
// //    public Node getSource() {
// //        return source;
// //    }
// //
// //    public void setSource(Node source) {
// //        this.source = source;
// //    }
// //
// //    public Node getDestination() {
// //        return destination;
// //    }
// //
// //    public void setDestination(Node destination) {
// //        this.destination = destination;
// //    }
// }


// Path: src/main/java/epto/EpTOApplication.java
import epto.utils.Event;
import epto.utils.Message;
import peersim.cdsim.CDProtocol;
import peersim.config.Configuration;
import peersim.core.CommonState;
import peersim.core.Node;
import peersim.edsim.EDProtocol;
import java.util.ArrayList;

            EpTOBroadcast(new Event(), node);
        }
    }

    public void EpTOBroadcast(Event event, Node node) {
//        Message m = new Message(Message.PREBROADCAST, event);
//        EDSimulator.add(10, m, node, EpTODissemination.PID);

        EpTODissemination EpTO_dissemination = (EpTODissemination) node.getProtocol(EpTODissemination.PID);
        EpTO_dissemination.EpTOBroadcast(event, node);
    }

    public Object clone() {
        EpTOApplication epToApplication = null;
        try {
            epToApplication = (EpTOApplication) super.clone();
            epToApplication.delivered = new ArrayList<Event>();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return epToApplication;
    }

    public void EpTODeliver(Event event, Node node) {
        delivered.add(event);
        System.out.println("Node " + node.getID() + " delivered : " + event);
        System.out.println("Node " + node.getID() + " delivered (till now) : " + delivered);
    }

    public void processEvent(Node node, int i, Object o) {
        Message m = (Message) o;