<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[13793] CalendarServer/trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/13793">13793</a></dd>
<dt>Author</dt> <dd>cdaboo@apple.com</dd>
<dt>Date</dt> <dd>2014-07-25 12:29:30 -0700 (Fri, 25 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>White space.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServertrunkcalendarservercontrolsocketpy">CalendarServer/trunk/calendarserver/controlsocket.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverplatformdarwinsaclpy">CalendarServer/trunk/calendarserver/platform/darwin/sacl.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverprofilingpy">CalendarServer/trunk/calendarserver/profiling.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushamppushpy">CalendarServer/trunk/calendarserver/push/amppush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushapplepushpy">CalendarServer/trunk/calendarserver/push/applepush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushnotifierpy">CalendarServer/trunk/calendarserver/push/notifier.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushtesttest_amppushpy">CalendarServer/trunk/calendarserver/push/test/test_amppush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushtesttest_applepushpy">CalendarServer/trunk/calendarserver/push/test/test_applepush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushtesttest_notifierpy">CalendarServer/trunk/calendarserver/push/test/test_notifier.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushutilpy">CalendarServer/trunk/calendarserver/push/util.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertapcaldavpy">CalendarServer/trunk/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertaptesttest_utilpy">CalendarServer/trunk/calendarserver/tap/test/test_util.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertaputilpy">CalendarServer/trunk/calendarserver/tap/util.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsanonymizepy">CalendarServer/trunk/calendarserver/tools/anonymize.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolscalverifypy">CalendarServer/trunk/calendarserver/tools/calverify.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolscmdlinepy">CalendarServer/trunk/calendarserver/tools/cmdline.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsdbinspectpy">CalendarServer/trunk/calendarserver/tools/dbinspect.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsnotificationspy">CalendarServer/trunk/calendarserver/tools/notifications.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsobliteratepy">CalendarServer/trunk/calendarserver/tools/obliterate.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsprincipalspy">CalendarServer/trunk/calendarserver/tools/principals.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolspurgepy">CalendarServer/trunk/calendarserver/tools/purge.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsresourcespy">CalendarServer/trunk/calendarserver/tools/resources.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshellcmdpy">CalendarServer/trunk/calendarserver/tools/shell/cmd.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshelldirectorypy">CalendarServer/trunk/calendarserver/tools/shell/directory.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshellterminalpy">CalendarServer/trunk/calendarserver/tools/shell/terminal.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshellvfspy">CalendarServer/trunk/calendarserver/tools/shell/vfs.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_calverifypy">CalendarServer/trunk/calendarserver/tools/test/test_calverify.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_configpy">CalendarServer/trunk/calendarserver/tools/test/test_config.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_exportpy">CalendarServer/trunk/calendarserver/tools/test/test_export.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_gatewaypy">CalendarServer/trunk/calendarserver/tools/test/test_gateway.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_purgepy">CalendarServer/trunk/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_purge_old_eventspy">CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverwebadminlandingpy">CalendarServer/trunk/calendarserver/webadmin/landing.py</a></li>
<li><a href="#CalendarServertrunkconfauthgenerate_test_accountspy">CalendarServer/trunk/conf/auth/generate_test_accounts.py</a></li>
<li><a href="#CalendarServertrunkcontriboddsattributespy">CalendarServer/trunk/contrib/od/dsattributes.py</a></li>
<li><a href="#CalendarServertrunkcontribododframeworkpy">CalendarServer/trunk/contrib/od/odframework.py</a></li>
<li><a href="#CalendarServertrunkcontribperformance_event_createpy">CalendarServer/trunk/contrib/performance/_event_create.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchlibpy">CalendarServer/trunk/contrib/performance/benchlib.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarkpy">CalendarServer/trunk/contrib/performance/benchmark.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarksfind_eventspy">CalendarServer/trunk/contrib/performance/benchmarks/find_events.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarksvfreebusypy">CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarksvfreebusy_vary_attendeespy">CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py</a></li>
<li><a href="#CalendarServertrunkcontribperformanceeventkitframeworkpy">CalendarServer/trunk/contrib/performance/eventkitframework.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancehttpauthpy">CalendarServer/trunk/contrib/performance/httpauth.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancestatspy">CalendarServer/trunk/contrib/performance/stats.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancetest_benchmarkpy">CalendarServer/trunk/contrib/performance/test_benchmark.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancetest_statspy">CalendarServer/trunk/contrib/performance/test_stats.py</a></li>
<li><a href="#CalendarServertrunkcontribperformanceuploadpy">CalendarServer/trunk/contrib/performance/upload.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsfakecalendardatapy">CalendarServer/trunk/contrib/tools/fakecalendardata.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsmonitoranalysispy">CalendarServer/trunk/contrib/tools/monitoranalysis.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolspg_stats_analysispy">CalendarServer/trunk/contrib/tools/pg_stats_analysis.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsprotocolanalysispy">CalendarServer/trunk/contrib/tools/protocolanalysis.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsreadStatspy">CalendarServer/trunk/contrib/tools/readStats.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsrequest_monitorpy">CalendarServer/trunk/contrib/tools/request_monitor.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsstatsanalysispy">CalendarServer/trunk/contrib/tools/statsanalysis.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServertrunkcalendarservercontrolsocketpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/controlsocket.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/controlsocket.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/controlsocket.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx">         Build a thing that will multiplex AMP to all the relevant sockets.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         receiverMap = {}
</span><del>-        for k, f  in self._factoryMap.items():
</del><ins>+        for k, f in self._factoryMap.items():
</ins><span class="cx">             receiverMap[k] = f.buildProtocol(addr)
</span><span class="cx">         return BinaryBoxProtocol(DispatchingBoxReceiver(receiverMap))
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverplatformdarwinsaclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/platform/darwin/sacl.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/platform/darwin/sacl.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/platform/darwin/sacl.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx">     raise ImportError(ve)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def checkSACL(userOrGroupName, serviceName):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Check to see if a given user or group is a member of an OS X Server
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverprofilingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/profiling.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/profiling.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/profiling.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx">     return wrapper
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def profile_inline_callback():
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Decorator to profile an inlineCallback function
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushamppushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/amppush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/amppush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/amppush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -85,12 +85,15 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def enqueue(self, transaction, id, dataChangedTimestamp=None,
-        priority=PushPriority.high):
</del><ins>+    def enqueue(
+        self, transaction, id, dataChangedTimestamp=None,
+        priority=PushPriority.high
+    ):
</ins><span class="cx">         if dataChangedTimestamp is None:
</span><span class="cx">             dataChangedTimestamp = int(time.time())
</span><span class="cx">         for protocol in self.protocols:
</span><del>-            yield protocol.callRemote(NotificationForID, id=id,
</del><ins>+            yield protocol.callRemote(
+                NotificationForID, id=id,
</ins><span class="cx">                 dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx">                 priority=priority.value)
</span><span class="cx"> 
</span><span class="lines">@@ -108,11 +111,14 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @NotificationForID.responder
</span><del>-    def enqueueFromWorker(self, id, dataChangedTimestamp=None,
-        priority=PushPriority.high.value):
</del><ins>+    def enqueueFromWorker(
+        self, id, dataChangedTimestamp=None,
+        priority=PushPriority.high.value
+    ):
</ins><span class="cx">         if dataChangedTimestamp is None:
</span><span class="cx">             dataChangedTimestamp = int(time.time())
</span><del>-        self.master.enqueue(None, id, dataChangedTimestamp=dataChangedTimestamp,
</del><ins>+        self.master.enqueue(
+            None, id, dataChangedTimestamp=dataChangedTimestamp,
</ins><span class="cx">             priority=PushPriority.lookupByValue(priority))
</span><span class="cx">         return {&quot;status&quot; : &quot;OK&quot;}
</span><span class="cx"> 
</span><span class="lines">@@ -138,8 +144,10 @@
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     log = Logger()
</span><span class="cx"> 
</span><del>-    def __init__(self, controlSocket, parentService, port, enableStaggering,
-        staggerSeconds, reactor=None):
</del><ins>+    def __init__(
+        self, controlSocket, parentService, port, enableStaggering,
+        staggerSeconds, reactor=None
+    ):
</ins><span class="cx">         if reactor is None:
</span><span class="cx">             from twisted.internet import reactor
</span><span class="cx">         from twisted.application.strports import service as strPortsService
</span><span class="lines">@@ -147,18 +155,21 @@
</span><span class="cx">         if port:
</span><span class="cx">             # Service which listens for client subscriptions and sends
</span><span class="cx">             # notifications to them
</span><del>-            strPortsService(str(port), AMPPushNotifierFactory(self),
</del><ins>+            strPortsService(
+                str(port), AMPPushNotifierFactory(self),
</ins><span class="cx">                 reactor=reactor).setServiceParent(parentService)
</span><span class="cx"> 
</span><span class="cx">         if controlSocket is not None:
</span><span class="cx">             # Set up the listener which gets notifications from the slaves
</span><del>-            controlSocket.addFactory(PUSH_ROUTE,
-                AMPPushMasterListenerFactory(self))
</del><ins>+            controlSocket.addFactory(
+                PUSH_ROUTE, AMPPushMasterListenerFactory(self)
+            )
</ins><span class="cx"> 
</span><span class="cx">         self.subscribers = []
</span><span class="cx"> 
</span><span class="cx">         if enableStaggering:
</span><del>-            self.scheduler = PushScheduler(reactor, self.sendNotification,
</del><ins>+            self.scheduler = PushScheduler(
+                reactor, self.sendNotification,
</ins><span class="cx">                 staggerSeconds=staggerSeconds)
</span><span class="cx">         else:
</span><span class="cx">             self.scheduler = None
</span><span class="lines">@@ -174,8 +185,10 @@
</span><span class="cx">         self.subscribers.remove(p)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def enqueue(self, transaction, pushKey, dataChangedTimestamp=None,
-        priority=PushPriority.high):
</del><ins>+    def enqueue(
+        self, transaction, pushKey, dataChangedTimestamp=None,
+        priority=PushPriority.high
+    ):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Sends an AMP push notification to any clients subscribing to this pushKey.
</span><span class="cx"> 
</span><span class="lines">@@ -200,7 +213,8 @@
</span><span class="cx">             if token is not None:
</span><span class="cx">                 tokens.append(token)
</span><span class="cx">         if tokens:
</span><del>-            return self.scheduleNotifications(tokens, pushKey,
</del><ins>+            return self.scheduleNotifications(
+                tokens, pushKey,
</ins><span class="cx">                 dataChangedTimestamp, priority)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -208,7 +222,8 @@
</span><span class="cx">     def sendNotification(self, token, id, dataChangedTimestamp, priority):
</span><span class="cx">         for subscriber in self.subscribers:
</span><span class="cx">             if subscriber.subscribedToID(id):
</span><del>-                yield subscriber.notify(token, id, dataChangedTimestamp,
</del><ins>+                yield subscriber.notify(
+                    token, id, dataChangedTimestamp,
</ins><span class="cx">                     priority)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -218,7 +233,8 @@
</span><span class="cx">             self.scheduler.schedule(tokens, id, dataChangedTimestamp, priority)
</span><span class="cx">         else:
</span><span class="cx">             for token in tokens:
</span><del>-                yield self.sendNotification(token, id, dataChangedTimestamp,
</del><ins>+                yield self.sendNotification(
+                    token, id, dataChangedTimestamp,
</ins><span class="cx">                     priority)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -252,7 +268,8 @@
</span><span class="cx">     def notify(self, token, id, dataChangedTimestamp, priority):
</span><span class="cx">         if self.subscribedToID(id) == token:
</span><span class="cx">             self.log.debug(&quot;Sending notification for %s to %s&quot; % (id, token))
</span><del>-            return self.callRemote(NotificationForID, id=id,
</del><ins>+            return self.callRemote(
+                NotificationForID, id=id,
</ins><span class="cx">                 dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx">                 priority=priority.value)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushapplepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/applepush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/applepush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/applepush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -71,8 +71,10 @@
</span><span class="cx">     log = Logger()
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><del>-    def makeService(cls, settings, store, testConnectorClass=None,
-        reactor=None):
</del><ins>+    def makeService(
+        cls, settings, store, testConnectorClass=None,
+        reactor=None
+    ):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Creates the various &quot;subservices&quot; that work together to implement
</span><span class="cx">         APN, including &quot;provider&quot; and &quot;feedback&quot; services for CalDAV and
</span><span class="lines">@@ -129,7 +131,8 @@
</span><span class="cx">                 )
</span><span class="cx">                 provider.setServiceParent(service)
</span><span class="cx">                 service.providers[protocol] = provider
</span><del>-                service.log.info(&quot;APNS %s topic: %s&quot; %
</del><ins>+                service.log.info(
+                    &quot;APNS %s topic: %s&quot; %
</ins><span class="cx">                     (protocol, settings[protocol][&quot;Topic&quot;]))
</span><span class="cx"> 
</span><span class="cx">                 feedback = APNFeedbackService(
</span><span class="lines">@@ -188,8 +191,10 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def enqueue(self, transaction, pushKey, dataChangedTimestamp=None,
-        priority=PushPriority.high):
</del><ins>+    def enqueue(
+        self, transaction, pushKey, dataChangedTimestamp=None,
+        priority=PushPriority.high
+    ):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Sends an Apple Push Notification to any device token subscribed to
</span><span class="cx">         this pushKey.
</span><span class="lines">@@ -226,14 +231,16 @@
</span><span class="cx"> 
</span><span class="cx">             numSubscriptions = len(subscriptions)
</span><span class="cx">             if numSubscriptions &gt; 0:
</span><del>-                self.log.debug(&quot;Sending %d APNS notifications for %s&quot; %
</del><ins>+                self.log.debug(
+                    &quot;Sending %d APNS notifications for %s&quot; %
</ins><span class="cx">                     (numSubscriptions, pushKey))
</span><span class="cx">                 tokens = []
</span><span class="cx">                 for token, uid in subscriptions:
</span><span class="cx">                     if token and uid:
</span><span class="cx">                         tokens.append(token)
</span><span class="cx">                 if tokens:
</span><del>-                    provider.scheduleNotifications(tokens, pushKey,
</del><ins>+                    provider.scheduleNotifications(
+                        tokens, pushKey,
</ins><span class="cx">                         dataChangedTimestamp, priority)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -313,7 +320,8 @@
</span><span class="cx">                 if command == self.COMMAND_ERROR:
</span><span class="cx">                     yield fn(status, identifier)
</span><span class="cx">             except Exception, e:
</span><del>-                self.log.warn(&quot;ProviderProtocol could not process error: %s (%s)&quot; %
</del><ins>+                self.log.warn(
+                    &quot;ProviderProtocol could not process error: %s (%s)&quot; %
</ins><span class="cx">                     (message.encode(&quot;hex&quot;), e))
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -336,12 +344,14 @@
</span><span class="cx">         if status in self.TOKEN_REMOVAL_CODES:
</span><span class="cx">             token = self.history.extractIdentifier(identifier)
</span><span class="cx">             if token is not None:
</span><del>-                self.log.debug(&quot;Removing subscriptions for bad token: %s&quot; %
</del><ins>+                self.log.debug(
+                    &quot;Removing subscriptions for bad token: %s&quot; %
</ins><span class="cx">                     (token,))
</span><span class="cx">                 txn = self.factory.store.newTransaction(label=&quot;APNProviderProtocol.processError&quot;)
</span><span class="cx">                 subscriptions = (yield txn.apnSubscriptionsByToken(token))
</span><span class="cx">                 for key, _ignore_modified, _ignore_uid in subscriptions:
</span><del>-                    self.log.debug(&quot;Removing subscription: %s %s&quot; %
</del><ins>+                    self.log.debug(
+                        &quot;Removing subscription: %s %s&quot; %
</ins><span class="cx">                         (token, key))
</span><span class="cx">                     yield txn.removeAPNSubscription(token, key)
</span><span class="cx">                 yield txn.commit()
</span><span class="lines">@@ -380,7 +390,8 @@
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="cx">         payloadLength = len(payload)
</span><del>-        self.log.debug(&quot;Sending APNS notification to {token}: id={id} payload={payload} priority={priority}&quot;,
</del><ins>+        self.log.debug(
+            &quot;Sending APNS notification to {token}: id={id} payload={payload} priority={priority}&quot;,
</ins><span class="cx">             token=token, id=identifier, payload=payload, priority=apnsPriority)
</span><span class="cx"> 
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -397,34 +408,34 @@
</span><span class="cx">             at a time that conservces power on the device receiving it)
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-                                                    # Frame struct.pack format
-                                                    # ! Network byte order
</del><ins>+        # Frame struct.pack format                ! Network byte order
</ins><span class="cx">         command = self.COMMAND_PROVIDER             # B
</span><span class="cx">         frameLength = (# I
</span><span class="cx">             # Item 1 (Device token)
</span><del>-            1 + # Item number                      # B
-            2 + # Item length                      # H
</del><ins>+            1 + # Item number                       # B
+            2 + # Item length                       # H
</ins><span class="cx">             32 + # device token                     # 32s
</span><span class="cx">             # Item 2 (Payload)
</span><del>-            1 + # Item number                      # B
-            2 + # Item length                      # H
</del><ins>+            1 + # Item number                       # B
+            2 + # Item length                       # H
</ins><span class="cx">             payloadLength + # the JSON payload      # %d s
</span><span class="cx">             # Item 3 (Notification ID)
</span><del>-            1 + # Item number                      # B
-            2 + # Item length                      # H
-            4 + # Notification ID                  # I
</del><ins>+            1 + # Item number                       # B
+            2 + # Item length                       # H
+            4 + # Notification ID                   # I
</ins><span class="cx">             # Item 4 (Expiration)
</span><del>-            1 + # Item number                      # B
-            2 + # Item length                      # H
-            4 + # Expiration seconds since epoch   # I
</del><ins>+            1 + # Item number                       # B
+            2 + # Item length                       # H
+            4 + # Expiration seconds since epoch    # I
</ins><span class="cx">             # Item 5 (Priority)
</span><del>-            1 + # Item number                      # B
-            2 + # Item length                      # H
</del><ins>+            1 + # Item number                       # B
+            2 + # Item length                       # H
</ins><span class="cx">             1    # Priority                         # B
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         self.transport.write(
</span><del>-            struct.pack(&quot;!BIBH32sBH%dsBHIBHIBHB&quot; % (payloadLength,),
</del><ins>+            struct.pack(
+                &quot;!BIBH32sBH%dsBHIBHIBHB&quot; % (payloadLength,),
</ins><span class="cx"> 
</span><span class="cx">                 command,                         # Command
</span><span class="cx">                 frameLength,                     # Frame length
</span><span class="lines">@@ -482,7 +493,8 @@
</span><span class="cx">     def clientConnectionFailed(self, connector, reason):
</span><span class="cx">         self.log.error(&quot;Unable to connect to APN server: %s&quot; % (reason,))
</span><span class="cx">         self.connected = False
</span><del>-        ReconnectingClientFactory.clientConnectionFailed(self, connector,
</del><ins>+        ReconnectingClientFactory.clientConnectionFailed(
+            self, connector,
</ins><span class="cx">             reason)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -500,9 +512,11 @@
</span><span class="cx"> class APNConnectionService(service.Service):
</span><span class="cx">     log = Logger()
</span><span class="cx"> 
</span><del>-    def __init__(self, host, port, certPath, keyPath, chainPath=&quot;&quot;,
</del><ins>+    def __init__(
+        self, host, port, certPath, keyPath, chainPath=&quot;&quot;,
</ins><span class="cx">         passphrase=&quot;&quot;, sslMethod=&quot;TLSv1_METHOD&quot;, testConnector=None,
</span><del>-        reactor=None):
</del><ins>+        reactor=None
+    ):
</ins><span class="cx"> 
</span><span class="cx">         self.host = host
</span><span class="cx">         self.port = port
</span><span class="lines">@@ -541,12 +555,15 @@
</span><span class="cx"> 
</span><span class="cx"> class APNProviderService(APNConnectionService):
</span><span class="cx"> 
</span><del>-    def __init__(self, store, host, port, certPath, keyPath, chainPath=&quot;&quot;,
</del><ins>+    def __init__(
+        self, store, host, port, certPath, keyPath, chainPath=&quot;&quot;,
</ins><span class="cx">         passphrase=&quot;&quot;, sslMethod=&quot;TLSv1_METHOD&quot;,
</span><span class="cx">         staggerNotifications=False, staggerSeconds=3,
</span><del>-        testConnector=None, reactor=None):
</del><ins>+        testConnector=None, reactor=None
+    ):
</ins><span class="cx"> 
</span><del>-        APNConnectionService.__init__(self, host, port, certPath, keyPath,
</del><ins>+        APNConnectionService.__init__(
+            self, host, port, certPath, keyPath,
</ins><span class="cx">             chainPath=chainPath, passphrase=passphrase, sslMethod=sslMethod,
</span><span class="cx">             testConnector=testConnector, reactor=reactor)
</span><span class="cx"> 
</span><span class="lines">@@ -554,7 +571,8 @@
</span><span class="cx">         self.factory = None
</span><span class="cx">         self.queue = []
</span><span class="cx">         if staggerNotifications:
</span><del>-            self.scheduler = PushScheduler(self.reactor, self.sendNotification,
</del><ins>+            self.scheduler = PushScheduler(
+                self.reactor, self.sendNotification,
</ins><span class="cx">                 staggerSeconds=staggerSeconds)
</span><span class="cx">         else:
</span><span class="cx">             self.scheduler = None
</span><span class="lines">@@ -583,7 +601,8 @@
</span><span class="cx">             self.queue = []
</span><span class="cx">             for (token, key), dataChangedTimestamp, priority in queued:
</span><span class="cx">                 if token and key and dataChangedTimestamp and priority:
</span><del>-                    self.sendNotification(token, key, dataChangedTimestamp,
</del><ins>+                    self.sendNotification(
+                        token, key, dataChangedTimestamp,
</ins><span class="cx">                         priority)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -695,12 +714,14 @@
</span><span class="cx">             self.buffer = self.buffer[self.MESSAGE_LENGTH:]
</span><span class="cx"> 
</span><span class="cx">             try:
</span><del>-                timestamp, _ignore_tokenLength, binaryToken = struct.unpack(&quot;!IH32s&quot;,
</del><ins>+                timestamp, _ignore_tokenLength, binaryToken = struct.unpack(
+                    &quot;!IH32s&quot;,
</ins><span class="cx">                     message)
</span><span class="cx">                 token = binaryToken.encode(&quot;hex&quot;).lower()
</span><span class="cx">                 yield fn(timestamp, token)
</span><span class="cx">             except Exception, e:
</span><del>-                self.log.warn(&quot;FeedbackProtocol could not process message: %s (%s)&quot; %
</del><ins>+                self.log.warn(
+                    &quot;FeedbackProtocol could not process message: %s (%s)&quot; %
</ins><span class="cx">                     (message.encode(&quot;hex&quot;), e))
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -719,14 +740,16 @@
</span><span class="cx">         @type token: C{str}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        self.log.debug(&quot;FeedbackProtocol processFeedback time=%d token=%s&quot; %
</del><ins>+        self.log.debug(
+            &quot;FeedbackProtocol processFeedback time=%d token=%s&quot; %
</ins><span class="cx">             (timestamp, token))
</span><span class="cx">         txn = self.factory.store.newTransaction(label=&quot;APNFeedbackProtocol.processFeedback&quot;)
</span><span class="cx">         subscriptions = (yield txn.apnSubscriptionsByToken(token))
</span><span class="cx"> 
</span><span class="cx">         for key, modified, _ignore_uid in subscriptions:
</span><span class="cx">             if timestamp &gt; modified:
</span><del>-                self.log.debug(&quot;FeedbackProtocol removing subscription: %s %s&quot; %
</del><ins>+                self.log.debug(
+                    &quot;FeedbackProtocol removing subscription: %s %s&quot; %
</ins><span class="cx">                     (token, key))
</span><span class="cx">                 yield txn.removeAPNSubscription(token, key)
</span><span class="cx">         yield txn.commit()
</span><span class="lines">@@ -743,7 +766,8 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def clientConnectionFailed(self, connector, reason):
</span><del>-        self.log.error(&quot;Unable to connect to APN feedback server: %s&quot; %
</del><ins>+        self.log.error(
+            &quot;Unable to connect to APN feedback server: %s&quot; %
</ins><span class="cx">             (reason,))
</span><span class="cx">         self.connected = False
</span><span class="cx">         ClientFactory.clientConnectionFailed(self, connector, reason)
</span><span class="lines">@@ -752,11 +776,14 @@
</span><span class="cx"> 
</span><span class="cx"> class APNFeedbackService(APNConnectionService):
</span><span class="cx"> 
</span><del>-    def __init__(self, store, updateSeconds, host, port,
</del><ins>+    def __init__(
+        self, store, updateSeconds, host, port,
</ins><span class="cx">         certPath, keyPath, chainPath=&quot;&quot;, passphrase=&quot;&quot;, sslMethod=&quot;TLSv1_METHOD&quot;,
</span><del>-        testConnector=None, reactor=None):
</del><ins>+        testConnector=None, reactor=None
+    ):
</ins><span class="cx"> 
</span><del>-        APNConnectionService.__init__(self, host, port, certPath, keyPath,
</del><ins>+        APNConnectionService.__init__(
+            self, host, port, certPath, keyPath,
</ins><span class="cx">             chainPath=chainPath, passphrase=passphrase, sslMethod=sslMethod,
</span><span class="cx">             testConnector=testConnector, reactor=reactor)
</span><span class="cx"> 
</span><span class="lines">@@ -780,13 +807,16 @@
</span><span class="cx">         self.nextCheck = None
</span><span class="cx">         self.log.debug(&quot;APNFeedbackService checkForFeedback&quot;)
</span><span class="cx">         self.connect(self.factory)
</span><del>-        self.nextCheck = self.reactor.callLater(self.updateSeconds,
</del><ins>+        self.nextCheck = self.reactor.callLater(
+            self.updateSeconds,
</ins><span class="cx">             self.checkForFeedback)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class APNSubscriptionResource(ReadOnlyNoCopyResourceMixIn,
-    DAVResourceWithoutChildrenMixin, DAVResource):
</del><ins>+class APNSubscriptionResource(
+    ReadOnlyNoCopyResourceMixIn,
+    DAVResourceWithoutChildrenMixin, DAVResource
+):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     The DAV resource allowing clients to subscribe to Apple push notifications.
</span><span class="cx">     To subscribe, a client should first determine the key they are interested
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushnotifierpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/notifier.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/notifier.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/notifier.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -50,7 +50,8 @@
</span><span class="cx"> 
</span><span class="cx">         # Find all work items with the same push ID and find the highest
</span><span class="cx">         # priority.  Delete matching work items.
</span><del>-        results = (yield Select([self.table.WORK_ID, self.table.JOB_ID, self.table.PUSH_PRIORITY],
</del><ins>+        results = (yield Select(
+            [self.table.WORK_ID, self.table.JOB_ID, self.table.PUSH_PRIORITY],
</ins><span class="cx">             From=self.table, Where=self.table.PUSH_ID == self.pushID).on(
</span><span class="cx">             self.transaction))
</span><span class="cx"> 
</span><span class="lines">@@ -132,12 +133,15 @@
</span><span class="cx"> 
</span><span class="cx">         for prefix, id in ids:
</span><span class="cx">             if self._notify:
</span><del>-                self.log.debug(&quot;Notifications are enabled: %s %s/%s priority=%d&quot; %
</del><ins>+                self.log.debug(
+                    &quot;Notifications are enabled: %s %s/%s priority=%d&quot; %
</ins><span class="cx">                     (self._storeObject, prefix, id, priority.value))
</span><del>-                yield self._notifierFactory.send(prefix, id, txn,
</del><ins>+                yield self._notifierFactory.send(
+                    prefix, id, txn,
</ins><span class="cx">                     priority=priority)
</span><span class="cx">             else:
</span><del>-                self.log.debug(&quot;Skipping notification for: %s %s/%s&quot; %
</del><ins>+                self.log.debug(
+                    &quot;Skipping notification for: %s %s/%s&quot; %
</ins><span class="cx">                     (self._storeObject, prefix, id,))
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -220,10 +224,12 @@
</span><span class="cx">         settings = {}
</span><span class="cx">         settings[&quot;APSBundleID&quot;] = applePushSettings[protocol][&quot;Topic&quot;]
</span><span class="cx">         if config.EnableSSL:
</span><del>-            url = &quot;https://%s:%s/%s&quot; % (config.ServerHostName, config.SSLPort,
</del><ins>+            url = &quot;https://%s:%s/%s&quot; % (
+                config.ServerHostName, config.SSLPort,
</ins><span class="cx">                 applePushSettings.SubscriptionURL)
</span><span class="cx">         else:
</span><del>-            url = &quot;http://%s:%s/%s&quot; % (config.ServerHostName, config.HTTPPort,
</del><ins>+            url = &quot;http://%s:%s/%s&quot; % (
+                config.ServerHostName, config.HTTPPort,
</ins><span class="cx">                 applePushSettings.SubscriptionURL)
</span><span class="cx">         settings[&quot;SubscriptionURL&quot;] = url
</span><span class="cx">         settings[&quot;SubscriptionRefreshIntervalSeconds&quot;] = applePushSettings.SubscriptionRefreshIntervalSeconds
</span><span class="lines">@@ -263,5 +269,6 @@
</span><span class="cx">         @type priority: L{PushPriority}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for observer in self.observers:
</span><del>-            yield observer.enqueue(transaction, pushKey,
</del><ins>+            yield observer.enqueue(
+                transaction, pushKey,
</ins><span class="cx">                 dataChangedTimestamp=None, priority=priority)
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushtesttest_amppushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/test/test_amppush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/test/test_amppush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/test/test_amppush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -58,7 +58,8 @@
</span><span class="cx">         self.assertTrue(client3.subscribedToID(&quot;/CalDAV/localhost/user03/&quot;))
</span><span class="cx"> 
</span><span class="cx">         dataChangedTimestamp = 1354815999
</span><del>-        service.enqueue(None, &quot;/CalDAV/localhost/user01/&quot;,
</del><ins>+        service.enqueue(
+            None, &quot;/CalDAV/localhost/user01/&quot;,
</ins><span class="cx">             dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx">             priority=PushPriority.high)
</span><span class="cx">         self.assertEquals(len(client1.history), 0)
</span><span class="lines">@@ -114,7 +115,8 @@
</span><span class="cx">         client1.reset()
</span><span class="cx">         client2.reset()
</span><span class="cx">         client2.unsubscribe(&quot;token2&quot;, &quot;/CalDAV/localhost/user01/&quot;)
</span><del>-        service.enqueue(None, &quot;/CalDAV/localhost/user01/&quot;,
</del><ins>+        service.enqueue(
+            None, &quot;/CalDAV/localhost/user01/&quot;,
</ins><span class="cx">             dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx">             priority=PushPriority.low)
</span><span class="cx">         self.assertEquals(len(client1.history), 0)
</span><span class="lines">@@ -142,7 +144,8 @@
</span><span class="cx">         client1.reset()
</span><span class="cx">         client2.reset()
</span><span class="cx">         client2.subscribe(&quot;token2&quot;, &quot;/CalDAV/localhost/user01/&quot;)
</span><del>-        service.enqueue(None, &quot;/CalDAV/localhost/user01/&quot;,
</del><ins>+        service.enqueue(
+            None, &quot;/CalDAV/localhost/user01/&quot;,
</ins><span class="cx">             dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx">             priority=PushPriority.medium)
</span><span class="cx">         self.assertEquals(
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushtesttest_applepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/test/test_applepush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/test/test_applepush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/test/test_applepush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -109,7 +109,8 @@
</span><span class="cx"> 
</span><span class="cx">         # Set up the service
</span><span class="cx">         clock = Clock()
</span><del>-        service = (yield ApplePushNotifierService.makeService(settings,
</del><ins>+        service = (yield ApplePushNotifierService.makeService(
+            settings,
</ins><span class="cx">             self._sqlCalendarStore, testConnectorClass=TestConnector, reactor=clock))
</span><span class="cx">         self.assertEquals(set(service.providers.keys()), set([&quot;CalDAV&quot;, &quot;CardDAV&quot;]))
</span><span class="cx">         self.assertEquals(set(service.feedbacks.keys()), set([&quot;CalDAV&quot;, &quot;CardDAV&quot;]))
</span><span class="lines">@@ -120,14 +121,17 @@
</span><span class="cx">         # Notification arrives from calendar server
</span><span class="cx">         dataChangedTimestamp = 1354815999
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><del>-        yield service.enqueue(txn, &quot;/CalDAV/calendars.example.com/user01/calendar/&quot;,
</del><ins>+        yield service.enqueue(
+            txn, &quot;/CalDAV/calendars.example.com/user01/calendar/&quot;,
</ins><span class="cx">             dataChangedTimestamp=dataChangedTimestamp, priority=PushPriority.high)
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         # The notifications should be in the queue
</span><del>-        self.assertTrue(((token, key1), dataChangedTimestamp, PushPriority.high)
</del><ins>+        self.assertTrue(
+            ((token, key1), dataChangedTimestamp, PushPriority.high)
</ins><span class="cx">             in service.providers[&quot;CalDAV&quot;].queue)
</span><del>-        self.assertTrue(((token2, key1), dataChangedTimestamp, PushPriority.high)
</del><ins>+        self.assertTrue(
+            ((token2, key1), dataChangedTimestamp, PushPriority.high)
</ins><span class="cx">             in service.providers[&quot;CalDAV&quot;].queue)
</span><span class="cx"> 
</span><span class="cx">         # Start the service, making the connection which should service the
</span><span class="lines">@@ -186,7 +190,8 @@
</span><span class="cx">         providerConnector.transport.data = None
</span><span class="cx">         # Send notification while service is connected
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><del>-        yield service.enqueue(txn, &quot;/CalDAV/calendars.example.com/user01/calendar/&quot;,
</del><ins>+        yield service.enqueue(
+            txn, &quot;/CalDAV/calendars.example.com/user01/calendar/&quot;,
</ins><span class="cx">             priority=PushPriority.low)
</span><span class="cx">         yield txn.commit()
</span><span class="cx">         clock.advance(1) # so that first push is sent
</span><span class="lines">@@ -217,7 +222,8 @@
</span><span class="cx">         # with amounts of data not fitting message boundaries
</span><span class="cx">         # Send 1st 4 bytes
</span><span class="cx">         history = []
</span><del>-        errorData = struct.pack(&quot;!BBIBBI&quot;,
</del><ins>+        errorData = struct.pack(
+            &quot;!BBIBBI&quot;,
</ins><span class="cx">             APNProviderProtocol.COMMAND_ERROR, 3, 4,
</span><span class="cx">             APNProviderProtocol.COMMAND_ERROR, 5, 6,
</span><span class="cx">         )
</span><span class="lines">@@ -243,7 +249,8 @@
</span><span class="cx">         feedbackConnector = service.feedbacks[&quot;CalDAV&quot;].testConnector
</span><span class="cx">         timestamp = 2000
</span><span class="cx">         binaryToken = token.decode(&quot;hex&quot;)
</span><del>-        feedbackData = struct.pack(&quot;!IH32s&quot;, timestamp, len(binaryToken),
</del><ins>+        feedbackData = struct.pack(
+            &quot;!IH32s&quot;, timestamp, len(binaryToken),
</ins><span class="cx">             binaryToken)
</span><span class="cx">         yield feedbackConnector.receiveData(feedbackData)
</span><span class="cx"> 
</span><span class="lines">@@ -255,10 +262,11 @@
</span><span class="cx">             return succeed(None)
</span><span class="cx">         timestamp = 2000
</span><span class="cx">         binaryToken = token.decode(&quot;hex&quot;)
</span><del>-        feedbackData = struct.pack(&quot;!IH32sIH32s&quot;,
</del><ins>+        feedbackData = struct.pack(
+            &quot;!IH32sIH32s&quot;,
</ins><span class="cx">             timestamp, len(binaryToken), binaryToken,
</span><span class="cx">             timestamp, len(binaryToken), binaryToken,
</span><del>-            )
</del><ins>+        )
</ins><span class="cx">         # Send 1st 10 bytes
</span><span class="cx">         yield feedbackConnector.receiveData(feedbackData[:10], fn=feedbackTestFunction)
</span><span class="cx">         # Send remaining bytes
</span><span class="lines">@@ -276,7 +284,8 @@
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><span class="cx">         subscriptions = (yield txn.apnSubscriptionsByToken(token))
</span><span class="cx">         yield txn.commit()
</span><del>-        self.assertEquals(subscriptions,
</del><ins>+        self.assertEquals(
+            subscriptions,
</ins><span class="cx">             [[&quot;/CalDAV/calendars.example.com/user02/calendar/&quot;, 3000, &quot;D2256BCC-48E2-42D1-BD89-CBA1E4CCDFFB&quot;]]
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="lines">@@ -333,8 +342,10 @@
</span><span class="cx">         history = TokenHistory(maxSize=5)
</span><span class="cx"> 
</span><span class="cx">         # Ensure returned identifiers increment
</span><del>-        for id, token in enumerate((&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;),
-            start=1):
</del><ins>+        for id, token in enumerate(
+            (&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;),
+            start=1
+        ):
</ins><span class="cx">             self.assertEquals(id, history.add(token))
</span><span class="cx">         self.assertEquals(len(history.history), 5)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushtesttest_notifierpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/test/test_notifier.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/test/test_notifier.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/test/test_notifier.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -36,8 +36,10 @@
</span><span class="cx">         self.history = []
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def enqueue(self, transaction, id, dataChangedTimestamp=None,
-        priority=None):
</del><ins>+    def enqueue(
+        self, transaction, id, dataChangedTimestamp=None,
+        priority=None
+    ):
</ins><span class="cx">         self.history.append((id, priority))
</span><span class="cx">         return(succeed(None))
</span><span class="cx"> 
</span><span class="lines">@@ -95,8 +97,10 @@
</span><span class="cx">         self.history = []
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def enqueue(self, transaction, pushID, dataChangedTimestamp=None,
-        priority=None):
</del><ins>+    def enqueue(
+        self, transaction, pushID, dataChangedTimestamp=None,
+        priority=None
+    ):
</ins><span class="cx">         self.history.append((pushID, priority))
</span><span class="cx">         return(succeed(None))
</span><span class="cx"> 
</span><span class="lines">@@ -117,61 +121,75 @@
</span><span class="cx">         self._sqlCalendarStore.callWithNewTransactions(decorateTransaction)
</span><span class="cx"> 
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/foo/&quot;,
</span><span class="cx">             pushPriority=PushPriority.high.value
</span><span class="cx">         )
</span><span class="cx">         yield txn.commit()
</span><span class="cx">         yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60)
</span><del>-        self.assertEquals(pushDistributor.history,
</del><ins>+        self.assertEquals(
+            pushDistributor.history,
</ins><span class="cx">             [(&quot;/CalDAV/localhost/foo/&quot;, PushPriority.high)])
</span><span class="cx"> 
</span><span class="cx">         pushDistributor.reset()
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/bar/&quot;,
</span><span class="cx">             pushPriority=PushPriority.high.value
</span><span class="cx">         )
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/bar/&quot;,
</span><span class="cx">             pushPriority=PushPriority.high.value
</span><span class="cx">         )
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/bar/&quot;,
</span><span class="cx">             pushPriority=PushPriority.high.value
</span><span class="cx">         )
</span><span class="cx">         # Enqueue a different pushID to ensure those are not grouped with
</span><span class="cx">         # the others:
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/baz/&quot;,
</span><span class="cx">             pushPriority=PushPriority.high.value
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         yield txn.commit()
</span><span class="cx">         yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60)
</span><del>-        self.assertEquals(set(pushDistributor.history),
-            set([(&quot;/CalDAV/localhost/bar/&quot;, PushPriority.high),
-             (&quot;/CalDAV/localhost/baz/&quot;, PushPriority.high)]))
</del><ins>+        self.assertEquals(
+            set(pushDistributor.history),
+            set([
+                (&quot;/CalDAV/localhost/bar/&quot;, PushPriority.high),
+                (&quot;/CalDAV/localhost/baz/&quot;, PushPriority.high)
+            ])
+        )
</ins><span class="cx"> 
</span><span class="cx">         # Ensure only the high-water-mark priority push goes out, by
</span><span class="cx">         # enqueuing low, medium, and high notifications
</span><span class="cx">         pushDistributor.reset()
</span><span class="cx">         txn = self._sqlCalendarStore.newTransaction()
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/bar/&quot;,
</span><span class="cx">             pushPriority=PushPriority.low.value
</span><span class="cx">         )
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/bar/&quot;,
</span><span class="cx">             pushPriority=PushPriority.high.value
</span><span class="cx">         )
</span><del>-        yield txn.enqueue(PushNotificationWork,
</del><ins>+        yield txn.enqueue(
+            PushNotificationWork,
</ins><span class="cx">             pushID=&quot;/CalDAV/localhost/bar/&quot;,
</span><span class="cx">             pushPriority=PushPriority.medium.value
</span><span class="cx">         )
</span><span class="cx">         yield txn.commit()
</span><span class="cx">         yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60)
</span><del>-        self.assertEquals(pushDistributor.history,
</del><ins>+        self.assertEquals(
+            pushDistributor.history,
</ins><span class="cx">             [(&quot;/CalDAV/localhost/bar/&quot;, PushPriority.high)])
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -205,7 +223,8 @@
</span><span class="cx"> 
</span><span class="cx">         home = yield self.homeUnderTest(name=&quot;user01&quot;)
</span><span class="cx">         yield home.notifyChanged(category=ChangeCategory.default)
</span><del>-        self.assertEquals(self.notifierFactory.history,
</del><ins>+        self.assertEquals(
+            self.notifierFactory.history,
</ins><span class="cx">             [(&quot;/CalDAV/example.com/user01/&quot;, PushPriority.high)])
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/util.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/util.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/util.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -160,13 +160,15 @@
</span><span class="cx">         for token in tokens:
</span><span class="cx">             internalKey = (token, key)
</span><span class="cx">             if internalKey in self.outstanding:
</span><del>-                self.log.debug(&quot;PushScheduler already has this scheduled: %s&quot; %
</del><ins>+                self.log.debug(
+                    &quot;PushScheduler already has this scheduled: %s&quot; %
</ins><span class="cx">                     (internalKey,))
</span><span class="cx">             else:
</span><span class="cx">                 self.outstanding[internalKey] = self.reactor.callLater(
</span><span class="cx">                     scheduleTime, self.send, token, key, dataChangedTimestamp,
</span><span class="cx">                     priority)
</span><del>-                self.log.debug(&quot;PushScheduler scheduled: %s in %.0f sec&quot; %
</del><ins>+                self.log.debug(
+                    &quot;PushScheduler scheduled: %s in %.0f sec&quot; %
</ins><span class="cx">                     (internalKey, scheduleTime))
</span><span class="cx">                 scheduleTime += self.staggerSeconds
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/caldav.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/caldav.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -2470,7 +2470,7 @@
</span><span class="cx">         @param name: the name of the process to signal.
</span><span class="cx">         @type signal: C{str}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        if not name in self.protocols:
</del><ins>+        if name not in self.protocols:
</ins><span class="cx">             return
</span><span class="cx">         proc = self.protocols[name].transport
</span><span class="cx">         try:
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertaptesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/test/test_util.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/test/test_util.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tap/test/test_util.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -201,7 +201,8 @@
</span><span class="cx">         )
</span><span class="cx">         result = (yield self.stepper.start(&quot;abc&quot;))
</span><span class="cx">         self.assertEquals(result, &quot;abc&quot;) # original result passed through
</span><del>-        self.assertEquals(self.history,
</del><ins>+        self.assertEquals(
+            self.history,
</ins><span class="cx">             ['one success', 'two success', 'three success', 'four success'])
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -211,7 +212,8 @@
</span><span class="cx">         self.stepper.addStep(StepThree(self._record, True))
</span><span class="cx">         self.stepper.addStep(StepFour(self._record, True))
</span><span class="cx">         self.failUnlessFailure(self.stepper.start(), ZeroDivisionError)
</span><del>-        self.assertEquals(self.history,
</del><ins>+        self.assertEquals(
+            self.history,
</ins><span class="cx">             ['one success', 'two failure', 'three failure', 'four failure'])
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -223,5 +225,6 @@
</span><span class="cx">         self.stepper.addStep(StepFour(self._record, False))
</span><span class="cx">         result = (yield self.stepper.start(&quot;abc&quot;))
</span><span class="cx">         self.assertEquals(result, None) # original result is gone
</span><del>-        self.assertEquals(self.history,
</del><ins>+        self.assertEquals(
+            self.history,
</ins><span class="cx">             ['one success', 'two failure', 'three success', 'four failure'])
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertaputilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/util.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/util.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tap/util.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -289,7 +289,7 @@
</span><span class="cx">                 &quot;No such user: {user}&quot;.format(
</span><span class="cx">                     user=credentials.credentials.username
</span><span class="cx">                 )
</span><del>-        )
</del><ins>+            )
</ins><span class="cx"> 
</span><span class="cx">         # See if record is enabledForLogin
</span><span class="cx">         if not credentials.authnPrincipal.record.isLoginEnabled():
</span><span class="lines">@@ -461,7 +461,8 @@
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         if config.DirectoryAddressBook.Enabled and config.EnableSearchAddressBook:
</span><del>-            log.info(&quot;Setting up directory address book: {cls}&quot;,
</del><ins>+            log.info(
+                &quot;Setting up directory address book: {cls}&quot;,
</ins><span class="cx">                 cls=directoryBackedAddressBookResourceClass)
</span><span class="cx"> 
</span><span class="cx">             directoryBackedAddressBookCollection = directoryBackedAddressBookResourceClass(
</span><span class="lines">@@ -557,8 +558,9 @@
</span><span class="cx"> 
</span><span class="cx">     # Timezone service is optional
</span><span class="cx">     if config.EnableTimezoneService:
</span><del>-        log.info(&quot;Setting up time zone service resource: {cls}&quot;,
-                      cls=timezoneServiceResourceClass)
</del><ins>+        log.info(
+            &quot;Setting up time zone service resource: {cls}&quot;,
+            cls=timezoneServiceResourceClass)
</ins><span class="cx"> 
</span><span class="cx">         timezoneService = timezoneServiceResourceClass(
</span><span class="cx">             root,
</span><span class="lines">@@ -567,8 +569,9 @@
</span><span class="cx"> 
</span><span class="cx">     # Standard Timezone service is optional
</span><span class="cx">     if config.TimezoneService.Enabled:
</span><del>-        log.info(&quot;Setting up standard time zone service resource: {cls}&quot;,
-                      cls=timezoneStdServiceResourceClass)
</del><ins>+        log.info(
+            &quot;Setting up standard time zone service resource: {cls}&quot;,
+            cls=timezoneStdServiceResourceClass)
</ins><span class="cx"> 
</span><span class="cx">         timezoneStdService = timezoneStdServiceResourceClass(
</span><span class="cx">             root,
</span><span class="lines">@@ -630,8 +633,9 @@
</span><span class="cx">     # WebCal
</span><span class="cx">     #
</span><span class="cx">     if config.WebCalendarRoot:
</span><del>-        log.info(&quot;Setting up WebCalendar resource: {res}&quot;,
-                      res=config.WebCalendarRoot)
</del><ins>+        log.info(
+            &quot;Setting up WebCalendar resource: {res}&quot;,
+            res=config.WebCalendarRoot)
</ins><span class="cx">         webCalendar = webCalendarResourceClass(
</span><span class="cx">             config.WebCalendarRoot,
</span><span class="cx">             principalCollections=(principalCollection,),
</span><span class="lines">@@ -657,7 +661,8 @@
</span><span class="cx">     #
</span><span class="cx">     apnConfig = config.Notifications.Services.APNS
</span><span class="cx">     if apnConfig.Enabled:
</span><del>-        log.info(&quot;Setting up APNS resource at /{url}&quot;,
</del><ins>+        log.info(
+            &quot;Setting up APNS resource at /{url}&quot;,
</ins><span class="cx">             url=apnConfig[&quot;SubscriptionURL&quot;])
</span><span class="cx">         apnResource = apnSubscriptionResourceClass(root, newStore)
</span><span class="cx">         root.putChild(apnConfig[&quot;SubscriptionURL&quot;], apnResource)
</span><span class="lines">@@ -690,7 +695,8 @@
</span><span class="cx">                         schemeConfig[&quot;Qop&quot;],
</span><span class="cx">                         realm,
</span><span class="cx">                     ))
</span><del>-            log.info(&quot;Overriding {path} with {cls} ({schemes})&quot;,
</del><ins>+            log.info(
+                &quot;Overriding {path} with {cls} ({schemes})&quot;,
</ins><span class="cx">                 path=path, cls=cls, schemes=schemes)
</span><span class="cx"> 
</span><span class="cx">     authWrapper = AuthenticationWrapper(
</span><span class="lines">@@ -917,11 +923,13 @@
</span><span class="cx">                     try:
</span><span class="cx">                         memory = self._memoryForPID(pid, self._residentOnly)
</span><span class="cx">                     except Exception, e:
</span><del>-                        log.error(&quot;Unable to determine memory usage of PID: {pid} ({err})&quot;,
</del><ins>+                        log.error(
+                            &quot;Unable to determine memory usage of PID: {pid} ({err})&quot;,
</ins><span class="cx">                             pid=pid, err=e)
</span><span class="cx">                         continue
</span><span class="cx">                     if memory &gt; self._bytes:
</span><del>-                        log.warn(&quot;Killing large process: {name} PID:{pid} {memtype}:{mem}&quot;,
</del><ins>+                        log.warn(
+                            &quot;Killing large process: {name} PID:{pid} {memtype}:{mem}&quot;,
</ins><span class="cx">                             name=name, pid=pid,
</span><span class="cx">                             memtype=(&quot;Resident&quot; if self._residentOnly else &quot;Virtual&quot;),
</span><span class="cx">                             mem=memory)
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsanonymizepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/anonymize.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/anonymize.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/anonymize.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -151,7 +151,8 @@
</span><span class="cx">                                 print(&quot;Couldn't find %s, skipping.&quot; % (home,))
</span><span class="cx">                                 continue
</span><span class="cx">                             sourceHome = os.path.join(secondPath, home)
</span><del>-                            destHome = os.path.join(destUidHomes,
</del><ins>+                            destHome = os.path.join(
+                                destUidHomes,
</ins><span class="cx">                                 record['guid'][0:2], record['guid'][2:4],
</span><span class="cx">                                 record['guid'])
</span><span class="cx">                             homeList.append((sourceHome, destHome, record))
</span><span class="lines">@@ -261,7 +262,8 @@
</span><span class="cx">             for freeBusy in freeBusies:
</span><span class="cx">                 xml += &quot;&lt;href xmlns='DAV:'&gt;/calendars/__uids__/%s/%s/&lt;/href&gt;\n&quot; % (record['guid'], freeBusy)
</span><span class="cx">             xml += &quot;&lt;/calendar-free-busy-set&gt;\n&quot;
</span><del>-            xattr.setxattr(destInbox,
</del><ins>+            xattr.setxattr(
+                destInbox,
</ins><span class="cx">                 &quot;WebDAV:{urn:ietf:params:xml:ns:caldav}calendar-free-busy-set&quot;,
</span><span class="cx">                 zlib.compress(xml)
</span><span class="cx">             )
</span><span class="lines">@@ -399,7 +401,8 @@
</span><span class="cx">                     origRecordNames = record['dsAttrTypeStandard:RecordName']
</span><span class="cx">                     origEmails = record.get('dsAttrTypeStandard:EMailAddress', [])
</span><span class="cx">                     origMembers = record.get('dsAttrTypeStandard:GroupMembers', [])
</span><del>-                    self.addRecord(internalType=internalType, guid=origGUID,
</del><ins>+                    self.addRecord(
+                        internalType=internalType, guid=origGUID,
</ins><span class="cx">                         names=origRecordNames, emails=origEmails,
</span><span class="cx">                         members=origMembers)
</span><span class="cx"> 
</span><span class="lines">@@ -407,8 +410,10 @@
</span><span class="cx">         print(&quot;&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def addRecord(self, internalType=&quot;users&quot;, guid=None, names=None,
-        emails=None, members=None, cua=None):
</del><ins>+    def addRecord(
+        self, internalType=&quot;users&quot;, guid=None, names=None,
+        emails=None, members=None, cua=None
+    ):
</ins><span class="cx"> 
</span><span class="cx">         if cua:
</span><span class="cx">             keys = [self.cua2key(cua)]
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolscalverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/calverify.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/calverify.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/calverify.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -170,7 +170,8 @@
</span><span class="cx">             brokenRID = brokenComponent.propertyValue(&quot;RECURRENCE-ID&quot;)
</span><span class="cx">             if doFix:
</span><span class="cx">                 master.addProperty(Property(&quot;RDATE&quot;, [brokenRID, ]))
</span><del>-                fixed.append(&quot;Added RDATE for invalid occurrence: %s&quot; %
</del><ins>+                fixed.append(
+                    &quot;Added RDATE for invalid occurrence: %s&quot; %
</ins><span class="cx">                     (brokenRID,))
</span><span class="cx">             else:
</span><span class="cx">                 unfixed.append(&quot;Invalid occurrence: %s&quot; % (brokenRID,))
</span><span class="lines">@@ -339,7 +340,7 @@
</span><span class="cx">         ['no-organizer', '', &quot;Detect dark events without an organizer&quot;],
</span><span class="cx">         ['invalid-organizer', '', &quot;Detect dark events with an organizer not in the directory&quot;],
</span><span class="cx">         ['disabled-organizer', '', &quot;Detect dark events with a disabled organizer&quot;],
</span><del>-]
</del><ins>+    ]
</ins><span class="cx"> 
</span><span class="cx">     optParameters = [
</span><span class="cx">         ['config', 'f', DEFAULT_CONFIG_FILE, &quot;Specify caldavd.plist configuration path.&quot;],
</span><span class="lines">@@ -478,11 +479,11 @@
</span><span class="cx"> 
</span><span class="cx">         if inbox:
</span><span class="cx">             cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                    cb.BIND_MODE == _BIND_MODE_OWN)
</del><ins>+                cb.BIND_MODE == _BIND_MODE_OWN)
</ins><span class="cx">         else:
</span><span class="cx">             cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                    cb.BIND_MODE == _BIND_MODE_OWN).And(
-                    cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</del><ins>+                cb.BIND_MODE == _BIND_MODE_OWN).And(
+                cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</ins><span class="cx"> 
</span><span class="cx">         kwds = {}
</span><span class="cx">         rows = (yield Select(
</span><span class="lines">@@ -503,11 +504,11 @@
</span><span class="cx"> 
</span><span class="cx">         if inbox:
</span><span class="cx">             cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                    cb.BIND_MODE == _BIND_MODE_OWN)
</del><ins>+                cb.BIND_MODE == _BIND_MODE_OWN)
</ins><span class="cx">         else:
</span><span class="cx">             cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                    cb.BIND_MODE == _BIND_MODE_OWN).And(
-                    cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</del><ins>+                cb.BIND_MODE == _BIND_MODE_OWN).And(
+                cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</ins><span class="cx"> 
</span><span class="cx">         kwds = {&quot;uuid&quot;: uuid}
</span><span class="cx">         if len(uuid) != 36:
</span><span class="lines">@@ -558,11 +559,11 @@
</span><span class="cx"> 
</span><span class="cx">         if inbox:
</span><span class="cx">             cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                    cb.BIND_MODE == _BIND_MODE_OWN)
</del><ins>+                cb.BIND_MODE == _BIND_MODE_OWN)
</ins><span class="cx">         else:
</span><span class="cx">             cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                    cb.BIND_MODE == _BIND_MODE_OWN).And(
-                    cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</del><ins>+                cb.BIND_MODE == _BIND_MODE_OWN).And(
+                cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</ins><span class="cx"> 
</span><span class="cx">         kwds = {
</span><span class="cx">             &quot;UID&quot; : uid,
</span><span class="lines">@@ -611,8 +612,8 @@
</span><span class="cx">         tr = schema.TIME_RANGE
</span><span class="cx"> 
</span><span class="cx">         cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>-                cb.BIND_MODE == _BIND_MODE_OWN).And(
-                cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</del><ins>+            cb.BIND_MODE == _BIND_MODE_OWN).And(
+            cb.CALENDAR_RESOURCE_NAME != &quot;inbox&quot;)
</ins><span class="cx"> 
</span><span class="cx">         kwds = {
</span><span class="cx">             &quot;Start&quot; : pyCalendarTodatetime(start),
</span><span class="lines">@@ -1543,7 +1544,7 @@
</span><span class="cx">                         eachAttendeesOwnStatus[organizerAttendee] = self.buildAttendeeStates(calendar, self.start, self.end, attendee_only=organizerAttendee)
</span><span class="cx">                         attendeeResIDs[(organizerAttendee, uid)] = attresid
</span><span class="cx">                         attendeeCreatedModified[organizerAttendee] = (att_created, att_modified,)
</span><del>-                        #print(&quot;Reloaded missing attendee data&quot;)
</del><ins>+                        # print(&quot;Reloaded missing attendee data&quot;)
</ins><span class="cx"> 
</span><span class="cx">                 # If an entry for the attendee exists, then check whether attendee status matches
</span><span class="cx">                 if organizerAttendee in eachAttendeesOwnStatus:
</span><span class="lines">@@ -1708,8 +1709,8 @@
</span><span class="cx">                 rows = yield self.getAllResourceInfoWithUID(uid)
</span><span class="cx">                 yield self.buildResourceInfo(rows, onlyOrganizer=True)
</span><span class="cx"> 
</span><del>-                #if uid in self.organized_byuid:
-                #    print(&quot;Reloaded missing organizer data: %s&quot; % (uid,))
</del><ins>+                # if uid in self.organized_byuid:
+                #     print(&quot;Reloaded missing organizer data: %s&quot; % (uid,))
</ins><span class="cx"> 
</span><span class="cx">             if uid not in self.organized_byuid:
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolscmdlinepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/cmdline.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/cmdline.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/cmdline.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -74,6 +74,7 @@
</span><span class="cx">     if serviceMaker is None:
</span><span class="cx">         serviceMaker = CalDAVServiceMaker
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     # We want to validate that the actual service is always an instance of WorkerService, so wrap the
</span><span class="cx">     # service maker callback inside a function that does that check
</span><span class="cx">     def _makeValidService(store):
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsdbinspectpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/dbinspect.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/dbinspect.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/dbinspect.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -101,6 +101,7 @@
</span><span class="cx">     returnValue(record.shortNames[0] if record else &quot;(%s)&quot; % (uid,))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def UIDFromInput(txn, value):
</span><span class="cx">     try:
</span><span class="lines">@@ -755,14 +756,14 @@
</span><span class="cx"> 
</span><span class="cx">         # Create fake filter element to match time-range
</span><span class="cx">         filter = caldavxml.Filter(
</span><del>-                      caldavxml.ComponentFilter(
-                          caldavxml.ComponentFilter(
-                              timerange,
-                              name=(&quot;VEVENT&quot;,),
-                          ),
-                          name=&quot;VCALENDAR&quot;,
-                       )
-                  )
</del><ins>+            caldavxml.ComponentFilter(
+                caldavxml.ComponentFilter(
+                    timerange,
+                    name=(&quot;VEVENT&quot;,),
+                ),
+                name=&quot;VCALENDAR&quot;,
+            )
+        )
</ins><span class="cx">         filter = Filter(filter)
</span><span class="cx">         filter.settimezone(None)
</span><span class="cx"> 
</span><span class="lines">@@ -806,26 +807,26 @@
</span><span class="cx">             schema.CALENDAR_OBJECT_REVISIONS,
</span><span class="cx"> 
</span><span class="cx">             schema.CALENDAR,
</span><del>-            #schema.CALENDAR_BIND, - cascades
-            #schema.CALENDAR_OBJECT, - cascades
-            #schema.TIME_RANGE, - cascades
-            #schema.TRANSPARENCY, - cascades
</del><ins>+            # schema.CALENDAR_BIND, - cascades
+            # schema.CALENDAR_OBJECT, - cascades
+            # schema.TIME_RANGE, - cascades
+            # schema.TRANSPARENCY, - cascades
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">             schema.CALENDAR_HOME,
</span><del>-            #schema.CALENDAR_HOME_METADATA - cascades
</del><ins>+            # schema.CALENDAR_HOME_METADATA - cascades
</ins><span class="cx">             schema.ATTACHMENT,
</span><span class="cx"> 
</span><span class="cx">             schema.ADDRESSBOOK_OBJECT_REVISIONS,
</span><span class="cx"> 
</span><span class="cx">             schema.ADDRESSBOOK_HOME,
</span><del>-            #schema.ADDRESSBOOK_HOME_METADATA, - cascades
-            #schema.ADDRESSBOOK_BIND, - cascades
-            #schema.ADDRESSBOOK_OBJECT, - cascades
</del><ins>+            # schema.ADDRESSBOOK_HOME_METADATA, - cascades
+            # schema.ADDRESSBOOK_BIND, - cascades
+            # schema.ADDRESSBOOK_OBJECT, - cascades
</ins><span class="cx"> 
</span><span class="cx">             schema.NOTIFICATION_HOME,
</span><span class="cx">             schema.NOTIFICATION,
</span><del>-            #schema.NOTIFICATION_OBJECT_REVISIONS - cascades,
</del><ins>+            # schema.NOTIFICATION_OBJECT_REVISIONS - cascades,
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         for tableschema in wipeout:
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/notifications.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/notifications.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/notifications.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -143,11 +143,14 @@
</span><span class="cx">         password = getpass(&quot;Password for %s: &quot; % (username,))
</span><span class="cx">         admin = username
</span><span class="cx"> 
</span><del>-    monitorService = PushMonitorService(useSSL, host, port, nodes, admin,
</del><ins>+    monitorService = PushMonitorService(
+        useSSL, host, port, nodes, admin,
</ins><span class="cx">         username, password, verbose)
</span><del>-    reactor.addSystemEventTrigger(&quot;during&quot;, &quot;startup&quot;,
</del><ins>+    reactor.addSystemEventTrigger(
+        &quot;during&quot;, &quot;startup&quot;,
</ins><span class="cx">         monitorService.startService)
</span><del>-    reactor.addSystemEventTrigger(&quot;before&quot;, &quot;shutdown&quot;,
</del><ins>+    reactor.addSystemEventTrigger(
+        &quot;before&quot;, &quot;shutdown&quot;,
</ins><span class="cx">         monitorService.stopService)
</span><span class="cx"> 
</span><span class="cx">     reactor.run()
</span><span class="lines">@@ -177,17 +180,20 @@
</span><span class="cx">         self.xmlStream = None
</span><span class="cx">         self.doKeepAlive = True
</span><span class="cx"> 
</span><del>-        xmlstream.XmlStreamFactory.__init__(self,
-           XMPPAuthenticator(JID(self.jid), password))
</del><ins>+        xmlstream.XmlStreamFactory.__init__(
+            self,
+            XMPPAuthenticator(JID(self.jid), password))
</ins><span class="cx"> 
</span><span class="cx">         self.addBootstrap(xmlstream.STREAM_CONNECTED_EVENT, self.connected)
</span><span class="cx">         self.addBootstrap(xmlstream.STREAM_END_EVENT, self.disconnected)
</span><span class="cx">         self.addBootstrap(xmlstream.INIT_FAILED_EVENT, self.initFailed)
</span><span class="cx"> 
</span><span class="cx">         self.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, self.authenticated)
</span><del>-        self.addBootstrap(IQAuthInitializer.INVALID_USER_EVENT,
</del><ins>+        self.addBootstrap(
+            IQAuthInitializer.INVALID_USER_EVENT,
</ins><span class="cx">             self.authFailed)
</span><del>-        self.addBootstrap(IQAuthInitializer.AUTH_FAILED_EVENT,
</del><ins>+        self.addBootstrap(
+            IQAuthInitializer.AUTH_FAILED_EVENT,
</ins><span class="cx">             self.authFailed)
</span><span class="cx"> 
</span><span class="cx">         if sigint:
</span><span class="lines">@@ -253,7 +259,8 @@
</span><span class="cx">         if self.doKeepAlive and self.xmlStream is not None:
</span><span class="cx">             presence = domish.Element(('jabber:client', 'presence'))
</span><span class="cx">             self.xmlStream.send(presence)
</span><del>-            self.presenceCall = reactor.callLater(self.presenceSeconds,
</del><ins>+            self.presenceCall = reactor.callLater(
+                self.presenceSeconds,
</ins><span class="cx">                 self.sendPresence)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -340,8 +347,10 @@
</span><span class="cx">     using XMPP and monitored for updates.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def __init__(self, useSSL, host, port, nodes, authname, username, password,
-        verbose):
</del><ins>+    def __init__(
+        self, useSSL, host, port, nodes, authname, username, password,
+        verbose
+    ):
</ins><span class="cx">         self.useSSL = useSSL
</span><span class="cx">         self.host = host
</span><span class="cx">         self.port = port
</span><span class="lines">@@ -365,7 +374,8 @@
</span><span class="cx">                 for home in homes:
</span><span class="cx">                     paths.add(home)
</span><span class="cx">                 for principal in (yield self.getProxyFor()):
</span><del>-                    name, homes = (yield self.getPrincipalDetails(principal,
</del><ins>+                    name, homes = (yield self.getPrincipalDetails(
+                        principal,
</ins><span class="cx">                         includeCardDAV=False))
</span><span class="cx">                     if self.verbose:
</span><span class="cx">                         print(name, homes)
</span><span class="lines">@@ -421,7 +431,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            responseBody = (yield self.makeRequest(path, &quot;PROPFIND&quot;, headers,
</del><ins>+            responseBody = (yield self.makeRequest(
+                path, &quot;PROPFIND&quot;, headers,
</ins><span class="cx">                 body))
</span><span class="cx">             try:
</span><span class="cx">                 doc = ElementTree.fromstring(responseBody)
</span><span class="lines">@@ -485,7 +496,8 @@
</span><span class="cx">         path = &quot;/principals/users/%s/&quot; % (self.username,)
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            responseBody = (yield self.makeRequest(path, &quot;PROPFIND&quot;, headers,
</del><ins>+            responseBody = (yield self.makeRequest(
+                path, &quot;PROPFIND&quot;, headers,
</ins><span class="cx">                 body))
</span><span class="cx">             try:
</span><span class="cx">                 doc = ElementTree.fromstring(responseBody)
</span><span class="lines">@@ -541,7 +553,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            responseBody = (yield self.makeRequest(path, &quot;PROPFIND&quot;, headers,
</del><ins>+            responseBody = (yield self.makeRequest(
+                path, &quot;PROPFIND&quot;, headers,
</ins><span class="cx">                 body))
</span><span class="cx">             host = None
</span><span class="cx">             port = None
</span><span class="lines">@@ -617,7 +630,8 @@
</span><span class="cx">         service = &quot;pubsub.%s&quot; % (host,)
</span><span class="cx">         jid = &quot;%s@%s&quot; % (self.authname, host)
</span><span class="cx"> 
</span><del>-        pubsubFactory = PubSubClientFactory(jid, self.password, service, nodes,
</del><ins>+        pubsubFactory = PubSubClientFactory(
+            jid, self.password, service, nodes,
</ins><span class="cx">             self.verbose)
</span><span class="cx">         connect(GAIEndpoint(reactor, host, port), pubsubFactory)
</span><span class="cx"> 
</span><span class="lines">@@ -625,7 +639,8 @@
</span><span class="cx">     def makeRequest(self, path, method, headers, body):
</span><span class="cx">         scheme = &quot;https:&quot; if self.useSSL else &quot;http:&quot;
</span><span class="cx">         url = &quot;%s//%s:%d%s&quot; % (scheme, self.host, self.port, path)
</span><del>-        caldavFactory = client.HTTPClientFactory(url, method=method,
</del><ins>+        caldavFactory = client.HTTPClientFactory(
+            url, method=method,
</ins><span class="cx">             headers=headers, postdata=body, agent=&quot;Push Monitor&quot;)
</span><span class="cx">         caldavFactory.username = self.authname
</span><span class="cx">         caldavFactory.password = self.password
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsobliteratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/obliterate.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/obliterate.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/obliterate.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -296,8 +296,8 @@
</span><span class="cx">         self.output.write(&quot;Total Resources: %d\n&quot; % (self.totalResources,))
</span><span class="cx">         if self.attachments:
</span><span class="cx">             self.output.write(&quot;Attachments removed: %s\n&quot; % (len(self.attachments,)))
</span><del>-            #for attachment in self.attachments:
-            #    self.output.write(&quot;    %s\n&quot; % (attachment,))
</del><ins>+            # for attachment in self.attachments:
+            #     self.output.write(&quot;    %s\n&quot; % (attachment,))
</ins><span class="cx">         self.output.write(&quot;Obliteration time: %.1fs\n&quot; % (time.time() - t,))
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsprincipalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/principals.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/principals.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/principals.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -63,7 +63,7 @@
</span><span class="cx">     print(&quot;&quot;)
</span><span class="cx">     print(&quot;  Principals are identified by one of the following:&quot;)
</span><span class="cx">     print(&quot;    Type and shortname (eg.: users:wsanchez)&quot;)
</span><del>-    #print(&quot;    A principal path (eg.: /principals/users/wsanchez/)&quot;)
</del><ins>+    # print(&quot;    A principal path (eg.: /principals/users/wsanchez/)&quot;)
</ins><span class="cx">     print(&quot;    A GUID (eg.: E415DBA7-40B5-49F5-A7CC-ACC81E4DEC79)&quot;)
</span><span class="cx">     print(&quot;&quot;)
</span><span class="cx">     print(&quot;options:&quot;)
</span><span class="lines">@@ -791,7 +791,7 @@
</span><span class="cx">     groupUIDs = yield txn.allGroupDelegates()
</span><span class="cx">     for groupUID in groupUIDs:
</span><span class="cx">         (
</span><del>-            groupID, name, _ignore_membershipHash, modified, extant
</del><ins>+            groupID, name, _ignore_membershipHash, modified, _ignore_extant
</ins><span class="cx">         ) = yield txn.groupByUID(
</span><span class="cx">             groupUID
</span><span class="cx">         )
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolspurgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/purge.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/purge.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/purge.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -302,7 +302,7 @@
</span><span class="cx">         print(&quot;  -h --help: print this help and exit&quot;)
</span><span class="cx">         print(&quot;  -f --config &lt;path&gt;: Specify caldavd.plist configuration path&quot;)
</span><span class="cx">         print(&quot;  -d --days &lt;number&gt;: specify how many days in the past to retain (default=%d)&quot; % (DEFAULT_RETAIN_DAYS,))
</span><del>-        #print(&quot;  -b --batch &lt;number&gt;: number of events to remove in each transaction (default=%d)&quot; % (DEFAULT_BATCH_SIZE,))
</del><ins>+        # print(&quot;  -b --batch &lt;number&gt;: number of events to remove in each transaction (default=%d)&quot; % (DEFAULT_BATCH_SIZE,))
</ins><span class="cx">         print(&quot;  -n --dry-run: calculate how many events to purge, but do not purge data&quot;)
</span><span class="cx">         print(&quot;  -v --verbose: print progress information&quot;)
</span><span class="cx">         print(&quot;  -D --debug: debug logging&quot;)
</span><span class="lines">@@ -475,7 +475,7 @@
</span><span class="cx">         print(&quot;  -h --help: print this help and exit&quot;)
</span><span class="cx">         print(&quot;  -f --config &lt;path&gt;: Specify caldavd.plist configuration path&quot;)
</span><span class="cx">         print(&quot;  -u --uuid &lt;owner uid&gt;: target a specific user UID&quot;)
</span><del>-        #print(&quot;  -b --batch &lt;number&gt;: number of attachments to remove in each transaction (default=%d)&quot; % (DEFAULT_BATCH_SIZE,))
</del><ins>+        # print(&quot;  -b --batch &lt;number&gt;: number of attachments to remove in each transaction (default=%d)&quot; % (DEFAULT_BATCH_SIZE,))
</ins><span class="cx">         print(&quot;  -d --days &lt;number&gt;: specify how many days in the past to retain (default=%d) zero means no removal of old attachments&quot; % (DEFAULT_RETAIN_DAYS,))
</span><span class="cx">         print(&quot;  -n --dry-run: calculate how many attachments to purge, but do not purge data&quot;)
</span><span class="cx">         print(&quot;  -v --verbose: print progress information&quot;)
</span><span class="lines">@@ -680,7 +680,7 @@
</span><span class="cx">             table = tables.Table()
</span><span class="cx">             table.addHeader((&quot;User&quot;, &quot;Current Quota&quot;, &quot;Orphan Size&quot;, &quot;Orphan Count&quot;, &quot;Dropbox Size&quot;, &quot;Dropbox Count&quot;, &quot;Managed Size&quot;, &quot;Managed Count&quot;, &quot;Total Size&quot;, &quot;Total Count&quot;))
</span><span class="cx">             table.setDefaultColumnFormats(
</span><del>-               (
</del><ins>+                (
</ins><span class="cx">                     tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx">                     tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">                     tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -1011,14 +1011,14 @@
</span><span class="cx">         # Anything in the past is left alone
</span><span class="cx">         whenString = self.when.getText()
</span><span class="cx">         query_filter = caldavxml.Filter(
</span><del>-              caldavxml.ComponentFilter(
-                  caldavxml.ComponentFilter(
-                      caldavxml.TimeRange(start=whenString,),
-                      name=(&quot;VEVENT&quot;,),
-                  ),
-                  name=&quot;VCALENDAR&quot;,
-               )
-          )
</del><ins>+            caldavxml.ComponentFilter(
+                caldavxml.ComponentFilter(
+                    caldavxml.TimeRange(start=whenString,),
+                    name=(&quot;VEVENT&quot;,),
+                ),
+                name=&quot;VCALENDAR&quot;,
+            )
+        )
</ins><span class="cx">         query_filter = Filter(query_filter)
</span><span class="cx"> 
</span><span class="cx">         count = 0
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsresourcespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/resources.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/resources.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/resources.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx">         yield migrateResources(sourceService, destService)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def usage():
</span><span class="cx"> 
</span><span class="cx">     name = os.path.basename(sys.argv[0])
</span><span class="lines">@@ -101,10 +102,12 @@
</span><span class="cx">     utilityMain(configFileName, ResourceMigrationService, verbose=verbose)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class DirectoryRecord(BaseDirectoryRecord, CalendarDirectoryRecordMixin):
</span><span class="cx">     pass
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def migrateResources(sourceService, destService, verbose=False):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshellcmdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/cmd.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/cmd.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/cmd.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -472,7 +472,7 @@
</span><span class="cx">         if not isinstance(wd, Folder):
</span><span class="cx">             raise NotFoundError(&quot;Not a folder: %s&quot; % (wd,))
</span><span class="cx"> 
</span><del>-        #log.info(&quot;wd -&gt; %s&quot; % (wd,))
</del><ins>+        # log.info(&quot;wd -&gt; %s&quot; % (wd,))
</ins><span class="cx">         self.wd = wd
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshelldirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/directory.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/directory.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/directory.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -72,16 +72,16 @@
</span><span class="cx">         if value:
</span><span class="cx">             table.addRow((name, value))
</span><span class="cx"> 
</span><del>-    add(&quot;Service&quot;    , record.service   )
</del><ins>+    add(&quot;Service&quot;    , record.service)
</ins><span class="cx">     add(&quot;Record Type&quot;, record.recordType)
</span><span class="cx"> 
</span><span class="cx">     for shortName in record.shortNames:
</span><span class="cx">         add(&quot;Short Name&quot;, shortName)
</span><span class="cx"> 
</span><del>-    add(&quot;GUID&quot;      , record.guid     )
-    add(&quot;Full Name&quot; , record.fullName )
</del><ins>+    add(&quot;GUID&quot;      , record.guid)
+    add(&quot;Full Name&quot; , record.fullName)
</ins><span class="cx">     add(&quot;First Name&quot;, record.firstName)
</span><del>-    add(&quot;Last Name&quot; , record.lastName )
</del><ins>+    add(&quot;Last Name&quot; , record.lastName)
</ins><span class="cx"> 
</span><span class="cx">     try:
</span><span class="cx">         for email in record.emailAddresses:
</span><span class="lines">@@ -116,7 +116,8 @@
</span><span class="cx">     if not rows:
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><del>-    rows = sorted(rows,
</del><ins>+    rows = sorted(
+        rows,
</ins><span class="cx">         key=lambda row: (row[1], row[2])
</span><span class="cx">     )
</span><span class="cx"> 
</span><span class="lines">@@ -162,7 +163,8 @@
</span><span class="cx">     if not rows:
</span><span class="cx">         returnValue(None)
</span><span class="cx"> 
</span><del>-    rows = sorted(rows,
</del><ins>+    rows = sorted(
+        rows,
</ins><span class="cx">         key=lambda row: (row[1], row[2], row[4])
</span><span class="cx">     )
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshellterminalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/terminal.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/terminal.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/terminal.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -203,7 +203,7 @@
</span><span class="cx">         self.keyHandlers['\x04'] = self.handle_EOF   # Control-D
</span><span class="cx">         self.keyHandlers['\x1c'] = self.handle_QUIT  # Control-\
</span><span class="cx">         self.keyHandlers['\x0c'] = self.handle_FF    # Control-L
</span><del>-        #self.keyHandlers['\t'  ] = self.handle_TAB   # Tab
</del><ins>+        # self.keyHandlers['\t'  ] = self.handle_TAB   # Tab
</ins><span class="cx"> 
</span><span class="cx">         if self.emulate == &quot;emacs&quot;:
</span><span class="cx">             # EMACS key bindinds
</span><span class="lines">@@ -320,7 +320,7 @@
</span><span class="cx">                 self.characterReceived(c, True)
</span><span class="cx"> 
</span><span class="cx">             # FIXME: Add a space only if we know we've fully completed the term.
</span><del>-            #self.characterReceived(&quot; &quot;, False)
</del><ins>+            # self.characterReceived(&quot; &quot;, False)
</ins><span class="cx">         else:
</span><span class="cx">             self.terminal.nextLine()
</span><span class="cx">             for completion in completions:
</span><span class="lines">@@ -363,7 +363,7 @@
</span><span class="cx"> 
</span><span class="cx">         if tokens:
</span><span class="cx">             cmd = tokens.pop(0)
</span><del>-            #print(&quot;Arguments: %r&quot; % (tokens,))
</del><ins>+            # print(&quot;Arguments: %r&quot; % (tokens,))
</ins><span class="cx"> 
</span><span class="cx">             m = getattr(self.commands, &quot;cmd_%s&quot; % (cmd,), None)
</span><span class="cx">             if m:
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshellvfspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/vfs.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/vfs.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/vfs.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -206,15 +206,15 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def child(self, name):
</span><span class="cx">         # FIXME: Move this logic to locate()
</span><del>-        #if not name:
-        #    return succeed(self)
-        #if name == &quot;.&quot;:
-        #    return succeed(self)
-        #if name == &quot;..&quot;:
-        #    path = self.path[:-1]
-        #    if not path:
-        #        path = &quot;/&quot;
-        #    return RootFolder(self.service).locate(path)
</del><ins>+        # if not name:
+        #     return succeed(self)
+        # if name == &quot;.&quot;:
+        #     return succeed(self)
+        # if name == &quot;..&quot;:
+        #     path = self.path[:-1]
+        #     if not path:
+        #         path = &quot;/&quot;
+        #     return RootFolder(self.service).locate(path)
</ins><span class="cx"> 
</span><span class="cx">         if name in self._children:
</span><span class="cx">             returnValue(self._children[name])
</span><span class="lines">@@ -736,7 +736,7 @@
</span><span class="cx">             organizerName = organizer.parameterValue(&quot;CN&quot;)
</span><span class="cx">             organizerEmail = organizer.parameterValue(&quot;EMAIL&quot;)
</span><span class="cx"> 
</span><del>-            name = &quot; (%s)&quot; % (organizerName ,) if organizerName  else &quot;&quot;
</del><ins>+            name = &quot; (%s)&quot; % (organizerName ,) if organizerName else &quot;&quot;
</ins><span class="cx">             email = &quot; &lt;%s&gt;&quot; % (organizerEmail,) if organizerEmail else &quot;&quot;
</span><span class="cx"> 
</span><span class="cx">             rows.append((&quot;Organizer&quot;, &quot;%s%s%s&quot; % (organizer.value(), name, email)))
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_calverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_calverify.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_calverify.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_calverify.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1030,14 +1030,14 @@
</span><span class="cx">     requirements = {
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid1 : {
</span><span class="cx">             &quot;calendar&quot; : {
</span><del>-                 &quot;missing_attendee.ics&quot;      : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched_attendee.ics&quot;   : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched2_attendee.ics&quot;  : (MISMATCH2_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched3_attendee.ics&quot;  : (MISMATCH3_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched_organizer.ics&quot;  : (MISMATCH_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched2_organizer.ics&quot; : (MISMATCH2_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-           },
-           &quot;inbox&quot; : {},
</del><ins>+                &quot;missing_attendee.ics&quot;      : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched_attendee.ics&quot;   : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched2_attendee.ics&quot;  : (MISMATCH2_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched3_attendee.ics&quot;  : (MISMATCH3_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched_organizer.ics&quot;  : (MISMATCH_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched2_organizer.ics&quot; : (MISMATCH2_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+            },
+            &quot;inbox&quot; : {},
</ins><span class="cx">         },
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid2 : {
</span><span class="cx">             &quot;calendar&quot; : {
</span><span class="lines">@@ -1048,7 +1048,7 @@
</span><span class="cx">                 &quot;mismatched_organizer.ics&quot;  : (MISMATCH_ORGANIZER_2_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx">                 &quot;mismatched2_organizer.ics&quot; : (MISMATCH2_ORGANIZER_2_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx">             },
</span><del>-           &quot;inbox&quot; : {},
</del><ins>+            &quot;inbox&quot; : {},
</ins><span class="cx">         },
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid3 : {
</span><span class="cx">             &quot;calendar&quot; : {
</span><span class="lines">@@ -1061,7 +1061,7 @@
</span><span class="cx">                 &quot;mismatched_organizer.ics&quot; : (MISMATCH_ORGANIZER_3_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx">                 &quot;mismatched2_attendee.ics&quot; : (MISMATCH2_ATTENDEE_3_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx">             },
</span><del>-           &quot;inbox&quot; : {},
</del><ins>+            &quot;inbox&quot; : {},
</ins><span class="cx">         },
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1331,10 +1331,10 @@
</span><span class="cx">     requirements = {
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid1 : {
</span><span class="cx">             &quot;calendar&quot; : {
</span><del>-                 &quot;missing_attendee.ics&quot;      : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched_attendee.ics&quot;   : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-           },
-           &quot;inbox&quot; : {},
</del><ins>+                &quot;missing_attendee.ics&quot;      : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched_attendee.ics&quot;   : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+            },
+            &quot;inbox&quot; : {},
</ins><span class="cx">         },
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid2 : {
</span><span class="cx">             &quot;calendar&quot; : {},
</span><span class="lines">@@ -1558,10 +1558,10 @@
</span><span class="cx">     requirements = {
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid1 : {
</span><span class="cx">             &quot;calendar&quot; : {
</span><del>-                 &quot;missing_attendee.ics&quot;      : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-                 &quot;mismatched_attendee.ics&quot;   : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
-           },
-           &quot;inbox&quot; : {},
</del><ins>+                &quot;missing_attendee.ics&quot;      : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+                &quot;mismatched_attendee.ics&quot;   : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+            },
+            &quot;inbox&quot; : {},
</ins><span class="cx">         },
</span><span class="cx">         CalVerifyMismatchTestsBase.uuid2 : {
</span><span class="cx">             &quot;calendar&quot; : {},
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_configpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_config.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_config.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_config.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -16,7 +16,8 @@
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> from twistedcaldav.config import ConfigDict
</span><del>-from calendarserver.tools.config import (WritableConfig, setKeyPath, getKeyPath,
</del><ins>+from calendarserver.tools.config import (
+    WritableConfig, setKeyPath, getKeyPath,
</ins><span class="cx">     flattenDictionary, processArgs)
</span><span class="cx"> from calendarserver.tools.test.test_gateway import RunCommandTestCase
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="lines">@@ -118,7 +119,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Verify readConfig returns with only the writable keys
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        results = yield self.runCommand(command_readConfig,
</del><ins>+        results = yield self.runCommand(
+            command_readConfig,
</ins><span class="cx">             script=&quot;calendarserver_config&quot;)
</span><span class="cx"> 
</span><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;RedirectHTTPToHTTPS&quot;], False)
</span><span class="lines">@@ -140,7 +142,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Verify writeConfig updates the writable plist file only
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        results = yield self.runCommand(command_writeConfig,
</del><ins>+        results = yield self.runCommand(
+            command_writeConfig,
</ins><span class="cx">             script=&quot;calendarserver_config&quot;)
</span><span class="cx"> 
</span><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;EnableCalDAV&quot;], False)
</span><span class="lines">@@ -161,7 +164,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Verify sending a bogus command returns an error
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        results = yield self.runCommand(command_bogusCommand,
</del><ins>+        results = yield self.runCommand(
+            command_bogusCommand,
</ins><span class="cx">             script=&quot;calendarserver_config&quot;)
</span><span class="cx">         self.assertEquals(results[&quot;error&quot;], &quot;Unknown command 'bogus'&quot;)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_exportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_export.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_export.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_export.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -48,8 +48,8 @@
</span><span class="cx"> def holiday(uid):
</span><span class="cx">     return (
</span><span class="cx">         getModule(&quot;twistedcaldav.test&quot;).filePath
</span><del>-            .sibling(&quot;data&quot;).child(&quot;Holidays&quot;).child(uid + &quot;.ics&quot;)
-            .getContent()
</del><ins>+        .sibling(&quot;data&quot;).child(&quot;Holidays&quot;).child(uid + &quot;.ics&quot;)
+        .getContent()
</ins><span class="cx">     )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -292,7 +292,7 @@
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><span class="cx">             [(yield self.txn().calendarHomeWithUID(&quot;user01&quot;))
</span><del>-              .calendarWithName(&quot;calendar1&quot;)], io
</del><ins>+                .calendarWithName(&quot;calendar1&quot;)], io
</ins><span class="cx">         )
</span><span class="cx">         self.assertEquals(Component.fromString(io.getvalue()),
</span><span class="cx">                           expected)
</span><span class="lines">@@ -325,7 +325,7 @@
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><span class="cx">             [(yield self.txn().calendarHomeWithUID(&quot;user01&quot;))
</span><del>-              .calendarWithName(&quot;calendar1&quot;)], io
</del><ins>+                .calendarWithName(&quot;calendar1&quot;)], io
</ins><span class="cx">         )
</span><span class="cx">         self.assertEquals(Component.fromString(io.getvalue()),
</span><span class="cx">                           expected)
</span><span class="lines">@@ -355,7 +355,7 @@
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><span class="cx">             [(yield self.txn().calendarHomeWithUID(&quot;user01&quot;))
</span><del>-              .calendarWithName(&quot;calendar1&quot;)], io
</del><ins>+                .calendarWithName(&quot;calendar1&quot;)], io
</ins><span class="cx">         )
</span><span class="cx">         result = Component.fromString(io.getvalue())
</span><span class="cx"> 
</span><span class="lines">@@ -396,7 +396,7 @@
</span><span class="cx">         io = StringIO()
</span><span class="cx">         yield exportToFile(
</span><span class="cx">             [(yield self.txn().calendarHomeWithUID(&quot;user02&quot;))
</span><del>-              .calendarWithName(&quot;calendar1&quot;)], io
</del><ins>+                .calendarWithName(&quot;calendar1&quot;)], io
</ins><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             Component.fromString(resultForUser2),
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_gatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_gateway.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_gateway.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_gateway.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -209,7 +209,8 @@
</span><span class="cx">         # self.assertEquals(results[&quot;result&quot;][&quot;Capacity&quot;], &quot;40&quot;)
</span><span class="cx">         # self.assertEquals(results[&quot;result&quot;][&quot;Description&quot;], &quot;Test Description&quot;)
</span><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;RecordName&quot;], [&quot;createdlocation01&quot;])
</span><del>-        self.assertEquals(results[&quot;result&quot;][&quot;RealName&quot;],
</del><ins>+        self.assertEquals(
+            results[&quot;result&quot;][&quot;RealName&quot;],
</ins><span class="cx">             &quot;Created Location 01 %s %s&quot; % (unichr(208), u&quot;\ud83d\udca3&quot;))
</span><span class="cx">         # self.assertEquals(results[&quot;result&quot;][&quot;Comment&quot;], &quot;Test Comment&quot;)
</span><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;AutoScheduleMode&quot;], u&quot;acceptIfFree&quot;)
</span><span class="lines">@@ -288,7 +289,8 @@
</span><span class="cx">         self._flush()
</span><span class="cx"> 
</span><span class="cx">         record = yield self.directory.recordWithUID(&quot;836B1B66-2E9A-4F46-8B1C-3DD6772C20B2&quot;)
</span><del>-        self.assertEquals(record.fullNames[0],
</del><ins>+        self.assertEquals(
+            record.fullNames[0],
</ins><span class="cx">             u&quot;Created Location 01 %s %s&quot; % (unichr(208), u&quot;\ud83d\udca3&quot;))
</span><span class="cx"> 
</span><span class="cx">         self.assertNotEquals(record, None)
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_purge.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_purge.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -383,7 +383,8 @@
</span><span class="cx">         self.assertTrue(&quot;;UNTIL=&quot; not in str(comp))
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><del>-        count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</del><ins>+        count = (yield PurgePrincipalService.purgeUIDs(
+            self.storeUnderTest(), self.directory,
</ins><span class="cx">             (self.uid,), verbose=False, proxies=False))
</span><span class="cx">         self.assertEquals(count, 2) # 2 events
</span><span class="cx"> 
</span><span class="lines">@@ -480,7 +481,7 @@
</span><span class="cx">                 self.assertTrue(home.purging())
</span><span class="cx"> 
</span><span class="cx">             yield self.commit()
</span><del>-            #print len(work1), len(work2), len(work3), len(work4)
</del><ins>+            # print len(work1), len(work2), len(work3), len(work4)
</ins><span class="cx">             if len(work1) + len(work2) + len(work3) + len(work4) == 0:
</span><span class="cx">                 break
</span><span class="cx">             d = Deferred()
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -455,7 +455,8 @@
</span><span class="cx"> 
</span><span class="cx">         # Query for all old events
</span><span class="cx">         results = (yield txn.eventsOlderThan(cutoff))
</span><del>-        self.assertEquals(sorted(results),
</del><ins>+        self.assertEquals(
+            sorted(results),
</ins><span class="cx">             sorted([
</span><span class="cx">                 ['home1', 'calendar1', 'old.ics', '1901-01-01 01:00:00'],
</span><span class="cx">                 ['home1', 'calendar1', 'oldattachment1.ics', '1901-01-01 01:00:00'],
</span><span class="lines">@@ -673,7 +674,8 @@
</span><span class="cx">         # Create an addressbook and one CardDAV resource
</span><span class="cx">         abHome = (yield txn.addressbookHomeWithUID(&quot;home1&quot;, create=True))
</span><span class="cx">         abColl = (yield abHome.addressbookWithName(&quot;addressbook&quot;))
</span><del>-        (yield abColl.createAddressBookObjectWithName(&quot;card1&quot;,
</del><ins>+        (yield abColl.createAddressBookObjectWithName(
+            &quot;card1&quot;,
</ins><span class="cx">             VCardComponent.fromString(VCARD_1)))
</span><span class="cx">         self.assertEquals(len((yield abColl.addressbookObjects())), 1)
</span><span class="cx"> 
</span><span class="lines">@@ -686,7 +688,8 @@
</span><span class="cx">         (yield txn.commit())
</span><span class="cx"> 
</span><span class="cx">         # Purge home1 completely
</span><del>-        total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
</del><ins>+        total = yield PurgePrincipalService.purgeUIDs(
+            self._sqlCalendarStore, self.directory,
</ins><span class="cx">             (&quot;home1&quot;,), verbose=False, proxies=False)
</span><span class="cx"> 
</span><span class="cx">         # Wait for queue to process
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverwebadminlandingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/webadmin/landing.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/webadmin/landing.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/webadmin/landing.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -65,11 +65,11 @@
</span><span class="cx">         # self._root = root
</span><span class="cx">         # self._principalCollections = principalCollections
</span><span class="cx"> 
</span><del>-        #from .config import ConfigurationResource
-        #self.putChild(u&quot;config&quot;, ConfigurationResource(configuration, principalCollections))
</del><ins>+        # from .config import ConfigurationResource
+        # self.putChild(u&quot;config&quot;, ConfigurationResource(configuration, principalCollections))
</ins><span class="cx"> 
</span><del>-        #from .principals import PrincipalsResource
-        #self.putChild(u&quot;principals&quot;, PrincipalsResource(directory, store, principalCollections))
</del><ins>+        # from .principals import PrincipalsResource
+        # self.putChild(u&quot;principals&quot;, PrincipalsResource(directory, store, principalCollections))
</ins><span class="cx"> 
</span><span class="cx">         # from .logs import LogsResource
</span><span class="cx">         # self.putChild(u&quot;logs&quot;, LogsResource())
</span></span></pre></div>
<a id="CalendarServertrunkconfauthgenerate_test_accountspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/auth/generate_test_accounts.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/generate_test_accounts.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/conf/auth/generate_test_accounts.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -96,618 +96,618 @@
</span><span class="cx"> 
</span><span class="cx"> if EXTRA_GROUPS:
</span><span class="cx">     members.update({
</span><del>-    GROUPGUIDS % 8: (
-        USERGUIDS % 1,
-        USERGUIDS % 2,
-        USERGUIDS % 3,
-        USERGUIDS % 4,
-        USERGUIDS % 5,
-    ),
-    GROUPGUIDS % 9: (
-        USERGUIDS % 1,
-        USERGUIDS % 2,
-        USERGUIDS % 3,
-        USERGUIDS % 4,
-        USERGUIDS % 5,
-        USERGUIDS % 6,
-        USERGUIDS % 7,
-        USERGUIDS % 8,
-        USERGUIDS % 9,
-        USERGUIDS % 10,
-        USERGUIDS % 11,
-        USERGUIDS % 12,
-        USERGUIDS % 13,
-        USERGUIDS % 14,
-        USERGUIDS % 15,
-        USERGUIDS % 16,
-        USERGUIDS % 17,
-        USERGUIDS % 18,
-        USERGUIDS % 19,
-        USERGUIDS % 20,
-        USERGUIDS % 21,
-        USERGUIDS % 22,
-        USERGUIDS % 23,
-        USERGUIDS % 24,
-        USERGUIDS % 25,
-        USERGUIDS % 26,
-        USERGUIDS % 27,
-        USERGUIDS % 28,
-        USERGUIDS % 29,
-        USERGUIDS % 30,
-        USERGUIDS % 31,
-        USERGUIDS % 32,
-        USERGUIDS % 33,
-        USERGUIDS % 34,
-        USERGUIDS % 35,
-        USERGUIDS % 36,
-        USERGUIDS % 37,
-        USERGUIDS % 38,
-        USERGUIDS % 39,
-        USERGUIDS % 40,
-        USERGUIDS % 41,
-        USERGUIDS % 42,
-        USERGUIDS % 43,
-        USERGUIDS % 44,
-        USERGUIDS % 45,
-        USERGUIDS % 46,
-        USERGUIDS % 47,
-        USERGUIDS % 48,
-        USERGUIDS % 49,
-        USERGUIDS % 50,
-        USERGUIDS % 51,
-        USERGUIDS % 52,
-        USERGUIDS % 53,
-        USERGUIDS % 54,
-        USERGUIDS % 55,
-        USERGUIDS % 56,
-        USERGUIDS % 57,
-        USERGUIDS % 58,
-        USERGUIDS % 59,
-        USERGUIDS % 60,
-        USERGUIDS % 61,
-        USERGUIDS % 62,
-        USERGUIDS % 63,
-        USERGUIDS % 64,
-        USERGUIDS % 65,
-        USERGUIDS % 66,
-        USERGUIDS % 67,
-        USERGUIDS % 68,
-        USERGUIDS % 69,
-        USERGUIDS % 70,
-        USERGUIDS % 71,
-        USERGUIDS % 72,
-        USERGUIDS % 73,
-        USERGUIDS % 74,
-        USERGUIDS % 75,
-        USERGUIDS % 76,
-        USERGUIDS % 77,
-        USERGUIDS % 78,
-        USERGUIDS % 79,
-        USERGUIDS % 80,
-        USERGUIDS % 81,
-        USERGUIDS % 82,
-        USERGUIDS % 83,
-        USERGUIDS % 84,
-        USERGUIDS % 85,
-        USERGUIDS % 86,
-        USERGUIDS % 87,
-        USERGUIDS % 88,
-        USERGUIDS % 89,
-        USERGUIDS % 90,
-        USERGUIDS % 91,
-        USERGUIDS % 92,
-        USERGUIDS % 93,
-        USERGUIDS % 94,
-        USERGUIDS % 95,
-        USERGUIDS % 96,
-        USERGUIDS % 97,
-        USERGUIDS % 98,
-        USERGUIDS % 99,
-        USERGUIDS % 100,
-    ),
-    GROUPGUIDS % 10: (
-        USERGUIDS % 1,
-        USERGUIDS % 2,
-        USERGUIDS % 3,
-        USERGUIDS % 4,
-        USERGUIDS % 5,
-        USERGUIDS % 6,
-        USERGUIDS % 7,
-        USERGUIDS % 8,
-        USERGUIDS % 9,
-        USERGUIDS % 10,
-        USERGUIDS % 11,
-        USERGUIDS % 12,
-        USERGUIDS % 13,
-        USERGUIDS % 14,
-        USERGUIDS % 15,
-        USERGUIDS % 16,
-        USERGUIDS % 17,
-        USERGUIDS % 18,
-        USERGUIDS % 19,
-        USERGUIDS % 20,
-        USERGUIDS % 21,
-        USERGUIDS % 22,
-        USERGUIDS % 23,
-        USERGUIDS % 24,
-        USERGUIDS % 25,
-        USERGUIDS % 26,
-        USERGUIDS % 27,
-        USERGUIDS % 28,
-        USERGUIDS % 29,
-        USERGUIDS % 30,
-        USERGUIDS % 31,
-        USERGUIDS % 32,
-        USERGUIDS % 33,
-        USERGUIDS % 34,
-        USERGUIDS % 35,
-        USERGUIDS % 36,
-        USERGUIDS % 37,
-        USERGUIDS % 38,
-        USERGUIDS % 39,
-        USERGUIDS % 40,
-        USERGUIDS % 41,
-        USERGUIDS % 42,
-        USERGUIDS % 43,
-        USERGUIDS % 44,
-        USERGUIDS % 45,
-        USERGUIDS % 46,
-        USERGUIDS % 47,
-        USERGUIDS % 48,
-        USERGUIDS % 49,
-        USERGUIDS % 50,
-        USERGUIDS % 51,
-        USERGUIDS % 52,
-        USERGUIDS % 53,
-        USERGUIDS % 54,
-        USERGUIDS % 55,
-        USERGUIDS % 56,
-        USERGUIDS % 57,
-        USERGUIDS % 58,
-        USERGUIDS % 59,
-        USERGUIDS % 60,
-        USERGUIDS % 61,
-        USERGUIDS % 62,
-        USERGUIDS % 63,
-        USERGUIDS % 64,
-        USERGUIDS % 65,
-        USERGUIDS % 66,
-        USERGUIDS % 67,
-        USERGUIDS % 68,
-        USERGUIDS % 69,
-        USERGUIDS % 70,
-        USERGUIDS % 71,
-        USERGUIDS % 72,
-        USERGUIDS % 73,
-        USERGUIDS % 74,
-        USERGUIDS % 75,
-        USERGUIDS % 76,
-        USERGUIDS % 77,
-        USERGUIDS % 78,
-        USERGUIDS % 79,
-        USERGUIDS % 80,
-        USERGUIDS % 81,
-        USERGUIDS % 82,
-        USERGUIDS % 83,
-        USERGUIDS % 84,
-        USERGUIDS % 85,
-        USERGUIDS % 86,
-        USERGUIDS % 87,
-        USERGUIDS % 88,
-        USERGUIDS % 89,
-        USERGUIDS % 90,
-        USERGUIDS % 91,
-        USERGUIDS % 92,
-        USERGUIDS % 93,
-        USERGUIDS % 94,
-        USERGUIDS % 95,
-        USERGUIDS % 96,
-        USERGUIDS % 97,
-        USERGUIDS % 98,
-        USERGUIDS % 99,
-        USERGUIDS % 100,
-        USERGUIDS % 101,
-        USERGUIDS % 102,
-        USERGUIDS % 103,
-        USERGUIDS % 104,
-        USERGUIDS % 105,
-        USERGUIDS % 106,
-        USERGUIDS % 107,
-        USERGUIDS % 108,
-        USERGUIDS % 109,
-        USERGUIDS % 110,
-        USERGUIDS % 111,
-        USERGUIDS % 112,
-        USERGUIDS % 113,
-        USERGUIDS % 114,
-        USERGUIDS % 115,
-        USERGUIDS % 116,
-        USERGUIDS % 117,
-        USERGUIDS % 118,
-        USERGUIDS % 119,
-        USERGUIDS % 120,
-        USERGUIDS % 121,
-        USERGUIDS % 122,
-        USERGUIDS % 123,
-        USERGUIDS % 124,
-        USERGUIDS % 125,
-        USERGUIDS % 126,
-        USERGUIDS % 127,
-        USERGUIDS % 128,
-        USERGUIDS % 129,
-        USERGUIDS % 130,
-        USERGUIDS % 131,
-        USERGUIDS % 132,
-        USERGUIDS % 133,
-        USERGUIDS % 134,
-        USERGUIDS % 135,
-        USERGUIDS % 136,
-        USERGUIDS % 137,
-        USERGUIDS % 138,
-        USERGUIDS % 139,
-        USERGUIDS % 140,
-        USERGUIDS % 141,
-        USERGUIDS % 142,
-        USERGUIDS % 143,
-        USERGUIDS % 144,
-        USERGUIDS % 145,
-        USERGUIDS % 146,
-        USERGUIDS % 147,
-        USERGUIDS % 148,
-        USERGUIDS % 149,
-        USERGUIDS % 150,
-        USERGUIDS % 151,
-        USERGUIDS % 152,
-        USERGUIDS % 153,
-        USERGUIDS % 154,
-        USERGUIDS % 155,
-        USERGUIDS % 156,
-        USERGUIDS % 157,
-        USERGUIDS % 158,
-        USERGUIDS % 159,
-        USERGUIDS % 160,
-        USERGUIDS % 161,
-        USERGUIDS % 162,
-        USERGUIDS % 163,
-        USERGUIDS % 164,
-        USERGUIDS % 165,
-        USERGUIDS % 166,
-        USERGUIDS % 167,
-        USERGUIDS % 168,
-        USERGUIDS % 169,
-        USERGUIDS % 170,
-        USERGUIDS % 171,
-        USERGUIDS % 172,
-        USERGUIDS % 173,
-        USERGUIDS % 174,
-        USERGUIDS % 175,
-        USERGUIDS % 176,
-        USERGUIDS % 177,
-        USERGUIDS % 178,
-        USERGUIDS % 179,
-        USERGUIDS % 180,
-        USERGUIDS % 181,
-        USERGUIDS % 182,
-        USERGUIDS % 183,
-        USERGUIDS % 184,
-        USERGUIDS % 185,
-        USERGUIDS % 186,
-        USERGUIDS % 187,
-        USERGUIDS % 188,
-        USERGUIDS % 189,
-        USERGUIDS % 190,
-        USERGUIDS % 191,
-        USERGUIDS % 192,
-        USERGUIDS % 193,
-        USERGUIDS % 194,
-        USERGUIDS % 195,
-        USERGUIDS % 196,
-        USERGUIDS % 197,
-        USERGUIDS % 198,
-        USERGUIDS % 199,
-        USERGUIDS % 200,
-        USERGUIDS % 201,
-        USERGUIDS % 202,
-        USERGUIDS % 203,
-        USERGUIDS % 204,
-        USERGUIDS % 205,
-        USERGUIDS % 206,
-        USERGUIDS % 207,
-        USERGUIDS % 208,
-        USERGUIDS % 209,
-        USERGUIDS % 210,
-        USERGUIDS % 211,
-        USERGUIDS % 212,
-        USERGUIDS % 213,
-        USERGUIDS % 214,
-        USERGUIDS % 215,
-        USERGUIDS % 216,
-        USERGUIDS % 217,
-        USERGUIDS % 218,
-        USERGUIDS % 219,
-        USERGUIDS % 220,
-        USERGUIDS % 221,
-        USERGUIDS % 222,
-        USERGUIDS % 223,
-        USERGUIDS % 224,
-        USERGUIDS % 225,
-        USERGUIDS % 226,
-        USERGUIDS % 227,
-        USERGUIDS % 228,
-        USERGUIDS % 229,
-        USERGUIDS % 230,
-        USERGUIDS % 231,
-        USERGUIDS % 232,
-        USERGUIDS % 233,
-        USERGUIDS % 234,
-        USERGUIDS % 235,
-        USERGUIDS % 236,
-        USERGUIDS % 237,
-        USERGUIDS % 238,
-        USERGUIDS % 239,
-        USERGUIDS % 240,
-        USERGUIDS % 241,
-        USERGUIDS % 242,
-        USERGUIDS % 243,
-        USERGUIDS % 244,
-        USERGUIDS % 245,
-        USERGUIDS % 246,
-        USERGUIDS % 247,
-        USERGUIDS % 248,
-        USERGUIDS % 249,
-        USERGUIDS % 250,
-        USERGUIDS % 251,
-        USERGUIDS % 252,
-        USERGUIDS % 253,
-        USERGUIDS % 254,
-        USERGUIDS % 255,
-        USERGUIDS % 256,
-        USERGUIDS % 257,
-        USERGUIDS % 258,
-        USERGUIDS % 259,
-        USERGUIDS % 260,
-        USERGUIDS % 261,
-        USERGUIDS % 262,
-        USERGUIDS % 263,
-        USERGUIDS % 264,
-        USERGUIDS % 265,
-        USERGUIDS % 266,
-        USERGUIDS % 267,
-        USERGUIDS % 268,
-        USERGUIDS % 269,
-        USERGUIDS % 270,
-        USERGUIDS % 271,
-        USERGUIDS % 272,
-        USERGUIDS % 273,
-        USERGUIDS % 274,
-        USERGUIDS % 275,
-        USERGUIDS % 276,
-        USERGUIDS % 277,
-        USERGUIDS % 278,
-        USERGUIDS % 279,
-        USERGUIDS % 280,
-        USERGUIDS % 281,
-        USERGUIDS % 282,
-        USERGUIDS % 283,
-        USERGUIDS % 284,
-        USERGUIDS % 285,
-        USERGUIDS % 286,
-        USERGUIDS % 287,
-        USERGUIDS % 288,
-        USERGUIDS % 289,
-        USERGUIDS % 290,
-        USERGUIDS % 291,
-        USERGUIDS % 292,
-        USERGUIDS % 293,
-        USERGUIDS % 294,
-        USERGUIDS % 295,
-        USERGUIDS % 296,
-        USERGUIDS % 297,
-        USERGUIDS % 298,
-        USERGUIDS % 299,
-        USERGUIDS % 300,
-        USERGUIDS % 301,
-        USERGUIDS % 302,
-        USERGUIDS % 303,
-        USERGUIDS % 304,
-        USERGUIDS % 305,
-        USERGUIDS % 306,
-        USERGUIDS % 307,
-        USERGUIDS % 308,
-        USERGUIDS % 309,
-        USERGUIDS % 310,
-        USERGUIDS % 311,
-        USERGUIDS % 312,
-        USERGUIDS % 313,
-        USERGUIDS % 314,
-        USERGUIDS % 315,
-        USERGUIDS % 316,
-        USERGUIDS % 317,
-        USERGUIDS % 318,
-        USERGUIDS % 319,
-        USERGUIDS % 320,
-        USERGUIDS % 321,
-        USERGUIDS % 322,
-        USERGUIDS % 323,
-        USERGUIDS % 324,
-        USERGUIDS % 325,
-        USERGUIDS % 326,
-        USERGUIDS % 327,
-        USERGUIDS % 328,
-        USERGUIDS % 329,
-        USERGUIDS % 330,
-        USERGUIDS % 331,
-        USERGUIDS % 332,
-        USERGUIDS % 333,
-        USERGUIDS % 334,
-        USERGUIDS % 335,
-        USERGUIDS % 336,
-        USERGUIDS % 337,
-        USERGUIDS % 338,
-        USERGUIDS % 339,
-        USERGUIDS % 340,
-        USERGUIDS % 341,
-        USERGUIDS % 342,
-        USERGUIDS % 343,
-        USERGUIDS % 344,
-        USERGUIDS % 345,
-        USERGUIDS % 346,
-        USERGUIDS % 347,
-        USERGUIDS % 348,
-        USERGUIDS % 349,
-        USERGUIDS % 350,
-        USERGUIDS % 351,
-        USERGUIDS % 352,
-        USERGUIDS % 353,
-        USERGUIDS % 354,
-        USERGUIDS % 355,
-        USERGUIDS % 356,
-        USERGUIDS % 357,
-        USERGUIDS % 358,
-        USERGUIDS % 359,
-        USERGUIDS % 360,
-        USERGUIDS % 361,
-        USERGUIDS % 362,
-        USERGUIDS % 363,
-        USERGUIDS % 364,
-        USERGUIDS % 365,
-        USERGUIDS % 366,
-        USERGUIDS % 367,
-        USERGUIDS % 368,
-        USERGUIDS % 369,
-        USERGUIDS % 370,
-        USERGUIDS % 371,
-        USERGUIDS % 372,
-        USERGUIDS % 373,
-        USERGUIDS % 374,
-        USERGUIDS % 375,
-        USERGUIDS % 376,
-        USERGUIDS % 377,
-        USERGUIDS % 378,
-        USERGUIDS % 379,
-        USERGUIDS % 380,
-        USERGUIDS % 381,
-        USERGUIDS % 382,
-        USERGUIDS % 383,
-        USERGUIDS % 384,
-        USERGUIDS % 385,
-        USERGUIDS % 386,
-        USERGUIDS % 387,
-        USERGUIDS % 388,
-        USERGUIDS % 389,
-        USERGUIDS % 390,
-        USERGUIDS % 391,
-        USERGUIDS % 392,
-        USERGUIDS % 393,
-        USERGUIDS % 394,
-        USERGUIDS % 395,
-        USERGUIDS % 396,
-        USERGUIDS % 397,
-        USERGUIDS % 398,
-        USERGUIDS % 399,
-        USERGUIDS % 400,
-        USERGUIDS % 401,
-        USERGUIDS % 402,
-        USERGUIDS % 403,
-        USERGUIDS % 404,
-        USERGUIDS % 405,
-        USERGUIDS % 406,
-        USERGUIDS % 407,
-        USERGUIDS % 408,
-        USERGUIDS % 409,
-        USERGUIDS % 410,
-        USERGUIDS % 411,
-        USERGUIDS % 412,
-        USERGUIDS % 413,
-        USERGUIDS % 414,
-        USERGUIDS % 415,
-        USERGUIDS % 416,
-        USERGUIDS % 417,
-        USERGUIDS % 418,
-        USERGUIDS % 419,
-        USERGUIDS % 420,
-        USERGUIDS % 421,
-        USERGUIDS % 422,
-        USERGUIDS % 423,
-        USERGUIDS % 424,
-        USERGUIDS % 425,
-        USERGUIDS % 426,
-        USERGUIDS % 427,
-        USERGUIDS % 428,
-        USERGUIDS % 429,
-        USERGUIDS % 430,
-        USERGUIDS % 431,
-        USERGUIDS % 432,
-        USERGUIDS % 433,
-        USERGUIDS % 434,
-        USERGUIDS % 435,
-        USERGUIDS % 436,
-        USERGUIDS % 437,
-        USERGUIDS % 438,
-        USERGUIDS % 439,
-        USERGUIDS % 440,
-        USERGUIDS % 441,
-        USERGUIDS % 442,
-        USERGUIDS % 443,
-        USERGUIDS % 444,
-        USERGUIDS % 445,
-        USERGUIDS % 446,
-        USERGUIDS % 447,
-        USERGUIDS % 448,
-        USERGUIDS % 449,
-        USERGUIDS % 450,
-        USERGUIDS % 451,
-        USERGUIDS % 452,
-        USERGUIDS % 453,
-        USERGUIDS % 454,
-        USERGUIDS % 455,
-        USERGUIDS % 456,
-        USERGUIDS % 457,
-        USERGUIDS % 458,
-        USERGUIDS % 459,
-        USERGUIDS % 460,
-        USERGUIDS % 461,
-        USERGUIDS % 462,
-        USERGUIDS % 463,
-        USERGUIDS % 464,
-        USERGUIDS % 465,
-        USERGUIDS % 466,
-        USERGUIDS % 467,
-        USERGUIDS % 468,
-        USERGUIDS % 469,
-        USERGUIDS % 470,
-        USERGUIDS % 471,
-        USERGUIDS % 472,
-        USERGUIDS % 473,
-        USERGUIDS % 474,
-        USERGUIDS % 475,
-        USERGUIDS % 476,
-        USERGUIDS % 477,
-        USERGUIDS % 478,
-        USERGUIDS % 479,
-        USERGUIDS % 480,
-        USERGUIDS % 481,
-        USERGUIDS % 482,
-        USERGUIDS % 483,
-        USERGUIDS % 484,
-        USERGUIDS % 485,
-        USERGUIDS % 486,
-        USERGUIDS % 487,
-        USERGUIDS % 488,
-        USERGUIDS % 489,
-        USERGUIDS % 490,
-        USERGUIDS % 491,
-        USERGUIDS % 492,
-        USERGUIDS % 493,
-        USERGUIDS % 494,
-        USERGUIDS % 495,
-        USERGUIDS % 496,
-        USERGUIDS % 497,
-        USERGUIDS % 498,
-        USERGUIDS % 499,
-        USERGUIDS % 500,
-    ),
-})
</del><ins>+        GROUPGUIDS % 8: (
+            USERGUIDS % 1,
+            USERGUIDS % 2,
+            USERGUIDS % 3,
+            USERGUIDS % 4,
+            USERGUIDS % 5,
+        ),
+        GROUPGUIDS % 9: (
+            USERGUIDS % 1,
+            USERGUIDS % 2,
+            USERGUIDS % 3,
+            USERGUIDS % 4,
+            USERGUIDS % 5,
+            USERGUIDS % 6,
+            USERGUIDS % 7,
+            USERGUIDS % 8,
+            USERGUIDS % 9,
+            USERGUIDS % 10,
+            USERGUIDS % 11,
+            USERGUIDS % 12,
+            USERGUIDS % 13,
+            USERGUIDS % 14,
+            USERGUIDS % 15,
+            USERGUIDS % 16,
+            USERGUIDS % 17,
+            USERGUIDS % 18,
+            USERGUIDS % 19,
+            USERGUIDS % 20,
+            USERGUIDS % 21,
+            USERGUIDS % 22,
+            USERGUIDS % 23,
+            USERGUIDS % 24,
+            USERGUIDS % 25,
+            USERGUIDS % 26,
+            USERGUIDS % 27,
+            USERGUIDS % 28,
+            USERGUIDS % 29,
+            USERGUIDS % 30,
+            USERGUIDS % 31,
+            USERGUIDS % 32,
+            USERGUIDS % 33,
+            USERGUIDS % 34,
+            USERGUIDS % 35,
+            USERGUIDS % 36,
+            USERGUIDS % 37,
+            USERGUIDS % 38,
+            USERGUIDS % 39,
+            USERGUIDS % 40,
+            USERGUIDS % 41,
+            USERGUIDS % 42,
+            USERGUIDS % 43,
+            USERGUIDS % 44,
+            USERGUIDS % 45,
+            USERGUIDS % 46,
+            USERGUIDS % 47,
+            USERGUIDS % 48,
+            USERGUIDS % 49,
+            USERGUIDS % 50,
+            USERGUIDS % 51,
+            USERGUIDS % 52,
+            USERGUIDS % 53,
+            USERGUIDS % 54,
+            USERGUIDS % 55,
+            USERGUIDS % 56,
+            USERGUIDS % 57,
+            USERGUIDS % 58,
+            USERGUIDS % 59,
+            USERGUIDS % 60,
+            USERGUIDS % 61,
+            USERGUIDS % 62,
+            USERGUIDS % 63,
+            USERGUIDS % 64,
+            USERGUIDS % 65,
+            USERGUIDS % 66,
+            USERGUIDS % 67,
+            USERGUIDS % 68,
+            USERGUIDS % 69,
+            USERGUIDS % 70,
+            USERGUIDS % 71,
+            USERGUIDS % 72,
+            USERGUIDS % 73,
+            USERGUIDS % 74,
+            USERGUIDS % 75,
+            USERGUIDS % 76,
+            USERGUIDS % 77,
+            USERGUIDS % 78,
+            USERGUIDS % 79,
+            USERGUIDS % 80,
+            USERGUIDS % 81,
+            USERGUIDS % 82,
+            USERGUIDS % 83,
+            USERGUIDS % 84,
+            USERGUIDS % 85,
+            USERGUIDS % 86,
+            USERGUIDS % 87,
+            USERGUIDS % 88,
+            USERGUIDS % 89,
+            USERGUIDS % 90,
+            USERGUIDS % 91,
+            USERGUIDS % 92,
+            USERGUIDS % 93,
+            USERGUIDS % 94,
+            USERGUIDS % 95,
+            USERGUIDS % 96,
+            USERGUIDS % 97,
+            USERGUIDS % 98,
+            USERGUIDS % 99,
+            USERGUIDS % 100,
+        ),
+        GROUPGUIDS % 10: (
+            USERGUIDS % 1,
+            USERGUIDS % 2,
+            USERGUIDS % 3,
+            USERGUIDS % 4,
+            USERGUIDS % 5,
+            USERGUIDS % 6,
+            USERGUIDS % 7,
+            USERGUIDS % 8,
+            USERGUIDS % 9,
+            USERGUIDS % 10,
+            USERGUIDS % 11,
+            USERGUIDS % 12,
+            USERGUIDS % 13,
+            USERGUIDS % 14,
+            USERGUIDS % 15,
+            USERGUIDS % 16,
+            USERGUIDS % 17,
+            USERGUIDS % 18,
+            USERGUIDS % 19,
+            USERGUIDS % 20,
+            USERGUIDS % 21,
+            USERGUIDS % 22,
+            USERGUIDS % 23,
+            USERGUIDS % 24,
+            USERGUIDS % 25,
+            USERGUIDS % 26,
+            USERGUIDS % 27,
+            USERGUIDS % 28,
+            USERGUIDS % 29,
+            USERGUIDS % 30,
+            USERGUIDS % 31,
+            USERGUIDS % 32,
+            USERGUIDS % 33,
+            USERGUIDS % 34,
+            USERGUIDS % 35,
+            USERGUIDS % 36,
+            USERGUIDS % 37,
+            USERGUIDS % 38,
+            USERGUIDS % 39,
+            USERGUIDS % 40,
+            USERGUIDS % 41,
+            USERGUIDS % 42,
+            USERGUIDS % 43,
+            USERGUIDS % 44,
+            USERGUIDS % 45,
+            USERGUIDS % 46,
+            USERGUIDS % 47,
+            USERGUIDS % 48,
+            USERGUIDS % 49,
+            USERGUIDS % 50,
+            USERGUIDS % 51,
+            USERGUIDS % 52,
+            USERGUIDS % 53,
+            USERGUIDS % 54,
+            USERGUIDS % 55,
+            USERGUIDS % 56,
+            USERGUIDS % 57,
+            USERGUIDS % 58,
+            USERGUIDS % 59,
+            USERGUIDS % 60,
+            USERGUIDS % 61,
+            USERGUIDS % 62,
+            USERGUIDS % 63,
+            USERGUIDS % 64,
+            USERGUIDS % 65,
+            USERGUIDS % 66,
+            USERGUIDS % 67,
+            USERGUIDS % 68,
+            USERGUIDS % 69,
+            USERGUIDS % 70,
+            USERGUIDS % 71,
+            USERGUIDS % 72,
+            USERGUIDS % 73,
+            USERGUIDS % 74,
+            USERGUIDS % 75,
+            USERGUIDS % 76,
+            USERGUIDS % 77,
+            USERGUIDS % 78,
+            USERGUIDS % 79,
+            USERGUIDS % 80,
+            USERGUIDS % 81,
+            USERGUIDS % 82,
+            USERGUIDS % 83,
+            USERGUIDS % 84,
+            USERGUIDS % 85,
+            USERGUIDS % 86,
+            USERGUIDS % 87,
+            USERGUIDS % 88,
+            USERGUIDS % 89,
+            USERGUIDS % 90,
+            USERGUIDS % 91,
+            USERGUIDS % 92,
+            USERGUIDS % 93,
+            USERGUIDS % 94,
+            USERGUIDS % 95,
+            USERGUIDS % 96,
+            USERGUIDS % 97,
+            USERGUIDS % 98,
+            USERGUIDS % 99,
+            USERGUIDS % 100,
+            USERGUIDS % 101,
+            USERGUIDS % 102,
+            USERGUIDS % 103,
+            USERGUIDS % 104,
+            USERGUIDS % 105,
+            USERGUIDS % 106,
+            USERGUIDS % 107,
+            USERGUIDS % 108,
+            USERGUIDS % 109,
+            USERGUIDS % 110,
+            USERGUIDS % 111,
+            USERGUIDS % 112,
+            USERGUIDS % 113,
+            USERGUIDS % 114,
+            USERGUIDS % 115,
+            USERGUIDS % 116,
+            USERGUIDS % 117,
+            USERGUIDS % 118,
+            USERGUIDS % 119,
+            USERGUIDS % 120,
+            USERGUIDS % 121,
+            USERGUIDS % 122,
+            USERGUIDS % 123,
+            USERGUIDS % 124,
+            USERGUIDS % 125,
+            USERGUIDS % 126,
+            USERGUIDS % 127,
+            USERGUIDS % 128,
+            USERGUIDS % 129,
+            USERGUIDS % 130,
+            USERGUIDS % 131,
+            USERGUIDS % 132,
+            USERGUIDS % 133,
+            USERGUIDS % 134,
+            USERGUIDS % 135,
+            USERGUIDS % 136,
+            USERGUIDS % 137,
+            USERGUIDS % 138,
+            USERGUIDS % 139,
+            USERGUIDS % 140,
+            USERGUIDS % 141,
+            USERGUIDS % 142,
+            USERGUIDS % 143,
+            USERGUIDS % 144,
+            USERGUIDS % 145,
+            USERGUIDS % 146,
+            USERGUIDS % 147,
+            USERGUIDS % 148,
+            USERGUIDS % 149,
+            USERGUIDS % 150,
+            USERGUIDS % 151,
+            USERGUIDS % 152,
+            USERGUIDS % 153,
+            USERGUIDS % 154,
+            USERGUIDS % 155,
+            USERGUIDS % 156,
+            USERGUIDS % 157,
+            USERGUIDS % 158,
+            USERGUIDS % 159,
+            USERGUIDS % 160,
+            USERGUIDS % 161,
+            USERGUIDS % 162,
+            USERGUIDS % 163,
+            USERGUIDS % 164,
+            USERGUIDS % 165,
+            USERGUIDS % 166,
+            USERGUIDS % 167,
+            USERGUIDS % 168,
+            USERGUIDS % 169,
+            USERGUIDS % 170,
+            USERGUIDS % 171,
+            USERGUIDS % 172,
+            USERGUIDS % 173,
+            USERGUIDS % 174,
+            USERGUIDS % 175,
+            USERGUIDS % 176,
+            USERGUIDS % 177,
+            USERGUIDS % 178,
+            USERGUIDS % 179,
+            USERGUIDS % 180,
+            USERGUIDS % 181,
+            USERGUIDS % 182,
+            USERGUIDS % 183,
+            USERGUIDS % 184,
+            USERGUIDS % 185,
+            USERGUIDS % 186,
+            USERGUIDS % 187,
+            USERGUIDS % 188,
+            USERGUIDS % 189,
+            USERGUIDS % 190,
+            USERGUIDS % 191,
+            USERGUIDS % 192,
+            USERGUIDS % 193,
+            USERGUIDS % 194,
+            USERGUIDS % 195,
+            USERGUIDS % 196,
+            USERGUIDS % 197,
+            USERGUIDS % 198,
+            USERGUIDS % 199,
+            USERGUIDS % 200,
+            USERGUIDS % 201,
+            USERGUIDS % 202,
+            USERGUIDS % 203,
+            USERGUIDS % 204,
+            USERGUIDS % 205,
+            USERGUIDS % 206,
+            USERGUIDS % 207,
+            USERGUIDS % 208,
+            USERGUIDS % 209,
+            USERGUIDS % 210,
+            USERGUIDS % 211,
+            USERGUIDS % 212,
+            USERGUIDS % 213,
+            USERGUIDS % 214,
+            USERGUIDS % 215,
+            USERGUIDS % 216,
+            USERGUIDS % 217,
+            USERGUIDS % 218,
+            USERGUIDS % 219,
+            USERGUIDS % 220,
+            USERGUIDS % 221,
+            USERGUIDS % 222,
+            USERGUIDS % 223,
+            USERGUIDS % 224,
+            USERGUIDS % 225,
+            USERGUIDS % 226,
+            USERGUIDS % 227,
+            USERGUIDS % 228,
+            USERGUIDS % 229,
+            USERGUIDS % 230,
+            USERGUIDS % 231,
+            USERGUIDS % 232,
+            USERGUIDS % 233,
+            USERGUIDS % 234,
+            USERGUIDS % 235,
+            USERGUIDS % 236,
+            USERGUIDS % 237,
+            USERGUIDS % 238,
+            USERGUIDS % 239,
+            USERGUIDS % 240,
+            USERGUIDS % 241,
+            USERGUIDS % 242,
+            USERGUIDS % 243,
+            USERGUIDS % 244,
+            USERGUIDS % 245,
+            USERGUIDS % 246,
+            USERGUIDS % 247,
+            USERGUIDS % 248,
+            USERGUIDS % 249,
+            USERGUIDS % 250,
+            USERGUIDS % 251,
+            USERGUIDS % 252,
+            USERGUIDS % 253,
+            USERGUIDS % 254,
+            USERGUIDS % 255,
+            USERGUIDS % 256,
+            USERGUIDS % 257,
+            USERGUIDS % 258,
+            USERGUIDS % 259,
+            USERGUIDS % 260,
+            USERGUIDS % 261,
+            USERGUIDS % 262,
+            USERGUIDS % 263,
+            USERGUIDS % 264,
+            USERGUIDS % 265,
+            USERGUIDS % 266,
+            USERGUIDS % 267,
+            USERGUIDS % 268,
+            USERGUIDS % 269,
+            USERGUIDS % 270,
+            USERGUIDS % 271,
+            USERGUIDS % 272,
+            USERGUIDS % 273,
+            USERGUIDS % 274,
+            USERGUIDS % 275,
+            USERGUIDS % 276,
+            USERGUIDS % 277,
+            USERGUIDS % 278,
+            USERGUIDS % 279,
+            USERGUIDS % 280,
+            USERGUIDS % 281,
+            USERGUIDS % 282,
+            USERGUIDS % 283,
+            USERGUIDS % 284,
+            USERGUIDS % 285,
+            USERGUIDS % 286,
+            USERGUIDS % 287,
+            USERGUIDS % 288,
+            USERGUIDS % 289,
+            USERGUIDS % 290,
+            USERGUIDS % 291,
+            USERGUIDS % 292,
+            USERGUIDS % 293,
+            USERGUIDS % 294,
+            USERGUIDS % 295,
+            USERGUIDS % 296,
+            USERGUIDS % 297,
+            USERGUIDS % 298,
+            USERGUIDS % 299,
+            USERGUIDS % 300,
+            USERGUIDS % 301,
+            USERGUIDS % 302,
+            USERGUIDS % 303,
+            USERGUIDS % 304,
+            USERGUIDS % 305,
+            USERGUIDS % 306,
+            USERGUIDS % 307,
+            USERGUIDS % 308,
+            USERGUIDS % 309,
+            USERGUIDS % 310,
+            USERGUIDS % 311,
+            USERGUIDS % 312,
+            USERGUIDS % 313,
+            USERGUIDS % 314,
+            USERGUIDS % 315,
+            USERGUIDS % 316,
+            USERGUIDS % 317,
+            USERGUIDS % 318,
+            USERGUIDS % 319,
+            USERGUIDS % 320,
+            USERGUIDS % 321,
+            USERGUIDS % 322,
+            USERGUIDS % 323,
+            USERGUIDS % 324,
+            USERGUIDS % 325,
+            USERGUIDS % 326,
+            USERGUIDS % 327,
+            USERGUIDS % 328,
+            USERGUIDS % 329,
+            USERGUIDS % 330,
+            USERGUIDS % 331,
+            USERGUIDS % 332,
+            USERGUIDS % 333,
+            USERGUIDS % 334,
+            USERGUIDS % 335,
+            USERGUIDS % 336,
+            USERGUIDS % 337,
+            USERGUIDS % 338,
+            USERGUIDS % 339,
+            USERGUIDS % 340,
+            USERGUIDS % 341,
+            USERGUIDS % 342,
+            USERGUIDS % 343,
+            USERGUIDS % 344,
+            USERGUIDS % 345,
+            USERGUIDS % 346,
+            USERGUIDS % 347,
+            USERGUIDS % 348,
+            USERGUIDS % 349,
+            USERGUIDS % 350,
+            USERGUIDS % 351,
+            USERGUIDS % 352,
+            USERGUIDS % 353,
+            USERGUIDS % 354,
+            USERGUIDS % 355,
+            USERGUIDS % 356,
+            USERGUIDS % 357,
+            USERGUIDS % 358,
+            USERGUIDS % 359,
+            USERGUIDS % 360,
+            USERGUIDS % 361,
+            USERGUIDS % 362,
+            USERGUIDS % 363,
+            USERGUIDS % 364,
+            USERGUIDS % 365,
+            USERGUIDS % 366,
+            USERGUIDS % 367,
+            USERGUIDS % 368,
+            USERGUIDS % 369,
+            USERGUIDS % 370,
+            USERGUIDS % 371,
+            USERGUIDS % 372,
+            USERGUIDS % 373,
+            USERGUIDS % 374,
+            USERGUIDS % 375,
+            USERGUIDS % 376,
+            USERGUIDS % 377,
+            USERGUIDS % 378,
+            USERGUIDS % 379,
+            USERGUIDS % 380,
+            USERGUIDS % 381,
+            USERGUIDS % 382,
+            USERGUIDS % 383,
+            USERGUIDS % 384,
+            USERGUIDS % 385,
+            USERGUIDS % 386,
+            USERGUIDS % 387,
+            USERGUIDS % 388,
+            USERGUIDS % 389,
+            USERGUIDS % 390,
+            USERGUIDS % 391,
+            USERGUIDS % 392,
+            USERGUIDS % 393,
+            USERGUIDS % 394,
+            USERGUIDS % 395,
+            USERGUIDS % 396,
+            USERGUIDS % 397,
+            USERGUIDS % 398,
+            USERGUIDS % 399,
+            USERGUIDS % 400,
+            USERGUIDS % 401,
+            USERGUIDS % 402,
+            USERGUIDS % 403,
+            USERGUIDS % 404,
+            USERGUIDS % 405,
+            USERGUIDS % 406,
+            USERGUIDS % 407,
+            USERGUIDS % 408,
+            USERGUIDS % 409,
+            USERGUIDS % 410,
+            USERGUIDS % 411,
+            USERGUIDS % 412,
+            USERGUIDS % 413,
+            USERGUIDS % 414,
+            USERGUIDS % 415,
+            USERGUIDS % 416,
+            USERGUIDS % 417,
+            USERGUIDS % 418,
+            USERGUIDS % 419,
+            USERGUIDS % 420,
+            USERGUIDS % 421,
+            USERGUIDS % 422,
+            USERGUIDS % 423,
+            USERGUIDS % 424,
+            USERGUIDS % 425,
+            USERGUIDS % 426,
+            USERGUIDS % 427,
+            USERGUIDS % 428,
+            USERGUIDS % 429,
+            USERGUIDS % 430,
+            USERGUIDS % 431,
+            USERGUIDS % 432,
+            USERGUIDS % 433,
+            USERGUIDS % 434,
+            USERGUIDS % 435,
+            USERGUIDS % 436,
+            USERGUIDS % 437,
+            USERGUIDS % 438,
+            USERGUIDS % 439,
+            USERGUIDS % 440,
+            USERGUIDS % 441,
+            USERGUIDS % 442,
+            USERGUIDS % 443,
+            USERGUIDS % 444,
+            USERGUIDS % 445,
+            USERGUIDS % 446,
+            USERGUIDS % 447,
+            USERGUIDS % 448,
+            USERGUIDS % 449,
+            USERGUIDS % 450,
+            USERGUIDS % 451,
+            USERGUIDS % 452,
+            USERGUIDS % 453,
+            USERGUIDS % 454,
+            USERGUIDS % 455,
+            USERGUIDS % 456,
+            USERGUIDS % 457,
+            USERGUIDS % 458,
+            USERGUIDS % 459,
+            USERGUIDS % 460,
+            USERGUIDS % 461,
+            USERGUIDS % 462,
+            USERGUIDS % 463,
+            USERGUIDS % 464,
+            USERGUIDS % 465,
+            USERGUIDS % 466,
+            USERGUIDS % 467,
+            USERGUIDS % 468,
+            USERGUIDS % 469,
+            USERGUIDS % 470,
+            USERGUIDS % 471,
+            USERGUIDS % 472,
+            USERGUIDS % 473,
+            USERGUIDS % 474,
+            USERGUIDS % 475,
+            USERGUIDS % 476,
+            USERGUIDS % 477,
+            USERGUIDS % 478,
+            USERGUIDS % 479,
+            USERGUIDS % 480,
+            USERGUIDS % 481,
+            USERGUIDS % 482,
+            USERGUIDS % 483,
+            USERGUIDS % 484,
+            USERGUIDS % 485,
+            USERGUIDS % 486,
+            USERGUIDS % 487,
+            USERGUIDS % 488,
+            USERGUIDS % 489,
+            USERGUIDS % 490,
+            USERGUIDS % 491,
+            USERGUIDS % 492,
+            USERGUIDS % 493,
+            USERGUIDS % 494,
+            USERGUIDS % 495,
+            USERGUIDS % 496,
+            USERGUIDS % 497,
+            USERGUIDS % 498,
+            USERGUIDS % 499,
+            USERGUIDS % 500,
+        ),
+    })
</ins><span class="cx"> 
</span><span class="cx"> for i in xrange(1, 101):
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcontriboddsattributespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/od/dsattributes.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/od/dsattributes.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/od/dsattributes.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-##
</del><ins>+# #
</ins><span class="cx"> # Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</span><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><del>-##
</del><ins>+# #
</ins><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> Record types and attribute names from Directory Service.
</span><span class="lines">@@ -21,22 +21,22 @@
</span><span class="cx"> 
</span><span class="cx"> # Specific match types
</span><span class="cx"> 
</span><del>-eDSExact             =    0x2001
-eDSStartsWith        =    0x2002
-eDSEndsWith          =    0x2003
-eDSContains          =    0x2004
</del><ins>+eDSExact = 0x2001
+eDSStartsWith = 0x2002
+eDSEndsWith = 0x2003
+eDSContains = 0x2004
</ins><span class="cx"> 
</span><del>-eDSLessThan          =    0x2005
-eDSGreaterThan       =    0x2006
-eDSLessEqual         =    0x2007
-eDSGreaterEqual      =    0x2008
</del><ins>+eDSLessThan = 0x2005
+eDSGreaterThan = 0x2006
+eDSLessEqual = 0x2007
+eDSGreaterEqual = 0x2008
</ins><span class="cx"> 
</span><span class="cx"> # Specific Record Type Constants
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  DirectoryService Specific Record Type Constants
</span><span class="cx"> &quot;&quot;&quot;
</span><del>- 
</del><ins>+
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSStdRecordTypeAccessControls
</span><span class="cx">   Record type that contains directory access control directives.
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSStdRecordTypeFileMakerServers
</span><del>-  FileMaker servers record type. Describes available FileMaker servers, 
</del><ins>+  FileMaker servers record type. Describes available FileMaker servers,
</ins><span class="cx">   used for service discovery.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSStdRecordTypeFileMakerServers = &quot;dsRecTypeStandard:FileMakerServers&quot;
</span><span class="lines">@@ -392,15 +392,15 @@
</span><span class="cx"> 
</span><span class="cx">         eDSNxxxxxx  Multi-Valued Attribute
</span><span class="cx"> 
</span><del>-    NOTE #1: Access controls may prevent any particular client from reading/writting
</del><ins>+    NOTE #1: Access controls may prevent any particular client from reading/writing
</ins><span class="cx">             various attribute types.  In addition some attribute types may not be stored at
</span><span class="cx">             all and could also represent &quot;real-time&quot; data generated by the directory node
</span><span class="cx">             plug-in.
</span><span class="cx"> 
</span><span class="cx">     NOTE #2: Attributes in the model are available for records and directory nodes.
</span><span class="cx"> &quot;&quot;&quot;
</span><del>- 
</del><span class="cx"> 
</span><ins>+
</ins><span class="cx"> # Single Valued Specific Attribute Type Constants
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -458,7 +458,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrBootFile
</span><del>- Attribute type in host or machine records for the name of the 
</del><ins>+ Attribute type in host or machine records for the name of the
</ins><span class="cx">         kernel that this machine will use by default when NetBooting.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrBootFile = &quot;dsAttrTypeStandard:BootFile&quot;
</span><span class="lines">@@ -480,8 +480,8 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrCapacity
</span><del>- Attribute type for the capacity of a resource. 
-     found in resource records (kDSStdRecordTypeResources). 
</del><ins>+ Attribute type for the capacity of a resource.
+     found in resource records (kDSStdRecordTypeResources).
</ins><span class="cx">     Example: 50
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrCapacity = &quot;dsAttrTypeStandard:Capacity&quot;
</span><span class="lines">@@ -514,14 +514,14 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrContactGUID
</span><del>- Attribute type for the contact GUID of a group. 
-     found in group records (kDSStdRecordTypeGroups). 
</del><ins>+ Attribute type for the contact GUID of a group.
+     found in group records (kDSStdRecordTypeGroups).
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrContactGUID = &quot;dsAttrTypeStandard:ContactGUID&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrContactPerson
</span><del>- Attribute type for the contact person of the machine. 
</del><ins>+ Attribute type for the contact person of the machine.
</ins><span class="cx">         Found in host or machine records.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrContactPerson = &quot;dsAttrTypeStandard:ContactPerson&quot;
</span><span class="lines">@@ -535,7 +535,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrCrossCertificatePair
</span><del>- Attribute containing the binary of a pair of certificates which 
</del><ins>+ Attribute containing the binary of a pair of certificates which
</ins><span class="cx">  verify each other.  Both certificates have the same level of authority.
</span><span class="cx">  Usually found in kDSStdRecordTypeCertificateAuthority records.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -587,7 +587,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrGeneratedUID
</span><del>- Used for 36 character (128 bit) unique ID. Usually found in user, 
</del><ins>+ Used for 36 character (128 bit) unique ID. Usually found in user,
</ins><span class="cx">  group, and computer records. An example value is &quot;A579E95E-CDFE-4EBC-B7E7-F2158562170F&quot;.
</span><span class="cx">  The standard format contains 32 hex characters and four hyphen characters.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -678,7 +678,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrMetaAutomountMap
</span><del>- Used to query for kDSStdRecordTypeAutomount entries associated with a specific 
</del><ins>+ Used to query for kDSStdRecordTypeAutomount entries associated with a specific
</ins><span class="cx">  kDSStdRecordTypeAutomountMap.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrMetaAutomountMap = &quot;dsAttrTypeStandard:MetaAutomountMap&quot;
</span><span class="lines">@@ -728,15 +728,15 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrOwner
</span><del>- Attribute type for the owner of a record. 
</del><ins>+ Attribute type for the owner of a record.
</ins><span class="cx">         Typically the value is a LDAP distinguished name.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrOwner = &quot;dsAttrTypeStandard:Owner&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrOwnerGUID
</span><del>- Attribute type for the owner GUID of a group. 
-     found in group records (kDSStdRecordTypeGroups). 
</del><ins>+ Attribute type for the owner GUID of a group.
+     found in group records (kDSStdRecordTypeGroups).
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrOwnerGUID = &quot;dsAttrTypeStandard:OwnerGUID&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -796,7 +796,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrPrimaryComputerGUID
</span><del>- Single-valued attribute that defines a primary computer of the computer group.  
</del><ins>+ Single-valued attribute that defines a primary computer of the computer group.
</ins><span class="cx">  added via extensible object for computer group record type (kDSStdRecordTypeComputerGroups)
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrPrimaryComputerGUID = &quot;dsAttrTypeStandard:PrimaryComputerGUID&quot;
</span><span class="lines">@@ -809,7 +809,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrPrimaryGroupID
</span><del>- This is the 32 bit unique ID that represents the primary group 
</del><ins>+ This is the 32 bit unique ID that represents the primary group
</ins><span class="cx">  a user is part of, or the ID of a group. Format is a signed 32 bit integer
</span><span class="cx">  represented as a string.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -860,7 +860,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrPrinterXRISupported
</span><span class="cx">  Multi-valued attribute that defines additional URIs supported by a printer.
</span><del>-              This is used when configuring a printer. This attribute is based on the IPP 
</del><ins>+              This is used when configuring a printer. This attribute is based on the IPP
</ins><span class="cx">                 Printing Specification RFC and IETF IPP-LDAP Printer Record.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrPrinterXRISupported = &quot;dsAttrTypeStandard:PrinterXRISupported&quot;
</span><span class="lines">@@ -912,14 +912,14 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrSMBHome
</span><del>- 
</del><ins>+
</ins><span class="cx">      UNC address of Windows homedirectory mount point (\\server\\sharepoint).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrSMBHome = &quot;dsAttrTypeStandard:SMBHome&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrSMBHomeDrive
</span><del>- 
</del><ins>+
</ins><span class="cx">      Drive letter for homedirectory mount point.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrSMBHomeDrive = &quot;dsAttrTypeStandard:SMBHomeDrive&quot;
</span><span class="lines">@@ -977,7 +977,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrSMBSID
</span><span class="cx">  SMB Security ID, stored as a string attribute of up to 64 bytes.
</span><del>-    Found in user, group, and computer records (kDSStdRecordTypeUsers, 
</del><ins>+    Found in user, group, and computer records (kDSStdRecordTypeUsers,
</ins><span class="cx">     kDSStdRecordTypeGroups, kDSStdRecordTypeComputers).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrSMBSID = &quot;dsAttrTypeStandard:SMBSID&quot;
</span><span class="lines">@@ -991,7 +991,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrServiceType
</span><span class="cx">  Represents the service type for the service.  This is the raw service type of the
</span><del>-     service.  For example a service record type of kDSStdRecordTypeWebServer 
</del><ins>+     service.  For example a service record type of kDSStdRecordTypeWebServer
</ins><span class="cx">      might have a service type of &quot;http&quot; or &quot;https&quot;.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrServiceType = &quot;dsAttrTypeStandard:ServiceType&quot;
</span><span class="lines">@@ -1023,7 +1023,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrTimeToLive
</span><span class="cx">  Attribute recommending how long to cache the record's attribute values.
</span><del>- Format is an unsigned 32 bit representing seconds. ie. 300 is 5 minutes.
</del><ins>+ Format is an unsigned 32 bit representing seconds. i.e. 300 is 5 minutes.
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrTimeToLive = &quot;dsAttrTypeStandard:TimeToLive&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -1038,14 +1038,14 @@
</span><span class="cx">  kDS1AttrUserCertificate
</span><span class="cx">  Attribute containing the binary of the user's certificate.
</span><span class="cx">  Usually found in user records. The certificate is data which identifies a user.
</span><del>- This data is attested to by a known party, and can be independently verified 
</del><ins>+ This data is attested to by a known party, and can be independently verified
</ins><span class="cx">  by a third party.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrUserCertificate = &quot;dsAttrTypeStandard:UserCertificate&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrUserPKCS12Data
</span><del>- Attribute containing binary data in PKCS #12 format. 
</del><ins>+ Attribute containing binary data in PKCS #12 format.
</ins><span class="cx">  Usually found in user records. The value can contain keys, certificates,
</span><span class="cx">  and other related information and is encrypted with a passphrase.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -1061,7 +1061,7 @@
</span><span class="cx">  kDS1AttrUserSMIMECertificate
</span><span class="cx">  Attribute containing the binary of the user's SMIME certificate.
</span><span class="cx">  Usually found in user records. The certificate is data which identifies a user.
</span><del>- This data is attested to by a known party, and can be independently verified 
</del><ins>+ This data is attested to by a known party, and can be independently verified
</ins><span class="cx">  by a third party. SMIME certificates are often used for signed or encrypted
</span><span class="cx">  emails.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -1094,7 +1094,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrWeblogURI
</span><span class="cx">  Single-valued attribute that defines the URI of a user's weblog.
</span><del>-    Usually found in user records (kDSStdRecordTypeUsers). 
</del><ins>+    Usually found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx">     Example: http://example.com/blog/jsmith
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDS1AttrWeblogURI = &quot;dsAttrTypeStandard:WeblogURI&quot;
</span><span class="lines">@@ -1193,7 +1193,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrBuilding
</span><span class="cx">  Represents the building name for a user or person record.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrBuilding = &quot;dsAttrTypeStandard:Building&quot;
</span><span class="lines">@@ -1207,7 +1207,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrCity
</span><span class="cx">  Usually, city for a user or person record.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrCity = &quot;dsAttrTypeStandard:City&quot;
</span><span class="lines">@@ -1235,7 +1235,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrCountry
</span><span class="cx">  Represents country of a record entry.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrCountry = &quot;dsAttrTypeStandard:Country&quot;
</span><span class="lines">@@ -1243,7 +1243,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrDepartment
</span><span class="cx">  Represents the department name of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrDepartment = &quot;dsAttrTypeStandard:Department&quot;
</span><span class="lines">@@ -1263,7 +1263,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrEMailContacts
</span><span class="cx">  multi-valued attribute that defines a record's custom email addresses .
</span><del>-     found in user records (kDSStdRecordTypeUsers). 
</del><ins>+     found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx">     Example: home:johndoe@mymail.com
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrEMailContacts = &quot;dsAttrTypeStandard:EMailContacts&quot;
</span><span class="lines">@@ -1271,7 +1271,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrFaxNumber
</span><span class="cx">  Represents the FAX numbers of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrFaxNumber = &quot;dsAttrTypeStandard:FAXNumber&quot;
</span><span class="lines">@@ -1297,7 +1297,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrGroupServices
</span><span class="cx">  xml-plist attribute that defines a group's services .
</span><del>-     found in group records (kDSStdRecordTypeGroups). 
</del><ins>+     found in group records (kDSStdRecordTypeGroups).
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrGroupServices = &quot;dsAttrTypeStandard:GroupServices&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -1336,9 +1336,9 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">     kDSNAttrIPAddressAndENetAddress
</span><del>- A pairing of IPv4 or IPv6 addresses with Ethernet addresses 
- (e.g., &quot;10.1.1.1/00:16:cb:92:56:41&quot;).  Usually found on kDSStdRecordTypeComputers for use by 
- services that need specific pairing of the two values.  This should be in addition to 
</del><ins>+ A pairing of IPv4 or IPv6 addresses with Ethernet addresses
+ (e.g., &quot;10.1.1.1/00:16:cb:92:56:41&quot;).  Usually found on kDSStdRecordTypeComputers for use by
+ services that need specific pairing of the two values.  This should be in addition to
</ins><span class="cx">  kDSNAttrIPAddress, kDSNAttrIPv6Address and kDS1AttrENetAddress. This is necessary because not
</span><span class="cx">  all directories return attribute values in a guaranteed order.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -1347,15 +1347,15 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrIPv6Address
</span><span class="cx">  IPv6 address expressed in the standard notation (e.g., &quot;fe80::236:caff:fcc2:5641&quot; )
</span><del>- Usually found on kDSStdRecordTypeComputers, kDSStdRecordTypeHosts, and 
</del><ins>+ Usually found on kDSStdRecordTypeComputers, kDSStdRecordTypeHosts, and
</ins><span class="cx">  kDSStdRecordTypeMachines.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrIPv6Address = &quot;dsAttrTypeStandard:IPv6Address&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrJPEGPhoto
</span><del>- Used to store binary picture data in JPEG format. 
- Usually found in user, people or group records (kDSStdRecordTypeUsers, 
</del><ins>+ Used to store binary picture data in JPEG format.
+ Usually found in user, people or group records (kDSStdRecordTypeUsers,
</ins><span class="cx">  kDSStdRecordTypePeople, kDSStdRecordTypeGroups).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrJPEGPhoto = &quot;dsAttrTypeStandard:JPEGPhoto&quot;
</span><span class="lines">@@ -1363,7 +1363,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrJobTitle
</span><span class="cx">  Represents the job title of a user.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrJobTitle = &quot;dsAttrTypeStandard:JobTitle&quot;
</span><span class="lines">@@ -1394,7 +1394,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrMachineServes
</span><del>- Attribute type in host or machine records for storing NetInfo 
</del><ins>+ Attribute type in host or machine records for storing NetInfo
</ins><span class="cx">         domains served.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrMachineServes = &quot;dsAttrTypeStandard:MachineServes&quot;
</span><span class="lines">@@ -1410,7 +1410,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrMapURI
</span><span class="cx">  attribute that defines the URI of a user's location.
</span><del>-    Usually found in user records (kDSStdRecordTypeUsers). 
</del><ins>+    Usually found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx">     Example: http://example.com/bldg1
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrMapURI = &quot;dsAttrTypeStandard:MapURI&quot;
</span><span class="lines">@@ -1423,20 +1423,20 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrMIME
</span><del>- Data contained in this attribute type is a fully qualified MIME Type. 
</del><ins>+ Data contained in this attribute type is a fully qualified MIME Type.
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrMIME = &quot;dsAttrTypeStandard:MIME&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrMember
</span><del>- List of member records. 
</del><ins>+ List of member records.
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrMember = &quot;dsAttrTypeStandard:Member&quot;
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrMobileNumber
</span><span class="cx">  Represents the mobile numbers of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrMobileNumber = &quot;dsAttrTypeStandard:MobileNumber&quot;
</span><span class="lines">@@ -1463,7 +1463,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrNickName
</span><span class="cx">  Represents the nickname of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrNickName = &quot;dsAttrTypeStandard:NickName&quot;
</span><span class="lines">@@ -1490,7 +1490,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrPagerNumber
</span><span class="cx">  Represents the pager numbers of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrPagerNumber = &quot;dsAttrTypeStandard:PagerNumber&quot;
</span><span class="lines">@@ -1498,7 +1498,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrPhoneContacts
</span><span class="cx">  multi-valued attribute that defines a record's custom phone numbers .
</span><del>-     found in user records (kDSStdRecordTypeUsers). 
</del><ins>+     found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx">     Example: home fax:408-555-4444
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrPhoneContacts = &quot;dsAttrTypeStandard:PhoneContacts&quot;
</span><span class="lines">@@ -1539,7 +1539,7 @@
</span><span class="cx">  kDSNAttrNamePrefix
</span><span class="cx">  Represents the title prefix of a user or person.
</span><span class="cx">  ie. Mr., Ms., Mrs., Dr., etc.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrNamePrefix = &quot;dsAttrTypeStandard:NamePrefix&quot;
</span><span class="lines">@@ -1559,7 +1559,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrRelationships
</span><span class="cx">  multi-valued attribute that defines the relationship to the record type .
</span><del>-     found in user records (kDSStdRecordTypeUsers). 
</del><ins>+     found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx">     Example: brother:John
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrRelationships = &quot;dsAttrTypeStandard:Relationships&quot;
</span><span class="lines">@@ -1572,8 +1572,8 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrResourceType
</span><del>- Attribute type for the kind of resource. 
-     found in resource records (kDSStdRecordTypeResources). 
</del><ins>+ Attribute type for the kind of resource.
+     found in resource records (kDSStdRecordTypeResources).
</ins><span class="cx">     Example: ConferenceRoom
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrResourceType = &quot;dsAttrTypeStandard:ResourceType&quot;
</span><span class="lines">@@ -1593,7 +1593,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDSNAttrStreet
</span><span class="cx">  Represents the street address of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrStreet = &quot;dsAttrTypeStandard:Street&quot;
</span><span class="lines">@@ -1602,7 +1602,7 @@
</span><span class="cx">  kDSNAttrNameSuffix
</span><span class="cx">  Represents the name suffix of a user or person.
</span><span class="cx">  ie. Jr., Sr., etc.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or 
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx">  kDSStdRecordTypePeople).
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrNameSuffix = &quot;dsAttrTypeStandard:NameSuffix&quot;
</span><span class="lines">@@ -1837,7 +1837,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  Search Node attribute type Constants
</span><span class="cx"> &quot;&quot;&quot;
</span><del>- 
</del><ins>+
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">  kDS1AttrSearchPath
</span><span class="cx">  Search path used by the search node.
</span><span class="lines">@@ -1891,4 +1891,3 @@
</span><span class="cx">  Retained only for backward compatibility.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> kDSNAttrCSPSearchPath = &quot;dsAttrTypeStandard:CSPSearchPath&quot;
</span><del>-
</del></span></pre></div>
<a id="CalendarServertrunkcontribododframeworkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/od/odframework.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/od/odframework.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/od/odframework.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1,8 +1,10 @@
</span><span class="cx"> import objc as _objc
</span><span class="cx"> 
</span><del>-__bundle__ = _objc.initFrameworkWrapper(&quot;OpenDirectory&quot;,
</del><ins>+__bundle__ = _objc.initFrameworkWrapper(
+    &quot;OpenDirectory&quot;,
</ins><span class="cx">     frameworkIdentifier=&quot;com.apple.OpenDirectory&quot;,
</span><span class="cx">     frameworkPath=_objc.pathForFramework(
</span><del>-    &quot;/System/Library/Frameworks/OpenDirectory.framework&quot;),
-    globals=globals())
-
</del><ins>+        &quot;/System/Library/Frameworks/OpenDirectory.framework&quot;
+    ),
+    globals=globals()
+)
</ins></span></pre></div>
<a id="CalendarServertrunkcontribperformance_event_createpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/_event_create.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/_event_create.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/_event_create.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -119,8 +119,8 @@
</span><span class="cx">             'ORGANIZER': makeOrganizer(organizerSequence),
</span><span class="cx">             'ATTENDEES': ''.join(attendees),
</span><span class="cx">             'RRULE': rrule,
</span><del>-            },
-        }
</del><ins>+        },
+    }
</ins><span class="cx">     return cal.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchlibpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchlib.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchlib.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchlib.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -88,8 +88,8 @@
</span><span class="cx">         root=root, principal=principal)
</span><span class="cx">     cal = &quot;/calendars/users/%s/%s/&quot; % (user, calendar)
</span><span class="cx">     d = _serial([
</span><del>-            (account.deleteResource, (cal,)),
-            (account.makeCalendar, (cal,))])
</del><ins>+        (account.deleteResource, (cal,)),
+        (account.makeCalendar, (cal,))])
</ins><span class="cx">     d.addCallback(lambda ignored: account)
</span><span class="cx">     return d
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmark.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmark.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmark.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -211,7 +211,7 @@
</span><span class="cx">             SQLDuration('execute'): self._execute, # Time spent in the execute phase of SQL execution
</span><span class="cx">             SQLDuration('iternext'): self._iternext, # Time spent fetching rows from the execute phase
</span><span class="cx">             SQLDuration('SQL'): self._execute + self._iternext, # Combination of the previous two
</span><del>-            }
</del><ins>+        }
</ins><span class="cx">         self._init_stats()
</span><span class="cx">         return results
</span><span class="cx"> 
</span><span class="lines">@@ -370,11 +370,11 @@
</span><span class="cx">         ('label', 'l', 'data', 'A descriptive string to attach to the output filename.'),
</span><span class="cx">         ('hosts-count', None, None, 'For distributed benchmark collection, the number of hosts participating in collection.', int),
</span><span class="cx">         ('host-index', None, None, 'For distributed benchmark collection, the (zero-based) index of this host in the collection.', int),
</span><del>-        ]
</del><ins>+    ]
</ins><span class="cx"> 
</span><span class="cx">     optFlags = [
</span><span class="cx">         ('debug', None, 'Enable various debugging helpers'),
</span><del>-        ]
</del><ins>+    ]
</ins><span class="cx"> 
</span><span class="cx">     def __init__(self):
</span><span class="cx">         Options.__init__(self)
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarksfind_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmarks/find_events.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmarks/find_events.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmarks/find_events.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">                 StringProducer(event))
</span><span class="cx">     worker = worker()
</span><span class="cx">     return gatherResults([
</span><del>-            cooperate(worker).whenDone() for _ignore_i in range(3)])
</del><ins>+        cooperate(worker).whenDone() for _ignore_i in range(3)])
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarksvfreebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -110,8 +110,8 @@
</span><span class="cx">             'START': formatDate(base + i * interval),
</span><span class="cx">             'END': formatDate(base + i * interval + duration),
</span><span class="cx">             'SEQUENCE': i,
</span><del>-            },
-        }
</del><ins>+        },
+    }
</ins><span class="cx">     return data.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -149,17 +149,17 @@
</span><span class="cx">     method = 'POST'
</span><span class="cx">     uri = 'http://%s:%d/calendars/__uids__/%s/outbox/' % (host, port, user)
</span><span class="cx">     headers = Headers({
</span><del>-            &quot;content-type&quot;: [&quot;text/calendar&quot;],
-            &quot;originator&quot;: [&quot;mailto:%s@example.com&quot; % (user,)],
-            &quot;recipient&quot;: [&quot;urn:x-uid:%s, urn:x-uid:10000000-0000-0000-0000-000000000002&quot; % (uid,)]})
</del><ins>+        &quot;content-type&quot;: [&quot;text/calendar&quot;],
+        &quot;originator&quot;: [&quot;mailto:%s@example.com&quot; % (user,)],
+        &quot;recipient&quot;: [&quot;urn:x-uid:%s, urn:x-uid:10000000-0000-0000-0000-000000000002&quot; % (uid,)]})
</ins><span class="cx"> 
</span><span class="cx">     vfb = VFREEBUSY % {
</span><del>-            &quot;attendees&quot;: &quot;&quot;.join([
-                    &quot;ATTENDEE:urn:x-uid:%s\n&quot; % (uid,),
-                    &quot;ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000002\n&quot;]),
-            &quot;start&quot;: formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
-            &quot;end&quot;: formatDate(
-                baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'}
</del><ins>+        &quot;attendees&quot;: &quot;&quot;.join([
+            &quot;ATTENDEE:urn:x-uid:%s\n&quot; % (uid,),
+            &quot;ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000002\n&quot;]),
+        &quot;start&quot;: formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
+        &quot;end&quot;: formatDate(
+            baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'}
</ins><span class="cx">     body = StringProducer(vfb.replace(&quot;\n&quot;, &quot;\r\n&quot;))
</span><span class="cx"> 
</span><span class="cx">     samples = yield sample(
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarksvfreebusy_vary_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -78,16 +78,16 @@
</span><span class="cx">     method = 'POST'
</span><span class="cx">     uri = 'http://%s:%d/calendars/__uids__/10000000-0000-0000-0000-000000000001/outbox/' % (host, port)
</span><span class="cx">     headers = Headers({
</span><del>-            &quot;content-type&quot;: [&quot;text/calendar&quot;],
-            &quot;originator&quot;: [&quot;mailto:%s@example.com&quot; % (user,)],
-            &quot;recipient&quot;: [&quot;, &quot;.join([&quot;urn:x-uid:10000000-0000-0000-0000-000000000%03d&quot; % (i,) for i in [userNumber] + targets])]})
</del><ins>+        &quot;content-type&quot;: [&quot;text/calendar&quot;],
+        &quot;originator&quot;: [&quot;mailto:%s@example.com&quot; % (user,)],
+        &quot;recipient&quot;: [&quot;, &quot;.join([&quot;urn:x-uid:10000000-0000-0000-0000-000000000%03d&quot; % (i,) for i in [userNumber] + targets])]})
</ins><span class="cx">     body = StringProducer(VFREEBUSY % {
</span><del>-            &quot;attendees&quot;: &quot;&quot;.join([
-                    &quot;ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000%03d\n&quot; % (i,)
-                    for i in [userNumber] + targets]),
-            &quot;start&quot;: formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
-            &quot;end&quot;: formatDate(
-                baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'})
</del><ins>+        &quot;attendees&quot;: &quot;&quot;.join([
+            &quot;ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000%03d\n&quot; % (i,)
+            for i in [userNumber] + targets]),
+        &quot;start&quot;: formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
+        &quot;end&quot;: formatDate(
+            baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'})
</ins><span class="cx"> 
</span><span class="cx">     samples = yield sample(
</span><span class="cx">         dtrace, samples,
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformanceeventkitframeworkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/eventkitframework.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/eventkitframework.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/eventkitframework.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1,7 +1,10 @@
</span><span class="cx"> import objc as _objc
</span><span class="cx"> 
</span><del>-__bundle__ = _objc.initFrameworkWrapper(&quot;EventKit&quot;,
</del><ins>+__bundle__ = _objc.initFrameworkWrapper(
+    &quot;EventKit&quot;,
</ins><span class="cx">     frameworkIdentifier=&quot;com.apple.EventKit&quot;,
</span><span class="cx">     frameworkPath=_objc.pathForFramework(
</span><del>-    &quot;/System/Library/Frameworks/EventKit.framework&quot;),
-    globals=globals())
</del><ins>+        &quot;/System/Library/Frameworks/EventKit.framework&quot;
+    ),
+    globals=globals()
+)
</ins></span></pre></div>
<a id="CalendarServertrunkcontribperformancehttpauthpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/httpauth.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/httpauth.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/httpauth.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx">         challengeType = {
</span><span class="cx">             'basic': BasicChallenge,
</span><span class="cx">             'digest': DigestChallenge,
</span><del>-            }.get(scheme.lower())
</del><ins>+        }.get(scheme.lower())
</ins><span class="cx">         if challengeType is None:
</span><span class="cx">             return &quot;&quot;, None
</span><span class="cx">         return scheme.lower(), challengeType(**args)
</span><span class="lines">@@ -125,7 +125,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 authorization = headers.getRawHeaders('authorization')
</span><span class="cx">             msg(&quot;UNAUTHORIZED response to %s %s (Authorization=%r)&quot; % (
</span><del>-                    method, uri, authorization))
</del><ins>+                method, uri, authorization))
</ins><span class="cx">             # Look for a challenge
</span><span class="cx">             authorization = response.headers.getRawHeaders('www-authenticate')
</span><span class="cx">             if authorization is None:
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancestatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/stats.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/stats.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/stats.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -96,11 +96,11 @@
</span><span class="cx"> 
</span><span class="cx">     def summarize(self, data):
</span><span class="cx">         return ''.join([
</span><del>-                self.name, ' mean ', str(mean(data)), '\n',
-                self.name, ' median ', str(median(data)), '\n',
-                self.name, ' stddev ', str(stddev(data)), '\n',
-                self.name, ' median absolute deviation ', str(mad(data)), '\n',
-                self.name, ' sum ', str(sum(data)), '\n'])
</del><ins>+            self.name, ' mean ', str(mean(data)), '\n',
+            self.name, ' median ', str(median(data)), '\n',
+            self.name, ' stddev ', str(stddev(data)), '\n',
+            self.name, ' median absolute deviation ', str(mad(data)), '\n',
+            self.name, ' sum ', str(sum(data)), '\n'])
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def write(self, basename, data):
</span><span class="lines">@@ -178,9 +178,9 @@
</span><span class="cx">                 total += interval
</span><span class="cx">             times.append(total / NANO * 1000)
</span><span class="cx">         return ''.join([
</span><del>-                '%d: %s\n' % (count, statement)
-                for (statement, count)
-                in statements.iteritems()]) + _Statistic.summarize(self, times)
</del><ins>+            '%d: %s\n' % (count, statement)
+            for (statement, count)
+            in statements.iteritems()]) + _Statistic.summarize(self, times)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def statements(self, samples):
</span><span class="lines">@@ -230,7 +230,7 @@
</span><span class="cx">     discrete buckets (eg, as would be suitable for constructing a
</span><span class="cx">     histogram of the values).
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    #buckets = {}
</del><ins>+    # buckets = {}
</ins><span class="cx">     return []
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancetest_benchmarkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/test_benchmark.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/test_benchmark.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/test_benchmark.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -164,16 +164,16 @@
</span><span class="cx">         subset.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         self.options.parseOptions([
</span><del>-                &quot;--hosts-count=3&quot;, &quot;--host-index=0&quot;,
-                &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;])
</del><ins>+            &quot;--hosts-count=3&quot;, &quot;--host-index=0&quot;,
+            &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;])
</ins><span class="cx">         self.assertEquals(self.options['benchmarks'], [&quot;foo&quot;, &quot;quux&quot;])
</span><span class="cx"> 
</span><span class="cx">         self.options.parseOptions([
</span><del>-                &quot;--hosts-count=3&quot;, &quot;--host-index=1&quot;,
-                &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;])
</del><ins>+            &quot;--hosts-count=3&quot;, &quot;--host-index=1&quot;,
+            &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;])
</ins><span class="cx">         self.assertEquals(self.options['benchmarks'], [&quot;bar&quot;])
</span><span class="cx"> 
</span><span class="cx">         self.options.parseOptions([
</span><del>-                &quot;--hosts-count=3&quot;, &quot;--host-index=2&quot;,
-                &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;])
</del><ins>+            &quot;--hosts-count=3&quot;, &quot;--host-index=2&quot;,
+            &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;quux&quot;])
</ins><span class="cx">         self.assertEquals(self.options['benchmarks'], [&quot;baz&quot;])
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancetest_statspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/test_stats.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/test_stats.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/test_stats.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx">     # twisted.trial.unittest.FailTest: not equal:
</span><span class="cx">     # a = datetime.datetime(2011, 6, 4, 15, 30, tzinfo=&lt;DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD&gt;)
</span><span class="cx">     # b = datetime.datetime(2011, 6, 4, 19, 30, tzinfo=&lt;DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST&gt;)
</span><del>-    #test_workdistribution.todo = &quot;Somehow timezones mess this up&quot;
</del><ins>+    # test_workdistribution.todo = &quot;Somehow timezones mess this up&quot;
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def test_recurrencedistribution(self):
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformanceuploadpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/upload.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/upload.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/upload.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">          'Identifier for the file/benchmark/parameter'),
</span><span class="cx">         ('backend', None, None,
</span><span class="cx">          'Which storage backend produced this data.'),
</span><del>-        ]
</del><ins>+    ]
</ins><span class="cx"> 
</span><span class="cx">     def postOptions(self):
</span><span class="cx">         assert self['url']
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">         'std_dev': str(std_dev),
</span><span class="cx">         'max': str(max_value),
</span><span class="cx">         'min': str(min_value),
</span><del>-        }
</del><ins>+    }
</ins><span class="cx">     print('uploading', data)
</span><span class="cx">     agent = Agent(reactor)
</span><span class="cx">     d = agent.request('POST', url, None, StringProducer(urlencode(data)))
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsfakecalendardatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/fakecalendardata.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/fakecalendardata.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/fakecalendardata.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -211,7 +211,7 @@
</span><span class="cx"> 
</span><span class="cx">     vevents = []
</span><span class="cx">     for count, (recurring, attendees, date, hour) in enumerate(eventTypes):
</span><del>-        #print(recurring, attendees, date, hour)
</del><ins>+        # print(recurring, attendees, date, hour)
</ins><span class="cx">         vevents.append(makeVEVENT(recurring, attendees, date, hour, count + 1))
</span><span class="cx"> 
</span><span class="cx">     print(calendar_template % {&quot;VEVENTS&quot; : &quot;&quot;.join(vevents)})
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsmonitoranalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/monitoranalysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/monitoranalysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/monitoranalysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx"> 
</span><span class="cx">                     if reqs &lt;= 80:
</span><span class="cx">                         data.append((dtstamp, reqs, resp, lqnon, cpu))
</span><del>-                    #print(&quot;%s %d %d %d %d&quot; % (dtstamp, reqs, resp, lqnon, cpu))
</del><ins>+                    # print(&quot;%s %d %d %d %d&quot; % (dtstamp, reqs, resp, lqnon, cpu))
</ins><span class="cx">             except StopIteration:
</span><span class="cx">                 break
</span><span class="cx"> 
</span><span class="lines">@@ -120,8 +120,10 @@
</span><span class="cx">     plt.plot(x1, y1, &quot;b+&quot;, x2, y2, &quot;g+&quot;, x3, y3, &quot;y+&quot;)
</span><span class="cx"> 
</span><span class="cx">     if first:
</span><del>-        plt.legend(('ListenQ at zero', 'ListenQ &lt; 50', 'ListenQ &gt;= 50'),
-               'upper left', shadow=True, fancybox=True)
</del><ins>+        plt.legend(
+            ('ListenQ at zero', 'ListenQ &lt; 50', 'ListenQ &gt;= 50'),
+            'upper left', shadow=True, fancybox=True
+        )
</ins><span class="cx">     if last:
</span><span class="cx">         plt.xlabel(&quot;Requests/second&quot;)
</span><span class="cx">     plt.ylabel(&quot;Av. Response Time (ms)&quot;)
</span><span class="lines">@@ -156,8 +158,10 @@
</span><span class="cx">     )
</span><span class="cx"> 
</span><span class="cx">     if first:
</span><del>-        plt.legend(('CPU &lt; 1/4', 'CPU &lt; 1/2', 'CPU &lt; 3/4', &quot;CPU High&quot;),
-               'upper left', shadow=True, fancybox=True)
</del><ins>+        plt.legend(
+            ('CPU &lt; 1/4', 'CPU &lt; 1/2', 'CPU &lt; 3/4', &quot;CPU High&quot;),
+            'upper left', shadow=True, fancybox=True
+        )
</ins><span class="cx">     if last:
</span><span class="cx">         plt.xlabel(&quot;Requests/second&quot;)
</span><span class="cx">     plt.ylabel(&quot;Av. Response Time (ms)&quot;)
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolspg_stats_analysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/pg_stats_analysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/pg_stats_analysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/pg_stats_analysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -185,8 +185,8 @@
</span><span class="cx">                 entries.append(bits)
</span><span class="cx">                 if verbose and divmod(len(entries), 1000)[1] == 0:
</span><span class="cx">                     print(&quot;%d entries&quot; % (len(entries),))
</span><del>-                #if float(bits[COLUMN_total_time]) &gt; 1:
-                #    print(bits[COLUMN_total_time], bits[COLUMN_query])
</del><ins>+                # if float(bits[COLUMN_total_time]) &gt; 1:
+                #     print(bits[COLUMN_total_time], bits[COLUMN_query])
</ins><span class="cx"> 
</span><span class="cx">     if verbose:
</span><span class="cx">         print(&quot;Read %d entries&quot; % (len(entries,)))
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsprotocolanalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/protocolanalysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/protocolanalysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/protocolanalysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1039,14 +1039,14 @@
</span><span class="cx">             print(&quot;URI Counts&quot;)
</span><span class="cx">             self.printURICounts(doTabs)
</span><span class="cx"> 
</span><del>-            #print(&quot;User Interaction Counts&quot;)
-            #self.printUserInteractionCounts(doTabs)
</del><ins>+            # print(&quot;User Interaction Counts&quot;)
+            # self.printUserInteractionCounts(doTabs)
</ins><span class="cx"> 
</span><span class="cx">             print(&quot;User Weights (top 100)&quot;)
</span><span class="cx">             self.printUserWeights(doTabs)
</span><span class="cx"> 
</span><del>-            #print(&quot;User Response times&quot;)
-            #self.printUserResponseTimes(doTabs)
</del><ins>+            # print(&quot;User Response times&quot;)
+            # self.printUserResponseTimes(doTabs)
</ins><span class="cx"> 
</span><span class="cx">             print(&quot;Sim values&quot;)
</span><span class="cx">             self.printSimStats(doTabs)
</span><span class="lines">@@ -1555,10 +1555,10 @@
</span><span class="cx">     def printUserInteractionCounts(self, doTabs):
</span><span class="cx">         table = tables.Table()
</span><span class="cx">         table.setDefaultColumnFormats((
</span><del>-                tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                tables.Table.ColumnFormat(&quot;%0.2f&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                ))
</del><ins>+            tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+            tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+            tables.Table.ColumnFormat(&quot;%0.2f&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+        ))
</ins><span class="cx">         table.addHeader((&quot;# users accessed&quot;, &quot;# of users&quot;, &quot;% of users&quot;))
</span><span class="cx">         summary = self.summarizeUserInteraction(METHOD_PROPFIND_CALENDAR_HOME)
</span><span class="cx">         total = sum(summary.values())
</span><span class="lines">@@ -1574,11 +1574,11 @@
</span><span class="cx">         hours = self.timeCounts / self.resolutionMinutes / 60
</span><span class="cx">         table = tables.Table()
</span><span class="cx">         table.setDefaultColumnFormats((
</span><del>-                tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
-                ))
</del><ins>+            tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+            tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+            tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+            tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+        ))
</ins><span class="cx">         table.addHeader((&quot;Item&quot;, &quot;Value&quot;, &quot;Items, per User, per Day&quot;, &quot;Interval (sec), per item, per user&quot;))
</span><span class="cx">         table.addRow((&quot;Unique Users&quot;, users, &quot;&quot;, &quot;&quot;))
</span><span class="cx"> 
</span><span class="lines">@@ -1673,7 +1673,7 @@
</span><span class="cx">         self.printInfo(doTabs)
</span><span class="cx"> 
</span><span class="cx">         print(&quot;Load Analysis Differences&quot;)
</span><del>-        #self.printLoadAnalysisDetails(doTabs)
</del><ins>+        # self.printLoadAnalysisDetails(doTabs)
</ins><span class="cx">         self.printHourlyTotals(doTabs)
</span><span class="cx"> 
</span><span class="cx">         if not summary:
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsreadStatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/readStats.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/readStats.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/readStats.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -188,7 +188,7 @@
</span><span class="cx">         (&quot;&quot;, &quot;&quot;, &quot;per second&quot;, &quot;(ms)&quot;, &quot;no write(ms)&quot;, &quot;(ms)&quot;, &quot;Average&quot;, &quot;Average&quot;, &quot;&quot;),
</span><span class="cx">     )
</span><span class="cx">     table.setDefaultColumnFormats(
</span><del>-       (
</del><ins>+        (
</ins><span class="cx">             tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%.1f&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -235,7 +235,7 @@
</span><span class="cx">     )
</span><span class="cx">     max_column = 5
</span><span class="cx">     table.setDefaultColumnFormats(
</span><del>-       (
</del><ins>+        (
</ins><span class="cx">             tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%.1f&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -295,7 +295,7 @@
</span><span class="cx">         (&quot;&quot;, &quot;&lt;10ms&quot;, &quot;10ms&lt;-&gt;100ms&quot;, &quot;100ms&lt;-&gt;1s&quot;, &quot;1s&lt;-&gt;10s&quot;, &quot;10s&lt;-&gt;30s&quot;, &quot;30s&lt;-&gt;60s&quot;, &quot;&gt;60s&quot;, &quot;Over 1s&quot;, &quot;Over 10s&quot;),
</span><span class="cx">     )
</span><span class="cx">     table.setDefaultColumnFormats(
</span><del>-       (
</del><ins>+        (
</ins><span class="cx">             tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%d (%.1f%%)&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%d (%.1f%%)&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -358,7 +358,7 @@
</span><span class="cx">         (&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;(ms)&quot;, &quot;&quot;, &quot;&quot;),
</span><span class="cx">     )
</span><span class="cx">     table.setDefaultColumnFormats(
</span><del>-       (
</del><ins>+        (
</ins><span class="cx">             tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%.1f%%&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -453,7 +453,7 @@
</span><span class="cx">         (&quot;User-Agent&quot;, &quot;Total&quot;, &quot;Percentage&quot;),
</span><span class="cx">     )
</span><span class="cx">     table.setDefaultColumnFormats(
</span><del>-       (
</del><ins>+        (
</ins><span class="cx">             tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">             tables.Table.ColumnFormat(&quot;%.1f%%&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsrequest_monitorpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/request_monitor.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/request_monitor.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/request_monitor.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -511,7 +511,7 @@
</span><span class="cx">             (&quot;&quot;, &quot;&quot;, &quot;per second&quot;, &quot;(ms)&quot;, &quot;no write(ms)&quot;, &quot;(ms)&quot;, &quot;Average&quot;, &quot;Time&quot;, &quot;Time&quot;, &quot;&quot;),
</span><span class="cx">         )
</span><span class="cx">         table.setDefaultColumnFormats(
</span><del>-           (
</del><ins>+            (
</ins><span class="cx">                 tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.CENTER_JUSTIFY),
</span><span class="cx">                 tables.Table.ColumnFormat(&quot;%d&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">                 tables.Table.ColumnFormat(&quot;%.1f&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -599,7 +599,7 @@
</span><span class="cx">             (&quot;&quot;, &quot;&lt;10ms&quot;, &quot;10ms&lt;-&gt;100ms&quot;, &quot;100ms&lt;-&gt;1s&quot;, &quot;1s&lt;-&gt;10s&quot;, &quot;10s&lt;-&gt;30s&quot;, &quot;30s&lt;-&gt;60s&quot;, &quot;&gt;60s&quot;, &quot;Over 1s&quot;, &quot;Over 10s&quot;),
</span><span class="cx">         )
</span><span class="cx">         table.setDefaultColumnFormats(
</span><del>-           (
</del><ins>+            (
</ins><span class="cx">                 tables.Table.ColumnFormat(&quot;%s&quot;, tables.Table.ColumnFormat.CENTER_JUSTIFY),
</span><span class="cx">                 tables.Table.ColumnFormat(&quot;%d (%.1f%%)&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx">                 tables.Table.ColumnFormat(&quot;%d (%.1f%%)&quot;, tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsstatsanalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/statsanalysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/statsanalysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/statsanalysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -29,6 +29,8 @@
</span><span class="cx"> def safeDivision(value, total, factor=1):
</span><span class="cx">     return value * factor / total if total else 0
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> def analyze(fpath, title):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze a readStats data file.
</span><span class="lines">@@ -63,6 +65,7 @@
</span><span class="cx">     print(&quot;Read %d data points\n&quot; % (len(dataset[title]),))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def analyzeTableFormat(f, title):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze a &quot;table&quot; format output file. First line has already been tested.
</span><span class="lines">@@ -78,6 +81,7 @@
</span><span class="cx">             analyzeTableRecord(f, title)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def analyzeTableRecord(liter, title):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze one entry from the readStats data file.
</span><span class="lines">@@ -101,6 +105,7 @@
</span><span class="cx">             break
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def parseOverall(line):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Parse the &quot;Overall:&quot; stats summary line.
</span><span class="lines">@@ -130,6 +135,7 @@
</span><span class="cx">     return overall
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def parseMethods(liter):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Parse the &quot;Method Count&quot; table from a data file entry.
</span><span class="lines">@@ -160,6 +166,7 @@
</span><span class="cx">     return methods
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def analyzeJSONFormat(f, first, title):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze a JSON format output file. First line has already been tested.
</span><span class="lines">@@ -175,10 +182,11 @@
</span><span class="cx">             analyzeJSONRecord(line, title)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def analyzeJSONRecord(line, title):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze a JSON record.
</span><del>-    
</del><ins>+
</ins><span class="cx">     @param line: line of JSON data to parse
</span><span class="cx">     @type line: L{str}
</span><span class="cx">     @param title: title to use for data set
</span><span class="lines">@@ -197,6 +205,7 @@
</span><span class="cx">     analyzeJSONStatsMethods(allstats, title, seconds)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def analyzeJSONStatsSummary(allstats, title, seconds):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze all server JSON summary stats.
</span><span class="lines">@@ -233,6 +242,7 @@
</span><span class="cx">     dataset[title][seconds][&quot;Overall:Max. Response&quot;] = max(results[&quot;Max. Response&quot;])
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def analyzeJSONStatsMethods(allstats, title, seconds):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Analyze all server JSON method stats.
</span><span class="lines">@@ -268,6 +278,7 @@
</span><span class="cx">         dataset[title][seconds][&quot;Method:{}:Total Resp. %&quot;.format(method)] = safeDivision(method_times[method], total_response, 100.0)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def plotSeries(key, ymin=None, ymax=None):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Plot the chosen dataset key for each scanned data file.
</span><span class="lines">@@ -284,7 +295,7 @@
</span><span class="cx">     for title, data in sorted(dataset.items(), key=lambda x: x[0]):
</span><span class="cx">         titles.append(title)
</span><span class="cx">         x, y = zip(*[(k / 3600.0, v[key]) for k, v in sorted(data.items(), key=lambda x: x[0]) if key in v])
</span><del>-    
</del><ins>+
</ins><span class="cx">         plt.plot(x, y)
</span><span class="cx"> 
</span><span class="cx">     plt.xlabel(&quot;Hours&quot;)
</span><span class="lines">@@ -306,6 +317,7 @@
</span><span class="cx">     plt.show()
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def usage(error_msg=None):
</span><span class="cx">     if error_msg:
</span><span class="cx">         print(error_msg)
</span></span></pre>
</div>
</div>

</body>
</html>