<!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>[13309] CalendarServer/branches/users/sagen/newcua</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/13309">13309</a></dd>
<dt>Author</dt> <dd>sagen@apple.com</dd>
<dt>Date</dt> <dd>2014-04-17 11:25:57 -0700 (Thu, 17 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>New canonical CUA is urn:x-uid:&lt;uid&gt;; we can still look up by /principals/ CUAs, but we don't return them from record.calendarUserAddresses; we normalize CUAs within component( ) now</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertapcaldavpy">CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertoolscalverifypy">CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertoolspurgepy">CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertoolsshellcmdpy">CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertoolstesttest_calverifypy">CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertoolstesttest_purgepy">CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuacalendarservertoolstesttest_purge_old_eventspy">CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatwistedcaldavdirectorytesttest_principalpy">CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatwistedcaldavicalpy">CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatwistedcaldavtesttest_icalendarpy">CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatwistedcaldavtesttest_upgradepy">CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatwistedcaldavupgradepy">CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreschedulingimplicitpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreschedulingischeduledeliverypy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreschedulingtesttest_implicitpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoresqlpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretesttest_implicitpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretesttest_queue_schedulingpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretesttest_sqlpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretestutilpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreutilpy">CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavcommondatastoresql_schemacurrentsql">CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavwhodirectorypy">CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavwhotesttest_directorypy">CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcuatxdavwhotesttest_group_attendeespy">CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -603,6 +603,11 @@
</span><span class="cx">             self.store,
</span><span class="cx">             int(config.LogID) if config.LogID else 5
</span><span class="cx">         )
</span><ins>+        from calendarserver.tools.purge import scheduleNextPrincipalPurgeUpdate
+        yield scheduleNextPrincipalPurgeUpdate(
+            self.store,
+            int(config.LogID) if config.LogID else 5
+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertoolscalverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -40,7 +40,6 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-import base64
</del><span class="cx"> import collections
</span><span class="cx"> import sys
</span><span class="cx"> import time
</span><span class="lines">@@ -256,7 +255,6 @@
</span><span class="cx"> Options for --ical:
</span><span class="cx"> 
</span><span class="cx"> --badcua   : only look for bad calendar user addresses.
</span><del>---nobase64 : do not apply base64 encoding to CALENDARSERVER-OLD-CUA.
</del><span class="cx"> --uuid     : only scan specified calendar homes. Can be a partial GUID
</span><span class="cx">              to scan all GUIDs with that as a prefix.
</span><span class="cx"> --uid      : scan only calendar data with the specific iCalendar UID.
</span><span class="lines">@@ -299,7 +297,7 @@
</span><span class="cx"> CHANGES
</span><span class="cx"> v8: Detects ORGANIZER or ATTENDEE properties with mailto: calendar user
</span><span class="cx">     addresses for users that have valid directory records. Fix is to
</span><del>-    replace the value with a urn:uuid: form.
</del><ins>+    replace the value with a urn:x-uid: form.
</ins><span class="cx"> 
</span><span class="cx"> v9: Detects double-bookings.
</span><span class="cx"> 
</span><span class="lines">@@ -324,9 +322,7 @@
</span><span class="cx"> 
</span><span class="cx">     optFlags = [
</span><span class="cx">         ['ical', 'i', &quot;Calendar data check.&quot;],
</span><del>-        ['badcua', 'b', &quot;Calendar data check for bad CALENDARSERVER-OLD-CUA only.&quot;],
</del><span class="cx">         ['debug', 'D', &quot;Debug logging.&quot;],
</span><del>-        ['nobase64', 'n', &quot;Do not apply CALENDARSERVER-OLD-CUA base64 transform when fixing.&quot;],
</del><span class="cx">         ['mismatch', 's', &quot;Detect organizer/attendee mismatches.&quot;],
</span><span class="cx">         ['missing', 'm', &quot;Show 'orphaned' homes.&quot;],
</span><span class="cx">         ['double', 'd', &quot;Detect double-bookings.&quot;],
</span><span class="lines">@@ -696,21 +692,6 @@
</span><span class="cx">         try:
</span><span class="cx">             caldata = Calendar.parseText(rows[0][0]) if rows else None
</span><span class="cx">         except ErrorBase:
</span><del>-            caltxt = rows[0][0] if rows else None
-            if caltxt:
-                caltxt = caltxt.replace(&quot;\r\n &quot;, &quot;&quot;)
-                if caltxt.find(&quot;CALENDARSERVER-OLD-CUA=\&quot;//&quot;) != -1:
-                    if doFix:
-                        caltxt = (yield self.fixBadOldCua(resid, caltxt))
-                        try:
-                            caldata = Calendar.parseText(caltxt) if rows else None
-                        except ErrorBase:
-                            self.parseError = &quot;No fix bad CALENDARSERVER-OLD-CUA&quot;
-                            returnValue(None)
-                    else:
-                        self.parseError = &quot;Bad CALENDARSERVER-OLD-CUA&quot;
-                        returnValue(None)
-
</del><span class="cx">             self.parseError = &quot;Failed to parse&quot;
</span><span class="cx">             returnValue(None)
</span><span class="cx"> 
</span><span class="lines">@@ -743,68 +724,7 @@
</span><span class="cx">         returnValue((caldata, rows[0][1], rows[0][2], rows[0][3],) if rows else (None, None, None, None,))
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
-    def fixBadOldCua(self, resid, caltxt):
-        &quot;&quot;&quot;
-        Fix bad CALENDARSERVER-OLD-CUA lines and write fixed data to store. Assumes iCalendar data lines unfolded.
-        &quot;&quot;&quot;
</del><span class="cx"> 
</span><del>-        # Get store objects
-        homeID, calendarID = yield self.getAllResourceInfoForResourceID(resid)
-        home = yield self.txn.calendarHomeWithResourceID(homeID)
-        calendar = yield home.childWithID(calendarID)
-        calendarObj = yield calendar.objectResourceWithID(resid)
-
-        # Do raw data fix one line at a time
-        caltxt = self.fixBadOldCuaLines(caltxt)
-
-        # Re-parse
-        try:
-            component = Component.fromString(caltxt)
-        except InvalidICalendarDataError:
-            returnValue(None)
-
-        # Write out fix, commit and get a new transaction
-        # Use _migrating to ignore possible overridden instance errors - we are either correcting or ignoring those
-        self.txn._migrating = True
-        component = yield calendarObj._setComponentInternal(component, internal_state=ComponentUpdateState.RAW)
-        yield self.txn.commit()
-        self.txn = self.store.newTransaction()
-
-        returnValue(caltxt)
-
-
-    def fixBadOldCuaLines(self, caltxt):
-        &quot;&quot;&quot;
-        Fix bad CALENDARSERVER-OLD-CUA lines. Assumes iCalendar data lines unfolded.
-        &quot;&quot;&quot;
-
-        # Do raw data fix one line at a time
-        lines = caltxt.splitlines()
-        for ctr, line in enumerate(lines):
-            startpos = line.find(&quot;;CALENDARSERVER-OLD-CUA=\&quot;//&quot;)
-            if startpos != -1:
-                endpos = line.find(&quot;urn:uuid:&quot;)
-                if endpos != -1:
-                    endpos += len(&quot;urn:uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\&quot;&quot;)
-                    badparam = line[startpos + len(&quot;;CALENDARSERVER-OLD-CUA=\&quot;&quot;):endpos]
-                    endbadparam = badparam.find(&quot;;&quot;)
-                    if endbadparam != -1:
-                        badparam = badparam[:endbadparam].replace(&quot;\\&quot;, &quot;&quot;)
-                        if badparam.find(&quot;8443&quot;) != -1:
-                            badparam = &quot;https:&quot; + badparam
-                        else:
-                            badparam = &quot;http:&quot; + badparam
-                        if self.options[&quot;nobase64&quot;]:
-                            badparam = &quot;\&quot;&quot; + badparam + &quot;\&quot;&quot;
-                        else:
-                            badparam = &quot;base64-%s&quot; % (base64.b64encode(badparam),)
-                        badparam = &quot;;CALENDARSERVER-OLD-CUA=&quot; + badparam
-                        lines[ctr] = line[:startpos] + badparam + line[endpos:]
-        caltxt = &quot;\r\n&quot;.join(lines) + &quot;\r\n&quot;
-        return caltxt
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def removeEvent(self, resid):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -1274,15 +1194,6 @@
</span><span class="cx">                         else:
</span><span class="cx">                             raise InvalidICalendarDataError(&quot;iCalendar ORGANIZER missing mailto:&quot;)
</span><span class="cx"> 
</span><del>-                # CALENDARSERVER-OLD-CUA needs to be base64 encoded
-                if organizer.hasParameter(&quot;CALENDARSERVER-OLD-CUA&quot;):
-                    oldcua = organizer.parameterValue(&quot;CALENDARSERVER-OLD-CUA&quot;)
-                    if not oldcua.startswith(&quot;base64-&quot;) and not self.options[&quot;nobase64&quot;]:
-                        if doFix:
-                            organizer.setParameter(&quot;CALENDARSERVER-OLD-CUA&quot;, &quot;base64-%s&quot; % (base64.b64encode(oldcua)))
-                        else:
-                            raise InvalidICalendarDataError(&quot;iCalendar ORGANIZER CALENDARSERVER-OLD-CUA not base64&quot;)
-
</del><span class="cx">             for attendee in subcomponent.properties(&quot;ATTENDEE&quot;):
</span><span class="cx">                 cuaddr = attendee.value()
</span><span class="cx"> 
</span><span class="lines">@@ -1307,16 +1218,7 @@
</span><span class="cx">                         else:
</span><span class="cx">                             raise InvalidICalendarDataError(&quot;iCalendar ATTENDEE missing mailto:&quot;)
</span><span class="cx"> 
</span><del>-                # CALENDARSERVER-OLD-CUA needs to be base64 encoded
-                if attendee.hasParameter(&quot;CALENDARSERVER-OLD-CUA&quot;):
-                    oldcua = attendee.parameterValue(&quot;CALENDARSERVER-OLD-CUA&quot;)
-                    if not oldcua.startswith(&quot;base64-&quot;) and not self.options[&quot;nobase64&quot;]:
-                        if doFix:
-                            attendee.setParameter(&quot;CALENDARSERVER-OLD-CUA&quot;, &quot;base64-%s&quot; % (base64.b64encode(oldcua)))
-                        else:
-                            raise InvalidICalendarDataError(&quot;iCalendar ATTENDEE CALENDARSERVER-OLD-CUA not base64&quot;)
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     def attendeesWithoutOrganizer(self, component, doFix):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Look for events with ATTENDEE properties and no ORGANIZER property.
</span><span class="lines">@@ -1521,11 +1423,11 @@
</span><span class="cx"> 
</span><span class="cx">             # If targeting a specific organizer, skip events belonging to others
</span><span class="cx">             if self.options[&quot;uuid&quot;]:
</span><del>-                if not organizer.startswith(&quot;urn:uuid:&quot;) or self.options[&quot;uuid&quot;] != organizer[9:]:
</del><ins>+                if not organizer.startswith(&quot;urn:x-uid:&quot;) or self.options[&quot;uuid&quot;] != organizer[10:]:
</ins><span class="cx">                     continue
</span><span class="cx"> 
</span><span class="cx">             # Cache organizer/attendee states
</span><del>-            if organizer.startswith(&quot;urn:uuid:&quot;) and owner == organizer[9:]:
</del><ins>+            if organizer.startswith(&quot;urn:x-uid:&quot;) and owner == organizer[10:]:
</ins><span class="cx">                 if not onlyAttendee:
</span><span class="cx">                     self.organized.append((owner, resid, uid, md5, organizer, created, modified,))
</span><span class="cx">                     self.organized_byuid[uid] = (owner, resid, uid, md5, organizer, created, modified,)
</span><span class="lines">@@ -1789,9 +1691,9 @@
</span><span class="cx">                 continue
</span><span class="cx"> 
</span><span class="cx">             # Only care about data for hosted organizers
</span><del>-            if not organizer.startswith(&quot;urn:uuid:&quot;):
</del><ins>+            if not organizer.startswith(&quot;urn:x-uid:&quot;):
</ins><span class="cx">                 continue
</span><del>-            organizer = organizer[9:]
</del><ins>+            organizer = organizer[10:]
</ins><span class="cx"> 
</span><span class="cx">             # Skip organizers not enabled for calendaring
</span><span class="cx">             if not (yield self.testForCalendaringUUID(organizer)):
</span><span class="lines">@@ -1913,7 +1815,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            cuaddr = &quot;urn:uuid:%s&quot; % attendee
</del><ins>+            cuaddr = &quot;urn:x-uid:%s&quot; % attendee
</ins><span class="cx"> 
</span><span class="cx">             # Get the organizer's calendar data
</span><span class="cx">             calendar = (yield self.getCalendar(orgresid))
</span><span class="lines">@@ -2073,8 +1975,8 @@
</span><span class="cx">             props = item.getOwner().getProperties().get(definitions.cICalProperty_ATTENDEE, [])
</span><span class="cx">             for prop in props:
</span><span class="cx">                 caladdr = prop.getCalAddressValue().getValue()
</span><del>-                if caladdr.startswith(&quot;urn:uuid:&quot;):
-                    caladdr = caladdr[9:]
</del><ins>+                if caladdr.startswith(&quot;urn:x-uid:&quot;):
+                    caladdr = caladdr[10:]
</ins><span class="cx">                 else:
</span><span class="cx">                     continue
</span><span class="cx">                 if attendee_only is not None and attendee_only != caladdr:
</span><span class="lines">@@ -2610,8 +2512,8 @@
</span><span class="cx">             else:
</span><span class="cx">                 principal = yield self.directoryService().recordWithCalendarUserAddress(organizer)
</span><span class="cx">                 # FIXME: Why the mix of records and principals here?
</span><del>-                if principal is None and organizer.startswith(&quot;urn:uuid:&quot;):
-                    principal = yield self.directoryService().principalCollection.principalForUID(organizer[9:])
</del><ins>+                if principal is None and organizer.startswith(&quot;urn:x-uid:&quot;):
+                    principal = yield self.directoryService().principalCollection.principalForUID(organizer[10:])
</ins><span class="cx">                 if principal is None:
</span><span class="cx">                     if self.options[&quot;invalid-organizer&quot;]:
</span><span class="cx">                         fail = True
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertoolspurgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -17,33 +17,193 @@
</span><span class="cx"> ##
</span><span class="cx"> from __future__ import print_function
</span><span class="cx"> 
</span><ins>+import collections
+from getopt import getopt, GetoptError
+import os
+import sys
+
</ins><span class="cx"> from calendarserver.tools import tables
</span><span class="cx"> from calendarserver.tools.cmdline import utilityMain, WorkerService
</span><del>-
-from getopt import getopt, GetoptError
-
</del><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-
</del><span class="cx"> from twext.python.log import Logger
</span><del>-
</del><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-
</del><span class="cx"> from twistedcaldav import caldavxml
</span><del>-
</del><span class="cx"> from txdav.caldav.datastore.query.filter import Filter
</span><ins>+from twext.enterprise.dal.record import fromTable
+from twext.enterprise.dal.syntax import Delete, Select
+from twext.enterprise.jobqueue import WorkItem
+from txdav.common.datastore.sql_tables import schema
+import datetime
</ins><span class="cx"> 
</span><ins>+log = Logger()
</ins><span class="cx"> 
</span><del>-import collections
-import os
-import sys
</del><span class="cx"> 
</span><del>-log = Logger()
-
</del><span class="cx"> DEFAULT_BATCH_SIZE = 100
</span><span class="cx"> DEFAULT_RETAIN_DAYS = 365
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+class PrincipalPurgeScanPollingWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_SCAN_POLLING_WORK)
+):
+
+    group = &quot;principal_purge_scan_polling&quot;
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete all other work items
+        yield Delete(From=self.table, Where=None).on(self.transaction)
+
+        # Schedule next update, 7 days out
+        notBefore = (
+            datetime.datetime.utcnow() +
+            datetime.timedelta(days=7)
+        )
+        log.info(
+            &quot;Scheduling next principal purge scan update: {when}&quot;, when=notBefore
+        )
+        yield self.transaction.enqueue(
+            PrincipalPurgeScanPollingWork,
+            notBefore=notBefore
+        )
+
+        # Do the scan
+        allUIDs = set()
+        for home in (schema.CALENDAR_HOME, schema.ADDRESSBOOK_HOME):
+            for [uid] in (
+                yield Select(
+                    [home.OWNER_UID],
+                    From=home
+                ).on(self.transaction)
+            ):
+                allUIDs.add(uid)
+
+        # Spread out the per-uid checks 1 second apart
+        seconds = 0
+        for uid in allUIDs:
+            notBefore = (
+                datetime.datetime.utcnow() +
+                datetime.timedelta(seconds=seconds)
+            )
+            seconds += 1
+            yield self.transaction.enqueue(
+                PrincipalPurgeCheckWork,
+                uid=uid,
+                notBefore=notBefore
+            )
+
+
+
+
+class PrincipalPurgeCheckWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_CHECK_WORK)
+):
+    &quot;&quot;&quot;
+    Work item for checking for the existence of a UID in the directory
+    &quot;&quot;&quot;
+
+    group = property(lambda self: self.uid)
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete any other work items for this UID
+        yield Delete(
+            From=self.table,
+            Where=self.table.UID == self.uid
+        ).on(self.transaction)
+
+        log.debug(&quot;Checking for existence of {uid} in directory&quot;, uid=self.uid)
+        directory = self.transaction.store().directoryService()
+        record = yield directory.recordWithUID(self.uid)
+
+        if record is None:
+            # Schedule purge of this UID a week from now
+            notBefore = (
+                datetime.datetime.utcnow() +
+                datetime.timedelta(minutes=1)
+            )
+            log.warn(
+                &quot;Principal {uid} is no longer in the directory; scheduling clean-up at {when}&quot;,
+                uid=self.uid, when=notBefore
+            )
+            yield self.transaction.enqueue(
+                PrincipalPurgeWork,
+                uid=self.uid,
+                notBefore=notBefore
+            )
+        else:
+            log.debug(&quot;{uid} is still in the directory&quot;, uid=self.uid)
+
+
+
+class PrincipalPurgeWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_WORK)
+):
+    &quot;&quot;&quot;
+    Work item for purging a UID's data
+    &quot;&quot;&quot;
+
+    group = property(lambda self: self.uid)
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete any other work items for this UID
+        yield Delete(
+            From=self.table,
+            Where=self.table.UID == self.uid
+        ).on(self.transaction)
+
+        # Check for UID in directory again
+        log.debug(&quot;One last existence check for {uid}&quot;, uid=self.uid)
+        directory = self.transaction.store().directoryService()
+        record = yield directory.recordWithUID(self.uid)
+
+        if record is None:
+            # Time to go
+            service = PurgePrincipalService(self.transaction.store)
+            log.warn(
+                &quot;Cleaning up future events for principal {uid} since they are no longer in directory&quot;,
+                uid=self.uid
+            )
+            yield service.purgeUIDs(
+                self.transaction.store,
+                directory,
+                [self.uid],
+                completely=False,
+                doimplicit=True,
+                proxies=True,
+                when=None
+            )
+        else:
+            log.debug(&quot;{uid} has re-appeared in the directory&quot;, uid=self.uid)
+
+
+@inlineCallbacks
+def scheduleNextPrincipalPurgeUpdate(store, seconds):
+
+    notBefore = (
+        datetime.datetime.utcnow() + datetime.timedelta(seconds=seconds)
+    )
+
+    log.debug(
+        &quot;Scheduling next principal purge update: {when}&quot;, when=notBefore
+    )
+
+    def _enqueue(txn):
+        return txn.enqueue(PrincipalPurgeScanPollingWork, notBefore=notBefore)
+
+    wp = yield store.inTransaction(&quot;scheduleNextPrincipalPurgeUpdate&quot;, _enqueue)
+
+    returnValue(wp)
+
+
+
</ins><span class="cx"> class PurgeOldEventsService(WorkerService):
</span><span class="cx"> 
</span><span class="cx">     cutoff = None
</span><span class="lines">@@ -681,11 +841,10 @@
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><del>-    def purgeUIDs(cls, store, directory, root, uids, verbose=False, dryrun=False,
</del><ins>+    def purgeUIDs(cls, store, directory, uids, verbose=False, dryrun=False,
</ins><span class="cx">                   completely=False, doimplicit=True, proxies=True, when=None):
</span><span class="cx"> 
</span><span class="cx">         service = cls(store)
</span><del>-        service.root = root
</del><span class="cx">         service.directory = directory
</span><span class="cx">         service.uids = uids
</span><span class="cx">         service.verbose = verbose
</span><span class="lines">@@ -701,10 +860,8 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def doWork(self):
</span><span class="cx"> 
</span><del>-        if self.root is None:
-            self.root = self.rootResource()
</del><span class="cx">         if self.directory is None:
</span><del>-            self.directory = self.root.getDirectory()
</del><ins>+            self.directory = self.store.directoryService()
</ins><span class="cx"> 
</span><span class="cx">         total = 0
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertoolsshellcmdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -36,7 +36,6 @@
</span><span class="cx"> from txdav.common.icommondatastore import NotFoundError
</span><span class="cx"> 
</span><span class="cx"> from calendarserver.version import version
</span><del>-from calendarserver.tap.util import getRootResource
</del><span class="cx"> from calendarserver.tools.tables import Table
</span><span class="cx"> from calendarserver.tools.purge import PurgePrincipalService
</span><span class="cx"> from calendarserver.tools.shell.vfs import Folder, RootFolder
</span><span class="lines">@@ -668,11 +667,6 @@
</span><span class="cx">             self.terminal.write(&quot;Aborting.\n&quot;)
</span><span class="cx">             return
</span><span class="cx"> 
</span><del>-        rootResource = getRootResource(
-            self.protocol.service.config,
-            self.protocol.service.store,
-        )
-
</del><span class="cx">         if dryRun:
</span><span class="cx">             toPurge = &quot;to purge&quot;
</span><span class="cx">         else:
</span><span class="lines">@@ -683,7 +677,6 @@
</span><span class="cx">             count, _ignore_assignments = (yield PurgePrincipalService.purgeUIDs(
</span><span class="cx">                 self.protocol.service.store,
</span><span class="cx">                 directory,
</span><del>-                rootResource,
</del><span class="cx">                 (record.uid,),
</span><span class="cx">                 verbose=False,
</span><span class="cx">                 dryrun=dryRun,
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertoolstesttest_calverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -157,9 +157,9 @@
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="lines">@@ -178,8 +178,8 @@
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> ORGANIZER:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><del>-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -199,9 +199,9 @@
</span><span class="cx"> SUMMARY:Ancient event
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</ins><span class="cx"> ATTENDEE:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><del>-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -223,39 +223,13 @@
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> ORGANIZER:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><span class="cx"> ATTENDEE:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><del>-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-# Non-base64 Organizer and Attendee parameter
-BAD7_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//Apple Inc.//iCal 4.0.1//EN
-CALSCALE:GREGORIAN
-BEGIN:VEVENT
-CREATED:20100303T181216Z
-UID:BAD7
-DTEND:20100307T151500Z
-TRANSP:OPAQUE
-SUMMARY:Ancient event
-DTSTART:20100307T111500Z
-DTSTAMP:20100303T181220Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;http://demo.com:8008/principals/__uids__/
- D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F9
- 2F92E61D0
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;http://demo.com:8008/principals/__uids__/D
- 46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92
- F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-SEQUENCE:2
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
-
-
</del><span class="cx"> # Base64 Organizer and Attendee parameter
</span><span class="cx"> OK8_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> VERSION:2.0
</span><span class="lines">@@ -271,73 +245,16 @@
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;base64-aHR0cDovL2RlbW8uY29tOjgwMDgvcHJpbm
</span><span class="cx">  NpcGFscy9fX3VpZHNfXy9ENDZGM0Q3MS0wNEI3LTQzQzItQTdCNi02RjkyRjkyRTYxRDA=&quot;:
</span><del>- urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</del><ins>+ urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</ins><span class="cx"> ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;base64-aHR0cDovL2RlbW8uY29tOjgwMDgvcHJpbmN
</span><span class="cx">  pcGFscy9fX3VpZHNfXy9ENDZGM0Q3MS0wNEI3LTQzQzItQTdCNi02RjkyRjkyRTYxRDA=&quot;:u
</span><del>- rn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ rn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="cx"> 
</span><del>-BAD9_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:BAD9
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyrus
- /;CN=\\&quot;Cyrus Daboo\\&quot;;CUTYPE=INDIVIDUAL;EMAIL=\\&quot;cyrus@example.com\\&quot;;PARTSTAT=ACC
- EPTED:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=c
- yrus@example.com;RSVP=TRUE:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyru
- s/;CN=\\&quot;Cyrus Daboo\\&quot;;EMAIL=\\&quot;cyrus@example.com\\&quot;:urn:uuid:7B2636C7-07F6-4475-9
- 24B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uuid:7B2636C7-
- 07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</del><span class="cx"> 
</span><span class="cx"> # Non-mailto: Organizer
</span><span class="cx"> BAD10_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="lines">@@ -425,8 +342,8 @@
</span><span class="cx"> SUMMARY:Ancient event
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><del>-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -457,9 +374,7 @@
</span><span class="cx">                 &quot;bad4.ics&quot; : (BAD4_ICS, metadata,),
</span><span class="cx">                 &quot;bad5.ics&quot; : (BAD5_ICS, metadata,),
</span><span class="cx">                 &quot;bad6.ics&quot; : (BAD6_ICS, metadata,),
</span><del>-                &quot;bad7.ics&quot; : (BAD7_ICS, metadata,),
</del><span class="cx">                 &quot;ok8.ics&quot;  : (OK8_ICS, metadata,),
</span><del>-                &quot;bad9.ics&quot; : (BAD9_ICS, metadata,),
</del><span class="cx">                 &quot;bad10.ics&quot; : (BAD10_ICS, metadata,),
</span><span class="cx">                 &quot;bad11.ics&quot; : (BAD11_ICS, metadata,),
</span><span class="cx">                 &quot;bad12.ics&quot; : (BAD12_ICS, metadata,),
</span><span class="lines">@@ -523,8 +438,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD11&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="lines">@@ -571,8 +484,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD11&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="lines">@@ -598,11 +509,11 @@
</span><span class="cx">         obj = yield self.calendarObjectUnderTest(name=&quot;bad10.ics&quot;)
</span><span class="cx">         ical = yield obj.component()
</span><span class="cx">         org = ical.getOrganizerProperty()
</span><del>-        self.assertEqual(org.value(), &quot;urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;)
</del><ins>+        self.assertEqual(org.value(), &quot;urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;)
</ins><span class="cx">         self.assertFalse(org.hasParameter(&quot;SCHEDULE-AGENT&quot;))
</span><span class="cx">         for attendee in ical.getAllAttendeeProperties():
</span><span class="cx">             self.assertTrue(
</span><del>-                attendee.value().startswith(&quot;urn:uuid:&quot;) or
</del><ins>+                attendee.value().startswith(&quot;urn:x-uid:&quot;) or
</ins><span class="cx">                 attendee.value().startswith(&quot;/principals&quot;)
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="lines">@@ -637,8 +548,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="cx">         )))
</span><span class="lines">@@ -681,8 +590,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="cx">         )))
</span><span class="lines">@@ -701,217 +608,8 @@
</span><span class="cx">         self.assertNotEqual(sync_token_old, sync_token_new)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def test_fixBadCuaLines(self):
-        &quot;&quot;&quot;
-        CalVerifyService.fixBadOldCuaLines. Make sure it applies correct fix.
-        &quot;&quot;&quot;
</del><span class="cx"> 
</span><del>-        data = (
-            (
-                &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyrus
- /;CN=&quot;Cyrus Daboo&quot;;CUTYPE=INDIVIDUAL;EMAIL=&quot;cyrus@example.com&quot;;PARTSTAT=ACC
- EPTED:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=c
- yrus@example.com;RSVP=TRUE:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyru
- s/;CN=&quot;Cyrus Daboo&quot;;EMAIL=&quot;cyrus@example.com&quot;:urn:uuid:7B2636C7-07F6-4475-9
- 24B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uuid:7B2636C7-
- 07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;),
-                &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;https://example.com:8443/principals/users/c
- yrus/&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com;RSVP=TRUE:urn:uuid:7B2636C7-0
- 7F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;https://example.com:8443/principals/users/
- cyrus/&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uuid:7B2636C7-07F6-4475-
- 924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;),
-                &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=base64-aHR0cHM6Ly9leGFtcGxlLmNvbTo4NDQzL3Bya
- W5jaXBhbHMvdXNlcnMvY3lydXMv;CN=Cyrus Daboo;EMAIL=cyrus@example.com;RSVP=TRU
- E:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=base64-aHR0cHM6Ly9leGFtcGxlLmNvbTo4NDQzL3By
- aW5jaXBhbHMvdXNlcnMvY3lydXMv;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uui
- d:7B2636C7-07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;),
-            ),
-        )
</del><span class="cx"> 
</span><del>-        optionsNo64 = {
-            &quot;ical&quot;: True,
-            &quot;nobase64&quot;: True,
-            &quot;verbose&quot;: False,
-            &quot;uid&quot;: &quot;&quot;,
-            &quot;uuid&quot;: &quot;&quot;,
-            &quot;tzid&quot;: &quot;&quot;,
-        }
-        calverifyNo64 = BadDataService(self._sqlCalendarStore, optionsNo64, StringIO(), reactor, config)
-        calverifyNo64.emailDomain = &quot;example.com&quot;
-
-        options64 = {
-            &quot;ical&quot;: True,
-            &quot;nobase64&quot;: False,
-            &quot;verbose&quot;: False,
-            &quot;uid&quot;: &quot;&quot;,
-            &quot;uuid&quot;: &quot;&quot;,
-            &quot;tzid&quot;: &quot;&quot;,
-        }
-        calverify64 = BadDataService(self._sqlCalendarStore, options64, StringIO(), reactor, config)
-        calverify64.emailDomain = &quot;example.com&quot;
-
-        for bad, oknobase64, okbase64 in data:
-            bad = bad.replace(&quot;\r\n &quot;, &quot;&quot;)
-            oknobase64 = oknobase64.replace(&quot;\r\n &quot;, &quot;&quot;)
-            okbase64 = okbase64.replace(&quot;\r\n &quot;, &quot;&quot;)
-            self.assertEqual(calverifyNo64.fixBadOldCuaLines(bad), oknobase64)
-            self.assertEqual(calverify64.fixBadOldCuaLines(bad), okbase64)
-
-
-
</del><span class="cx"> class CalVerifyMismatchTestsBase(StoreTestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Tests calverify for iCalendar mismatch problems.
</span><span class="lines">@@ -964,10 +662,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -986,10 +684,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1007,10 +705,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1029,10 +727,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1050,10 +748,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1071,10 +769,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1093,10 +791,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1114,10 +812,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1135,10 +833,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1157,10 +855,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear - 1, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1178,10 +876,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1200,10 +898,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1221,9 +919,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1241,8 +939,8 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1260,10 +958,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1282,9 +980,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1302,9 +1000,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1322,10 +1020,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1583,9 +1281,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1604,9 +1302,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1624,9 +1322,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1810,9 +1508,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1831,9 +1529,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1851,9 +1549,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2029,9 +1727,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2050,9 +1748,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2070,9 +1768,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2091,9 +1789,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2110,9 +1808,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> TRANSP:TRANSPARENT
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2132,9 +1830,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2151,9 +1849,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> STATUS:CANCELLED
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2173,9 +1871,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=3
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2193,9 +1891,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2215,9 +1913,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=3
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2235,9 +1933,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -2249,9 +1947,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2287,9 +1985,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2306,9 +2004,9 @@
</span><span class="cx"> DTSTART;VALUE=DATE:%(year)s%(month)02d21
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2327,9 +2025,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2347,9 +2045,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2479,9 +2177,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2500,9 +2198,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2523,7 +2221,7 @@
</span><span class="cx"> SEQUENCE:2
</span><span class="cx"> ORGANIZER:mailto:foobar@example.com
</span><span class="cx"> ATTENDEE:mailto:foobar@example.com
</span><del>-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2810,9 +2508,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2827,9 +2525,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2844,9 +2542,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now_fwd11)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2863,9 +2561,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now_fwd11)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2882,9 +2580,9 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2901,9 +2599,9 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2920,9 +2618,9 @@
</span><span class="cx"> UID:VALID_ORGANIZER_OVERRIDE_ICS
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2931,9 +2629,9 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd11)s
</span><span class="cx"> DTSTART:%(now_fwd11)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -877,7 +877,7 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</span><del>-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=True))
</del><ins>+            (self.uid,), verbose=False, proxies=False, completely=True))
</ins><span class="cx">         self.assertEquals(count, 2) # 2 events
</span><span class="cx"> 
</span><span class="cx">         # Now you don't
</span><span class="lines">@@ -892,7 +892,6 @@
</span><span class="cx">         count = yield PurgePrincipalService.purgeUIDs(
</span><span class="cx">             self.storeUnderTest(),
</span><span class="cx">             self.directory,
</span><del>-            self.rootResource,
</del><span class="cx">             (self.uid,),
</span><span class="cx">             verbose=False,
</span><span class="cx">             proxies=False,
</span><span class="lines">@@ -922,7 +921,7 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</span><del>-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False))
</del><ins>+            (self.uid,), verbose=False, proxies=False, completely=False))
</ins><span class="cx">         self.assertEquals(count, 1) # 2 events
</span><span class="cx"> 
</span><span class="cx">         # Now you still see it
</span><span class="lines">@@ -935,7 +934,7 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         count = yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</span><del>-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False)
</del><ins>+            (self.uid,), verbose=False, proxies=False, completely=False)
</ins><span class="cx">         self.assertEquals(count, 1)
</span><span class="cx"> 
</span><span class="cx">         # And you still do
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuacalendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -677,7 +677,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Purge home1
</span><span class="cx">         total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
</span><del>-            self.rootResource, (&quot;home1&quot;,), verbose=False, proxies=False,
</del><ins>+            (&quot;home1&quot;,), verbose=False, proxies=False,
</ins><span class="cx">             when=DateTime(now, 4, 1, 12, 0, 0, 0, Timezone(utc=True)))
</span><span class="cx"> 
</span><span class="cx">         # 4 items deleted: 3 events and 1 vcard
</span><span class="lines">@@ -714,7 +714,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Purge home1 completely
</span><span class="cx">         total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
</span><del>-            self.rootResource, (&quot;home1&quot;,), verbose=False, proxies=False, completely=True)
</del><ins>+            (&quot;home1&quot;,), verbose=False, proxies=False, completely=True)
</ins><span class="cx"> 
</span><span class="cx">         # 9 items deleted: 8 events and 1 vcard
</span><span class="cx">         self.assertEquals(total, 9)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatwistedcaldavdirectorytesttest_principalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -612,21 +612,10 @@
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><span class="cx">         ) in (yield self._allRecords()):
</span><span class="cx">             if record.hasCalendars:
</span><del>-                if self.directory.fieldName.guid in record.fields:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith(&quot;urn:uuid:&quot;)
-                    )
-                elif self.directory.fieldName.emailAddresses in record.fields:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith(&quot;mailto:&quot;)
-                    )
-                else:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith(&quot;/principals/__uids__/&quot;)
-                    )
</del><ins>+                self.failUnless(
+                    recordResource.canonicalCalendarUserAddress()
+                    .startswith(&quot;urn:x-uid:&quot;)
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatwistedcaldavicalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -3267,13 +3267,21 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def normalizeCalendarUserAddresses(self, lookupFunction, recordFunction,
-        toUUID=True):
</del><ins>+    def normalizeCalendarUserAddresses(
+        self, lookupFunction, recordFunction, toCanonical=True
+    ):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Do the ORGANIZER/ATTENDEE property normalization.
</span><span class="cx"> 
</span><span class="cx">         @param lookupFunction: function returning full name, guid, CUAs for a given CUA
</span><span class="cx">         @type lookupFunction: L{Function}
</span><ins>+
+        @param recordFunction: function taking a CUA and returning a record
+        @type recordFunction: L{Function}
+
+        @param toCanonical: whether to convert to the canonical CUA form (True)
+            or to the mailto: form (False)
+        @type toCanonical: L{bool}
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         for component in self.subcomponents():
</span><span class="lines">@@ -3288,8 +3296,8 @@
</span><span class="cx">                 # Check that we can lookup this calendar user address - if not
</span><span class="cx">                 # we cannot do anything with it
</span><span class="cx">                 cuaddr = normalizeCUAddr(prop.value())
</span><del>-                name, guid, cutype, cuaddrs = yield lookupFunction(cuaddr, recordFunction, config)
-                if guid is None:
</del><ins>+                name, uid, cutype, cuaddrs = yield lookupFunction(cuaddr, recordFunction, config)
+                if uid is None:
</ins><span class="cx">                     continue
</span><span class="cx"> 
</span><span class="cx">                 # Get any EMAIL parameter
</span><span class="lines">@@ -3300,14 +3308,12 @@
</span><span class="cx">                 # Get any CN parameter
</span><span class="cx">                 oldCN = prop.parameterValue(&quot;CN&quot;)
</span><span class="cx"> 
</span><del>-                if toUUID:
-                    # Always re-write value to urn:uuid
-                    if isinstance(guid, uuid.UUID):
-                        guid = unicode(guid).upper()
-                    prop.setValue(&quot;urn:uuid:{guid}&quot;.format(guid=guid))
</del><ins>+                if toCanonical:
+                    # Always re-write value to urn:x-uid
+                    prop.setValue(&quot;urn:x-uid:{uid}&quot;.format(uid=uid))
</ins><span class="cx"> 
</span><del>-                # If it is already a non-UUID address leave it be
-                elif cuaddr.startswith(&quot;urn:uuid:&quot;):
</del><ins>+                # If it is already a non-x-uid address leave it be
+                elif (cuaddr.startswith(&quot;urn:x-uid:&quot;) or cuaddr.startswith(&quot;urn:uuid:&quot;)):
</ins><span class="cx"> 
</span><span class="cx">                     if oldemail:
</span><span class="cx">                         # Use the EMAIL parameter if it exists
</span><span class="lines">@@ -3364,7 +3370,7 @@
</span><span class="cx">                     prop.removeParameter(&quot;CN&quot;)
</span><span class="cx"> 
</span><span class="cx">                 # Re-write the EMAIL if its value no longer matches
</span><del>-                if oldemail and oldemail not in cuaddrs or oldemail is None and toUUID:
</del><ins>+                if oldemail and oldemail not in cuaddrs or oldemail is None and toCanonical:
</ins><span class="cx">                     if cuaddr.startswith(&quot;mailto:&quot;) and cuaddr in cuaddrs:
</span><span class="cx">                         email = cuaddr[7:]
</span><span class="cx">                     else:
</span><span class="lines">@@ -3388,7 +3394,7 @@
</span><span class="cx"> 
</span><span class="cx">             # For VPOLL also do immediate children
</span><span class="cx">             if component.name() == &quot;VPOLL&quot;:
</span><del>-                yield component.normalizeCalendarUserAddresses(lookupFunction, recordFunction, toUUID)
</del><ins>+                yield component.normalizeCalendarUserAddresses(lookupFunction, recordFunction, toCanonical)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -3638,21 +3644,21 @@
</span><span class="cx"> 
</span><span class="cx"> # #
</span><span class="cx"> # Utilities
</span><del>-# #p
</del><ins>+# #
</ins><span class="cx"> 
</span><span class="cx"> @inlineCallbacks
</span><del>-def normalizeCUAddress(cuaddr, lookupFunction, recordFunction, toUUID=True):
</del><ins>+def normalizeCUAddress(cuaddr, lookupFunction, recordFunction, toCanonical=True):
</ins><span class="cx">     # Check that we can lookup this calendar user address - if not
</span><span class="cx">     # we cannot do anything with it
</span><del>-    _ignore_name, guid, _ignore_cuType, cuaddrs = (yield lookupFunction(normalizeCUAddr(cuaddr), recordFunction, config))
</del><ins>+    _ignore_name, uid, _ignore_cuType, cuaddrs = (yield lookupFunction(normalizeCUAddr(cuaddr), recordFunction, config))
</ins><span class="cx"> 
</span><del>-    if toUUID:
-        # Always re-write value to urn:uuid
-        if guid:
-            returnValue(&quot;urn:uuid:{0}&quot;.format(guid,))
</del><ins>+    if toCanonical:
+        # Always re-write value to urn:x-uid
+        if uid:
+            returnValue(&quot;urn:x-uid:{0}&quot;.format(uid,))
</ins><span class="cx"> 
</span><del>-    # If it is already a non-UUID address leave it be
-    elif cuaddr.startswith(&quot;urn:uuid:&quot;):
</del><ins>+    # If it is already a non-x-uid address leave it be
+    elif (cuaddr.startswith(&quot;urn:x-uid:&quot;) or cuaddr.startswith(&quot;urn:uuid:&quot;)):
</ins><span class="cx"> 
</span><span class="cx">         # Pick the first mailto,
</span><span class="cx">         # or failing that the first path one,
</span><span class="lines">@@ -3723,9 +3729,12 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-def normalize_iCalStr(icalstr):
</del><ins>+def normalize_iCalStr(icalstr, sort=False):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Normalize a string representation of ical data for easy test comparison.
</span><ins>+
+    @param sort: Whether to sort the output
+    @type sort: L{boolean}
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     icalstr = str(icalstr).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><span class="lines">@@ -3735,13 +3744,18 @@
</span><span class="cx">         pos = line.find(&quot;;X-CALENDARSERVER-DTSTAMP=&quot;)
</span><span class="cx">         if pos != -1:
</span><span class="cx">             lines[ctr] = line[:pos] + line[pos + len(&quot;;X-CALENDARSERVER-DTSTAMP=&quot;) + 16:]
</span><ins>+    if sort:
+        lines.sort()
</ins><span class="cx">     icalstr = &quot;\r\n&quot;.join(lines)
</span><span class="cx">     return icalstr + &quot;\r\n&quot;
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-def diff_iCalStrs(icalstr1, icalstr2):
-
-    icalstr1 = normalize_iCalStr(icalstr1).splitlines()
-    icalstr2 = normalize_iCalStr(icalstr2).splitlines()
</del><ins>+def diff_iCalStrs(icalstr1, icalstr2, sort=False):
+    &quot;&quot;&quot;
+    @param sort: Whether to sort the output
+    @type sort: L{boolean}
+    &quot;&quot;&quot;
+    icalstr1 = normalize_iCalStr(icalstr1, sort=sort).splitlines()
+    icalstr2 = normalize_iCalStr(icalstr2, sort=sort).splitlines()
</ins><span class="cx">     return &quot;\n&quot;.join(unified_diff(icalstr1, icalstr2))
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatwistedcaldavtesttest_icalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -7598,7 +7598,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_normalizeCalendarUserAddressesFromUUID(self):
</del><ins>+    def test_normalizeCalendarUserAddressesFromCanonical(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure mailto is preferred, followed by path form, then http form.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -7612,6 +7612,7 @@
</span><span class="cx"> ATTENDEE:urn:uuid:foo
</span><span class="cx"> ATTENDEE:urn:uuid:bar
</span><span class="cx"> ATTENDEE:urn:uuid:baz
</span><ins>+ATTENDEE:urn:x-uid:buz
</ins><span class="cx"> DTSTAMP:20071114T000000Z
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -7627,24 +7628,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:baz&quot; : (
</span><span class="cx">                         &quot;Baz&quot;,
</span><span class="cx">                         &quot;baz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                       (&quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</del><ins>+                       (&quot;urn:x-uid:baz&quot;, &quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</ins><span class="cx">                     ),
</span><ins>+                    &quot;urn:x-uid:buz&quot; : (
+                        &quot;Buz&quot;,
+                        &quot;buz&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                       (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;, &quot;http://example.com/buz&quot;)
+                    ),
</ins><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=False)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=False)
</ins><span class="cx"> 
</span><span class="cx">         self.assertEquals(&quot;mailto:bar@example.com&quot;,
</span><span class="cx">             component.getAttendeeProperty((&quot;mailto:bar@example.com&quot;,)).value())
</span><span class="lines">@@ -7652,6 +7659,8 @@
</span><span class="cx">             component.getAttendeeProperty((&quot;/foo&quot;,)).value())
</span><span class="cx">         self.assertEquals(&quot;http://example.com/baz&quot;,
</span><span class="cx">             component.getAttendeeProperty((&quot;http://example.com/baz&quot;,)).value())
</span><ins>+        self.assertEquals(&quot;http://example.com/buz&quot;,
+            component.getAttendeeProperty((&quot;http://example.com/buz&quot;,)).value())
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -7686,30 +7695,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;,)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/locations/buzz&quot; : (
</span><span class="cx">                         &quot;{Restricted} Buzz&quot;,
</span><span class="cx">                         &quot;buzz&quot;,
</span><span class="cx">                         &quot;ROOM&quot;,
</span><del>-                        (&quot;urn:uuid:buzz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buzz&quot;, &quot;urn:uuid:buzz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
</ins><span class="cx"> 
</span><span class="cx">         # Location value changed
</span><span class="cx">         prop = component.mainComponent().getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(prop.value(), &quot;{Restricted} Buzz&quot;)
</span><del>-        prop = component.getAttendeeProperty((&quot;urn:uuid:buzz&quot;,))
-        self.assertEquals(&quot;urn:uuid:buzz&quot;, prop.value())
</del><ins>+        prop = component.getAttendeeProperty((&quot;urn:x-uid:buzz&quot;,))
+        self.assertEquals(&quot;urn:x-uid:buzz&quot;, prop.value())
</ins><span class="cx">         self.assertEquals(prop.parameterValue(&quot;CN&quot;), &quot;{Restricted} Buzz&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -7745,30 +7754,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;,)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/locations/buzz&quot; : (
</span><span class="cx">                         &quot;{Restricted} Buzz&quot;,
</span><span class="cx">                         &quot;buzz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buzz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buzz&quot;, &quot;urn:uuid:buzz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
</ins><span class="cx"> 
</span><span class="cx">         # Location value changed
</span><span class="cx">         prop = component.mainComponent().getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(prop.value(), &quot;Fuzz&quot;)
</span><del>-        prop = component.getAttendeeProperty((&quot;urn:uuid:buzz&quot;,))
-        self.assertEquals(&quot;urn:uuid:buzz&quot;, prop.value())
</del><ins>+        prop = component.getAttendeeProperty((&quot;urn:x-uid:buzz&quot;,))
+        self.assertEquals(&quot;urn:x-uid:buzz&quot;, prop.value())
</ins><span class="cx">         self.assertEquals(prop.parameterValue(&quot;CN&quot;), &quot;{Restricted} Buzz&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -7804,30 +7813,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;,)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/locations/buzz&quot; : (
</span><span class="cx">                         &quot;{Restricted} Buzz&quot;,
</span><span class="cx">                         &quot;buzz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buzz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buzz&quot;, &quot;urn:uuid:buzz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
</ins><span class="cx"> 
</span><span class="cx">         # Location value changed
</span><span class="cx">         prop = component.mainComponent().getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(prop.value(), &quot;Buzz&quot;)
</span><del>-        prop = component.getAttendeeProperty((&quot;urn:uuid:buzz&quot;,))
-        self.assertEquals(&quot;urn:uuid:buzz&quot;, prop.value())
</del><ins>+        prop = component.getAttendeeProperty((&quot;urn:x-uid:buzz&quot;,))
+        self.assertEquals(&quot;urn:x-uid:buzz&quot;, prop.value())
</ins><span class="cx">         self.assertEquals(prop.parameterValue(&quot;CN&quot;), &quot;{Restricted} Buzz&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -8529,7 +8538,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_normalizeCUAddressFromUUID(self):
</del><ins>+    def test_normalizeCUAddressFromCanonical(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure mailto is preferred, followed by path form, then http form.
</span><span class="cx">         If CALENDARSERVER-OLD-CUA parameter is present, restore that value.
</span><span class="lines">@@ -8539,7 +8548,11 @@
</span><span class="cx">             (&quot;urn:uuid:foo&quot;, &quot;/foo&quot;),
</span><span class="cx">             (&quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;,),
</span><span class="cx">             (&quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;,),
</span><del>-            (&quot;urn:uuid:buz&quot;, &quot;urn:uuid:buz&quot;,),
</del><ins>+            (&quot;urn:uuid:buz&quot;, &quot;urn:x-uid:buz&quot;,),
+            (&quot;urn:x-uid:foo&quot;, &quot;/foo&quot;),
+            (&quot;urn:x-uid:bar&quot;, &quot;mailto:bar@example.com&quot;,),
+            (&quot;urn:x-uid:baz&quot;, &quot;http://example.com/baz&quot;,),
+            (&quot;urn:x-uid:buz&quot;, &quot;urn:x-uid:buz&quot;,),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         def lookupFunction(cuaddr, ignored1, ignored2):
</span><span class="lines">@@ -8549,44 +8562,68 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:baz&quot; : (
</span><span class="cx">                         &quot;Baz&quot;,
</span><span class="cx">                         &quot;baz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</del><ins>+                        (&quot;urn:x-uid:baz&quot;, &quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:buz&quot; : (
</span><span class="cx">                         &quot;Buz&quot;,
</span><span class="cx">                         &quot;buz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;,)
</ins><span class="cx">                     ),
</span><ins>+                    &quot;urn:x-uid:foo&quot; : (
+                        &quot;Foo&quot;,
+                        &quot;foo&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
+                    ),
+                    &quot;urn:x-uid:bar&quot; : (
+                        &quot;Bar&quot;,
+                        &quot;bar&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
+                    ),
+                    &quot;urn:x-uid:baz&quot; : (
+                        &quot;Baz&quot;,
+                        &quot;baz&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:baz&quot;, &quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
+                    ),
+                    &quot;urn:x-uid:buz&quot; : (
+                        &quot;Buz&quot;,
+                        &quot;buz&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;,)
+                    ),
</ins><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">         for cuaddr, result in data:
</span><del>-            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toUUID=False)
</del><ins>+            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toCanonical=False)
</ins><span class="cx">             self.assertEquals(new_cuaddr, result)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_normalizeCUAddressToUUID(self):
</del><ins>+    def test_normalizeCUAddressToCanonical(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure http(s) and /path CUA values are tucked away into the property
</span><span class="cx">         using CALENDARSERVER-OLD-CUA parameter.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         data = (
</span><del>-            (&quot;/principals/users/foo&quot;, &quot;urn:uuid:foo&quot;,),
-            (&quot;http://example.com/principals/users/buz&quot;, &quot;urn:uuid:buz&quot;,),
</del><ins>+            (&quot;/principals/users/foo&quot;, &quot;urn:x-uid:foo&quot;,),
+            (&quot;http://example.com/principals/users/buz&quot;, &quot;urn:x-uid:buz&quot;,),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -8597,19 +8634,19 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/buz&quot; : (
</span><span class="cx">                         &quot;Buz&quot;,
</span><span class="cx">                         &quot;buz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">         for cuaddr, result in data:
</span><del>-            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toUUID=True)
</del><ins>+            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toCanonical=True)
</ins><span class="cx">             self.assertEquals(new_cuaddr, result)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatwistedcaldavtesttest_upgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -1537,13 +1537,13 @@
</span><span class="cx"> 
</span><span class="cx">         records = {
</span><span class="cx">             &quot;mailto:a@example.com&quot;:
</span><del>-                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:uuid:123&quot;)),
</del><ins>+                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:x-uid:123&quot;)),
</ins><span class="cx">             &quot;mailto:b@example.com&quot;:
</span><del>-                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:uuid:234&quot;)),
</del><ins>+                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:x-uid:234&quot;)),
</ins><span class="cx">             &quot;/principals/users/a&quot;:
</span><del>-                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:uuid:123&quot;)),
</del><ins>+                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:x-uid:123&quot;)),
</ins><span class="cx">             &quot;/principals/users/b&quot;:
</span><del>-                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:uuid:234&quot;)),
</del><ins>+                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:x-uid:234&quot;)),
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         directory = StubDirectory()
</span><span class="lines">@@ -1681,17 +1681,18 @@
</span><span class="cx"> DTSTART;TZID=US/Pacific:20090203T120000
</span><span class="cx"> DTEND;TZID=US/Pacific:20090203T130000
</span><span class="cx"> ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez@example.com;
</span><del>- PARTSTAT=ACCEPTED:urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D
</del><ins>+ PARTSTAT=ACCEPTED:urn:x-uid:6423F94A-6B76-4A3A-815B-D52CFD77935D
</ins><span class="cx"> ATTENDEE;CN=Double 'quotey' Quotes;CUTYPE=INDIVIDUAL;EMAIL=doublequotes@ex
</span><del>- ample.com;PARTSTAT=ACCEPTED:urn:uuid:8E04787E-336D-41ED-A70B-D233AD0DCE6F
</del><ins>+ ample.com;PARTSTAT=ACCEPTED:urn:x-uid:8E04787E-336D-41ED-A70B-D233AD0DCE6
+ F
</ins><span class="cx"> ATTENDEE;CN=Cyrus Daboo;CUTYPE=INDIVIDUAL;EMAIL=cdaboo@example.com;PARTSTA
</span><del>- T=ACCEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:5A985493-EE2C-4665-94CF-4DFEA3A8
- 9500
</del><ins>+ T=ACCEPTED;ROLE=REQ-PARTICIPANT:urn:x-uid:5A985493-EE2C-4665-94CF-4DFEA3A
+ 89500
</ins><span class="cx"> CREATED:20090203T181910Z
</span><span class="cx"> DESCRIPTION:This has &quot; Bad Quotes &quot; in it
</span><span class="cx"> DTSTAMP:20090203T181924Z
</span><del>-ORGANIZER;CN=Cyrus Daboo;EMAIL=cdaboo@example.com:urn:uuid:5A985493-EE2C-4
- 665-94CF-4DFEA3A89500
</del><ins>+ORGANIZER;CN=Cyrus Daboo;EMAIL=cdaboo@example.com:urn:x-uid:5A985493-EE2C-
+ 4665-94CF-4DFEA3A89500
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> SUMMARY:New Event
</span><span class="cx"> TRANSP:OPAQUE
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatwistedcaldavupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -587,7 +587,8 @@
</span><span class="cx"> @inlineCallbacks
</span><span class="cx"> def normalizeCUAddrs(data, directory, cuaCache):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Normalize calendar user addresses to urn:uuid: form.
</del><ins>+    Normalize calendar user addresses in data.  Cache CUA lookup results for
+    great speed.
</ins><span class="cx"> 
</span><span class="cx">     @param data: the calendar data to convert
</span><span class="cx">     @type data: C{str}
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreschedulingimplicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -633,7 +633,7 @@
</span><span class="cx">                 self.calendar.sequenceInSync(self.oldcalendar)
</span><span class="cx"> 
</span><span class="cx">             # Significant change
</span><del>-            no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule, status_cancelled, only_status = yield self.isOrganizerChangeInsignificant()
</del><ins>+            no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule, status_cancelled, only_status = self.isOrganizerChangeInsignificant()
</ins><span class="cx">             if no_change:
</span><span class="cx">                 if reinvites:
</span><span class="cx">                     log.debug(&quot;Implicit - organizer '{organizer}' is re-inviting UID: '{uid}', attendees: {attendees}&quot;, organizer=self.organizer, uid=self.uid, attendees=&quot;, &quot;.join(reinvites))
</span><span class="lines">@@ -721,7 +721,6 @@
</span><span class="cx">                 pass
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
</del><span class="cx">     def isOrganizerChangeInsignificant(self):
</span><span class="cx"> 
</span><span class="cx">         rids = None
</span><span class="lines">@@ -812,16 +811,8 @@
</span><span class="cx">                     only_status = False
</span><span class="cx"> 
</span><span class="cx">             if checkOrganizerValue:
</span><del>-                @inlineCallbacks
-                def _normalizeCUAddress(addr):
-                    if not addr.startswith(&quot;urn:uuid&quot;):
-                        principal = yield self.calendar_home.directoryService().recordWithCalendarUserAddress(addr)
-                        if principal is not None:
-                            addr = principal.canonicalCalendarUserAddress()
-                    returnValue(addr)
-
-                oldOrganizer = yield _normalizeCUAddress(self.oldcalendar.getOrganizer())
-                newOrganizer = yield _normalizeCUAddress(self.calendar.getOrganizer())
</del><ins>+                oldOrganizer = self.oldcalendar.getOrganizer()
+                newOrganizer = self.calendar.getOrganizer()
</ins><span class="cx">                 if oldOrganizer != newOrganizer:
</span><span class="cx">                     log.error(&quot;Cannot change ORGANIZER: UID:{uid}&quot;, uid=self.uid)
</span><span class="cx">                     raise HTTPError(ErrorResponse(
</span><span class="lines">@@ -839,10 +830,10 @@
</span><span class="cx">                 except KeyError:
</span><span class="cx">                     pass
</span><span class="cx"> 
</span><del>-        returnValue((
</del><ins>+        return (
</ins><span class="cx">             no_change, rids, date_changed_rids, reinvites,
</span><span class="cx">             recurrence_reschedule, status_cancelled, only_status
</span><del>-        ))
</del><ins>+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def findRemovedAttendees(self):
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreschedulingischeduledeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -359,7 +359,7 @@
</span><span class="cx">         # The Originator must be the ORGANIZER (for a request) or ATTENDEE (for a reply)
</span><span class="cx">         originator = self.scheduler.organizer.cuaddr if self.scheduler.isiTIPRequest else self.scheduler.attendee
</span><span class="cx">         if self.server.unNormalizeAddresses:
</span><del>-            originator = yield normalizeCUAddress(originator, normalizationLookup, self.scheduler.txn.directoryService().recordWithCalendarUserAddress, toUUID=False)
</del><ins>+            originator = yield normalizeCUAddress(originator, normalizationLookup, self.scheduler.txn.directoryService().recordWithCalendarUserAddress, toCanonical=False)
</ins><span class="cx">         self.headers.addRawHeader(&quot;Originator&quot;, utf8String(originator))
</span><span class="cx">         self.sign_headers.append(&quot;Originator&quot;)
</span><span class="cx"> 
</span><span class="lines">@@ -417,7 +417,7 @@
</span><span class="cx">                 yield normalizedCalendar.normalizeCalendarUserAddresses(
</span><span class="cx">                     normalizationLookup,
</span><span class="cx">                     self.scheduler.txn.directoryService().recordWithCalendarUserAddress,
</span><del>-                    toUUID=False)
</del><ins>+                    toCanonical=False)
</ins><span class="cx"> 
</span><span class="cx">             # For VFREEBUSY we need to strip out ATTENDEEs that do not match the recipient list
</span><span class="cx">             if self.scheduler.isfreebusy:
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreschedulingtesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -1295,7 +1295,8 @@
</span><span class="cx"> 
</span><span class="cx">         cobj = yield self.calendarObjectUnderTest(home=&quot;user01&quot;, name=&quot;test.ics&quot;)
</span><span class="cx">         comp = yield cobj.component()
</span><del>-        self.assertTrue(comp.getOrganizer().startswith(&quot;mailto:&quot;))
</del><ins>+        # Because CUA normalization happens in component() now too...
+        self.assertTrue(comp.getOrganizer().startswith(&quot;urn:x-uid:&quot;))
</ins><span class="cx">         self.assertFalse(comp.getOrganizerScheduleAgent())
</span><span class="cx"> 
</span><span class="cx">         cobj = yield self.calendarObjectUnderTest(home=&quot;user01&quot;, name=&quot;test.ics&quot;)
</span><span class="lines">@@ -1304,7 +1305,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj = yield self.calendarObjectUnderTest(home=&quot;user01&quot;, name=&quot;test.ics&quot;)
</span><span class="cx">         comp = yield cobj.component()
</span><del>-        self.assertTrue(comp.getOrganizer().startswith(&quot;urn:uuid:&quot;))
</del><ins>+        self.assertTrue(comp.getOrganizer().startswith(&quot;urn:x-uid:&quot;))
</ins><span class="cx">         self.assertTrue(comp.getOrganizerScheduleAgent())
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -3003,6 +3003,14 @@
</span><span class="cx">             # Fix any bogus data we can
</span><span class="cx">             fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
</span><span class="cx"> 
</span><ins>+            # Normalize CUAs:
+            # FIXME: update the DB copy as well so we don't keep going through
+            # this normalization?
+            yield component.normalizeCalendarUserAddresses(
+                normalizationLookup,
+                self.directoryService().recordWithCalendarUserAddress
+            )
+
</ins><span class="cx">             if unfixed:
</span><span class="cx">                 self.log.error(
</span><span class="cx">                     &quot;Calendar data id={0} had unfixable problems:\n  {1}&quot;.format(
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -103,8 +103,8 @@
</span><span class="cx">         calendar_resource1 = (yield self.calendarObjectUnderTest(name=&quot;test.ics&quot;, home=&quot;user01&quot;,))
</span><span class="cx">         calendar1 = (yield calendar_resource1.component())
</span><span class="cx">         calendar1 = str(calendar1).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><del>-        self.assertTrue(&quot;urn:uuid:user01&quot; in calendar1)
-        self.assertTrue(&quot;urn:uuid:user02&quot; in calendar1)
</del><ins>+        self.assertTrue(&quot;urn:x-uid:user01&quot; in calendar1)
+        self.assertTrue(&quot;urn:x-uid:user02&quot; in calendar1)
</ins><span class="cx">         self.assertTrue(&quot;CN=&quot; in calendar1)
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="lines">@@ -543,7 +543,7 @@
</span><span class="cx"> DTSTAMP:20080601T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;
</del><ins>+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:x-uid:user01&quot;;
</ins><span class="cx">  X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -577,7 +577,7 @@
</span><span class="cx">         calendar_resource = (yield self.calendarObjectUnderTest(name=&quot;test.ics&quot;, home=&quot;user01&quot;,))
</span><span class="cx">         calendar1 = (yield calendar_resource.component())
</span><span class="cx">         calendar1 = str(calendar1).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><del>-        self.assertTrue(&quot;X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=\&quot;urn:uuid:user01\&quot;;X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment&quot; in calendar1)
</del><ins>+        self.assertTrue(&quot;X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=\&quot;urn:x-uid:user01\&quot;;X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment&quot; in calendar1)
</ins><span class="cx">         self.assertTrue(&quot;SUMMARY:Changed&quot; in calendar1)
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretesttest_queue_schedulingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -122,10 +122,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -139,10 +139,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -155,10 +155,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> TRANSP:TRANSPARENT
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -172,10 +172,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -188,10 +188,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -205,9 +205,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> REQUEST-STATUS:2.0;Success
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -221,10 +221,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com;SCHEDULE-STATUS=1.2:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com;SCHEDULE-STATUS=1.2:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -2022,10 +2022,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20130806T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2034,10 +2034,10 @@
</span><span class="cx"> RECURRENCE-ID:20130807T120000Z
</span><span class="cx"> DTSTART:20130807T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2050,10 +2050,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20130806T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-2
</span><span class="lines">@@ -2063,10 +2063,10 @@
</span><span class="cx"> RECURRENCE-ID:20130807T000000Z
</span><span class="cx"> DTSTART:20130807T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2080,10 +2080,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20130806T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-2
</span><span class="lines">@@ -2093,10 +2093,10 @@
</span><span class="cx"> RECURRENCE-ID:20130807T000000Z
</span><span class="cx"> DTSTART:20130807T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2160,12 +2160,12 @@
</span><span class="cx"> DTSTART;TZID=America/Los_Angeles:20131211T164500
</span><span class="cx"> DTEND;TZID=America/Los_Angeles:20131211T174500
</span><span class="cx"> ATTENDEE;CN=Conference Room One;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
</span><del>- T;SCHEDULE-STATUS=2.0:urn:uuid:room1
</del><ins>+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room1
</ins><span class="cx"> ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
</span><del>- CEPTED:urn:uuid:user01
</del><ins>+ CEPTED:urn:x-uid:user01
</ins><span class="cx"> CREATED:20131211T221854Z
</span><span class="cx"> DTSTAMP:20131211T230632Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=5
</span><span class="cx"> SEQUENCE:8
</span><span class="cx"> SUMMARY:locations
</span><span class="lines">@@ -2177,12 +2177,12 @@
</span><span class="cx"> DTSTART;TZID=America/Los_Angeles:20131214T160000
</span><span class="cx"> DTEND;TZID=America/Los_Angeles:20131214T170000
</span><span class="cx"> ATTENDEE;CN=Conference Room Two;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
</span><del>- T;SCHEDULE-STATUS=2.0:urn:uuid:room2
</del><ins>+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room2
</ins><span class="cx"> ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
</span><del>- CEPTED:urn:uuid:user01
</del><ins>+ CEPTED:urn:x-uid:user01
</ins><span class="cx"> CREATED:20131211T221854Z
</span><span class="cx"> DTSTAMP:20131211T230632Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:8
</span><span class="cx"> SUMMARY:locations
</span><span class="cx"> TRANSP:OPAQUE
</span><span class="lines">@@ -2571,11 +2571,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2589,10 +2589,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user05
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user05
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2606,11 +2606,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2624,11 +2624,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user04
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user04
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2637,10 +2637,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2654,12 +2654,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2685,11 +2685,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2703,11 +2703,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:uuid:user04
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:x-uid:user04
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2716,10 +2716,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2741,12 +2741,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2765,12 +2765,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2796,13 +2796,13 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_back25)s
</span><span class="cx"> EXDATE:%(now_back24)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2829,12 +2829,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2854,11 +2854,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:uuid:user04
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:x-uid:user04
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2881,10 +2881,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:uuid:user05
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:x-uid:user05
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2908,10 +2908,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:uuid:user05
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:x-uid:user05
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3188,10 +3188,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3208,10 +3208,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3235,10 +3235,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3251,10 +3251,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3270,10 +3270,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3294,10 +3294,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3459,10 +3459,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3477,10 +3477,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="lines">@@ -3494,10 +3494,10 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -3506,10 +3506,10 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -3518,10 +3518,10 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -3535,10 +3535,10 @@
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3553,10 +3553,10 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3571,10 +3571,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3589,10 +3589,10 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3602,10 +3602,10 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3620,10 +3620,10 @@
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3638,10 +3638,10 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3663,10 +3663,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3681,10 +3681,10 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3694,10 +3694,10 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3913,7 +3913,7 @@
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3930,7 +3930,7 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3966,7 +3966,7 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3983,7 +3983,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3995,7 +3995,7 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4044,7 +4044,7 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4061,7 +4061,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4073,7 +4073,7 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4096,7 +4096,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4143,7 +4143,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip2 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;C4526F4C-4324-4893-B769-BD766E4A4E7C&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4217,7 +4217,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4253,7 +4253,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;CANCEL&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4336,7 +4336,7 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4371,7 +4371,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4475,7 +4475,7 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4505,7 +4505,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4541,7 +4541,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4697,7 +4697,7 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4714,7 +4714,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4726,7 +4726,7 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4758,7 +4758,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4777,7 +4777,7 @@
</span><span class="cx">         processor.recipient_calendar = None
</span><span class="cx">         processor.message = Component.fromString(itip2 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;C4526F4C-4324-4893-B769-BD766E4A4E7C&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4858,11 +4858,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4876,10 +4876,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -4893,11 +4893,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4911,11 +4911,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -4924,10 +4924,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -4941,12 +4941,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4972,11 +4972,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4990,11 +4990,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5003,10 +5003,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5028,12 +5028,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5055,11 +5055,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5073,10 +5073,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5093,12 +5093,12 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_back24)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5112,11 +5112,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5204,11 +5204,11 @@
</span><span class="cx"> 
</span><span class="cx">         # Verify cuser02 data
</span><span class="cx">         self.assertEqual(len(details), 2)
</span><del>-        self.assertEqual(details[0][0], &quot;urn:uuid:user01&quot;)
</del><ins>+        self.assertEqual(details[0][0], &quot;urn:x-uid:user01&quot;)
</ins><span class="cx">         self.assertEqual(details[0][1], (&quot;mailto:cuser01@example.org&quot;,))
</span><span class="cx">         self.assertEqual(normalize_iCalStr(details[0][2]), normalize_iCalStr(data_future_external) % relsubs, &quot;Failed future: %s\n%s&quot; % (title, diff_iCalStrs(details[0][2], data_future_external % relsubs),))
</span><span class="cx"> 
</span><del>-        self.assertEqual(details[1][0], &quot;urn:uuid:user01&quot;)
</del><ins>+        self.assertEqual(details[1][0], &quot;urn:x-uid:user01&quot;)
</ins><span class="cx">         self.assertEqual(details[1][1], (&quot;mailto:cuser01@example.org&quot;,))
</span><span class="cx">         self.assertEqual(normalize_iCalStr(details[1][2]), normalize_iCalStr(data_past_external) % relsubs, &quot;Failed past: %s\n%s&quot; % (title, diff_iCalStrs(details[1][2], data_past_external % relsubs),))
</span><span class="cx"> 
</span><span class="lines">@@ -5325,10 +5325,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5342,10 +5342,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5359,10 +5359,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5376,10 +5376,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5388,10 +5388,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5405,10 +5405,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5422,10 +5422,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5446,10 +5446,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5463,10 +5463,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5475,10 +5475,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5500,10 +5500,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5517,10 +5517,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5706,10 +5706,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;COUNT=36
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5723,10 +5723,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5740,10 +5740,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back28)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5757,10 +5757,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5769,10 +5769,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5786,10 +5786,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;COUNT=36
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5803,10 +5803,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5827,10 +5827,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back28)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5844,10 +5844,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5856,10 +5856,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5881,10 +5881,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;COUNT=36
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5898,10 +5898,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -81,6 +81,7 @@
</span><span class="cx">     def canonicalCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">             Return a CUA for this record, preferring in this order:
</span><ins>+            urn:x-uid: form
</ins><span class="cx">             urn:uuid: form
</span><span class="cx">             mailto: form
</span><span class="cx">             /principals/__uids__/ form
</span><span class="lines">@@ -90,6 +91,7 @@
</span><span class="cx">         sortedCuas = sorted(self.calendarUserAddresses)
</span><span class="cx"> 
</span><span class="cx">         for prefix in (
</span><ins>+            &quot;urn:x-uid:&quot;,
</ins><span class="cx">             &quot;urn:uuid:&quot;,
</span><span class="cx">             &quot;mailto:&quot;,
</span><span class="cx">             &quot;/principals/__uids__/&quot;
</span><span class="lines">@@ -147,6 +149,7 @@
</span><span class="cx">             (&quot;user%02d&quot; % (ctr,),),
</span><span class="cx">             &quot;User %02d&quot; % (ctr,),
</span><span class="cx">             frozenset((
</span><ins>+                &quot;urn:x-uid:user%02d&quot; % (ctr,),
</ins><span class="cx">                 &quot;urn:uuid:user%02d&quot; % (ctr,),
</span><span class="cx">                 &quot;mailto:user%02d@example.com&quot; % (ctr,),
</span><span class="cx">             )),
</span><span class="lines">@@ -188,13 +191,13 @@
</span><span class="cx">     ))
</span><span class="cx">     directory.addRecord(TestCalendarStoreDirectoryRecord(
</span><span class="cx">         &quot;room1&quot;, (&quot;room1&quot;,), &quot;Conference Room One&quot;,
</span><del>-        frozenset((&quot;urn:uuid:room1&quot;,)),
</del><ins>+        frozenset((&quot;urn:x-uid:room1&quot;,)),
</ins><span class="cx">         cutype=&quot;ROOM&quot;,
</span><span class="cx">         associatedAddress=&quot;il1&quot;,
</span><span class="cx">     ))
</span><span class="cx">     directory.addRecord(TestCalendarStoreDirectoryRecord(
</span><span class="cx">         &quot;room2&quot;, (&quot;room2&quot;,), &quot;Conference Room Two&quot;,
</span><del>-        frozenset((&quot;urn:uuid:room2&quot;,)),
</del><ins>+        frozenset((&quot;urn:x-uid:room2&quot;,)),
</ins><span class="cx">         cutype=&quot;ROOM&quot;,
</span><span class="cx">         associatedAddress=&quot;il2&quot;,
</span><span class="cx">     ))
</span><span class="lines">@@ -209,6 +212,7 @@
</span><span class="cx">         (uid,),
</span><span class="cx">         uid.capitalize(),
</span><span class="cx">         frozenset((
</span><ins>+            &quot;urn:x-uid:{0}&quot;.format(uid,),
</ins><span class="cx">             &quot;urn:uuid:{0}&quot;.format(uid,),
</span><span class="cx">             &quot;mailto:{0}@example.com&quot;.format(uid,),
</span><span class="cx">         )),
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcaldavdatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -104,8 +104,8 @@
</span><span class="cx"> def normalizationLookup(cuaddr, recordFunction, config):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Lookup function to be passed to ical.normalizeCalendarUserAddresses.
</span><del>-    Returns a tuple of (Full name C{str}, guid C{UUID}, cudtype C{str}, and
-    calendar user address list C{str}) for the given cuaddr.
</del><ins>+    Returns a tuple of (Full name C{unicode}, uid C{unicode}, cudtype C{str}, and
+    calendar user address list C{unicode}) for the given cuaddr.
</ins><span class="cx">     recordFunction is called to retrieve the record for the cuaddr.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     try:
</span><span class="lines">@@ -127,15 +127,10 @@
</span><span class="cx">         cuas = set(
</span><span class="cx">             [cua.encode(&quot;utf-8&quot;) for cua in record.calendarUserAddresses]
</span><span class="cx">         )
</span><del>-        try:
-            guid = record.guid
-        except AttributeError:
-            guid = None
</del><ins>+        returnValue((fullName, record.uid, record.getCUType(), cuas))
</ins><span class="cx"> 
</span><del>-        returnValue((fullName, guid, record.getCUType(), cuas))
</del><span class="cx"> 
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> @inlineCallbacks
</span><span class="cx"> def dropboxIDFromCalendarObject(calendarObject):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavcommondatastoresql_schemacurrentsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -1007,6 +1007,45 @@
</span><span class="cx"> create index SCHEDULE_REPLY_CANCEL_WORK_JOB_ID on
</span><span class="cx">   SCHEDULE_REPLY_CANCEL_WORK(JOB_ID);
</span><span class="cx"> 
</span><ins>+----------------------------------
+-- Principal Purge Polling Work --
+----------------------------------
+
+create table PRINCIPAL_PURGE_SCAN_POLLING_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null
+);
+
+create index PRINCIPAL_PURGE_SCAN_POLLING_WORK_JOB_ID on
+  PRINCIPAL_PURGE_SCAN_POLLING_WORK(JOB_ID);
+
+--------------------------------
+-- Principal Purge Check Work --
+--------------------------------
+
+create table PRINCIPAL_PURGE_CHECK_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null,
+  UID                           varchar(255) not null
+);
+
+create index PRINCIPAL_PURGE_CHECK_WORK_JOB_ID on
+  PRINCIPAL_PURGE_CHECK_WORK(JOB_ID);
+
+--------------------------
+-- Principal Purge Work --
+--------------------------
+
+create table PRINCIPAL_PURGE_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null,
+  UID                           varchar(255) not null
+);
+
+create index PRINCIPAL_PURGE_WORK_JOB_ID on
+  PRINCIPAL_PURGE_WORK(JOB_ID);
+
+
</ins><span class="cx"> --------------------
</span><span class="cx"> -- Schema Version --
</span><span class="cx"> --------------------
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavwhodirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -68,16 +68,23 @@
</span><span class="cx">         from txdav.caldav.datastore.scheduling.cuaddress import normalizeCUAddr
</span><span class="cx">         address = normalizeCUAddr(address)
</span><span class="cx">         record = None
</span><del>-        if address.startswith(&quot;urn:uuid:&quot;):
</del><ins>+
+        if address.startswith(&quot;urn:x-uid:&quot;):
+            uid = address[10:]
+            record = yield self.recordWithUID(uid)
+
+        elif address.startswith(&quot;urn:uuid:&quot;):
</ins><span class="cx">             try:
</span><span class="cx">                 guid = uuid.UUID(address[9:])
</span><span class="cx">             except ValueError:
</span><span class="cx">                 log.info(&quot;Invalid GUID: {guid}&quot;, guid=address[9:])
</span><span class="cx">                 returnValue(None)
</span><span class="cx">             record = yield self.recordWithGUID(guid)
</span><ins>+
</ins><span class="cx">         elif address.startswith(&quot;mailto:&quot;):
</span><span class="cx">             records = yield self.recordsWithEmailAddress(address[7:])
</span><span class="cx">             record = records[0] if records else None
</span><ins>+
</ins><span class="cx">         elif address.startswith(&quot;/principals/&quot;):
</span><span class="cx">             parts = address.split(&quot;/&quot;)
</span><span class="cx">             if len(parts) == 4:
</span><span class="lines">@@ -85,7 +92,6 @@
</span><span class="cx">                     uid = parts[3]
</span><span class="cx">                     record = yield self.recordWithUID(uid)
</span><span class="cx">                 else:
</span><del>-                    # recordType = self.fieldName.lookupByName(parts[2])
</del><span class="cx">                     recordType = self.oldNameToRecordType(parts[2])
</span><span class="cx">                     record = yield self.recordWithShortName(recordType, parts[3])
</span><span class="cx"> 
</span><span class="lines">@@ -259,30 +265,31 @@
</span><span class="cx">         except AttributeError:
</span><span class="cx">             pass
</span><span class="cx"> 
</span><del>-        try:
-            cuas = set(
-                [&quot;mailto:{0}&quot;.format(emailAddress,)
-                 for emailAddress in self.emailAddresses]
-            )
-        except AttributeError:
-            cuas = set()
</del><ins>+        cuas = set()
</ins><span class="cx"> 
</span><ins>+        # urn:x-uid:
+        cuas.add(&quot;urn:x-uid:{}&quot;.format(self.uid))
+
+        # urn:uuid:
</ins><span class="cx">         try:
</span><span class="cx">             if self.guid:
</span><span class="cx">                 if isinstance(self.guid, uuid.UUID):
</span><span class="cx">                     guid = unicode(self.guid).upper()
</span><span class="cx">                 else:
</span><span class="cx">                     guid = self.guid
</span><del>-                cuas.add(&quot;urn:uuid:{guid}&quot;.format(guid=guid))
</del><ins>+                cuas.add(&quot;urn:uuid:{}&quot;.format(guid))
</ins><span class="cx">         except AttributeError:
</span><span class="cx">             # No guid
</span><span class="cx">             pass
</span><del>-        cuas.add(u&quot;/principals/__uids__/{uid}/&quot;.format(uid=self.uid))
-        for shortName in self.shortNames:
-            cuas.add(u&quot;/principals/{rt}/{sn}/&quot;.format(
-                rt=self.service.recordTypeToOldName(self.recordType),
-                sn=shortName)
-            )
</del><ins>+
+        # mailto:
+        try:
+            for emailAddress in self.emailAddresses:
+                cuas.add(u&quot;mailto:{}&quot;.format(emailAddress))
+        except AttributeError:
+            # No emailAddresses
+            pass
+
</ins><span class="cx">         return frozenset(cuas)
</span><span class="cx"> 
</span><span class="cx">     # Mapping from directory record.recordType to RFC2445 CUTYPE values
</span><span class="lines">@@ -346,6 +353,7 @@
</span><span class="cx">     def canonicalCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">             Return a CUA for this record, preferring in this order:
</span><ins>+            urn:x-uid: form
</ins><span class="cx">             urn:uuid: form
</span><span class="cx">             mailto: form
</span><span class="cx">             /principals/__uids__/ form
</span><span class="lines">@@ -355,6 +363,7 @@
</span><span class="cx">         sortedCuas = sorted(self.calendarUserAddresses)
</span><span class="cx"> 
</span><span class="cx">         for prefix in (
</span><ins>+            &quot;urn:x-uid:&quot;,
</ins><span class="cx">             &quot;urn:uuid:&quot;,
</span><span class="cx">             &quot;mailto:&quot;,
</span><span class="cx">             &quot;/principals/__uids__/&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavwhotesttest_directorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -60,20 +60,22 @@
</span><span class="cx">         record = TestDirectoryRecord(
</span><span class="cx">             self.directory,
</span><span class="cx">             {
</span><del>-                FieldName.uid: u&quot;uid&quot;,
</del><ins>+                FieldName.uid: u&quot;test&quot;,
</ins><span class="cx">                 FieldName.shortNames: [u&quot;name&quot;],
</span><span class="cx">                 FieldName.recordType: RecordType.user,
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             record.canonicalCalendarUserAddress(),
</span><del>-            u&quot;/principals/__uids__/uid/&quot;
</del><ins>+            u&quot;urn:x-uid:test&quot;
</ins><span class="cx">         )
</span><span class="cx"> 
</span><ins>+        # Even with email address, canonical still remains urn:x-uid:
+
</ins><span class="cx">         record = TestDirectoryRecord(
</span><span class="cx">             self.directory,
</span><span class="cx">             {
</span><del>-                FieldName.uid: u&quot;uid&quot;,
</del><ins>+                FieldName.uid: u&quot;test&quot;,
</ins><span class="cx">                 FieldName.shortNames: [u&quot;name&quot;],
</span><span class="cx">                 FieldName.emailAddresses: [u&quot;test@example.com&quot;],
</span><span class="cx">                 FieldName.recordType: RecordType.user,
</span><span class="lines">@@ -81,25 +83,57 @@
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             record.canonicalCalendarUserAddress(),
</span><del>-            u&quot;mailto:test@example.com&quot;
</del><ins>+            u&quot;urn:x-uid:test&quot;
</ins><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
+    def test_calendarUserAddresses(self):
+        &quot;&quot;&quot;
+        Verify the right CUAs are advertised, which no longer includes the
+        /principals/ flavors (although those are still recognized by
+        recordWithCalendarUserAddress( ) for backwards compatibility).
+        &quot;&quot;&quot;
+
</ins><span class="cx">         record = TestDirectoryRecord(
</span><span class="cx">             self.directory,
</span><span class="cx">             {
</span><del>-                FieldName.uid: u&quot;uid&quot;,
</del><ins>+                FieldName.uid: u&quot;test&quot;,
</ins><span class="cx">                 FieldName.guid: UUID(&quot;E2F6C57F-BB15-4EF9-B0AC-47A7578386F1&quot;),
</span><del>-                FieldName.shortNames: [u&quot;name&quot;],
-                FieldName.emailAddresses: [u&quot;test@example.com&quot;],
</del><ins>+                FieldName.shortNames: [u&quot;name1&quot;, u&quot;name2&quot;],
+                FieldName.emailAddresses: [u&quot;test@example.com&quot;, u&quot;another@example.com&quot;],
</ins><span class="cx">                 FieldName.recordType: RecordType.user,
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><del>-            record.canonicalCalendarUserAddress(),
-            u&quot;urn:uuid:E2F6C57F-BB15-4EF9-B0AC-47A7578386F1&quot;
</del><ins>+            record.calendarUserAddresses,
+            frozenset(
+                [
+                    u&quot;urn:x-uid:test&quot;,
+                    u&quot;urn:uuid:E2F6C57F-BB15-4EF9-B0AC-47A7578386F1&quot;,
+                    u&quot;mailto:test@example.com&quot;,
+                    u&quot;mailto:another@example.com&quot;,
+                ]
+            )
</ins><span class="cx">         )
</span><span class="cx"> 
</span><ins>+        record = TestDirectoryRecord(
+            self.directory,
+            {
+                FieldName.uid: u&quot;test&quot;,
+                FieldName.shortNames: [u&quot;name1&quot;, u&quot;name2&quot;],
+                FieldName.recordType: RecordType.user,
+            }
+        )
+        self.assertEquals(
+            record.calendarUserAddresses,
+            frozenset(
+                [
+                    u&quot;urn:x-uid:test&quot;,
+                ]
+            )
+        )
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_recordsFromMatchExpression(self):
</span><span class="cx">         expression = MatchExpression(
</span><span class="lines">@@ -127,7 +161,9 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_recordWithCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Make sure hasCalendars is honored
</del><ins>+        Make sure various CUA forms are recognized and hasCalendars is honored.
+        Note: /principals/ CUAs are recognized but not advertised anymore; see
+        record.calendarUserAddresses.
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # hasCalendars
</span><span class="lines">@@ -135,7 +171,32 @@
</span><span class="cx">             u&quot;mailto:wsanchez@example.com&quot;
</span><span class="cx">         )
</span><span class="cx">         self.assertNotEquals(record, None)
</span><ins>+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
</ins><span class="cx"> 
</span><ins>+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;urn:x-uid:6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;/principals/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;/principals/users/wsanchez&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
</ins><span class="cx">         # no hasCalendars
</span><span class="cx">         record = yield self.directory.recordWithCalendarUserAddress(
</span><span class="cx">             u&quot;mailto:nocalendar@example.com&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcuatxdavwhotesttest_group_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py (13308 => 13309)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py        2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py        2014-04-17 18:25:57 UTC (rev 13309)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> from txdav.who.util import directoryFromConfig
</span><span class="cx"> import os
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class GroupAttendeeReconciliation(CommonCommonTests, unittest.TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     GroupAttendeeReconciliation tests
</span><span class="lines">@@ -41,12 +42,16 @@
</span><span class="cx">         yield super(GroupAttendeeReconciliation, self).setUp()
</span><span class="cx">         self.xmlService = xmlService(self.mktemp(), xmlData=None)
</span><span class="cx"> 
</span><del>-        self.patch(config.DirectoryService.params, &quot;xmlFile&quot;,
</del><ins>+        self.patch(
+            config.DirectoryService.params,
+            &quot;xmlFile&quot;,
</ins><span class="cx">             os.path.join(
</span><span class="cx">                 os.path.dirname(__file__), &quot;accounts&quot;, &quot;groupAttendeeAccounts.xml&quot;
</span><span class="cx">             )
</span><span class="cx">         )
</span><del>-        self.patch(config.ResourceService.params, &quot;xmlFile&quot;,
</del><ins>+        self.patch(
+            config.ResourceService.params,
+            &quot;xmlFile&quot;,
</ins><span class="cx">             os.path.join(
</span><span class="cx">                 os.path.dirname(__file__), &quot;accounts&quot;, &quot;resources.xml&quot;
</span><span class="cx">             )
</span><span class="lines">@@ -77,6 +82,7 @@
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000008&quot; : None,
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000009&quot; : None,
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000010&quot; : None,
</span><ins>+
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -118,12 +124,12 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
-ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000002
+ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -138,7 +144,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;10000000-0000-0000-0000-000000000001&quot;)
</span><span class="cx">         vcalendar2 = yield cobj1.component()
</span><del>-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
</del><ins>+        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(Component.fromString(data_get_1)))
</ins><span class="cx"> 
</span><span class="cx">         yield self._verifyObjectResourceCount(&quot;10000000-0000-0000-0000-000000000006&quot;, 1)
</span><span class="cx">         yield self._verifyObjectResourceCount(&quot;10000000-0000-0000-0000-000000000007&quot;, 1)
</span><span class="lines">@@ -176,10 +182,10 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> ATTENDEE;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:FFFFFFFF-EEEE-DDDD-CCCC-BBBBBBBBBBBB
</span><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -191,7 +197,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;10000000-0000-0000-0000-000000000001&quot;)
</span><span class="cx">         vcalendar2 = yield cobj1.component()
</span><del>-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
</del><ins>+        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(Component.fromString(data_get_1)))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -227,11 +233,11 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -242,7 +248,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;10000000-0000-0000-0000-000000000001&quot;)
</span><span class="cx">         vcalendar1 = yield cobj1.component()
</span><del>-        self.assertEqual(normalize_iCalStr(vcalendar1), normalize_iCalStr(data_get_1))
</del><ins>+        self.assertEqual(normalize_iCalStr(vcalendar1), normalize_iCalStr(Component.fromString(data_get_1)))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -271,7 +277,7 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> ORGANIZER:MAILTO:user01@example.com
</span><span class="cx"> ATTENDEE:mailto:user01@example.com
</span><del>-ATTENDEE:urn:uuid:20000000-0000-0000-0000-000000000004
</del><ins>+ATTENDEE:urn:x-uid:20000000-0000-0000-0000-000000000004
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR&quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -283,15 +289,15 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000004
-ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
-ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
-ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
-ATTENDEE;CN=User 10;EMAIL=user10@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000010
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000004
+ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
+ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000008
+ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000009
+ATTENDEE;CN=User 10;EMAIL=user10@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000010
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -303,7 +309,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;10000000-0000-0000-0000-000000000001&quot;)
</span><span class="cx">         vcalendar2 = yield cobj1.component()
</span><del>-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
</del><ins>+        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(Component.fromString(data_get_1)))
</ins><span class="cx"> 
</span><span class="cx">         yield self._verifyObjectResourceCount(&quot;10000000-0000-0000-0000-000000000006&quot;, 1)
</span><span class="cx">         yield self._verifyObjectResourceCount(&quot;10000000-0000-0000-0000-000000000007&quot;, 1)
</span><span class="lines">@@ -351,16 +357,16 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 03;CUTYPE=GROUP;EMAIL=group03@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000003
-ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
-ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
-ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 03;CUTYPE=GROUP;EMAIL=group03@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000003
+ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000008
+ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000009
+ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -372,7 +378,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj1 = yield self.calendarObjectUnderTest(name=&quot;data1.ics&quot;, calendar_name=&quot;calendar&quot;, home=&quot;10000000-0000-0000-0000-000000000001&quot;)
</span><span class="cx">         vcalendar2 = yield cobj1.component()
</span><del>-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
</del><ins>+        self.assertEqual(normalize_iCalStr(vcalendar2, sort=True), normalize_iCalStr(Component.fromString(data_get_1), sort=True))
</ins><span class="cx"> 
</span><span class="cx">         yield self._verifyObjectResourceCount(&quot;10000000-0000-0000-0000-000000000006&quot;, 1)
</span><span class="cx">         yield self._verifyObjectResourceCount(&quot;10000000-0000-0000-0000-000000000007&quot;, 1)
</span><span class="lines">@@ -410,10 +416,10 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:uuid:10000000-0000-0000-0000-000000000002
</del><ins>+ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:x-uid:10000000-0000-0000-0000-000000000002
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -427,11 +433,11 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
-ATTENDEE;CN=User 01;EMAIL=user01@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000001&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000001&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:uuid:10000000-0000-0000-0000-000000000002
</del><ins>+ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:x-uid:10000000-0000-0000-0000-000000000002
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span></span></pre>
</div>
</div>

</body>
</html>