[virtualcommons-svn] SF.net SVN: virtualcommons:[398] foraging/branches/deepak-branch-fall-09/ src/
Status: Beta
Brought to you by:
alllee
From: <al...@us...> - 2009-12-04 02:28:50
|
Revision: 398 http://virtualcommons.svn.sourceforge.net/virtualcommons/?rev=398&view=rev Author: alllee Date: 2009-12-04 02:28:43 +0000 (Fri, 04 Dec 2009) Log Message: ----------- getting rid of mobile resource-generator from configuration more refactoring on server side, still incomplete. Modified Paths: -------------- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/client/SanctioningPanel.java foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/facilitator/FacilitatorWindow.java foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ClientData.java foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/EnforcementMechanism.java foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round0.xml foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round1.xml foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round2.xml foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round3.xml foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round4.xml foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round5.xml Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/client/SanctioningPanel.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/client/SanctioningPanel.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/client/SanctioningPanel.java 2009-12-04 02:28:43 UTC (rev 398) @@ -427,6 +427,7 @@ private class SixChoicePanel implements ActionListener{ //String title; String [] buttonLabels; + // the index of the regulation that is being rendered in this panel int regulationID; int currentRanking; JPanel regulationPanel; Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/facilitator/FacilitatorWindow.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/facilitator/FacilitatorWindow.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/facilitator/FacilitatorWindow.java 2009-12-04 02:28:43 UTC (rev 398) @@ -338,15 +338,15 @@ public void displayDebriefing(FacilitatorEndRoundEvent event) { Map<Identifier, ClientData> clientDataMap = event.getClientDataMap(); - StringBuilder buffer = new StringBuilder(); - buffer.append(String.format("<h3>Round %d Results</h3>", facilitator.getCurrentRoundConfiguration().getRoundNumber())); - buffer.append("<table><thead><th>Participant</th><th>Current tokens</th><th>Current Income</th><th>Total Income</th></thead><tbody>"); + StringBuilder builder = new StringBuilder(); + builder.append(String.format("<h3>Round %d Results</h3>", facilitator.getCurrentRoundConfiguration().getRoundNumber())); + builder.append("<table><thead><th>Participant</th><th>Current tokens</th><th>Current Income</th><th>Total Income</th></thead><tbody>"); TreeSet<Identifier> orderedSet = new TreeSet<Identifier>(clientDataMap.keySet()); for (Identifier clientId : orderedSet) { ClientData data = clientDataMap.get(clientId); // FIXME: hack... inject the configuration into the client data so that getIncome() will return something appropriate. // should just refactor getIncome or remove it from ClientData entirely. - buffer.append(String.format( + builder.append(String.format( "<tr><td>%s</td>" + "<td align='center'>%d</td>" + "<td align='center'>$%3.2f</td>" + @@ -356,11 +356,11 @@ getIncome(data.getCurrentTokens()), data.getTotalIncome() + facilitator.getServerConfiguration().getShowUpFee())); } - buffer.append("</tbody></table><hr>"); + builder.append("</tbody></table><hr>"); if (event.isLastRound()) { - buffer.append("<h2><font color='blue'>The experiment is over. Please prepare payments.</font></h2>"); + builder.append("<h2><font color='blue'>The experiment is over. Please prepare payments.</font></h2>"); } - informationEditorPane.setText(buffer.toString()); + informationEditorPane.setText(builder.toString()); // switchCenterComponent(viewPane, informationPanel); //startRoundMenuItem.setEnabled(true); showInstructionsMenuItem.setEnabled(true); Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ClientData.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ClientData.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ClientData.java 2009-12-04 02:28:43 UTC (rev 398) @@ -60,6 +60,8 @@ private double viewSubjectsRadius; private double viewTokensRadius; + // this is only used in the Rotating Monitor enforcement mechanism. + private int tokensCollectedDuringInterval = 0; public ClientData(Identifier id) { this.id = id; @@ -92,7 +94,7 @@ */ public int getCurrentTokens() { return currentTokens; - } + } public void addTokens(int tokens) { currentTokens += tokens; @@ -102,6 +104,7 @@ totalTokens += tokens; totalIncome += (tokens * configuration.getDollarsPerToken()); } + tokensCollectedDuringInterval += tokens; } public Circle getSubjectsFieldOfVision() { @@ -137,6 +140,12 @@ addTokens(1); } + public int applyMonitorTax() { + int monitorTax = tokensCollectedDuringInterval / 4; + subtractTokens(monitorTax); + return monitorTax; + } + // used for post round sanctioning public synchronized void postRoundSanctionCost(int cost) { sanctionCosts += Math.abs(cost); @@ -280,13 +289,13 @@ */ public void reset() { resetCurrentTokens(); - if (getGroupDataModel().getRoundConfiguration().isRealTimeSanctioningEnabled()) { - resetLatestSanctions(); - } + resetLatestSanctions(); } public void resetLatestSanctions() { - latestSanctions.clear(); + if (latestSanctions != null) { + latestSanctions.clear(); + } } private void resetCurrentTokens() { @@ -294,7 +303,12 @@ sanctionBonuses = 0; sanctionPenalties = 0; sanctionCosts = 0; + tokensCollectedDuringInterval = 0; } + + public void resetTokensCollectedDuringInterval() { + tokensCollectedDuringInterval = 0; + } public int getAssignedNumber() { return assignedNumber; Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/EnforcementMechanism.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/EnforcementMechanism.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/EnforcementMechanism.java 2009-12-04 02:28:43 UTC (rev 398) @@ -5,6 +5,8 @@ NONE("No enforcement", "Everybody can harvest. Nobody can subtract tokens from others"), EVERYONE_CAN_SANCTION("Everybody can reduce", "Every participant can reduce the tokens of other participants by pressing the number key associated with that participant."), RANDOM_MONITOR("Random monitor", "Randomly, one of the participants is selected to be the monitoring participant. This participant cannot harvest but can subtract tokens from other participants by pressing the number key associated with that participant. At the end of the round each harvesting participant pays 25% of their earned tokens to the monitoring participant."), + // after (round duration / # of clients) seconds + // each monitor receives 25% of the tokens collected during their monitoring time. ROTATING_MONITOR("Rotating monitor", "Each participant is given an equal amount of time to be a monitor, with the ability to reduce the tokens of other participants by pressing the number key associated with that participant."); private final String title; Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java 2009-12-04 02:28:43 UTC (rev 398) @@ -17,8 +17,11 @@ import edu.asu.commons.experiment.DataModel; import edu.asu.commons.foraging.conf.RoundConfiguration; import edu.asu.commons.foraging.event.ClientPositionUpdateEvent; +import edu.asu.commons.foraging.event.EnforcementRankingRequest; import edu.asu.commons.foraging.event.LockResourceRequest; import edu.asu.commons.foraging.event.PostRoundSanctionRequest; +import edu.asu.commons.foraging.event.RegulationRankingRequest; +import edu.asu.commons.foraging.event.SubmitRegulationRequest; import edu.asu.commons.foraging.event.SynchronizeClientEvent; import edu.asu.commons.foraging.event.TokenCollectedEvent; import edu.asu.commons.foraging.event.UnlockResourceRequest; @@ -58,16 +61,16 @@ private volatile static long nextGroupId = 0; private volatile int receivedEnforcementRankings = 0; - private volatile int numberOfReceivedRegulations = 0; + private volatile int receivedRegulationRankings = 0; private EnforcementMechanism activeEnforcementMechanism = EnforcementMechanism.NONE; private List<ClientData> waitingMonitors; + + private int tokensCollectedDuringInterval = 0; -// private List<Regulation> regulationSubmissions; + private ArrayList<RegulationData> submittedRegulations = new ArrayList<RegulationData>(); -// private transient float averageTokens = -1; - public GroupDataModel(ServerDataModel serverDataModel) { this(serverDataModel, nextGroupId++); } @@ -118,6 +121,9 @@ public void rotateMonitor() { if (activeEnforcementMechanism.isRotatingMonitor() && ! waitingMonitors.isEmpty()) { for (ClientData clientData: clients.values()) { + if (clientData.isMonitor()) { + // this is the active monitor, give them 25% of the take. + } clientData.setForagingRole(ForagingRole.HARVEST); } ClientData nextMonitor = waitingMonitors.remove(0); @@ -168,10 +174,6 @@ return activeEnforcementMechanism; } - public int addEnforcementRanking() { - return receivedEnforcementRankings++; - } - private void resetEnforcementRankingCount() { receivedEnforcementRankings = 0; } @@ -179,15 +181,19 @@ public boolean hasReceivedAllEnforcementRankings() { return receivedEnforcementRankings >= clients.size(); } - - public int incrRegulationCount() { - return numberOfReceivedRegulations++; + + public void submitRegulationRequest(SubmitRegulationRequest request) { + Identifier id = request.getId(); + ClientData clientData = clients.get(id); + RegulationData submittedRegulation = new RegulationData(id, request.getMessage()); + clientData.setRegulationData(submittedRegulation); + submittedRegulations.add(submittedRegulation); } - public void resetRegulationCount() { - numberOfReceivedRegulations = 0; + public boolean hasReceivedAllRegulations() { + return submittedRegulations.size() >= clients.size(); } - + /** * Used to reset the food distribution for a client during a practice * round. @@ -201,6 +207,16 @@ resourceDistribution.clear(); } + /** + * Perform all cleanup. + */ + public void cleanupRound() { + clearResourceDistribution(); + tokensCollectedDuringInterval = 0; + activeEnforcementMechanism = EnforcementMechanism.NONE; + submittedRegulations.clear(); + } + public void clearResourceDistribution() { resourceDistribution.clear(); clearDiffLists(); @@ -367,6 +383,7 @@ Point position = clientData.getPoint(); if (resourceDistribution.containsKey(position)) { getRemovedResources().add( resourceDistribution.remove(position) ); + tokensCollectedDuringInterval++; clientData.addToken(); serverDataModel.getEventChannel().handle(new TokenCollectedEvent(clientData.getId(), position)); } @@ -398,7 +415,7 @@ public void clear() { clients.clear(); - clearResourceDistribution(); + cleanupRound(); } public boolean isResourceDistributionEmpty() { @@ -571,4 +588,22 @@ return activeEnforcementMechanism; } + public void submitEnforcementRanking(EnforcementRankingRequest request) { + ClientData clientData = clients.get(request.getId()); + clientData.setEnforcementRankings(request.getRankings()); + receivedEnforcementRankings++; + } + + public void submitRegulationRanking(RegulationRankingRequest request) { + + } + + public boolean hasReceivedAllRegulationRankings() { + return receivedRegulationRankings >= clients.size(); + } + + public List<RegulationData> getSubmittedRegulations() { + return submittedRegulations; + } + } Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java 2009-12-04 02:28:43 UTC (rev 398) @@ -166,9 +166,9 @@ } - public void clearResourceDistribution() { + public void cleanupRound() { for (GroupDataModel group: clientsToGroups.values()) { - group.clearResourceDistribution(); + group.cleanupRound(); } } Modified: foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java 2009-12-04 02:28:43 UTC (rev 398) @@ -278,28 +278,30 @@ // FIXME: start new implementation here. addEventProcessor(new EventTypeProcessor<EnforcementRankingRequest>(EnforcementRankingRequest.class) { public void handle(final EnforcementRankingRequest request) { - ClientData clientData = clients.get(request.getId()); - GroupDataModel groupDataModel = clientData.getGroupDataModel(); - clientData.setEnforcementRankings(request.getRankings()); - groupDataModel.addEnforcementRanking(); - if (groupDataModel.hasReceivedAllEnforcementRankings()) { - EnforcementMechanism enforcementMechanism = groupDataModel.generateEnforcementRankings(); - for (Identifier id: groupDataModel.getClientIdentifiers()) { - transmit(new EnforcementMechanismUpdateEvent(id, enforcementMechanism)); - } + GroupDataModel group = serverDataModel.getGroup(request.getId()); + group.submitEnforcementRanking(request); + if (group.hasReceivedAllEnforcementRankings()) { + sendEnforcementUpdate(group); } - } }); + addEventProcessor(new EventTypeProcessor<RegulationRankingRequest>(RegulationRankingRequest.class) { public void handle(final RegulationRankingRequest request) { - - + GroupDataModel group = serverDataModel.getGroup(request.getId()); + group.submitRegulationRanking(request); + if (group.hasReceivedAllRegulationRankings()) { + sendRegulationRankingUpdate(group); + } } }); addEventProcessor(new EventTypeProcessor<SubmitRegulationRequest>(SubmitRegulationRequest.class) { public void handle(final SubmitRegulationRequest request) { - + GroupDataModel group = serverDataModel.getGroup(request.getId()); + group.submitRegulationRequest(request); + if (group.hasReceivedAllRegulations()) { + sendRegulationUpdate(group); + } } }); @@ -441,6 +443,24 @@ }); } + private void sendRegulationUpdate(GroupDataModel group) { + // TODO: implement me + + } + private void sendRegulationRankingUpdate(GroupDataModel group) { + EnforcementMechanism enforcementMechanism = group.generateEnforcementRankings(); + for (Identifier id: group.getClientIdentifiers()) { + transmit(new EnforcementMechanismUpdateEvent(id, enforcementMechanism)); + } + } + + private void sendEnforcementUpdate(GroupDataModel group) { + EnforcementMechanism enforcementMechanism = group.generateEnforcementRankings(); + for (Identifier id: group.getClientIdentifiers()) { + transmit(new EnforcementMechanismUpdateEvent(id, enforcementMechanism)); + } + } + private void handleEnforcementSanctionRequest(RealTimeSanctionRequest request) { ClientData sourceClient = clients.get(request.getSource()); ClientData targetClient = clients.get(request.getTarget()); @@ -803,15 +823,14 @@ if (currentRoundDuration.hasExpired()) { // perform token adjustment if needed. for (GroupDataModel group: serverDataModel.getGroups()) { - if (group.getActiveEnforcementMechanism().isRandomMonitor()) { - // this is + if (group.getActiveEnforcementMechanism().hasMonitor()) { + // check for monitor status } } stopRound(); break; } - - + roundProcessor.execute(); Utils.sleep(SERVER_SLEEP_INTERVAL); break; @@ -979,7 +998,7 @@ } private void cleanupRound() { - serverDataModel.clearResourceDistribution(); + serverDataModel.cleanupRound(); for (ClientData clientData: clients.values()) { clientData.reset(); } Modified: foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round0.xml =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round0.xml 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round0.xml 2009-12-04 02:28:43 UTC (rev 398) @@ -8,7 +8,6 @@ <entry key="private-property">true</entry> <entry key="duration">240</entry> -<entry key='resource-generator'>mobile</entry> <entry key='tokens-field-of-vision'>true</entry> <entry key='subjects-field-of-vision'>true</entry> @@ -16,12 +15,12 @@ <entry key='initial-distribution'>.25</entry> <entry key='always-explicit'>true</entry> -<entry key='enforcement-option1'>Everybody can harvest</entry> - <entry key="quiz">true</entry> <entry key="q1">C</entry> <entry key="q2">B</entry> + + <entry key="instructions"> <![CDATA[ <h3>General Instructions</h3> Modified: foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round1.xml =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round1.xml 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round1.xml 2009-12-04 02:28:43 UTC (rev 398) @@ -8,7 +8,6 @@ <entry key="resource-depth">29</entry> <entry key="resource-width">29</entry> -<entry key='resource-generator'>mobile</entry> <entry key='tokens-field-of-vision'>true</entry> <entry key='subjects-field-of-vision'>true</entry> Modified: foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round2.xml =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round2.xml 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round2.xml 2009-12-04 02:28:43 UTC (rev 398) @@ -8,7 +8,6 @@ <entry key="resource-depth">29</entry> <entry key="resource-width">29</entry> -<entry key='resource-generator'>mobile</entry> <entry key='tokens-field-of-vision'>true</entry> <entry key='subjects-field-of-vision'>true</entry> @@ -18,6 +17,9 @@ <entry key="initial-distribution">.25</entry> <entry key="regrowth-rate">0.01</entry> +<entry key="chat-enabled">true</entry> +<entry key='voting-and-regulation-enabled'>true</entry> + <entry key="instructions"> <![CDATA[ <h3>Round 2 Instructions</h3> Modified: foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round3.xml =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round3.xml 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round3.xml 2009-12-04 02:28:43 UTC (rev 398) @@ -8,7 +8,6 @@ <entry key="resource-depth">29</entry> <entry key="resource-width">29</entry> -<entry key='resource-generator'>mobile</entry> <entry key='tokens-field-of-vision'>true</entry> <entry key='subjects-field-of-vision'>true</entry> @@ -19,13 +18,8 @@ <entry key="initial-distribution">.25</entry> <entry key="regrowth-rate">0.01</entry> -<!-- -<entry key="patchy">true</entry> -<entry key="top-initial-distribution">0.50</entry> -<entry key="top-rate">0.02</entry> -<entry key="bottom-initial-distribution">0.25</entry> -<entry key="bottom-rate">0.01</entry> ---> +<entry key="chat-enabled">true</entry> +<entry key='voting-and-regulation-enabled'>true</entry> <entry key="instructions"> <![CDATA[ Modified: foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round4.xml =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round4.xml 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round4.xml 2009-12-04 02:28:43 UTC (rev 398) @@ -8,7 +8,6 @@ <entry key="resource-width">29</entry> <entry key="duration">240</entry> -<entry key='resource-generator'>mobile</entry> <entry key='tokens-field-of-vision'>true</entry> <entry key='subjects-field-of-vision'>true</entry> @@ -17,6 +16,7 @@ <!-- before this round begins, we have a chat session --> <entry key="chat-enabled">true</entry> +<entry key='voting-and-regulation-enabled'>true</entry> <!-- enable sanctioning --> <entry key="sanction-type">real-time</entry> Modified: foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round5.xml =================================================================== --- foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round5.xml 2009-12-04 01:07:37 UTC (rev 397) +++ foraging/branches/deepak-branch-fall-09/src/main/resources/configuration/asu-experiments/voting-regulation-enforcement/round5.xml 2009-12-04 02:28:43 UTC (rev 398) @@ -8,8 +8,6 @@ <entry key="resource-width">29</entry> <entry key="duration">240</entry> -<!-- enable mobile offspring-generating resource --> -<entry key='resource-generator'>mobile</entry> <!-- enable field of vision for tokens and subjects --> <entry key='tokens-field-of-vision'>true</entry> <entry key='subjects-field-of-vision'>true</entry> @@ -27,6 +25,7 @@ <!-- before this round begins, we have a chat session --> <entry key="chat-enabled">true</entry> +<entry key='voting-and-regulation-enabled'>true</entry> <entry key="instructions"> <![CDATA[ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |