<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>29178</bug_id>
          
          <creation_ts>2009-09-11 04:50:29 -0700</creation_ts>
          <short_desc>Geolocation should be refactored to use a single map to store all notifiers</short_desc>
          <delta_ts>2009-10-27 10:57:36 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>27944</blocked>
    
    <blocked>30122</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Steve Block">steveblock</reporter>
          <assigned_to name="Steve Block">steveblock</assigned_to>
          <cc>bolsinga</cc>
    
    <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>steveblock</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>146521</commentid>
    <comment_count>0</comment_count>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-09-11 04:50:29 -0700</bug_when>
    <thetext>Currently the Geolocation object stores its notifier objects in two data structures. A set for the one-shot notifiers, and a map (from watch ID to notifier) for the watcher notifiers.

The logic could be simplified if a single data structure were used. We could assign IDs to one-shot notifiers as well as watcher notifiers, and store both in a single maps.

This refactoring would also help solve the problem of looking up watchers by ID, encountered in Bug 27944.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151224</commentid>
    <comment_count>1</comment_count>
      <attachid>40361</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-09-30 05:14:56 -0700</bug_when>
    <thetext>Created attachment 40361
Patch 1 for bug 29178</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151899</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-02 11:05:08 -0700</bug_when>
    <thetext>Who else has worked on Geolocation in WebKit and should be thus CC&apos;d on this bug?  I&apos;m really not a geolocation expert, but I can take a look at this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151901</commentid>
    <comment_count>3</comment_count>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-02 11:07:58 -0700</bug_when>
    <thetext>&gt; Who else has worked on Geolocation in WebKit and should be thus CC&apos;d on this
&gt; bug?  I&apos;m really not a geolocation expert, but I can take a look at this.
Greg Bolsinga is the only other person who&apos;s worked on Geolocation, but he&apos;s not a reviewer. This bug was created as a result of Bug 27944, which Darin Adler is reviewing. I&apos;ve CC&apos;ed them both.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151907</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-02 11:12:36 -0700</bug_when>
    <thetext>Thank you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151910</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-02 11:18:09 -0700</bug_when>
    <thetext>Hum... I wasn&apos;t sure from the ChangeLog &quot;why&quot; we were doing this change, although it makes a bit more sense now reading the bug.  Still feels a little strange to me to use positive/negative to denote type here.

Why m_id instead of m_requestId or similar, as you seem to suggest it could/should be called in your changelog comments.

&quot;id&quot; is a reserved word in Obj-C, so if this header was included by Objective-C code, that could be an issue.

I didn&apos;t stare at the details of the change particularly closely.  Overall it looked fine.  I&apos;m still slightly confused as to why, but really whichever of you is maintaining the geolocation code these days (you, greg, both, neither?) are in a better place to assess the &quot;why&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151913</commentid>
    <comment_count>6</comment_count>
      <attachid>40361</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-02 11:27:46 -0700</bug_when>
    <thetext>Comment on attachment 40361
Patch 1 for bug 29178

It&apos;s a little inelegant to use positive and negative numbers to make the map do two different things. It&apos;s the sort of &quot;cleverness&quot; we often try to avoid. I&apos;ll point out that the same thing can be done with unsigned integers just by choosing an arbitrary large number and having both sets of IDs go up. The large number approach avoids having to write the comment about avoiding the magic number -1. You also would need a function isValidWatchId to use instead of the &quot;&gt; 0&quot; and &quot;&lt;= 0&quot; checks, but this is actually an advantage rather than a disadvantage, since the code will be easier to read. A function like that would be good even if we do stick with the negative numbers.

In both cases, the real issue is guaranteeing the number won&apos;t wrap around. I&apos;d like to see a comment explaining why overflow is known to not be an issue. Can&apos;t people intentionally do something in a tight loop and create the overflow?

I suppose we can live with it.

Normally I like to name the global something like lastUsedWatchID or nextAvailableWatchID rather than watchID to make it more clear why it&apos;s a global variable.

&gt; +    GeoNotifierMap::const_iterator end = m_notifiers.end();
&gt; +    for (GeoNotifierMap::const_iterator it = m_notifiers.begin(); it != end; ++it) {
&gt; +        RefPtr&lt;GeoNotifier&gt; notifier = it-&gt;second;
&gt;          notifier-&gt;m_timer.stop();
&gt;      }

This is an unnecessary bit of reference count churn. I suggest writing it like this:

    it-&gt;second-&gt;notifier-&gt;m_timer.stop();

or like this:

    const RefPtr&lt;GeoNotifier&gt;&amp; notifier = it-&gt;second;
    notifier-&gt;m_timer.stop();

or like this:

    GeoNotifier* notifier = it-&gt;second.get();
    notifier-&gt;m_timer.stop();

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>151915</commentid>
    <comment_count>7</comment_count>
    <who name="Greg Bolsinga">bolsinga</who>
    <bug_when>2009-10-02 11:30:53 -0700</bug_when>
    <thetext>Looks good to me. I agree with Eric, if you can remove &apos;id&apos; as a variable name, Obj-C++ will appreciate it.

Also, the single &quot;&lt; 0&quot; test in Geolocation::clearOneShots may benefit from a comment similar to the one in the header. Alternately, could you create a inline method like &quot;bool isOneShot()&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152374</commentid>
    <comment_count>8</comment_count>
      <attachid>40361</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-05 11:07:22 -0700</bug_when>
    <thetext>Comment on attachment 40361
Patch 1 for bug 29178

Since there were modifications suggested by Gavin and Darin, this can&apos;t be landed by the bot.  cq-.  You can either post a new version, or make the suggested fixes when you land.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152700</commentid>
    <comment_count>9</comment_count>
      <attachid>40716</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-06 06:27:43 -0700</bug_when>
    <thetext>Created attachment 40716
Patch 2 for Bug 29178

(In reply to comment #5)
&gt; Why m_id instead of m_requestId or similar, as you seem to suggest it
&gt; could/should be called in your changelog comments.
&gt;
&gt; &quot;id&quot; is a reserved word in Obj-C, so if this header was included by
&gt; Objective-C code, that could be an issue.
Fixed.

(In reply to comment #6)
&gt; I&apos;ll
&gt; point out that the same thing can be done with unsigned integers just by
&gt; choosing an arbitrary large number and having both sets of IDs go up. The large
&gt; number approach avoids having to write the comment about avoiding the magic
&gt; number -1.
Yes, but it would complicate the logic in clearOneShots, which relies on the fact that one-shot IDs are smaller than watch IDs.

&gt; You also would need a function isValidWatchId to use instead of the
&gt; &quot;&gt; 0&quot; and &quot;&lt;= 0&quot; checks, but this is actually an advantage rather than a
&gt; disadvantage, since the code will be easier to read. A function like that would
&gt; be good even if we do stick with the negative numbers.
True, I&apos;ve added isOneShotRequest().

&gt; In both cases, the real issue is guaranteeing the number won&apos;t wrap around. I&apos;d
&gt; like to see a comment explaining why overflow is known to not be an issue.
&gt; Can&apos;t people intentionally do something in a tight loop and create the
&gt; overflow?
The existing code doesn&apos;t guard against overflow and I wasn&apos;t attempting to address it in this patch. Note that overflow is &apos;safe&apos; in that when a request ID is re-used, the previously existing request will be stopped, so requests are not leaked. Of course, references to the old ID will now refer to the wrong request, which should be fixed. I&apos;ve opened Bug 30122 to track this, as finding the right solution will probably require some discussion.

&gt; Normally I like to name the global something like lastUsedWatchID or
&gt; nextAvailableWatchID rather than watchID to make it more clear why it&apos;s a
&gt; global variable.
Fixed.

&gt; This is an unnecessary bit of reference count churn. I suggest writing it like
Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152799</commentid>
    <comment_count>10</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-06 11:41:28 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #6)
&gt; &gt; I&apos;ll
&gt; &gt; point out that the same thing can be done with unsigned integers just by
&gt; &gt; choosing an arbitrary large number and having both sets of IDs go up. The large
&gt; &gt; number approach avoids having to write the comment about avoiding the magic
&gt; &gt; number -1.
&gt; Yes, but it would complicate the logic in clearOneShots, which relies on the
&gt; fact that one-shot IDs are smaller than watch IDs.

Complicate in a good way. In my opinion, the current logic is unnecessarily subtle. It&apos;s the kind of cleverness that hurts maintainability over time. It would be easy to just add additional code in clearOneShots and not rely in that fact.

&gt; &gt; In both cases, the real issue is guaranteeing the number won&apos;t wrap around. I&apos;d
&gt; &gt; like to see a comment explaining why overflow is known to not be an issue.
&gt; &gt; Can&apos;t people intentionally do something in a tight loop and create the
&gt; &gt; overflow?
&gt; The existing code doesn&apos;t guard against overflow and I wasn&apos;t attempting to
&gt; address it in this patch. Note that overflow is &apos;safe&apos; in that when a request
&gt; ID is re-used, the previously existing request will be stopped, so requests are
&gt; not leaked. Of course, references to the old ID will now refer to the wrong
&gt; request, which should be fixed. I&apos;ve opened Bug 30122 to track this, as finding
&gt; the right solution will probably require some discussion.

Also note that overflow will take us from positive IDs to negative IDs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>152856</commentid>
    <comment_count>11</comment_count>
      <attachid>40742</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-06 14:07:15 -0700</bug_when>
    <thetext>Created attachment 40742
Patch 3 for Bug 29178

(In reply to comment #10)
&gt; Complicate in a good way. In my opinion, the current logic is unnecessarily
&gt; subtle. It&apos;s the kind of cleverness that hurts maintainability over time. It
&gt; would be easy to just add additional code in clearOneShots and not rely in that
&gt; fact.
OK, I&apos;ve updated the logic to use positive IDs for both one-shots and watchers. On wrap-around, we simply overwrite the previous request, to maintain the current behaviour.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155570</commentid>
    <comment_count>12</comment_count>
      <attachid>40742</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-10-18 22:49:04 -0700</bug_when>
    <thetext>Comment on attachment 40742
Patch 3 for Bug 29178

This doesn&apos;t seem like a win to me.  The code isn&apos;t really getting any simpler, which you can approximate by noting that this patch adds roughly as many lines as it removes, but the code is getting more obscure.

I haven&apos;t studied your use case in detail, but maybe what you really want is a superclass with two subclasses, one for each type of object you wish to store.

At a higher level, I&apos;m not sure this patch is solving a real problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155671</commentid>
    <comment_count>13</comment_count>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-19 06:16:41 -0700</bug_when>
    <thetext>&gt; At a higher level, I&apos;m not sure this patch is solving a real problem.
The problem being solved is the issue raised by Darin in Bug 27944, linked from the original description ...

---

&gt;&gt;&gt;&gt;&gt; +    for (GeoNotifierMap::iterator iter = m_watchers.begin(); iter != m_watchers.end(); ++iter) {
&gt;&gt;&gt;&gt;&gt; +        if (iter-&gt;second == notifier) {
&gt;&gt;&gt;&gt;&gt; +            m_watchers.remove(iter);
&gt;&gt;&gt;&gt;&gt; +            break;
&gt;&gt;&gt;&gt;&gt; +        }
&gt;&gt;&gt;&gt;&gt; +    }

&gt;&gt;&gt;&gt; Can a notifier have more than one watcher? It&apos;s unfortunate that we have to
&gt;&gt;&gt;&gt; iterate the map like this. Normally that&apos;s an anti-pattern -- we&apos;d use a pair
&gt;&gt;&gt;&gt; of maps to avoid it.

&gt;&gt;&gt; GeoNotifier represents a single request, which may be either a one-shot or a
&gt;&gt;&gt; watcher. This structure maps from watch ID (type int) to watcher (type
&gt;&gt;&gt; GeoNotifier). There&apos;s a one-to-one mapping between watch ID and watcher.
&gt;&gt;&gt;
&gt;&gt;&gt; An alternative to having to maintain a pair of maps would be to pass the watch
&gt;&gt;&gt; ID to the GeoNotifier constructor. The GeoNotifier would then pass this watch
&gt;&gt;&gt; ID, rather than its &apos;this&apos; pointer, to this method. For one-shots, which don&apos;t
&gt;&gt;&gt; have a watch ID, we could use either a single special value, or assign each a
&gt;&gt;&gt; unique ID for internal use only. What do you think? This might be best done in
&gt;&gt;&gt; a separate patch.

&gt;&gt; That sounds like a reasonable design. I don&apos;t feel that strongly but it&apos;s
&gt;&gt; always a warning sign when someone is iterating a map.

&gt; OK, I&apos;ll refactor to use an ID to identify all notifiers. This will also
&gt; simplify some of the logic. I&apos;ve been wanting to do this for a while. I&apos;ve
&gt; opened Bug 29178, which block this bug, to address this.

---

(In reply to comment #12)
&gt; (From update of attachment 40742 [details])
&gt; This doesn&apos;t seem like a win to me.  The code isn&apos;t really getting any simpler,
&gt; which you can approximate by noting that this patch adds roughly as many lines
&gt; as it removes, but the code is getting more obscure.
It&apos;s true that overall, the code isn&apos;t any simpler. But the reason for the change is as described above - we want to pass a requestID, rather than GeoNotifier*, to Geolocation::requestTimedOut to avoid having to iterate the maps of watchers. I also think that identifying all requests (one-shots, as well as watchers) by ID, and storing all requests in a single map, is neater and makes things simpler when performing operations on all requests, such as in stopTimers.

&gt; I haven&apos;t studied your use case in detail, but maybe what you really want is a
&gt; superclass with two subclasses, one for each type of object you wish to store.
I don&apos;t think so. The two sets of GeoNotifier objects I&apos;m storing are identical in nature - it&apos;s just that they&apos;re used differently by the Geolocation object.


Darin, are you happy with this approach? If not, I could resort to using a pair of maps for the watchers to avoid the look-up problem, which would probably require fewer changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>155946</commentid>
    <comment_count>14</comment_count>
      <attachid>40361</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-10-19 15:16:32 -0700</bug_when>
    <thetext>Comment on attachment 40361
Patch 1 for bug 29178

Clearing Darin Adler&apos;s r+ on this obsolete patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158161</commentid>
    <comment_count>15</comment_count>
      <attachid>41944</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-27 06:04:21 -0700</bug_when>
    <thetext>Created attachment 41944
Patch 4 for Bug 29178

Now using a pair of maps.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158237</commentid>
    <comment_count>16</comment_count>
      <attachid>41944</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-27 10:11:48 -0700</bug_when>
    <thetext>Comment on attachment 41944
Patch 4 for Bug 29178

r=me

&gt; +    if (iter != m_idToNotifierMap.end()) {
&gt; +        m_notifierToIdMap.remove(iter-&gt;second);
&gt; +        m_idToNotifierMap.remove(iter);
&gt; +    }

We normally prefer the early exit style, where this would return in the unusual failure case and the code would continue at the outer nesting level, rather than nesting the normal code flow path inside an if.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158258</commentid>
    <comment_count>17</comment_count>
      <attachid>41944</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-27 10:38:47 -0700</bug_when>
    <thetext>Comment on attachment 41944
Patch 4 for Bug 29178

cq- : Will land manually with Darin&apos;s minor change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158269</commentid>
    <comment_count>18</comment_count>
    <who name="Steve Block">steveblock</who>
    <bug_when>2009-10-27 10:57:36 -0700</bug_when>
    <thetext>Committed r50159: &lt;http://trac.webkit.org/changeset/50159&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40361</attachid>
            <date>2009-09-30 05:14:56 -0700</date>
            <delta_ts>2009-10-19 15:16:32 -0700</delta_ts>
            <desc>Patch 1 for bug 29178</desc>
            <filename>useSingleMapForNotifiers.txt</filename>
            <type>text/plain</type>
            <size>12445</size>
            <attacher name="Steve Block">steveblock</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0ODkyNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMDktMDktMzAgIFN0ZXZlIEJsb2NrICA8c3RldmVibG9ja0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEdlb2xvY2F0aW9uIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIHVzZSBhIHNpbmdsZSBtYXAgdG8g
c3RvcmUgYWxsIG5vdGlmaWVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI5MTc4CisKKyAgICAgICAgKiBwYWdlL0dlb2xvY2F0aW9uLmNwcDogTW9k
aWZpZWQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6Okdlb05v
dGlmaWVyKTogTW9kaWZpZWQuIFRha2VzIHJlcXVlc3QgSUQgYXMgYXJndW1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6OnRpbWVyRmlyZWQpOiBNb2RpZmll
ZC4gVXNlcyByZXF1ZXN0IElEIGFzIGFyZ3VtZW50IHRvIHJlcXVlc3RUaW1lZE91dC4KKyAgICAg
ICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpnZXRDdXJyZW50UG9zaXRpb24pOiBNb2RpZmllZC4g
TW92ZWQgY29tbW9uIGxvZ2ljIHRvIHN0YXJ0UmVxdWVzdC4KKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uOjp3YXRjaFBvc2l0aW9uKTogTW9kaWZpZWQuIE1vdmVkIGNvbW1vbiBsb2dpYyB0
byBzdGFydFJlcXVlc3QuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6c3RhcnRSZXF1
ZXN0KTogQWRkZWQuIFN0YXJ0cyBhIG9uZS1zaG90IG9yIHdhdGNoIHJlcXVlc3QuCisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6cmVxdWVzdFRpbWVkT3V0KTogTW9kaWZpZWQuIFRha2Vz
IHJlcXVlc3QgSUQgYXMgYXJndW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6
Y2xlYXJXYXRjaCk6IE1vZGlmaWVkLiBVc2VzIHNpbmdsZSBtYXAgZm9yIGFsbCByZXF1ZXN0cy4K
KyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpzdG9wVGltZXJzKTogTW9kaWZpZWQuIFVz
ZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJlcXVlc3RzLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9j
YXRpb246OmhhbmRsZUVycm9yKTogTW9kaWZpZWQuIFVzZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJl
cXVlc3RzLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Om1ha2VTdWNjZXNzQ2FsbGJh
Y2tzKTogTW9kaWZpZWQuIFVzZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJlcXVlc3RzLgorICAgICAg
ICAoV2ViQ29yZTo6R2VvbG9jYXRpb246OmNsZWFyT25lU2hvdHMpOiBBZGRlZC4gUmVtb3ZlcyBv
bmUtc2hvdCByZXF1ZXN0cy4KKyAgICAgICAgKiBwYWdlL0dlb2xvY2F0aW9uLmg6IE1vZGlmaWVk
LgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Okdlb05vdGlmaWVyOjpjcmVhdGUpOiBN
b2RpZmllZC4gVGFrZXMgcmVxdWVzdCBJRCBhcyBhcmd1bWVudC4KKyAgICAgICAgKFdlYkNvcmU6
Okdlb2xvY2F0aW9uOjpoYXNMaXN0ZW5lcnMpOiBNb2RpZmllZC4gVXNlcyBzaW5nbGUgbWFwIGZv
ciBhbGwgcmVxdWVzdHMuCisKIDIwMDktMDktMjkgIERhdmUgSHlhdHQgIDxoeWF0dEBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSm9uIEhvbmV5Y3V0dC4KSW5kZXg6IFdlYkNvcmUv
cGFnZS9HZW9sb2NhdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL0dlb2xvY2F0
aW9uLmNwcAkocmV2aXNpb24gNDg5MjQpCisrKyBXZWJDb3JlL3BhZ2UvR2VvbG9jYXRpb24uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zNSw4ICszNSw5IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotR2VvbG9jYXRpb246Okdlb05vdGlmaWVyOjpHZW9Ob3RpZmllcihHZW9sb2NhdGlvbiogZ2Vv
bG9jYXRpb24sIFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4gc3VjY2Vzc0NhbGxiYWNrLCBQ
YXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JDYWxsYmFjaz4gZXJyb3JDYWxsYmFjaywgUGFzc1JlZlB0
cjxQb3NpdGlvbk9wdGlvbnM+IG9wdGlvbnMpCi0gICAgOiBtX2dlb2xvY2F0aW9uKGdlb2xvY2F0
aW9uKQorR2VvbG9jYXRpb246Okdlb05vdGlmaWVyOjpHZW9Ob3RpZmllcihpbnQgaWQsIEdlb2xv
Y2F0aW9uKiBnZW9sb2NhdGlvbiwgUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiBzdWNjZXNz
Q2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBlcnJvckNhbGxiYWNr
LCBQYXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9ucz4gb3B0aW9ucykKKyAgICA6IG1faWQoaWQpCisg
ICAgLCBtX2dlb2xvY2F0aW9uKGdlb2xvY2F0aW9uKQogICAgICwgbV9zdWNjZXNzQ2FsbGJhY2so
c3VjY2Vzc0NhbGxiYWNrKQogICAgICwgbV9lcnJvckNhbGxiYWNrKGVycm9yQ2FsbGJhY2spCiAg
ICAgLCBtX29wdGlvbnMob3B0aW9ucykKQEAgLTY3LDcgKzY4LDcgQEAgdm9pZCBHZW9sb2NhdGlv
bjo6R2VvTm90aWZpZXI6OnRpbWVyRmlyZQogICAgICAgICBSZWZQdHI8UG9zaXRpb25FcnJvcj4g
ZXJyb3IgPSBQb3NpdGlvbkVycm9yOjpjcmVhdGUoUG9zaXRpb25FcnJvcjo6VElNRU9VVCwgIlRp
bWVvdXQgZXhwaXJlZCIpOwogICAgICAgICBtX2Vycm9yQ2FsbGJhY2stPmhhbmRsZUV2ZW50KGVy
cm9yLmdldCgpKTsKICAgICB9Ci0gICAgbV9nZW9sb2NhdGlvbi0+cmVxdWVzdFRpbWVkT3V0KHRo
aXMpOworICAgIG1fZ2VvbG9jYXRpb24tPnJlcXVlc3RUaW1lZE91dChtX2lkKTsKIH0KIAogR2Vv
bG9jYXRpb246Okdlb2xvY2F0aW9uKEZyYW1lKiBmcmFtZSkKQEAgLTkyLDI0ICs5MywzMCBAQCB2
b2lkIEdlb2xvY2F0aW9uOjpkaXNjb25uZWN0RnJhbWUoKQogCiB2b2lkIEdlb2xvY2F0aW9uOjpn
ZXRDdXJyZW50UG9zaXRpb24oUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiBzdWNjZXNzQ2Fs
bGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBlcnJvckNhbGxiYWNrLCBQ
YXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9ucz4gb3B0aW9ucykKIHsKLSAgICBSZWZQdHI8R2VvTm90
aWZpZXI+IG5vdGlmaWVyID0gR2VvTm90aWZpZXI6OmNyZWF0ZSh0aGlzLCBzdWNjZXNzQ2FsbGJh
Y2ssIGVycm9yQ2FsbGJhY2ssIG9wdGlvbnMpOwotCi0gICAgaWYgKG5vdGlmaWVyLT5oYXNaZXJv
VGltZW91dCgpIHx8IG1fc2VydmljZS0+c3RhcnRVcGRhdGluZyhub3RpZmllci0+bV9vcHRpb25z
LmdldCgpKSkKLSAgICAgICAgbm90aWZpZXItPnN0YXJ0VGltZXJJZk5lZWRlZCgpOwotICAgIGVs
c2UgewotICAgICAgICBpZiAobm90aWZpZXItPm1fZXJyb3JDYWxsYmFjaykgewotICAgICAgICAg
ICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+IGVycm9yID0gUG9zaXRpb25FcnJvcjo6Y3JlYXRlKFBv
c2l0aW9uRXJyb3I6OlBFUk1JU1NJT05fREVOSUVELCAiVW5hYmxlIHRvIFN0YXJ0Iik7Ci0gICAg
ICAgICAgICBub3RpZmllci0+bV9lcnJvckNhbGxiYWNrLT5oYW5kbGVFdmVudChlcnJvci5nZXQo
KSk7Ci0gICAgICAgIH0KKyAgICAvLyAtMSBpcyBhIHNwZWNpYWwga2V5IHZhbHVlIGZvciBXVEY6
Okhhc2hNYXAsIHNvIHN0YXJ0IGF0IC0yLgorICAgIHN0YXRpYyBpbnQgb25lU2hvdElkID0gLTI7
CisgICAgUmVmUHRyPEdlb05vdGlmaWVyPiBub3RpZmllciA9IHN0YXJ0UmVxdWVzdChvbmVTaG90
SWQsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9ucyk7CisgICAgaWYgKCFu
b3RpZmllcikKICAgICAgICAgcmV0dXJuOwotICAgIH0KIAotICAgIG1fb25lU2hvdHMuYWRkKG5v
dGlmaWVyKTsKKyAgICBtX25vdGlmaWVycy5zZXQob25lU2hvdElkLCBub3RpZmllcik7CisgICAg
b25lU2hvdElkLS07CiB9CiAKIGludCBHZW9sb2NhdGlvbjo6d2F0Y2hQb3NpdGlvbihQYXNzUmVm
UHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHN1Y2Nlc3NDYWxsYmFjaywgUGFzc1JlZlB0cjxQb3NpdGlv
bkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25PcHRpb25z
PiBvcHRpb25zKQogewotICAgIFJlZlB0cjxHZW9Ob3RpZmllcj4gbm90aWZpZXIgPSBHZW9Ob3Rp
Zmllcjo6Y3JlYXRlKHRoaXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9u
cyk7CisgICAgc3RhdGljIGludCB3YXRjaElkID0gMTsKKyAgICBSZWZQdHI8R2VvTm90aWZpZXI+
IG5vdGlmaWVyID0gc3RhcnRSZXF1ZXN0KHdhdGNoSWQsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JD
YWxsYmFjaywgb3B0aW9ucyk7CisgICAgaWYgKCFub3RpZmllcikKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBtX25vdGlmaWVycy5zZXQod2F0Y2hJZCwgbm90aWZpZXIpOworICAgIHJldHVybiB3
YXRjaElkKys7Cit9CisKK1Bhc3NSZWZQdHI8R2VvbG9jYXRpb246Okdlb05vdGlmaWVyPiBHZW9s
b2NhdGlvbjo6c3RhcnRSZXF1ZXN0KGludCBub3RpZmllcklkLCBQYXNzUmVmUHRyPFBvc2l0aW9u
Q2FsbGJhY2s+IHN1Y2Nlc3NDYWxsYmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJh
Y2s+IGVycm9yQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25PcHRpb25zPiBvcHRpb25zKQor
eworICAgIFJlZlB0cjxHZW9Ob3RpZmllcj4gbm90aWZpZXIgPSBHZW9Ob3RpZmllcjo6Y3JlYXRl
KG5vdGlmaWVySWQsIHRoaXMsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9u
cyk7CiAKICAgICBpZiAobm90aWZpZXItPmhhc1plcm9UaW1lb3V0KCkgfHwgbV9zZXJ2aWNlLT5z
dGFydFVwZGF0aW5nKG5vdGlmaWVyLT5tX29wdGlvbnMuZ2V0KCkpKQogICAgICAgICBub3RpZmll
ci0+c3RhcnRUaW1lcklmTmVlZGVkKCk7CkBAIC0xMjAsMjcgKzEyNywyOSBAQCBpbnQgR2VvbG9j
YXRpb246OndhdGNoUG9zaXRpb24oUGFzc1JlZlB0CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJu
IDA7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyBpbnQgc0lkZW50aWZpZXIgPSAwOwotICAgIAot
ICAgIG1fd2F0Y2hlcnMuc2V0KCsrc0lkZW50aWZpZXIsIG5vdGlmaWVyKTsKIAotICAgIHJldHVy
biBzSWRlbnRpZmllcjsKKyAgICByZXR1cm4gbm90aWZpZXIucmVsZWFzZSgpOyAgICAKIH0KIAot
dm9pZCBHZW9sb2NhdGlvbjo6cmVxdWVzdFRpbWVkT3V0KEdlb05vdGlmaWVyKiBub3RpZmllcikK
K3ZvaWQgR2VvbG9jYXRpb246OnJlcXVlc3RUaW1lZE91dChpbnQgbm90aWZpZXJJZCkKIHsKKyAg
ICBBU1NFUlQobV9ub3RpZmllcnMuY29udGFpbnMobm90aWZpZXJJZCkpOworCiAgICAgLy8gSWYg
dGhpcyBpcyBhIG9uZS1zaG90IHJlcXVlc3QsIHN0b3AgaXQuCi0gICAgbV9vbmVTaG90cy5yZW1v
dmUobm90aWZpZXIpOworICAgIGlmIChub3RpZmllcklkID49IDApCisgICAgICAgIHJldHVybjsK
IAorICAgIG1fbm90aWZpZXJzLnJlbW92ZShub3RpZmllcklkKTsKICAgICBpZiAoIWhhc0xpc3Rl
bmVycygpKQogICAgICAgICBtX3NlcnZpY2UtPnN0b3BVcGRhdGluZygpOwogfQogCiB2b2lkIEdl
b2xvY2F0aW9uOjpjbGVhcldhdGNoKGludCB3YXRjaElkKQogewotICAgIG1fd2F0Y2hlcnMucmVt
b3ZlKHdhdGNoSWQpOwotICAgIAorICAgIGlmICh3YXRjaElkIDw9IDApCisgICAgICAgIHJldHVy
bjsKKworICAgIG1fbm90aWZpZXJzLnJlbW92ZSh3YXRjaElkKTsKICAgICBpZiAoIWhhc0xpc3Rl
bmVycygpKQogICAgICAgICBtX3NlcnZpY2UtPnN0b3BVcGRhdGluZygpOwogfQpAQCAtMTkyLDU2
ICsyMDEsMzEgQEAgdm9pZCBHZW9sb2NhdGlvbjo6c2VuZFBvc2l0aW9uKFZlY3RvcjxSZQogICAg
IH0KIH0KIAotdm9pZCBHZW9sb2NhdGlvbjo6c3RvcFRpbWVyKFZlY3RvcjxSZWZQdHI8R2VvTm90
aWZpZXI+ID4mIG5vdGlmaWVycykKK3ZvaWQgR2VvbG9jYXRpb246OnN0b3BUaW1lcnMoKQogewot
ICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG5v
dGlmaWVycy5lbmQoKTsKLSAgICBmb3IgKFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbm90aWZpZXJzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICBSZWZQdHI8R2VvTm90aWZpZXI+IG5vdGlmaWVyID0gKml0OworICAgIEdlb05vdGlm
aWVyTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX25vdGlmaWVycy5lbmQoKTsKKyAgICBmb3Ig
KEdlb05vdGlmaWVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fbm90aWZpZXJzLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBSZWZQdHI8R2VvTm90aWZpZXI+IG5vdGlmaWVy
ID0gaXQtPnNlY29uZDsKICAgICAgICAgbm90aWZpZXItPm1fdGltZXIuc3RvcCgpOwogICAgIH0K
IH0KIAotdm9pZCBHZW9sb2NhdGlvbjo6c3RvcFRpbWVyc0Zvck9uZVNob3RzKCkKLXsKLSAgICBW
ZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IGNvcHk7Ci0gICAgY29weVRvVmVjdG9yKG1fb25l
U2hvdHMsIGNvcHkpOwotICAgIAotICAgIHN0b3BUaW1lcihjb3B5KTsKLX0KLQotdm9pZCBHZW9s
b2NhdGlvbjo6c3RvcFRpbWVyc0ZvcldhdGNoZXJzKCkKLXsKLSAgICBWZWN0b3I8UmVmUHRyPEdl
b05vdGlmaWVyPiA+IGNvcHk7Ci0gICAgY29weVZhbHVlc1RvVmVjdG9yKG1fd2F0Y2hlcnMsIGNv
cHkpOwotICAgIAotICAgIHN0b3BUaW1lcihjb3B5KTsKLX0KLQotdm9pZCBHZW9sb2NhdGlvbjo6
c3RvcFRpbWVycygpCi17Ci0gICAgc3RvcFRpbWVyc0Zvck9uZVNob3RzKCk7Ci0gICAgc3RvcFRp
bWVyc0ZvcldhdGNoZXJzKCk7Ci19Ci0KIHZvaWQgR2VvbG9jYXRpb246OmhhbmRsZUVycm9yKFBv
c2l0aW9uRXJyb3IqIGVycm9yKQogewogICAgIEFTU0VSVChlcnJvcik7CiAgICAgCi0gICAgVmVj
dG9yPFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBvbmVTaG90c0NvcHk7Ci0gICAgY29weVRvVmVjdG9y
KG1fb25lU2hvdHMsIG9uZVNob3RzQ29weSk7Ci0KLSAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlm
aWVyPiA+IHdhdGNoZXJzQ29weTsKLSAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV93YXRjaGVycywg
d2F0Y2hlcnNDb3B5KTsKKyAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IGNvcHk7Cisg
ICAgY29weVZhbHVlc1RvVmVjdG9yKG1fbm90aWZpZXJzLCBjb3B5KTsKIAotICAgIC8vIENsZWFy
IHRoZSBsaXN0cyBiZWZvcmUgd2UgbWFrZSB0aGUgY2FsbGJhY2tzLCB0byBhdm9pZCBjbGVhcmlu
ZyBub3RpZmllcnMKKyAgICAvLyBDbGVhciB0aGUgbm90aWZpZXJzIGJlZm9yZSB3ZSBtYWtlIHRo
ZSBjYWxsYmFja3MsIHRvIGF2b2lkIGNsZWFyaW5nIG5vdGlmaWVycwogICAgIC8vIGFkZGVkIGJ5
IGNhbGxzIHRvIEdlb2xvY2F0aW9uIG1ldGhvZHMgZnJvbSB0aGUgY2FsbGJhY2tzLCBhbmQgdG8g
cHJldmVudAogICAgIC8vIGZ1cnRoZXIgY2FsbGJhY2tzIHRvIHRoZXNlIG5vdGlmaWVycy4KLSAg
ICBtX29uZVNob3RzLmNsZWFyKCk7CiAgICAgaWYgKGVycm9yLT5pc0ZhdGFsKCkpCi0gICAgICAg
IG1fd2F0Y2hlcnMuY2xlYXIoKTsKKyAgICAgICAgbV9ub3RpZmllcnMuY2xlYXIoKTsKKyAgICBl
bHNlCisgICAgICAgIGNsZWFyT25lU2hvdHMoKTsKIAotICAgIHNlbmRFcnJvcihvbmVTaG90c0Nv
cHksIGVycm9yKTsKLSAgICBzZW5kRXJyb3Iod2F0Y2hlcnNDb3B5LCBlcnJvcik7CisgICAgc2Vu
ZEVycm9yKGNvcHksIGVycm9yKTsKIAogICAgIGlmICghaGFzTGlzdGVuZXJzKCkpCiAgICAgICAg
IG1fc2VydmljZS0+c3RvcFVwZGF0aW5nKCk7CkBAIC0yOTAsMTkgKzI3NCwxNSBAQCB2b2lkIEdl
b2xvY2F0aW9uOjptYWtlU3VjY2Vzc0NhbGxiYWNrcygpCiAgICAgQVNTRVJUKG1fc2VydmljZS0+
bGFzdFBvc2l0aW9uKCkpOwogICAgIEFTU0VSVChpc0FsbG93ZWQoKSk7CiAgICAgCi0gICAgVmVj
dG9yPFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBvbmVTaG90c0NvcHk7Ci0gICAgY29weVRvVmVjdG9y
KG1fb25lU2hvdHMsIG9uZVNob3RzQ29weSk7Ci0gICAgCi0gICAgVmVjdG9yPFJlZlB0cjxHZW9O
b3RpZmllcj4gPiB3YXRjaGVyc0NvcHk7Ci0gICAgY29weVZhbHVlc1RvVmVjdG9yKG1fd2F0Y2hl
cnMsIHdhdGNoZXJzQ29weSk7CisgICAgVmVjdG9yPFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBjb3B5
OworICAgIGNvcHlWYWx1ZXNUb1ZlY3RvcihtX25vdGlmaWVycywgY29weSk7CiAgICAgCi0gICAg
Ly8gQ2xlYXIgdGhlIGxpc3RzIGJlZm9yZSB3ZSBtYWtlIHRoZSBjYWxsYmFja3MsIHRvIGF2b2lk
IGNsZWFyaW5nIG5vdGlmaWVycworICAgIC8vIENsZWFyIHRoZSBvbmUtc2hvdHMgYmVmb3JlIHdl
IG1ha2UgdGhlIGNhbGxiYWNrcywgdG8gYXZvaWQgY2xlYXJpbmcgbm90aWZpZXJzCiAgICAgLy8g
YWRkZWQgYnkgY2FsbHMgdG8gR2VvbG9jYXRpb24gbWV0aG9kcyBmcm9tIHRoZSBjYWxsYmFja3Ms
IGFuZCB0byBwcmV2ZW50CiAgICAgLy8gZnVydGhlciBjYWxsYmFja3MgdG8gdGhlc2Ugbm90aWZp
ZXJzLgotICAgIG1fb25lU2hvdHMuY2xlYXIoKTsKKyAgICBjbGVhck9uZVNob3RzKCk7CiAKLSAg
ICBzZW5kUG9zaXRpb24ob25lU2hvdHNDb3B5LCBtX3NlcnZpY2UtPmxhc3RQb3NpdGlvbigpKTsK
LSAgICBzZW5kUG9zaXRpb24od2F0Y2hlcnNDb3B5LCBtX3NlcnZpY2UtPmxhc3RQb3NpdGlvbigp
KTsKKyAgICBzZW5kUG9zaXRpb24oY29weSwgbV9zZXJ2aWNlLT5sYXN0UG9zaXRpb24oKSk7CiAK
ICAgICBpZiAoIWhhc0xpc3RlbmVycygpKQogICAgICAgICBtX3NlcnZpY2UtPnN0b3BVcGRhdGlu
ZygpOwpAQCAtMzE1LDQgKzI5NSwxMCBAQCB2b2lkIEdlb2xvY2F0aW9uOjpnZW9sb2NhdGlvblNl
cnZpY2VFcnJvCiAgICAgaGFuZGxlRXJyb3Ioc2VydmljZS0+bGFzdEVycm9yKCkpOwogfQogCit2
b2lkIEdlb2xvY2F0aW9uOjpjbGVhck9uZVNob3RzKCkKK3sKKyAgICB3aGlsZSAoIW1fbm90aWZp
ZXJzLmlzRW1wdHkoKSAmJiBtX25vdGlmaWVycy5iZWdpbigpLT5maXJzdCA8IDApCisgICAgICAg
IG1fbm90aWZpZXJzLnJlbW92ZShtX25vdGlmaWVycy5iZWdpbigpKTsKK30KKwogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmgJKHJldmlzaW9uIDQ4OTI0KQorKysgV2Vi
Q29yZS9wYWdlL0dlb2xvY2F0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcgKzMzLDYgQEAK
ICNpbmNsdWRlICJUaW1lci5oIgogI2luY2x1ZGUgPHd0Zi9QbGF0Zm9ybS5oPgogI2luY2x1ZGUg
PHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYv
T3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVm
Q291bnRlZC5oPgpAQCAtNzMsMTIgKzcyLDEzIEBAIHByaXZhdGU6CiAKICAgICBjbGFzcyBHZW9O
b3RpZmllciA6IHB1YmxpYyBSZWZDb3VudGVkPEdlb05vdGlmaWVyPiB7CiAgICAgcHVibGljOgot
ICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxHZW9Ob3RpZmllcj4gY3JlYXRlKEdlb2xvY2F0aW9u
KiBnZW9sb2NhdGlvbiwgUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiBwb3NpdGlvbkNhbGxi
YWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JDYWxsYmFjaz4gcG9zaXRpb25FcnJvckNhbGxi
YWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9ucz4gb3B0aW9ucykgeyByZXR1cm4gYWRvcHRS
ZWYobmV3IEdlb05vdGlmaWVyKGdlb2xvY2F0aW9uLCBwb3NpdGlvbkNhbGxiYWNrLCBwb3NpdGlv
bkVycm9yQ2FsbGJhY2ssIG9wdGlvbnMpKTsgfQorICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxH
ZW9Ob3RpZmllcj4gY3JlYXRlKGludCBpZCwgR2VvbG9jYXRpb24qIGdlb2xvY2F0aW9uLCBQYXNz
UmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHBvc2l0aW9uQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9z
aXRpb25FcnJvckNhbGxiYWNrPiBwb3NpdGlvbkVycm9yQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9z
aXRpb25PcHRpb25zPiBvcHRpb25zKSB7IHJldHVybiBhZG9wdFJlZihuZXcgR2VvTm90aWZpZXIo
aWQsIGdlb2xvY2F0aW9uLCBwb3NpdGlvbkNhbGxiYWNrLCBwb3NpdGlvbkVycm9yQ2FsbGJhY2ss
IG9wdGlvbnMpKTsgfQogICAgICAgICAKICAgICAgICAgYm9vbCBoYXNaZXJvVGltZW91dCgpIGNv
bnN0OwogICAgICAgICB2b2lkIHN0YXJ0VGltZXJJZk5lZWRlZCgpOwogICAgICAgICB2b2lkIHRp
bWVyRmlyZWQoVGltZXI8R2VvTm90aWZpZXI+Kik7CiAgICAgICAgIAorICAgICAgICBpbnQgbV9p
ZDsKICAgICAgICAgR2VvbG9jYXRpb24qIG1fZ2VvbG9jYXRpb247CiAgICAgICAgIFJlZlB0cjxQ
b3NpdGlvbkNhbGxiYWNrPiBtX3N1Y2Nlc3NDYWxsYmFjazsKICAgICAgICAgUmVmUHRyPFBvc2l0
aW9uRXJyb3JDYWxsYmFjaz4gbV9lcnJvckNhbGxiYWNrOwpAQCAtODYsMTcgKzg2LDE2IEBAIHBy
aXZhdGU6CiAgICAgICAgIFRpbWVyPEdlb05vdGlmaWVyPiBtX3RpbWVyOwogCiAgICAgcHJpdmF0
ZToKLSAgICAgICAgR2VvTm90aWZpZXIoR2VvbG9jYXRpb24qLCBQYXNzUmVmUHRyPFBvc2l0aW9u
Q2FsbGJhY2s+LCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JDYWxsYmFjaz4sIFBhc3NSZWZQdHI8
UG9zaXRpb25PcHRpb25zPik7CisgICAgICAgIEdlb05vdGlmaWVyKGludCBpZCwgR2VvbG9jYXRp
b24qLCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJy
b3JDYWxsYmFjaz4sIFBhc3NSZWZQdHI8UG9zaXRpb25PcHRpb25zPik7CiAgICAgfTsKIAotICAg
IGJvb2wgaGFzTGlzdGVuZXJzKCkgY29uc3QgeyByZXR1cm4gIW1fb25lU2hvdHMuaXNFbXB0eSgp
IHx8ICFtX3dhdGNoZXJzLmlzRW1wdHkoKTsgfQorICAgIFBhc3NSZWZQdHI8R2VvTm90aWZpZXI+
IHN0YXJ0UmVxdWVzdChpbnQgbm90aWZpZXJJZCwgUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxiYWNr
PiwgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPFBvc2l0aW9u
T3B0aW9ucz4pOworCisgICAgYm9vbCBoYXNMaXN0ZW5lcnMoKSBjb25zdCB7IHJldHVybiAhbV9u
b3RpZmllcnMuaXNFbXB0eSgpOyB9CiAKICAgICB2b2lkIHNlbmRFcnJvcihWZWN0b3I8UmVmUHRy
PEdlb05vdGlmaWVyPiA+JiwgUG9zaXRpb25FcnJvciopOwogICAgIHZvaWQgc2VuZFBvc2l0aW9u
KFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4mLCBHZW9wb3NpdGlvbiopOwogICAgIAotICAg
IHN0YXRpYyB2b2lkIHN0b3BUaW1lcihWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+Jik7Ci0g
ICAgdm9pZCBzdG9wVGltZXJzRm9yT25lU2hvdHMoKTsKLSAgICB2b2lkIHN0b3BUaW1lcnNGb3JX
YXRjaGVycygpOwogICAgIHZvaWQgc3RvcFRpbWVycygpOwogICAgIAogICAgIHZvaWQgbWFrZVN1
Y2Nlc3NDYWxsYmFja3MoKTsKQEAgLTEwOCwxMyArMTA3LDE1IEBAIHByaXZhdGU6CiAgICAgdmly
dHVhbCB2b2lkIGdlb2xvY2F0aW9uU2VydmljZVBvc2l0aW9uQ2hhbmdlZChHZW9sb2NhdGlvblNl
cnZpY2UqKTsKICAgICB2aXJ0dWFsIHZvaWQgZ2VvbG9jYXRpb25TZXJ2aWNlRXJyb3JPY2N1cnJl
ZChHZW9sb2NhdGlvblNlcnZpY2UqKTsKIAotICAgIHZvaWQgcmVxdWVzdFRpbWVkT3V0KEdlb05v
dGlmaWVyKik7CisgICAgdm9pZCByZXF1ZXN0VGltZWRPdXQoaW50IG5vdGlmaWVySWQpOworCisg
ICAgdm9pZCBjbGVhck9uZVNob3RzKCk7CiAKLSAgICB0eXBlZGVmIEhhc2hTZXQ8UmVmUHRyPEdl
b05vdGlmaWVyPiA+IEdlb05vdGlmaWVyU2V0OworICAgIC8vIEEgbWFwIGZyb20gbm90aWZpZXIg
SUQgdG8gbm90aWZpZXIuIFdlIHVzZSBwb3NpdGl2ZSBJRHMgZm9yIHdhdGNoZXJzLCBhbmQKKyAg
ICAvLyBuZWdhdGl2ZSBJRHMgZm9yIG9uZS1zaG90cy4gT25seSB3YXRjaGVyIElEcyBhcmUgZXhw
b3NlZCB0byBKUy4KICAgICB0eXBlZGVmIEhhc2hNYXA8aW50LCBSZWZQdHI8R2VvTm90aWZpZXI+
ID4gR2VvTm90aWZpZXJNYXA7Ci0gICAgCi0gICAgR2VvTm90aWZpZXJTZXQgbV9vbmVTaG90czsK
LSAgICBHZW9Ob3RpZmllck1hcCBtX3dhdGNoZXJzOworICAgIEdlb05vdGlmaWVyTWFwIG1fbm90
aWZpZXJzOworCiAgICAgRnJhbWUqIG1fZnJhbWU7CiAgICAgT3duUHRyPEdlb2xvY2F0aW9uU2Vy
dmljZT4gbV9zZXJ2aWNlOwogCg==
</data>
<flag name="commit-queue"
          id="21889"
          type_id="3"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40716</attachid>
            <date>2009-10-06 06:27:43 -0700</date>
            <delta_ts>2009-10-06 14:07:15 -0700</delta_ts>
            <desc>Patch 2 for Bug 29178</desc>
            <filename>useSingleMapForNotifiers2.txt</filename>
            <type>text/plain</type>
            <size>13074</size>
            <attacher name="Steve Block">steveblock</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTE3NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMDktMTAtMDIgIFN0ZXZlIEJsb2NrICA8c3RldmVibG9ja0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEdlb2xvY2F0aW9uIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIHVzZSBhIHNpbmdsZSBtYXAgdG8g
c3RvcmUgYWxsIG5vdGlmaWVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI5MTc4CisKKyAgICAgICAgKiBwYWdlL0dlb2xvY2F0aW9uLmNwcDogTW9k
aWZpZWQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6Okdlb05v
dGlmaWVyKTogTW9kaWZpZWQuIFRha2VzIHJlcXVlc3QgSUQgYXMgYXJndW1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6OnRpbWVyRmlyZWQpOiBNb2RpZmll
ZC4gVXNlcyByZXF1ZXN0IElEIGFzIGFyZ3VtZW50IHRvIHJlcXVlc3RUaW1lZE91dC4KKyAgICAg
ICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpnZXRDdXJyZW50UG9zaXRpb24pOiBNb2RpZmllZC4g
TW92ZWQgY29tbW9uIGxvZ2ljIHRvIHN0YXJ0UmVxdWVzdC4KKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uOjp3YXRjaFBvc2l0aW9uKTogTW9kaWZpZWQuIE1vdmVkIGNvbW1vbiBsb2dpYyB0
byBzdGFydFJlcXVlc3QuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6c3RhcnRSZXF1
ZXN0KTogQWRkZWQuIFN0YXJ0cyBhIG9uZS1zaG90IG9yIHdhdGNoIHJlcXVlc3QuCisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6cmVxdWVzdFRpbWVkT3V0KTogTW9kaWZpZWQuIFRha2Vz
IHJlcXVlc3QgSUQgYXMgYXJndW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6
Y2xlYXJXYXRjaCk6IE1vZGlmaWVkLiBVc2VzIHNpbmdsZSBtYXAgZm9yIGFsbCByZXF1ZXN0cy4K
KyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpzdG9wVGltZXJzKTogTW9kaWZpZWQuIFVz
ZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJlcXVlc3RzLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9j
YXRpb246OmhhbmRsZUVycm9yKTogTW9kaWZpZWQuIFVzZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJl
cXVlc3RzLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Om1ha2VTdWNjZXNzQ2FsbGJh
Y2tzKTogTW9kaWZpZWQuIFVzZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJlcXVlc3RzLgorICAgICAg
ICAoV2ViQ29yZTo6R2VvbG9jYXRpb246OmNsZWFyT25lU2hvdHMpOiBBZGRlZC4gUmVtb3ZlcyBv
bmUtc2hvdCByZXF1ZXN0cy4KKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjppc09uZVNo
b3RSZXF1ZXN0KTogQWRkZWQuIERldGVybWluZXMgd2hldGhlciBhIHJlcXVlc3QgSUQgcmVmZXJz
IHRvIGEgb25lLXNob3QgcmVxdWVzdC4KKyAgICAgICAgKiBwYWdlL0dlb2xvY2F0aW9uLmg6IE1v
ZGlmaWVkLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Okdlb05vdGlmaWVyOjpjcmVh
dGUpOiBNb2RpZmllZC4gVGFrZXMgcmVxdWVzdCBJRCBhcyBhcmd1bWVudC4KKyAgICAgICAgKFdl
YkNvcmU6Okdlb2xvY2F0aW9uOjpoYXNMaXN0ZW5lcnMpOiBNb2RpZmllZC4gVXNlcyBzaW5nbGUg
bWFwIGZvciBhbGwgcmVxdWVzdHMuCisKIDIwMDktMTAtMDYgIFRvciBBcm5lIFZlc3Riw7ggIDx0
b3IuYXJuZS52ZXN0Ym9Abm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNpbW9uIEhh
dXNtYW5uLgpJbmRleDogV2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BhZ2UvR2VvbG9jYXRpb24uY3BwCShyZXZpc2lvbiA0OTE3NSkKKysrIFdlYkNv
cmUvcGFnZS9HZW9sb2NhdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDggKzM1LDkgQEAK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1HZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6Okdlb05v
dGlmaWVyKEdlb2xvY2F0aW9uKiBnZW9sb2NhdGlvbiwgUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxi
YWNrPiBzdWNjZXNzQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBl
cnJvckNhbGxiYWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9ucz4gb3B0aW9ucykKLSAgICA6
IG1fZ2VvbG9jYXRpb24oZ2VvbG9jYXRpb24pCitHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6Okdl
b05vdGlmaWVyKGludCByZXF1ZXN0SWQsIEdlb2xvY2F0aW9uKiBnZW9sb2NhdGlvbiwgUGFzc1Jl
ZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiBzdWNjZXNzQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRp
b25FcnJvckNhbGxiYWNrPiBlcnJvckNhbGxiYWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9u
cz4gb3B0aW9ucykKKyAgICA6IG1fcmVxdWVzdElkKHJlcXVlc3RJZCkKKyAgICAsIG1fZ2VvbG9j
YXRpb24oZ2VvbG9jYXRpb24pCiAgICAgLCBtX3N1Y2Nlc3NDYWxsYmFjayhzdWNjZXNzQ2FsbGJh
Y2spCiAgICAgLCBtX2Vycm9yQ2FsbGJhY2soZXJyb3JDYWxsYmFjaykKICAgICAsIG1fb3B0aW9u
cyhvcHRpb25zKQpAQCAtNjcsNyArNjgsNyBAQCB2b2lkIEdlb2xvY2F0aW9uOjpHZW9Ob3RpZmll
cjo6dGltZXJGaXJlCiAgICAgICAgIFJlZlB0cjxQb3NpdGlvbkVycm9yPiBlcnJvciA9IFBvc2l0
aW9uRXJyb3I6OmNyZWF0ZShQb3NpdGlvbkVycm9yOjpUSU1FT1VULCAiVGltZW91dCBleHBpcmVk
Iik7CiAgICAgICAgIG1fZXJyb3JDYWxsYmFjay0+aGFuZGxlRXZlbnQoZXJyb3IuZ2V0KCkpOwog
ICAgIH0KLSAgICBtX2dlb2xvY2F0aW9uLT5yZXF1ZXN0VGltZWRPdXQodGhpcyk7CisgICAgbV9n
ZW9sb2NhdGlvbi0+cmVxdWVzdFRpbWVkT3V0KG1fcmVxdWVzdElkKTsKIH0KIAogR2VvbG9jYXRp
b246Okdlb2xvY2F0aW9uKEZyYW1lKiBmcmFtZSkKQEAgLTkyLDI0ICs5MywzNiBAQCB2b2lkIEdl
b2xvY2F0aW9uOjpkaXNjb25uZWN0RnJhbWUoKQogCiB2b2lkIEdlb2xvY2F0aW9uOjpnZXRDdXJy
ZW50UG9zaXRpb24oUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiBzdWNjZXNzQ2FsbGJhY2ss
IFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBlcnJvckNhbGxiYWNrLCBQYXNzUmVm
UHRyPFBvc2l0aW9uT3B0aW9ucz4gb3B0aW9ucykKIHsKLSAgICBSZWZQdHI8R2VvTm90aWZpZXI+
IG5vdGlmaWVyID0gR2VvTm90aWZpZXI6OmNyZWF0ZSh0aGlzLCBzdWNjZXNzQ2FsbGJhY2ssIGVy
cm9yQ2FsbGJhY2ssIG9wdGlvbnMpOworICAgIC8vIC0xIGlzIGEgc3BlY2lhbCBrZXkgdmFsdWUg
Zm9yIFdURjo6SGFzaE1hcCwgc28gc3RhcnQgYXQgLTIuCisgICAgc3RhdGljIGludCBuZXh0QXZh
aWxhYmxlT25lU2hvdElkID0gLTI7CisgICAgaWYgKCFpc09uZVNob3RSZXF1ZXN0KG5leHRBdmFp
bGFibGVPbmVTaG90SWQpKQorICAgICAgICByZXR1cm47CiAKLSAgICBpZiAobm90aWZpZXItPmhh
c1plcm9UaW1lb3V0KCkgfHwgbV9zZXJ2aWNlLT5zdGFydFVwZGF0aW5nKG5vdGlmaWVyLT5tX29w
dGlvbnMuZ2V0KCkpKQotICAgICAgICBub3RpZmllci0+c3RhcnRUaW1lcklmTmVlZGVkKCk7Ci0g
ICAgZWxzZSB7Ci0gICAgICAgIGlmIChub3RpZmllci0+bV9lcnJvckNhbGxiYWNrKSB7Ci0gICAg
ICAgICAgICBSZWZQdHI8UG9zaXRpb25FcnJvcj4gZXJyb3IgPSBQb3NpdGlvbkVycm9yOjpjcmVh
dGUoUG9zaXRpb25FcnJvcjo6UEVSTUlTU0lPTl9ERU5JRUQsICJVbmFibGUgdG8gU3RhcnQiKTsK
LSAgICAgICAgICAgIG5vdGlmaWVyLT5tX2Vycm9yQ2FsbGJhY2stPmhhbmRsZUV2ZW50KGVycm9y
LmdldCgpKTsKLSAgICAgICAgfQorICAgIFJlZlB0cjxHZW9Ob3RpZmllcj4gbm90aWZpZXIgPSBz
dGFydFJlcXVlc3QobmV4dEF2YWlsYWJsZU9uZVNob3RJZCwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJv
ckNhbGxiYWNrLCBvcHRpb25zKTsKKyAgICBpZiAoIW5vdGlmaWVyKQogICAgICAgICByZXR1cm47
Ci0gICAgfQogCi0gICAgbV9vbmVTaG90cy5hZGQobm90aWZpZXIpOworICAgIG1fbm90aWZpZXJz
LnNldChuZXh0QXZhaWxhYmxlT25lU2hvdElkLCBub3RpZmllcik7CisgICAgbmV4dEF2YWlsYWJs
ZU9uZVNob3RJZC0tOwogfQogCiBpbnQgR2VvbG9jYXRpb246OndhdGNoUG9zaXRpb24oUGFzc1Jl
ZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiBzdWNjZXNzQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRp
b25FcnJvckNhbGxiYWNrPiBlcnJvckNhbGxiYWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9u
cz4gb3B0aW9ucykKIHsKLSAgICBSZWZQdHI8R2VvTm90aWZpZXI+IG5vdGlmaWVyID0gR2VvTm90
aWZpZXI6OmNyZWF0ZSh0aGlzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG9wdGlv
bnMpOworICAgIHN0YXRpYyBpbnQgbmV4dEF2YWlsYWJsZVdhdGNoSWQgPSAxOworICAgIGlmIChp
c09uZVNob3RSZXF1ZXN0KG5leHRBdmFpbGFibGVXYXRjaElkKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBSZWZQdHI8R2VvTm90aWZpZXI+IG5vdGlmaWVyID0gc3RhcnRSZXF1ZXN0KG5leHRB
dmFpbGFibGVXYXRjaElkLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG9wdGlvbnMp
OworICAgIGlmICghbm90aWZpZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgbV9ub3RpZmll
cnMuc2V0KG5leHRBdmFpbGFibGVXYXRjaElkLCBub3RpZmllcik7CisgICAgcmV0dXJuIG5leHRB
dmFpbGFibGVXYXRjaElkKys7Cit9CisKK1Bhc3NSZWZQdHI8R2VvbG9jYXRpb246Okdlb05vdGlm
aWVyPiBHZW9sb2NhdGlvbjo6c3RhcnRSZXF1ZXN0KGludCByZXF1ZXN0SWQsIFBhc3NSZWZQdHI8
UG9zaXRpb25DYWxsYmFjaz4gc3VjY2Vzc0NhbGxiYWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJy
b3JDYWxsYmFjaz4gZXJyb3JDYWxsYmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+IG9w
dGlvbnMpCit7CisgICAgUmVmUHRyPEdlb05vdGlmaWVyPiBub3RpZmllciA9IEdlb05vdGlmaWVy
OjpjcmVhdGUocmVxdWVzdElkLCB0aGlzLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ss
IG9wdGlvbnMpOwogCiAgICAgaWYgKG5vdGlmaWVyLT5oYXNaZXJvVGltZW91dCgpIHx8IG1fc2Vy
dmljZS0+c3RhcnRVcGRhdGluZyhub3RpZmllci0+bV9vcHRpb25zLmdldCgpKSkKICAgICAgICAg
bm90aWZpZXItPnN0YXJ0VGltZXJJZk5lZWRlZCgpOwpAQCAtMTIwLDI3ICsxMzMsMjkgQEAgaW50
IEdlb2xvY2F0aW9uOjp3YXRjaFBvc2l0aW9uKFBhc3NSZWZQdAogICAgICAgICB9CiAgICAgICAg
IHJldHVybiAwOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgaW50IHNJZGVudGlmaWVyID0gMDsK
LSAgICAKLSAgICBtX3dhdGNoZXJzLnNldCgrK3NJZGVudGlmaWVyLCBub3RpZmllcik7CiAKLSAg
ICByZXR1cm4gc0lkZW50aWZpZXI7CisgICAgcmV0dXJuIG5vdGlmaWVyLnJlbGVhc2UoKTsgICAg
CiB9CiAKLXZvaWQgR2VvbG9jYXRpb246OnJlcXVlc3RUaW1lZE91dChHZW9Ob3RpZmllciogbm90
aWZpZXIpCit2b2lkIEdlb2xvY2F0aW9uOjpyZXF1ZXN0VGltZWRPdXQoaW50IHJlcXVlc3RJZCkK
IHsKKyAgICBBU1NFUlQobV9ub3RpZmllcnMuY29udGFpbnMocmVxdWVzdElkKSk7CisKICAgICAv
LyBJZiB0aGlzIGlzIGEgb25lLXNob3QgcmVxdWVzdCwgc3RvcCBpdC4KLSAgICBtX29uZVNob3Rz
LnJlbW92ZShub3RpZmllcik7CisgICAgaWYgKCFpc09uZVNob3RSZXF1ZXN0KHJlcXVlc3RJZCkp
CisgICAgICAgIHJldHVybjsKIAorICAgIG1fbm90aWZpZXJzLnJlbW92ZShyZXF1ZXN0SWQpOwog
ICAgIGlmICghaGFzTGlzdGVuZXJzKCkpCiAgICAgICAgIG1fc2VydmljZS0+c3RvcFVwZGF0aW5n
KCk7CiB9CiAKIHZvaWQgR2VvbG9jYXRpb246OmNsZWFyV2F0Y2goaW50IHdhdGNoSWQpCiB7Ci0g
ICAgbV93YXRjaGVycy5yZW1vdmUod2F0Y2hJZCk7Ci0gICAgCisgICAgaWYgKGlzT25lU2hvdFJl
cXVlc3Qod2F0Y2hJZCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fbm90aWZpZXJzLnJlbW92
ZSh3YXRjaElkKTsKICAgICBpZiAoIWhhc0xpc3RlbmVycygpKQogICAgICAgICBtX3NlcnZpY2Ut
PnN0b3BVcGRhdGluZygpOwogfQpAQCAtMTkyLDU2ICsyMDcsMzEgQEAgdm9pZCBHZW9sb2NhdGlv
bjo6c2VuZFBvc2l0aW9uKFZlY3RvcjxSZQogICAgIH0KIH0KIAotdm9pZCBHZW9sb2NhdGlvbjo6
c3RvcFRpbWVyKFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4mIG5vdGlmaWVycykKK3ZvaWQg
R2VvbG9jYXRpb246OnN0b3BUaW1lcnMoKQogewotICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZp
ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG5vdGlmaWVycy5lbmQoKTsKLSAgICBmb3IgKFZl
Y3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbm90aWZpZXJz
LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBSZWZQdHI8R2VvTm90aWZpZXI+
IG5vdGlmaWVyID0gKml0OworICAgIEdlb05vdGlmaWVyTWFwOjpjb25zdF9pdGVyYXRvciBlbmQg
PSBtX25vdGlmaWVycy5lbmQoKTsKKyAgICBmb3IgKEdlb05vdGlmaWVyTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fbm90aWZpZXJzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAg
ICBHZW9Ob3RpZmllciogbm90aWZpZXIgPSBpdC0+c2Vjb25kLmdldCgpOwogICAgICAgICBub3Rp
Zmllci0+bV90aW1lci5zdG9wKCk7CiAgICAgfQogfQogCi12b2lkIEdlb2xvY2F0aW9uOjpzdG9w
VGltZXJzRm9yT25lU2hvdHMoKQotewotICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4g
Y29weTsKLSAgICBjb3B5VG9WZWN0b3IobV9vbmVTaG90cywgY29weSk7Ci0gICAgCi0gICAgc3Rv
cFRpbWVyKGNvcHkpOwotfQotCi12b2lkIEdlb2xvY2F0aW9uOjpzdG9wVGltZXJzRm9yV2F0Y2hl
cnMoKQotewotICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4gY29weTsKLSAgICBjb3B5
VmFsdWVzVG9WZWN0b3IobV93YXRjaGVycywgY29weSk7Ci0gICAgCi0gICAgc3RvcFRpbWVyKGNv
cHkpOwotfQotCi12b2lkIEdlb2xvY2F0aW9uOjpzdG9wVGltZXJzKCkKLXsKLSAgICBzdG9wVGlt
ZXJzRm9yT25lU2hvdHMoKTsKLSAgICBzdG9wVGltZXJzRm9yV2F0Y2hlcnMoKTsKLX0KLQogdm9p
ZCBHZW9sb2NhdGlvbjo6aGFuZGxlRXJyb3IoUG9zaXRpb25FcnJvciogZXJyb3IpCiB7CiAgICAg
QVNTRVJUKGVycm9yKTsKICAgICAKLSAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IG9u
ZVNob3RzQ29weTsKLSAgICBjb3B5VG9WZWN0b3IobV9vbmVTaG90cywgb25lU2hvdHNDb3B5KTsK
LQotICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4gd2F0Y2hlcnNDb3B5OwotICAgIGNv
cHlWYWx1ZXNUb1ZlY3RvcihtX3dhdGNoZXJzLCB3YXRjaGVyc0NvcHkpOworICAgIFZlY3RvcjxS
ZWZQdHI8R2VvTm90aWZpZXI+ID4gY29weTsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9ub3Rp
ZmllcnMsIGNvcHkpOwogCi0gICAgLy8gQ2xlYXIgdGhlIGxpc3RzIGJlZm9yZSB3ZSBtYWtlIHRo
ZSBjYWxsYmFja3MsIHRvIGF2b2lkIGNsZWFyaW5nIG5vdGlmaWVycworICAgIC8vIENsZWFyIHRo
ZSBub3RpZmllcnMgYmVmb3JlIHdlIG1ha2UgdGhlIGNhbGxiYWNrcywgdG8gYXZvaWQgY2xlYXJp
bmcgbm90aWZpZXJzCiAgICAgLy8gYWRkZWQgYnkgY2FsbHMgdG8gR2VvbG9jYXRpb24gbWV0aG9k
cyBmcm9tIHRoZSBjYWxsYmFja3MsIGFuZCB0byBwcmV2ZW50CiAgICAgLy8gZnVydGhlciBjYWxs
YmFja3MgdG8gdGhlc2Ugbm90aWZpZXJzLgotICAgIG1fb25lU2hvdHMuY2xlYXIoKTsKICAgICBp
ZiAoZXJyb3ItPmlzRmF0YWwoKSkKLSAgICAgICAgbV93YXRjaGVycy5jbGVhcigpOworICAgICAg
ICBtX25vdGlmaWVycy5jbGVhcigpOworICAgIGVsc2UKKyAgICAgICAgY2xlYXJPbmVTaG90cygp
OwogCi0gICAgc2VuZEVycm9yKG9uZVNob3RzQ29weSwgZXJyb3IpOwotICAgIHNlbmRFcnJvcih3
YXRjaGVyc0NvcHksIGVycm9yKTsKKyAgICBzZW5kRXJyb3IoY29weSwgZXJyb3IpOwogCiAgICAg
aWYgKCFoYXNMaXN0ZW5lcnMoKSkKICAgICAgICAgbV9zZXJ2aWNlLT5zdG9wVXBkYXRpbmcoKTsK
QEAgLTI5MCwxOSArMjgwLDE1IEBAIHZvaWQgR2VvbG9jYXRpb246Om1ha2VTdWNjZXNzQ2FsbGJh
Y2tzKCkKICAgICBBU1NFUlQobV9zZXJ2aWNlLT5sYXN0UG9zaXRpb24oKSk7CiAgICAgQVNTRVJU
KGlzQWxsb3dlZCgpKTsKICAgICAKLSAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IG9u
ZVNob3RzQ29weTsKLSAgICBjb3B5VG9WZWN0b3IobV9vbmVTaG90cywgb25lU2hvdHNDb3B5KTsK
LSAgICAKLSAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IHdhdGNoZXJzQ29weTsKLSAg
ICBjb3B5VmFsdWVzVG9WZWN0b3IobV93YXRjaGVycywgd2F0Y2hlcnNDb3B5KTsKKyAgICBWZWN0
b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IGNvcHk7CisgICAgY29weVZhbHVlc1RvVmVjdG9yKG1f
bm90aWZpZXJzLCBjb3B5KTsKICAgICAKLSAgICAvLyBDbGVhciB0aGUgbGlzdHMgYmVmb3JlIHdl
IG1ha2UgdGhlIGNhbGxiYWNrcywgdG8gYXZvaWQgY2xlYXJpbmcgbm90aWZpZXJzCisgICAgLy8g
Q2xlYXIgdGhlIG9uZS1zaG90cyBiZWZvcmUgd2UgbWFrZSB0aGUgY2FsbGJhY2tzLCB0byBhdm9p
ZCBjbGVhcmluZyBub3RpZmllcnMKICAgICAvLyBhZGRlZCBieSBjYWxscyB0byBHZW9sb2NhdGlv
biBtZXRob2RzIGZyb20gdGhlIGNhbGxiYWNrcywgYW5kIHRvIHByZXZlbnQKICAgICAvLyBmdXJ0
aGVyIGNhbGxiYWNrcyB0byB0aGVzZSBub3RpZmllcnMuCi0gICAgbV9vbmVTaG90cy5jbGVhcigp
OworICAgIGNsZWFyT25lU2hvdHMoKTsKIAotICAgIHNlbmRQb3NpdGlvbihvbmVTaG90c0NvcHks
IG1fc2VydmljZS0+bGFzdFBvc2l0aW9uKCkpOwotICAgIHNlbmRQb3NpdGlvbih3YXRjaGVyc0Nv
cHksIG1fc2VydmljZS0+bGFzdFBvc2l0aW9uKCkpOworICAgIHNlbmRQb3NpdGlvbihjb3B5LCBt
X3NlcnZpY2UtPmxhc3RQb3NpdGlvbigpKTsKIAogICAgIGlmICghaGFzTGlzdGVuZXJzKCkpCiAg
ICAgICAgIG1fc2VydmljZS0+c3RvcFVwZGF0aW5nKCk7CkBAIC0zMTUsNCArMzAxLDExIEBAIHZv
aWQgR2VvbG9jYXRpb246Omdlb2xvY2F0aW9uU2VydmljZUVycm8KICAgICBoYW5kbGVFcnJvcihz
ZXJ2aWNlLT5sYXN0RXJyb3IoKSk7CiB9CiAKK3ZvaWQgR2VvbG9jYXRpb246OmNsZWFyT25lU2hv
dHMoKQoreworICAgIC8vIFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgb25lLXNob3QgcmVx
dWVzdHMgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbWFwLgorICAgIHdoaWxlICghbV9ub3RpZmll
cnMuaXNFbXB0eSgpICYmIGlzT25lU2hvdFJlcXVlc3QobV9ub3RpZmllcnMuYmVnaW4oKS0+Zmly
c3QpKQorICAgICAgICBtX25vdGlmaWVycy5yZW1vdmUobV9ub3RpZmllcnMuYmVnaW4oKSk7Cit9
CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGFnZS9HZW9sb2NhdGlv
bi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9HZW9sb2NhdGlvbi5oCShyZXZpc2lvbiA0
OTE3NSkKKysrIFdlYkNvcmUvcGFnZS9HZW9sb2NhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
Myw3ICszMyw2IEBACiAjaW5jbHVkZSAiVGltZXIuaCIKICNpbmNsdWRlIDx3dGYvUGxhdGZvcm0u
aD4KICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAj
aW5jbHVkZSA8d3RmL093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CiAjaW5j
bHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KQEAgLTczLDEyICs3MiwxMyBAQCBwcml2YXRlOgogCiAg
ICAgY2xhc3MgR2VvTm90aWZpZXIgOiBwdWJsaWMgUmVmQ291bnRlZDxHZW9Ob3RpZmllcj4gewog
ICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8R2VvTm90aWZpZXI+IGNyZWF0
ZShHZW9sb2NhdGlvbiogZ2VvbG9jYXRpb24sIFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4g
cG9zaXRpb25DYWxsYmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+IHBvc2l0
aW9uRXJyb3JDYWxsYmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+IG9wdGlvbnMpIHsg
cmV0dXJuIGFkb3B0UmVmKG5ldyBHZW9Ob3RpZmllcihnZW9sb2NhdGlvbiwgcG9zaXRpb25DYWxs
YmFjaywgcG9zaXRpb25FcnJvckNhbGxiYWNrLCBvcHRpb25zKSk7IH0KKyAgICAgICAgc3RhdGlj
IFBhc3NSZWZQdHI8R2VvTm90aWZpZXI+IGNyZWF0ZShpbnQgcmVxdWVzdElkLCBHZW9sb2NhdGlv
biogZ2VvbG9jYXRpb24sIFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4gcG9zaXRpb25DYWxs
YmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+IHBvc2l0aW9uRXJyb3JDYWxs
YmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+IG9wdGlvbnMpIHsgcmV0dXJuIGFkb3B0
UmVmKG5ldyBHZW9Ob3RpZmllcihyZXF1ZXN0SWQsIGdlb2xvY2F0aW9uLCBwb3NpdGlvbkNhbGxi
YWNrLCBwb3NpdGlvbkVycm9yQ2FsbGJhY2ssIG9wdGlvbnMpKTsgfQogICAgICAgICAKICAgICAg
ICAgYm9vbCBoYXNaZXJvVGltZW91dCgpIGNvbnN0OwogICAgICAgICB2b2lkIHN0YXJ0VGltZXJJ
Zk5lZWRlZCgpOwogICAgICAgICB2b2lkIHRpbWVyRmlyZWQoVGltZXI8R2VvTm90aWZpZXI+Kik7
CiAgICAgICAgIAorICAgICAgICBpbnQgbV9yZXF1ZXN0SWQ7CiAgICAgICAgIEdlb2xvY2F0aW9u
KiBtX2dlb2xvY2F0aW9uOwogICAgICAgICBSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4gbV9zdWNj
ZXNzQ2FsbGJhY2s7CiAgICAgICAgIFJlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+IG1fZXJy
b3JDYWxsYmFjazsKQEAgLTg2LDE3ICs4NiwxOCBAQCBwcml2YXRlOgogICAgICAgICBUaW1lcjxH
ZW9Ob3RpZmllcj4gbV90aW1lcjsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIEdlb05vdGlmaWVy
KEdlb2xvY2F0aW9uKiwgUGFzc1JlZlB0cjxQb3NpdGlvbkNhbGxiYWNrPiwgUGFzc1JlZlB0cjxQ
b3NpdGlvbkVycm9yQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9ucz4pOworICAg
ICAgICBHZW9Ob3RpZmllcihpbnQgcmVxdWVzdElkLCBHZW9sb2NhdGlvbiosIFBhc3NSZWZQdHI8
UG9zaXRpb25DYWxsYmFjaz4sIFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiwgUGFz
c1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+KTsKICAgICB9OwogCi0gICAgYm9vbCBoYXNMaXN0ZW5l
cnMoKSBjb25zdCB7IHJldHVybiAhbV9vbmVTaG90cy5pc0VtcHR5KCkgfHwgIW1fd2F0Y2hlcnMu
aXNFbXB0eSgpOyB9CisgICAgUGFzc1JlZlB0cjxHZW9Ob3RpZmllcj4gc3RhcnRSZXF1ZXN0KGlu
dCByZXF1ZXN0SWQsIFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4sIFBhc3NSZWZQdHI8UG9z
aXRpb25FcnJvckNhbGxiYWNrPiwgUGFzc1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+KTsKKworICAg
IGJvb2wgaGFzTGlzdGVuZXJzKCkgY29uc3QgeyByZXR1cm4gIW1fbm90aWZpZXJzLmlzRW1wdHko
KTsgfQorCisgICAgc3RhdGljIGJvb2wgaXNPbmVTaG90UmVxdWVzdChpbnQgcmVxdWVzdElkKSB7
IHJldHVybiByZXF1ZXN0SWQgPCAwOyB9CiAKICAgICB2b2lkIHNlbmRFcnJvcihWZWN0b3I8UmVm
UHRyPEdlb05vdGlmaWVyPiA+JiwgUG9zaXRpb25FcnJvciopOwogICAgIHZvaWQgc2VuZFBvc2l0
aW9uKFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4mLCBHZW9wb3NpdGlvbiopOwogICAgIAot
ICAgIHN0YXRpYyB2b2lkIHN0b3BUaW1lcihWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+Jik7
Ci0gICAgdm9pZCBzdG9wVGltZXJzRm9yT25lU2hvdHMoKTsKLSAgICB2b2lkIHN0b3BUaW1lcnNG
b3JXYXRjaGVycygpOwogICAgIHZvaWQgc3RvcFRpbWVycygpOwogICAgIAogICAgIHZvaWQgbWFr
ZVN1Y2Nlc3NDYWxsYmFja3MoKTsKQEAgLTEwOCwxMyArMTA5LDE1IEBAIHByaXZhdGU6CiAgICAg
dmlydHVhbCB2b2lkIGdlb2xvY2F0aW9uU2VydmljZVBvc2l0aW9uQ2hhbmdlZChHZW9sb2NhdGlv
blNlcnZpY2UqKTsKICAgICB2aXJ0dWFsIHZvaWQgZ2VvbG9jYXRpb25TZXJ2aWNlRXJyb3JPY2N1
cnJlZChHZW9sb2NhdGlvblNlcnZpY2UqKTsKIAotICAgIHZvaWQgcmVxdWVzdFRpbWVkT3V0KEdl
b05vdGlmaWVyKik7CisgICAgdm9pZCByZXF1ZXN0VGltZWRPdXQoaW50IHJlcXVlc3RJZCk7CisK
KyAgICB2b2lkIGNsZWFyT25lU2hvdHMoKTsKIAotICAgIHR5cGVkZWYgSGFzaFNldDxSZWZQdHI8
R2VvTm90aWZpZXI+ID4gR2VvTm90aWZpZXJTZXQ7CisgICAgLy8gQSBtYXAgZnJvbSBub3RpZmll
ciBJRCB0byBub3RpZmllci4gV2UgdXNlIHBvc2l0aXZlIElEcyBmb3Igd2F0Y2hlcnMsIGFuZAor
ICAgIC8vIG5lZ2F0aXZlIElEcyBmb3Igb25lLXNob3RzLiBPbmx5IHdhdGNoZXIgSURzIGFyZSBl
eHBvc2VkIHRvIEpTLgogICAgIHR5cGVkZWYgSGFzaE1hcDxpbnQsIFJlZlB0cjxHZW9Ob3RpZmll
cj4gPiBHZW9Ob3RpZmllck1hcDsKLSAgICAKLSAgICBHZW9Ob3RpZmllclNldCBtX29uZVNob3Rz
OwotICAgIEdlb05vdGlmaWVyTWFwIG1fd2F0Y2hlcnM7CisgICAgR2VvTm90aWZpZXJNYXAgbV9u
b3RpZmllcnM7CisKICAgICBGcmFtZSogbV9mcmFtZTsKICAgICBPd25QdHI8R2VvbG9jYXRpb25T
ZXJ2aWNlPiBtX3NlcnZpY2U7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40742</attachid>
            <date>2009-10-06 14:07:15 -0700</date>
            <delta_ts>2009-10-27 06:04:21 -0700</delta_ts>
            <desc>Patch 3 for Bug 29178</desc>
            <filename>useSingleMapForNotifiers3.txt</filename>
            <type>text/plain</type>
            <size>14862</size>
            <attacher name="Steve Block">steveblock</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTIwMykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMDktMTAtMDYgIFN0ZXZlIEJsb2NrICA8c3RldmVibG9ja0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEdlb2xvY2F0aW9uIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIHVzZSBhIHNpbmdsZSBtYXAgdG8g
c3RvcmUgYWxsIG5vdGlmaWVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI5MTc4CisKKyAgICAgICAgKiBwYWdlL0dlb2xvY2F0aW9uLmNwcDogTW9k
aWZpZWQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6Okdlb05v
dGlmaWVyKTogTW9kaWZpZWQuIFRha2VzIHJlcXVlc3QgSUQgYXMgYXJndW1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6R2VvTm90aWZpZXI6OnRpbWVyRmlyZWQpOiBNb2RpZmll
ZC4gVXNlcyByZXF1ZXN0IElEIGFzIGFyZ3VtZW50IHRvIHJlcXVlc3RUaW1lZE91dC4KKyAgICAg
ICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpnZXRDdXJyZW50UG9zaXRpb24pOiBNb2RpZmllZC4g
TW92ZWQgY29tbW9uIGxvZ2ljIHRvIHN0YXJ0UmVxdWVzdC4KKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uOjp3YXRjaFBvc2l0aW9uKTogTW9kaWZpZWQuIE1vdmVkIGNvbW1vbiBsb2dpYyB0
byBzdGFydFJlcXVlc3QuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6c3RhcnRSZXF1
ZXN0KTogQWRkZWQuIFN0YXJ0cyBhIG9uZS1zaG90IG9yIHdhdGNoIHJlcXVlc3QuCisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6cmVxdWVzdFRpbWVkT3V0KTogTW9kaWZpZWQuIFRha2Vz
IHJlcXVlc3QgSUQgYXMgYXJndW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6
Y2xlYXJXYXRjaCk6IE1vZGlmaWVkLiBVc2VzIHNpbmdsZSBtYXAgZm9yIGFsbCByZXF1ZXN0cy4K
KyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpzdG9wVGltZXJzKTogTW9kaWZpZWQuIFVz
ZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJlcXVlc3RzLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9j
YXRpb246OmhhbmRsZUVycm9yKTogTW9kaWZpZWQuIFVzZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJl
cXVlc3RzLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Om1ha2VTdWNjZXNzQ2FsbGJh
Y2tzKTogTW9kaWZpZWQuIFVzZXMgc2luZ2xlIG1hcCBmb3IgYWxsIHJlcXVlc3RzLgorICAgICAg
ICAoV2ViQ29yZTo6R2VvbG9jYXRpb246OmNsZWFyT25lU2hvdHMpOiBBZGRlZC4gUmVtb3ZlcyBv
bmUtc2hvdCByZXF1ZXN0cy4KKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjppc09uZVNo
b3RSZXF1ZXN0KTogQWRkZWQuIERldGVybWluZXMgd2hldGhlciBhIHJlcXVlc3QgSUQgcmVmZXJz
IHRvIGEgb25lLXNob3QgcmVxdWVzdC4KKyAgICAgICAgKiBwYWdlL0dlb2xvY2F0aW9uLmg6IE1v
ZGlmaWVkLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Okdlb05vdGlmaWVyOjpjcmVh
dGUpOiBNb2RpZmllZC4gVGFrZXMgcmVxdWVzdCBJRCBhcyBhcmd1bWVudC4KKyAgICAgICAgKFdl
YkNvcmU6Okdlb2xvY2F0aW9uOjpoYXNMaXN0ZW5lcnMpOiBNb2RpZmllZC4gVXNlcyBzaW5nbGUg
bWFwIGZvciBhbGwgcmVxdWVzdHMuCisKIDIwMDktMTAtMDYgIEFudHRpIEtvaXZpc3RvICA8YW50
dGlAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmUgS2lsemVyLgpJbmRleDog
V2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2Uv
R2VvbG9jYXRpb24uY3BwCShyZXZpc2lvbiA0OTIwMykKKysrIFdlYkNvcmUvcGFnZS9HZW9sb2Nh
dGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDggKzM1LDEyIEBACiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotR2VvbG9jYXRpb246Okdlb05vdGlmaWVyOjpHZW9Ob3RpZmllcihHZW9sb2Nh
dGlvbiogZ2VvbG9jYXRpb24sIFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4gc3VjY2Vzc0Nh
bGxiYWNrLCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JDYWxsYmFjaz4gZXJyb3JDYWxsYmFjaywg
UGFzc1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+IG9wdGlvbnMpCi0gICAgOiBtX2dlb2xvY2F0aW9u
KGdlb2xvY2F0aW9uKQorc3RhdGljIGNvbnN0IGludCBmaXJzdE9uZVNob3RJZCA9IDEgPDwgMzA7
CitzdGF0aWMgY29uc3QgaW50IGZpcnN0V2F0Y2hJZCA9IDE7CisKK0dlb2xvY2F0aW9uOjpHZW9O
b3RpZmllcjo6R2VvTm90aWZpZXIoaW50IHJlcXVlc3RJZCwgR2VvbG9jYXRpb24qIGdlb2xvY2F0
aW9uLCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHN1Y2Nlc3NDYWxsYmFjaywgUGFzc1Jl
ZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJhY2ssIFBhc3NSZWZQdHI8UG9z
aXRpb25PcHRpb25zPiBvcHRpb25zKQorICAgIDogbV9yZXF1ZXN0SWQocmVxdWVzdElkKQorICAg
ICwgbV9nZW9sb2NhdGlvbihnZW9sb2NhdGlvbikKICAgICAsIG1fc3VjY2Vzc0NhbGxiYWNrKHN1
Y2Nlc3NDYWxsYmFjaykKICAgICAsIG1fZXJyb3JDYWxsYmFjayhlcnJvckNhbGxiYWNrKQogICAg
ICwgbV9vcHRpb25zKG9wdGlvbnMpCkBAIC02Nyw3ICs3MSw3IEBAIHZvaWQgR2VvbG9jYXRpb246
Okdlb05vdGlmaWVyOjp0aW1lckZpcmUKICAgICAgICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+IGVy
cm9yID0gUG9zaXRpb25FcnJvcjo6Y3JlYXRlKFBvc2l0aW9uRXJyb3I6OlRJTUVPVVQsICJUaW1l
b3V0IGV4cGlyZWQiKTsKICAgICAgICAgbV9lcnJvckNhbGxiYWNrLT5oYW5kbGVFdmVudChlcnJv
ci5nZXQoKSk7CiAgICAgfQotICAgIG1fZ2VvbG9jYXRpb24tPnJlcXVlc3RUaW1lZE91dCh0aGlz
KTsKKyAgICBtX2dlb2xvY2F0aW9uLT5yZXF1ZXN0VGltZWRPdXQobV9yZXF1ZXN0SWQpOwogfQog
CiBHZW9sb2NhdGlvbjo6R2VvbG9jYXRpb24oRnJhbWUqIGZyYW1lKQpAQCAtOTIsMjQgKzk2LDM3
IEBAIHZvaWQgR2VvbG9jYXRpb246OmRpc2Nvbm5lY3RGcmFtZSgpCiAKIHZvaWQgR2VvbG9jYXRp
b246OmdldEN1cnJlbnRQb3NpdGlvbihQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHN1Y2Nl
c3NDYWxsYmFjaywgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJh
Y2ssIFBhc3NSZWZQdHI8UG9zaXRpb25PcHRpb25zPiBvcHRpb25zKQogewotICAgIFJlZlB0cjxH
ZW9Ob3RpZmllcj4gbm90aWZpZXIgPSBHZW9Ob3RpZmllcjo6Y3JlYXRlKHRoaXMsIHN1Y2Nlc3ND
YWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9ucyk7CisgICAgc3RhdGljIGludCBuZXh0QXZh
aWxhYmxlT25lU2hvdElkID0gZmlyc3RPbmVTaG90SWQ7CisgICAgLy8gSGFuZGxlIHdyYXAtYXJv
dW5kLgorICAgIGlmICghaXNPbmVTaG90UmVxdWVzdChuZXh0QXZhaWxhYmxlT25lU2hvdElkKSkK
KyAgICAgICAgbmV4dEF2YWlsYWJsZU9uZVNob3RJZCA9IGZpcnN0T25lU2hvdElkOwogCi0gICAg
aWYgKG5vdGlmaWVyLT5oYXNaZXJvVGltZW91dCgpIHx8IG1fc2VydmljZS0+c3RhcnRVcGRhdGlu
Zyhub3RpZmllci0+bV9vcHRpb25zLmdldCgpKSkKLSAgICAgICAgbm90aWZpZXItPnN0YXJ0VGlt
ZXJJZk5lZWRlZCgpOwotICAgIGVsc2UgewotICAgICAgICBpZiAobm90aWZpZXItPm1fZXJyb3JD
YWxsYmFjaykgewotICAgICAgICAgICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+IGVycm9yID0gUG9z
aXRpb25FcnJvcjo6Y3JlYXRlKFBvc2l0aW9uRXJyb3I6OlBFUk1JU1NJT05fREVOSUVELCAiVW5h
YmxlIHRvIFN0YXJ0Iik7Ci0gICAgICAgICAgICBub3RpZmllci0+bV9lcnJvckNhbGxiYWNrLT5o
YW5kbGVFdmVudChlcnJvci5nZXQoKSk7Ci0gICAgICAgIH0KKyAgICBSZWZQdHI8R2VvTm90aWZp
ZXI+IG5vdGlmaWVyID0gc3RhcnRSZXF1ZXN0KG5leHRBdmFpbGFibGVPbmVTaG90SWQsIHN1Y2Nl
c3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgb3B0aW9ucyk7CisgICAgaWYgKCFub3RpZmllcikK
ICAgICAgICAgcmV0dXJuOwotICAgIH0KIAotICAgIG1fb25lU2hvdHMuYWRkKG5vdGlmaWVyKTsK
KyAgICBtX25vdGlmaWVycy5zZXQobmV4dEF2YWlsYWJsZU9uZVNob3RJZCwgbm90aWZpZXIpOwor
ICAgIG5leHRBdmFpbGFibGVPbmVTaG90SWQrKzsKIH0KIAogaW50IEdlb2xvY2F0aW9uOjp3YXRj
aFBvc2l0aW9uKFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4gc3VjY2Vzc0NhbGxiYWNrLCBQ
YXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JDYWxsYmFjaz4gZXJyb3JDYWxsYmFjaywgUGFzc1JlZlB0
cjxQb3NpdGlvbk9wdGlvbnM+IG9wdGlvbnMpCiB7Ci0gICAgUmVmUHRyPEdlb05vdGlmaWVyPiBu
b3RpZmllciA9IEdlb05vdGlmaWVyOjpjcmVhdGUodGhpcywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJv
ckNhbGxiYWNrLCBvcHRpb25zKTsKKyAgICBzdGF0aWMgaW50IG5leHRBdmFpbGFibGVXYXRjaElk
ID0gZmlyc3RXYXRjaElkOworICAgIC8vIEhhbmRsZSB3cmFwLWFyb3VuZC4KKyAgICBpZiAoaXNP
bmVTaG90UmVxdWVzdChuZXh0QXZhaWxhYmxlV2F0Y2hJZCkpCisgICAgICAgIG5leHRBdmFpbGFi
bGVXYXRjaElkID0gZmlyc3RXYXRjaElkOworCisgICAgUmVmUHRyPEdlb05vdGlmaWVyPiBub3Rp
ZmllciA9IHN0YXJ0UmVxdWVzdChuZXh0QXZhaWxhYmxlV2F0Y2hJZCwgc3VjY2Vzc0NhbGxiYWNr
LCBlcnJvckNhbGxiYWNrLCBvcHRpb25zKTsKKyAgICBpZiAoIW5vdGlmaWVyKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIG1fbm90aWZpZXJzLnNldChuZXh0QXZhaWxhYmxlV2F0Y2hJZCwgbm90
aWZpZXIpOworICAgIHJldHVybiBuZXh0QXZhaWxhYmxlV2F0Y2hJZCsrOworfQorCitQYXNzUmVm
UHRyPEdlb2xvY2F0aW9uOjpHZW9Ob3RpZmllcj4gR2VvbG9jYXRpb246OnN0YXJ0UmVxdWVzdChp
bnQgcmVxdWVzdElkLCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHN1Y2Nlc3NDYWxsYmFj
aywgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+IGVycm9yQ2FsbGJhY2ssIFBhc3NS
ZWZQdHI8UG9zaXRpb25PcHRpb25zPiBvcHRpb25zKQoreworICAgIFJlZlB0cjxHZW9Ob3RpZmll
cj4gbm90aWZpZXIgPSBHZW9Ob3RpZmllcjo6Y3JlYXRlKHJlcXVlc3RJZCwgdGhpcywgc3VjY2Vz
c0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCBvcHRpb25zKTsKIAogICAgIGlmIChub3RpZmllci0+
aGFzWmVyb1RpbWVvdXQoKSB8fCBtX3NlcnZpY2UtPnN0YXJ0VXBkYXRpbmcobm90aWZpZXItPm1f
b3B0aW9ucy5nZXQoKSkpCiAgICAgICAgIG5vdGlmaWVyLT5zdGFydFRpbWVySWZOZWVkZWQoKTsK
QEAgLTEyMCwyNyArMTM3LDI5IEBAIGludCBHZW9sb2NhdGlvbjo6d2F0Y2hQb3NpdGlvbihQYXNz
UmVmUHQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCi0gICAgc3Rh
dGljIGludCBzSWRlbnRpZmllciA9IDA7Ci0gICAgCi0gICAgbV93YXRjaGVycy5zZXQoKytzSWRl
bnRpZmllciwgbm90aWZpZXIpOwogCi0gICAgcmV0dXJuIHNJZGVudGlmaWVyOworICAgIHJldHVy
biBub3RpZmllci5yZWxlYXNlKCk7ICAgIAogfQogCi12b2lkIEdlb2xvY2F0aW9uOjpyZXF1ZXN0
VGltZWRPdXQoR2VvTm90aWZpZXIqIG5vdGlmaWVyKQordm9pZCBHZW9sb2NhdGlvbjo6cmVxdWVz
dFRpbWVkT3V0KGludCByZXF1ZXN0SWQpCiB7CisgICAgQVNTRVJUKG1fbm90aWZpZXJzLmNvbnRh
aW5zKHJlcXVlc3RJZCkpOworCiAgICAgLy8gSWYgdGhpcyBpcyBhIG9uZS1zaG90IHJlcXVlc3Qs
IHN0b3AgaXQuCi0gICAgbV9vbmVTaG90cy5yZW1vdmUobm90aWZpZXIpOworICAgIGlmICghaXNP
bmVTaG90UmVxdWVzdChyZXF1ZXN0SWQpKQorICAgICAgICByZXR1cm47CiAKKyAgICBtX25vdGlm
aWVycy5yZW1vdmUocmVxdWVzdElkKTsKICAgICBpZiAoIWhhc0xpc3RlbmVycygpKQogICAgICAg
ICBtX3NlcnZpY2UtPnN0b3BVcGRhdGluZygpOwogfQogCiB2b2lkIEdlb2xvY2F0aW9uOjpjbGVh
cldhdGNoKGludCB3YXRjaElkKQogewotICAgIG1fd2F0Y2hlcnMucmVtb3ZlKHdhdGNoSWQpOwot
ICAgIAorICAgIGlmIChpc09uZVNob3RSZXF1ZXN0KHdhdGNoSWQpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX25vdGlmaWVycy5yZW1vdmUod2F0Y2hJZCk7CiAgICAgaWYgKCFoYXNMaXN0ZW5l
cnMoKSkKICAgICAgICAgbV9zZXJ2aWNlLT5zdG9wVXBkYXRpbmcoKTsKIH0KQEAgLTE3MCw3OCAr
MTg5LDU5IEBAIHZvaWQgR2VvbG9jYXRpb246OnNldElzQWxsb3dlZChib29sIGFsbG8KICAgICB9
CiB9CiAKLXZvaWQgR2VvbG9jYXRpb246OnNlbmRFcnJvcihWZWN0b3I8UmVmUHRyPEdlb05vdGlm
aWVyPiA+JiBub3RpZmllcnMsIFBvc2l0aW9uRXJyb3IqIGVycm9yKQorYm9vbCBHZW9sb2NhdGlv
bjo6aXNPbmVTaG90UmVxdWVzdChpbnQgcmVxdWVzdElkKQogewotICAgICBWZWN0b3I8UmVmUHRy
PEdlb05vdGlmaWVyPiA+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBub3RpZmllcnMuZW5kKCk7Ci0g
ICAgIGZvciAoVmVjdG9yPFJlZlB0cjxHZW9Ob3RpZmllcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBub3RpZmllcnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICBSZWZQdHI8
R2VvTm90aWZpZXI+IG5vdGlmaWVyID0gKml0OwotICAgICAgICAgCi0gICAgICAgICBpZiAobm90
aWZpZXItPm1fZXJyb3JDYWxsYmFjaykKLSAgICAgICAgICAgICBub3RpZmllci0+bV9lcnJvckNh
bGxiYWNrLT5oYW5kbGVFdmVudChlcnJvcik7Ci0gICAgIH0KKyAgICAvLyBUaGlzIHJlbGllcyBv
biB0aGUgZmFjdCB0aGF0IG9uZS1zaG90IHJlcXVlc3QgSURzIGFyZSBncmVhdGVyIHRoYW4gd2F0
Y2ggSURzLgorICAgIHJldHVybiByZXF1ZXN0SWQgPj0gZmlyc3RPbmVTaG90SWQ7CiB9CiAKLXZv
aWQgR2VvbG9jYXRpb246OnNlbmRQb3NpdGlvbihWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+
JiBub3RpZmllcnMsIEdlb3Bvc2l0aW9uKiBwb3NpdGlvbikKK3ZvaWQgR2VvbG9jYXRpb246OnNl
bmRFcnJvcihWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+JiBub3RpZmllcnMsIFBvc2l0aW9u
RXJyb3IqIGVycm9yKQogewogICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID46OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IG5vdGlmaWVycy5lbmQoKTsKICAgICBmb3IgKFZlY3RvcjxSZWZQdHI8
R2VvTm90aWZpZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbm90aWZpZXJzLmJlZ2luKCk7IGl0
ICE9IGVuZDsgKytpdCkgewogICAgICAgICBSZWZQdHI8R2VvTm90aWZpZXI+IG5vdGlmaWVyID0g
Kml0OwotICAgICAgICBBU1NFUlQobm90aWZpZXItPm1fc3VjY2Vzc0NhbGxiYWNrKTsKLSAgICAg
ICAgCi0gICAgICAgIG5vdGlmaWVyLT5tX3N1Y2Nlc3NDYWxsYmFjay0+aGFuZGxlRXZlbnQocG9z
aXRpb24pOworCisgICAgICAgIGlmIChub3RpZmllci0+bV9lcnJvckNhbGxiYWNrKQorICAgICAg
ICAgICAgbm90aWZpZXItPm1fZXJyb3JDYWxsYmFjay0+aGFuZGxlRXZlbnQoZXJyb3IpOwogICAg
IH0KIH0KIAotdm9pZCBHZW9sb2NhdGlvbjo6c3RvcFRpbWVyKFZlY3RvcjxSZWZQdHI8R2VvTm90
aWZpZXI+ID4mIG5vdGlmaWVycykKK3ZvaWQgR2VvbG9jYXRpb246OnNlbmRQb3NpdGlvbihWZWN0
b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+JiBub3RpZmllcnMsIEdlb3Bvc2l0aW9uKiBwb3NpdGlv
bikKIHsKICAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+Ojpjb25zdF9pdGVyYXRvciBl
bmQgPSBub3RpZmllcnMuZW5kKCk7CiAgICAgZm9yIChWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVy
PiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG5vdGlmaWVycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKICAgICAgICAgUmVmUHRyPEdlb05vdGlmaWVyPiBub3RpZmllciA9ICppdDsKLSAgICAg
ICAgbm90aWZpZXItPm1fdGltZXIuc3RvcCgpOworICAgICAgICBBU1NFUlQobm90aWZpZXItPm1f
c3VjY2Vzc0NhbGxiYWNrKTsKKyAgICAgICAgCisgICAgICAgIG5vdGlmaWVyLT5tX3N1Y2Nlc3ND
YWxsYmFjay0+aGFuZGxlRXZlbnQocG9zaXRpb24pOwogICAgIH0KIH0KIAotdm9pZCBHZW9sb2Nh
dGlvbjo6c3RvcFRpbWVyc0Zvck9uZVNob3RzKCkKLXsKLSAgICBWZWN0b3I8UmVmUHRyPEdlb05v
dGlmaWVyPiA+IGNvcHk7Ci0gICAgY29weVRvVmVjdG9yKG1fb25lU2hvdHMsIGNvcHkpOwotICAg
IAotICAgIHN0b3BUaW1lcihjb3B5KTsKLX0KLQotdm9pZCBHZW9sb2NhdGlvbjo6c3RvcFRpbWVy
c0ZvcldhdGNoZXJzKCkKLXsKLSAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IGNvcHk7
Ci0gICAgY29weVZhbHVlc1RvVmVjdG9yKG1fd2F0Y2hlcnMsIGNvcHkpOwotICAgIAotICAgIHN0
b3BUaW1lcihjb3B5KTsKLX0KLQogdm9pZCBHZW9sb2NhdGlvbjo6c3RvcFRpbWVycygpCiB7Ci0g
ICAgc3RvcFRpbWVyc0Zvck9uZVNob3RzKCk7Ci0gICAgc3RvcFRpbWVyc0ZvcldhdGNoZXJzKCk7
CisgICAgR2VvTm90aWZpZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fbm90aWZpZXJzLmVu
ZCgpOworICAgIGZvciAoR2VvTm90aWZpZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ub3Rp
ZmllcnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEdlb05vdGlmaWVyKiBu
b3RpZmllciA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICAgIG5vdGlmaWVyLT5tX3RpbWVyLnN0
b3AoKTsKKyAgICB9CiB9CiAKIHZvaWQgR2VvbG9jYXRpb246OmhhbmRsZUVycm9yKFBvc2l0aW9u
RXJyb3IqIGVycm9yKQogewogICAgIEFTU0VSVChlcnJvcik7CiAgICAgCi0gICAgVmVjdG9yPFJl
ZlB0cjxHZW9Ob3RpZmllcj4gPiBvbmVTaG90c0NvcHk7Ci0gICAgY29weVRvVmVjdG9yKG1fb25l
U2hvdHMsIG9uZVNob3RzQ29weSk7Ci0KLSAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+
IHdhdGNoZXJzQ29weTsKLSAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV93YXRjaGVycywgd2F0Y2hl
cnNDb3B5KTsKKyAgICBWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+IGNvcHk7CisgICAgY29w
eVZhbHVlc1RvVmVjdG9yKG1fbm90aWZpZXJzLCBjb3B5KTsKIAotICAgIC8vIENsZWFyIHRoZSBs
aXN0cyBiZWZvcmUgd2UgbWFrZSB0aGUgY2FsbGJhY2tzLCB0byBhdm9pZCBjbGVhcmluZyBub3Rp
ZmllcnMKKyAgICAvLyBDbGVhciB0aGUgbm90aWZpZXJzIGJlZm9yZSB3ZSBtYWtlIHRoZSBjYWxs
YmFja3MsIHRvIGF2b2lkIGNsZWFyaW5nIG5vdGlmaWVycwogICAgIC8vIGFkZGVkIGJ5IGNhbGxz
IHRvIEdlb2xvY2F0aW9uIG1ldGhvZHMgZnJvbSB0aGUgY2FsbGJhY2tzLCBhbmQgdG8gcHJldmVu
dAogICAgIC8vIGZ1cnRoZXIgY2FsbGJhY2tzIHRvIHRoZXNlIG5vdGlmaWVycy4KLSAgICBtX29u
ZVNob3RzLmNsZWFyKCk7CiAgICAgaWYgKGVycm9yLT5pc0ZhdGFsKCkpCi0gICAgICAgIG1fd2F0
Y2hlcnMuY2xlYXIoKTsKKyAgICAgICAgbV9ub3RpZmllcnMuY2xlYXIoKTsKKyAgICBlbHNlCisg
ICAgICAgIGNsZWFyT25lU2hvdHMoKTsKIAotICAgIHNlbmRFcnJvcihvbmVTaG90c0NvcHksIGVy
cm9yKTsKLSAgICBzZW5kRXJyb3Iod2F0Y2hlcnNDb3B5LCBlcnJvcik7CisgICAgc2VuZEVycm9y
KGNvcHksIGVycm9yKTsKIAogICAgIGlmICghaGFzTGlzdGVuZXJzKCkpCiAgICAgICAgIG1fc2Vy
dmljZS0+c3RvcFVwZGF0aW5nKCk7CkBAIC0yOTAsMTkgKzI5MCwxNSBAQCB2b2lkIEdlb2xvY2F0
aW9uOjptYWtlU3VjY2Vzc0NhbGxiYWNrcygpCiAgICAgQVNTRVJUKG1fc2VydmljZS0+bGFzdFBv
c2l0aW9uKCkpOwogICAgIEFTU0VSVChpc0FsbG93ZWQoKSk7CiAgICAgCi0gICAgVmVjdG9yPFJl
ZlB0cjxHZW9Ob3RpZmllcj4gPiBvbmVTaG90c0NvcHk7Ci0gICAgY29weVRvVmVjdG9yKG1fb25l
U2hvdHMsIG9uZVNob3RzQ29weSk7Ci0gICAgCi0gICAgVmVjdG9yPFJlZlB0cjxHZW9Ob3RpZmll
cj4gPiB3YXRjaGVyc0NvcHk7Ci0gICAgY29weVZhbHVlc1RvVmVjdG9yKG1fd2F0Y2hlcnMsIHdh
dGNoZXJzQ29weSk7CisgICAgVmVjdG9yPFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBjb3B5OworICAg
IGNvcHlWYWx1ZXNUb1ZlY3RvcihtX25vdGlmaWVycywgY29weSk7CiAgICAgCi0gICAgLy8gQ2xl
YXIgdGhlIGxpc3RzIGJlZm9yZSB3ZSBtYWtlIHRoZSBjYWxsYmFja3MsIHRvIGF2b2lkIGNsZWFy
aW5nIG5vdGlmaWVycworICAgIC8vIENsZWFyIHRoZSBvbmUtc2hvdHMgYmVmb3JlIHdlIG1ha2Ug
dGhlIGNhbGxiYWNrcywgdG8gYXZvaWQgY2xlYXJpbmcgbm90aWZpZXJzCiAgICAgLy8gYWRkZWQg
YnkgY2FsbHMgdG8gR2VvbG9jYXRpb24gbWV0aG9kcyBmcm9tIHRoZSBjYWxsYmFja3MsIGFuZCB0
byBwcmV2ZW50CiAgICAgLy8gZnVydGhlciBjYWxsYmFja3MgdG8gdGhlc2Ugbm90aWZpZXJzLgot
ICAgIG1fb25lU2hvdHMuY2xlYXIoKTsKKyAgICBjbGVhck9uZVNob3RzKCk7CiAKLSAgICBzZW5k
UG9zaXRpb24ob25lU2hvdHNDb3B5LCBtX3NlcnZpY2UtPmxhc3RQb3NpdGlvbigpKTsKLSAgICBz
ZW5kUG9zaXRpb24od2F0Y2hlcnNDb3B5LCBtX3NlcnZpY2UtPmxhc3RQb3NpdGlvbigpKTsKKyAg
ICBzZW5kUG9zaXRpb24oY29weSwgbV9zZXJ2aWNlLT5sYXN0UG9zaXRpb24oKSk7CiAKICAgICBp
ZiAoIWhhc0xpc3RlbmVycygpKQogICAgICAgICBtX3NlcnZpY2UtPnN0b3BVcGRhdGluZygpOwpA
QCAtMzE1LDQgKzMxMSwxNiBAQCB2b2lkIEdlb2xvY2F0aW9uOjpnZW9sb2NhdGlvblNlcnZpY2VF
cnJvCiAgICAgaGFuZGxlRXJyb3Ioc2VydmljZS0+bGFzdEVycm9yKCkpOwogfQogCit2b2lkIEdl
b2xvY2F0aW9uOjpjbGVhck9uZVNob3RzKCkKK3sKKyAgICBWZWN0b3I8aW50PiBvbmVTaG90SWRz
OworICAgIEdlb05vdGlmaWVyTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX25vdGlmaWVycy5l
bmQoKTsKKyAgICBmb3IgKEdlb05vdGlmaWVyTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0gbV9u
b3RpZmllcnMuYmVnaW4oKTsgaXRlciAhPSBlbmQ7ICsraXRlcikgeworICAgICAgICBpZiAoaXNP
bmVTaG90UmVxdWVzdChpdGVyLT5maXJzdCkpCisgICAgICAgICAgICBvbmVTaG90SWRzLmFwcGVu
ZChpdGVyLT5maXJzdCk7CisgICAgfQorICAgIGZvciAoVmVjdG9yPGludD46OmNvbnN0X2l0ZXJh
dG9yIGl0ZXIgPSBvbmVTaG90SWRzLmJlZ2luKCk7IGl0ZXIgIT0gb25lU2hvdElkcy5lbmQoKTsg
aXRlcisrKQorICAgICAgICBtX25vdGlmaWVycy5yZW1vdmUoKml0ZXIpOworfQorCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BhZ2UvR2VvbG9jYXRpb24uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BhZ2UvR2VvbG9jYXRpb24uaAkocmV2aXNpb24gNDkyMDMpCisrKyBX
ZWJDb3JlL3BhZ2UvR2VvbG9jYXRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNiBA
QAogI2luY2x1ZGUgIlRpbWVyLmgiCiAjaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+CiAjaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0
Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9S
ZWZDb3VudGVkLmg+CkBAIC03MywxMiArNzIsMTMgQEAgcHJpdmF0ZToKIAogICAgIGNsYXNzIEdl
b05vdGlmaWVyIDogcHVibGljIFJlZkNvdW50ZWQ8R2VvTm90aWZpZXI+IHsKICAgICBwdWJsaWM6
Ci0gICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPEdlb05vdGlmaWVyPiBjcmVhdGUoR2VvbG9jYXRp
b24qIGdlb2xvY2F0aW9uLCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHBvc2l0aW9uQ2Fs
bGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBwb3NpdGlvbkVycm9yQ2Fs
bGJhY2ssIFBhc3NSZWZQdHI8UG9zaXRpb25PcHRpb25zPiBvcHRpb25zKSB7IHJldHVybiBhZG9w
dFJlZihuZXcgR2VvTm90aWZpZXIoZ2VvbG9jYXRpb24sIHBvc2l0aW9uQ2FsbGJhY2ssIHBvc2l0
aW9uRXJyb3JDYWxsYmFjaywgb3B0aW9ucykpOyB9CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRy
PEdlb05vdGlmaWVyPiBjcmVhdGUoaW50IHJlcXVlc3RJZCwgR2VvbG9jYXRpb24qIGdlb2xvY2F0
aW9uLCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IHBvc2l0aW9uQ2FsbGJhY2ssIFBhc3NS
ZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBwb3NpdGlvbkVycm9yQ2FsbGJhY2ssIFBhc3NS
ZWZQdHI8UG9zaXRpb25PcHRpb25zPiBvcHRpb25zKSB7IHJldHVybiBhZG9wdFJlZihuZXcgR2Vv
Tm90aWZpZXIocmVxdWVzdElkLCBnZW9sb2NhdGlvbiwgcG9zaXRpb25DYWxsYmFjaywgcG9zaXRp
b25FcnJvckNhbGxiYWNrLCBvcHRpb25zKSk7IH0KICAgICAgICAgCiAgICAgICAgIGJvb2wgaGFz
WmVyb1RpbWVvdXQoKSBjb25zdDsKICAgICAgICAgdm9pZCBzdGFydFRpbWVySWZOZWVkZWQoKTsK
ICAgICAgICAgdm9pZCB0aW1lckZpcmVkKFRpbWVyPEdlb05vdGlmaWVyPiopOwogICAgICAgICAK
KyAgICAgICAgaW50IG1fcmVxdWVzdElkOwogICAgICAgICBHZW9sb2NhdGlvbiogbV9nZW9sb2Nh
dGlvbjsKICAgICAgICAgUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+IG1fc3VjY2Vzc0NhbGxiYWNr
OwogICAgICAgICBSZWZQdHI8UG9zaXRpb25FcnJvckNhbGxiYWNrPiBtX2Vycm9yQ2FsbGJhY2s7
CkBAIC04NiwxNyArODYsMTggQEAgcHJpdmF0ZToKICAgICAgICAgVGltZXI8R2VvTm90aWZpZXI+
IG1fdGltZXI7CiAKICAgICBwcml2YXRlOgotICAgICAgICBHZW9Ob3RpZmllcihHZW9sb2NhdGlv
biosIFBhc3NSZWZQdHI8UG9zaXRpb25DYWxsYmFjaz4sIFBhc3NSZWZQdHI8UG9zaXRpb25FcnJv
ckNhbGxiYWNrPiwgUGFzc1JlZlB0cjxQb3NpdGlvbk9wdGlvbnM+KTsKKyAgICAgICAgR2VvTm90
aWZpZXIoaW50IHJlcXVlc3RJZCwgR2VvbG9jYXRpb24qLCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2Fs
bGJhY2s+LCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JDYWxsYmFjaz4sIFBhc3NSZWZQdHI8UG9z
aXRpb25PcHRpb25zPik7CiAgICAgfTsKIAotICAgIGJvb2wgaGFzTGlzdGVuZXJzKCkgY29uc3Qg
eyByZXR1cm4gIW1fb25lU2hvdHMuaXNFbXB0eSgpIHx8ICFtX3dhdGNoZXJzLmlzRW1wdHkoKTsg
fQorICAgIFBhc3NSZWZQdHI8R2VvTm90aWZpZXI+IHN0YXJ0UmVxdWVzdChpbnQgcmVxdWVzdElk
LCBQYXNzUmVmUHRyPFBvc2l0aW9uQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPFBvc2l0aW9uRXJyb3JD
YWxsYmFjaz4sIFBhc3NSZWZQdHI8UG9zaXRpb25PcHRpb25zPik7CisKKyAgICBib29sIGhhc0xp
c3RlbmVycygpIGNvbnN0IHsgcmV0dXJuICFtX25vdGlmaWVycy5pc0VtcHR5KCk7IH0KKworICAg
IHN0YXRpYyBib29sIGlzT25lU2hvdFJlcXVlc3QoaW50IHJlcXVlc3RJZCk7CiAKICAgICB2b2lk
IHNlbmRFcnJvcihWZWN0b3I8UmVmUHRyPEdlb05vdGlmaWVyPiA+JiwgUG9zaXRpb25FcnJvciop
OwogICAgIHZvaWQgc2VuZFBvc2l0aW9uKFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4mLCBH
ZW9wb3NpdGlvbiopOwogICAgIAotICAgIHN0YXRpYyB2b2lkIHN0b3BUaW1lcihWZWN0b3I8UmVm
UHRyPEdlb05vdGlmaWVyPiA+Jik7Ci0gICAgdm9pZCBzdG9wVGltZXJzRm9yT25lU2hvdHMoKTsK
LSAgICB2b2lkIHN0b3BUaW1lcnNGb3JXYXRjaGVycygpOwogICAgIHZvaWQgc3RvcFRpbWVycygp
OwogICAgIAogICAgIHZvaWQgbWFrZVN1Y2Nlc3NDYWxsYmFja3MoKTsKQEAgLTEwOCwxMyArMTA5
LDE1IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGdlb2xvY2F0aW9uU2VydmljZVBvc2l0
aW9uQ2hhbmdlZChHZW9sb2NhdGlvblNlcnZpY2UqKTsKICAgICB2aXJ0dWFsIHZvaWQgZ2VvbG9j
YXRpb25TZXJ2aWNlRXJyb3JPY2N1cnJlZChHZW9sb2NhdGlvblNlcnZpY2UqKTsKIAotICAgIHZv
aWQgcmVxdWVzdFRpbWVkT3V0KEdlb05vdGlmaWVyKik7CisgICAgdm9pZCByZXF1ZXN0VGltZWRP
dXQoaW50IHJlcXVlc3RJZCk7CisKKyAgICB2b2lkIGNsZWFyT25lU2hvdHMoKTsKIAotICAgIHR5
cGVkZWYgSGFzaFNldDxSZWZQdHI8R2VvTm90aWZpZXI+ID4gR2VvTm90aWZpZXJTZXQ7CisgICAg
Ly8gQSBtYXAgZnJvbSBub3RpZmllciBJRCB0byBub3RpZmllci4gV2UgdXNlIHBvc2l0aXZlIElE
cyBmb3Igd2F0Y2hlcnMsIGFuZAorICAgIC8vIG5lZ2F0aXZlIElEcyBmb3Igb25lLXNob3RzLiBP
bmx5IHdhdGNoZXIgSURzIGFyZSBleHBvc2VkIHRvIEpTLgogICAgIHR5cGVkZWYgSGFzaE1hcDxp
bnQsIFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBHZW9Ob3RpZmllck1hcDsKLSAgICAKLSAgICBHZW9O
b3RpZmllclNldCBtX29uZVNob3RzOwotICAgIEdlb05vdGlmaWVyTWFwIG1fd2F0Y2hlcnM7Cisg
ICAgR2VvTm90aWZpZXJNYXAgbV9ub3RpZmllcnM7CisKICAgICBGcmFtZSogbV9mcmFtZTsKICAg
ICBPd25QdHI8R2VvbG9jYXRpb25TZXJ2aWNlPiBtX3NlcnZpY2U7CiAK
</data>
<flag name="review"
          id="22008"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41944</attachid>
            <date>2009-10-27 06:04:21 -0700</date>
            <delta_ts>2009-10-27 10:38:47 -0700</delta_ts>
            <desc>Patch 4 for Bug 29178</desc>
            <filename>useSingleMapForNotifiers4.txt</filename>
            <type>text/plain</type>
            <size>6271</size>
            <attacher name="Steve Block">steveblock</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDE0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMDktMTAtMjcgIFN0ZXZlIEJsb2NrICA8c3RldmVibG9ja0Bnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFVzZSBhIHBhaXIgb2YgbWFwcyB0byBzdG9yZSBHZW9sb2NhdGlvbiB3YXRjaGVycy4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MTc4CisKKyAgICAg
ICAgVGhlIHBhaXIgb2YgbWFwcyBhbGxvd3MgdXMgdG8gbG9vayB1cCBhIHdhdGNoZXIgZWl0aGVy
IGJ5IGl0cyBJRCBvciBieSBpdHMgR2VvTm90aWZpZXIgb2JqZWN0LgorICAgICAgICBUaGUgYWJp
bGl0eSB0byBsb29rIHVwIGJ5IGEgd2F0Y2hlciBieSBpdHMgR2VvTm90aWZpZXIgb2JqZWN0IHdp
bGwgYmUgcmVxdWlyZWQgd2hlbiBpbXBsZW1lbnRpbmcKKyAgICAgICAgR2VvbG9jYXRpb246OmZh
dGFsRXJyb3JPY2N1cnJlZC4gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yNzk0NAorCisgICAgICAgICogcGFnZS9HZW9sb2NhdGlvbi5jcHA6IE1vZGlmaWVkLgor
ICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246OldhdGNoZXJzOjpzZXQpOiBBZGRlZC4gQWRk
cyBhIHdhdGNoZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2Nh
dGlvbjo6V2F0Y2hlcnM6OnJlbW92ZSk6IEFkZGVkLiBSZW1vdmVzIGEgd2F0Y2hlciBieSBJRC4K
KyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uOjpXYXRjaGVyczo6cmVtb3ZlKTogQWRkZWQu
IFJlbW92ZXMgYSB3YXRjaGVyIGJ5IEdlb05vdGlmaWVyIG9iamVjdC4KKyAgICAgICAgKFdlYkNv
cmU6Okdlb2xvY2F0aW9uOjpXYXRjaGVyczo6Y2xlYXIpOiBBZGRlZC4gUmVtb3ZlcyBhbGwgd2F0
Y2hlcnMuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvbjo6V2F0Y2hlcnM6OmlzRW1wdHkp
OiBBZGRlZC4gRGV0ZXJtaW5lcyBpZiB0aGVyZSBhcmUgbm8gd2F0Y2hlcnMuCisgICAgICAgIChX
ZWJDb3JlOjpHZW9sb2NhdGlvbjo6V2F0Y2hlcnM6OmdldE5vdGlmaWVyc1ZlY3Rvcik6IEFkZGVk
LiBHZXRzIGEgdmVjdG9yIG9mIHRoZSBHZW9Ob3RpZmllciBvYmplY3RzLgorICAgICAgICAoV2Vi
Q29yZTo6R2VvbG9jYXRpb246OndhdGNoUG9zaXRpb24pOiBNb2RpZmllZC4gUmVuYW1lIHdhdGNo
ZXIgaWRlbnRpZmllciBzdGF0aWMgdmFyaWFibGUuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2Nh
dGlvbjo6c3RvcFRpbWVyc0ZvcldhdGNoZXJzKTogTW9kaWZpZWQuIFVzZSBXYXRjaGVyczo6Z2V0
Tm90aWZpZXJzVmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb246OmhhbmRsZUVy
cm9yKTogTW9kaWZpZWQuIFVzZSBXYXRjaGVyczo6Z2V0Tm90aWZpZXJzVmVjdG9yLgorICAgICAg
ICAoV2ViQ29yZTo6R2VvbG9jYXRpb246Om1ha2VTdWNjZXNzQ2FsbGJhY2tzKTogTW9kaWZpZWQu
IFVzZSBXYXRjaGVyczo6Z2V0Tm90aWZpZXJzVmVjdG9yLgorICAgICAgICAqIHBhZ2UvR2VvbG9j
YXRpb24uaDogTW9kaWZpZWQuIEFkZHMgR2VvbG9jYXRpb246OldhdGNoZXJzIGNsYXNzLgorCiAy
MDA5LTEwLTI3ICBKb2FubWFyaWUgRGlnZ3MgIDxqb2FubWFyaWUuZGlnZ3NAZ21haWwuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IFhhbiBMb3Blei4KSW5kZXg6IFdlYkNvcmUvcGFnZS9HZW9s
b2NhdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmNwcAko
cmV2aXNpb24gNTAxMzgpCisrKyBXZWJDb3JlL3BhZ2UvR2VvbG9jYXRpb24uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC03MCw2ICs3MCw0NiBAQCB2b2lkIEdlb2xvY2F0aW9uOjpHZW9Ob3RpZmllcjo6
dGltZXJGaXJlCiAgICAgbV9nZW9sb2NhdGlvbi0+cmVxdWVzdFRpbWVkT3V0KHRoaXMpOwogfQog
Cit2b2lkIEdlb2xvY2F0aW9uOjpXYXRjaGVyczo6c2V0KGludCBpZCwgUGFzc1JlZlB0cjxHZW9O
b3RpZmllcj4gbm90aWZpZXIpCit7CisgICAgbV9pZFRvTm90aWZpZXJNYXAuc2V0KGlkLCBub3Rp
Zmllcik7CisgICAgbV9ub3RpZmllclRvSWRNYXAuc2V0KG5vdGlmaWVyLCBpZCk7Cit9CisKK3Zv
aWQgR2VvbG9jYXRpb246OldhdGNoZXJzOjpyZW1vdmUoaW50IGlkKQoreworICAgIElkVG9Ob3Rp
Zmllck1hcDo6aXRlcmF0b3IgaXRlciA9IG1faWRUb05vdGlmaWVyTWFwLmZpbmQoaWQpOworICAg
IGlmIChpdGVyICE9IG1faWRUb05vdGlmaWVyTWFwLmVuZCgpKSB7CisgICAgICAgIG1fbm90aWZp
ZXJUb0lkTWFwLnJlbW92ZShpdGVyLT5zZWNvbmQpOworICAgICAgICBtX2lkVG9Ob3RpZmllck1h
cC5yZW1vdmUoaXRlcik7CisgICAgfQorfQorCit2b2lkIEdlb2xvY2F0aW9uOjpXYXRjaGVyczo6
cmVtb3ZlKEdlb05vdGlmaWVyKiBub3RpZmllcikKK3sKKyAgICBOb3RpZmllclRvSWRNYXA6Oml0
ZXJhdG9yIGl0ZXIgPSBtX25vdGlmaWVyVG9JZE1hcC5maW5kKG5vdGlmaWVyKTsKKyAgICBpZiAo
aXRlciAhPSBtX25vdGlmaWVyVG9JZE1hcC5lbmQoKSkgeworICAgICAgICBtX2lkVG9Ob3RpZmll
ck1hcC5yZW1vdmUoaXRlci0+c2Vjb25kKTsKKyAgICAgICAgbV9ub3RpZmllclRvSWRNYXAucmVt
b3ZlKGl0ZXIpOworICAgIH0KK30KKwordm9pZCBHZW9sb2NhdGlvbjo6V2F0Y2hlcnM6OmNsZWFy
KCkKK3sKKyAgICBtX2lkVG9Ob3RpZmllck1hcC5jbGVhcigpOworICAgIG1fbm90aWZpZXJUb0lk
TWFwLmNsZWFyKCk7Cit9CisKK2Jvb2wgR2VvbG9jYXRpb246OldhdGNoZXJzOjppc0VtcHR5KCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9pZFRvTm90aWZpZXJNYXAuaXNFbXB0eSgpOworfQorCit2
b2lkIEdlb2xvY2F0aW9uOjpXYXRjaGVyczo6Z2V0Tm90aWZpZXJzVmVjdG9yKFZlY3RvcjxSZWZQ
dHI8R2VvTm90aWZpZXI+ID4mIGNvcHkpIGNvbnN0Cit7CisgICAgY29weVZhbHVlc1RvVmVjdG9y
KG1faWRUb05vdGlmaWVyTWFwLCBjb3B5KTsKK30KKwogR2VvbG9jYXRpb246Okdlb2xvY2F0aW9u
KEZyYW1lKiBmcmFtZSkKICAgICA6IG1fZnJhbWUoZnJhbWUpCiAgICAgLCBtX3NlcnZpY2UoR2Vv
bG9jYXRpb25TZXJ2aWNlOjpjcmVhdGUodGhpcykpCkBAIC0xMjEsMTEgKzE2MSw5IEBAIGludCBH
ZW9sb2NhdGlvbjo6d2F0Y2hQb3NpdGlvbihQYXNzUmVmUHQKICAgICAgICAgcmV0dXJuIDA7CiAg
ICAgfQogICAgIAotICAgIHN0YXRpYyBpbnQgc0lkZW50aWZpZXIgPSAwOwotICAgIAotICAgIG1f
d2F0Y2hlcnMuc2V0KCsrc0lkZW50aWZpZXIsIG5vdGlmaWVyKTsKLQotICAgIHJldHVybiBzSWRl
bnRpZmllcjsKKyAgICBzdGF0aWMgaW50IG5leHRBdmFpbGFibGVXYXRjaElkID0gMTsKKyAgICBt
X3dhdGNoZXJzLnNldChuZXh0QXZhaWxhYmxlV2F0Y2hJZCwgbm90aWZpZXIucmVsZWFzZSgpKTsK
KyAgICByZXR1cm4gbmV4dEF2YWlsYWJsZVdhdGNoSWQrKzsKIH0KIAogdm9pZCBHZW9sb2NhdGlv
bjo6cmVxdWVzdFRpbWVkT3V0KEdlb05vdGlmaWVyKiBub3RpZmllcikKQEAgLTIxMiw3ICsyNTAs
NyBAQCB2b2lkIEdlb2xvY2F0aW9uOjpzdG9wVGltZXJzRm9yT25lU2hvdHMoCiB2b2lkIEdlb2xv
Y2F0aW9uOjpzdG9wVGltZXJzRm9yV2F0Y2hlcnMoKQogewogICAgIFZlY3RvcjxSZWZQdHI8R2Vv
Tm90aWZpZXI+ID4gY29weTsKLSAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV93YXRjaGVycywgY29w
eSk7CisgICAgbV93YXRjaGVycy5nZXROb3RpZmllcnNWZWN0b3IoY29weSk7CiAgICAgCiAgICAg
c3RvcFRpbWVyKGNvcHkpOwogfQpAQCAtMjMxLDcgKzI2OSw3IEBAIHZvaWQgR2VvbG9jYXRpb246
OmhhbmRsZUVycm9yKFBvc2l0aW9uRXIKICAgICBjb3B5VG9WZWN0b3IobV9vbmVTaG90cywgb25l
U2hvdHNDb3B5KTsKIAogICAgIFZlY3RvcjxSZWZQdHI8R2VvTm90aWZpZXI+ID4gd2F0Y2hlcnND
b3B5OwotICAgIGNvcHlWYWx1ZXNUb1ZlY3RvcihtX3dhdGNoZXJzLCB3YXRjaGVyc0NvcHkpOwor
ICAgIG1fd2F0Y2hlcnMuZ2V0Tm90aWZpZXJzVmVjdG9yKHdhdGNoZXJzQ29weSk7CiAKICAgICAv
LyBDbGVhciB0aGUgbGlzdHMgYmVmb3JlIHdlIG1ha2UgdGhlIGNhbGxiYWNrcywgdG8gYXZvaWQg
Y2xlYXJpbmcgbm90aWZpZXJzCiAgICAgLy8gYWRkZWQgYnkgY2FsbHMgdG8gR2VvbG9jYXRpb24g
bWV0aG9kcyBmcm9tIHRoZSBjYWxsYmFja3MsIGFuZCB0byBwcmV2ZW50CkBAIC0yOTQsNyArMzMy
LDcgQEAgdm9pZCBHZW9sb2NhdGlvbjo6bWFrZVN1Y2Nlc3NDYWxsYmFja3MoKQogICAgIGNvcHlU
b1ZlY3RvcihtX29uZVNob3RzLCBvbmVTaG90c0NvcHkpOwogICAgIAogICAgIFZlY3RvcjxSZWZQ
dHI8R2VvTm90aWZpZXI+ID4gd2F0Y2hlcnNDb3B5OwotICAgIGNvcHlWYWx1ZXNUb1ZlY3Rvciht
X3dhdGNoZXJzLCB3YXRjaGVyc0NvcHkpOworICAgIG1fd2F0Y2hlcnMuZ2V0Tm90aWZpZXJzVmVj
dG9yKHdhdGNoZXJzQ29weSk7CiAgICAgCiAgICAgLy8gQ2xlYXIgdGhlIGxpc3RzIGJlZm9yZSB3
ZSBtYWtlIHRoZSBjYWxsYmFja3MsIHRvIGF2b2lkIGNsZWFyaW5nIG5vdGlmaWVycwogICAgIC8v
IGFkZGVkIGJ5IGNhbGxzIHRvIEdlb2xvY2F0aW9uIG1ldGhvZHMgZnJvbSB0aGUgY2FsbGJhY2tz
LCBhbmQgdG8gcHJldmVudApJbmRleDogV2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmgJKHJldmlzaW9uIDUwMTM4KQorKysg
V2ViQ29yZS9wYWdlL0dlb2xvY2F0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTg5LDYgKzg5LDIx
IEBAIHByaXZhdGU6CiAgICAgICAgIEdlb05vdGlmaWVyKEdlb2xvY2F0aW9uKiwgUGFzc1JlZlB0
cjxQb3NpdGlvbkNhbGxiYWNrPiwgUGFzc1JlZlB0cjxQb3NpdGlvbkVycm9yQ2FsbGJhY2s+LCBQ
YXNzUmVmUHRyPFBvc2l0aW9uT3B0aW9ucz4pOwogICAgIH07CiAKKyAgICBjbGFzcyBXYXRjaGVy
cyB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIHNldChpbnQgaWQsIFBhc3NSZWZQdHI8R2Vv
Tm90aWZpZXI+KTsKKyAgICAgICAgdm9pZCByZW1vdmUoaW50IGlkKTsKKyAgICAgICAgdm9pZCBy
ZW1vdmUoR2VvTm90aWZpZXIqKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworICAgICAgICBib29s
IGlzRW1wdHkoKSBjb25zdDsKKyAgICAgICAgdm9pZCBnZXROb3RpZmllcnNWZWN0b3IoVmVjdG9y
PFJlZlB0cjxHZW9Ob3RpZmllcj4gPiYpIGNvbnN0OworICAgIHByaXZhdGU6CisgICAgICAgIHR5
cGVkZWYgSGFzaE1hcDxpbnQsIFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBJZFRvTm90aWZpZXJNYXA7
CisgICAgICAgIHR5cGVkZWYgSGFzaE1hcDxSZWZQdHI8R2VvTm90aWZpZXI+LCBpbnQ+IE5vdGlm
aWVyVG9JZE1hcDsKKyAgICAgICAgSWRUb05vdGlmaWVyTWFwIG1faWRUb05vdGlmaWVyTWFwOwor
ICAgICAgICBOb3RpZmllclRvSWRNYXAgbV9ub3RpZmllclRvSWRNYXA7CisgICAgfTsKKwogICAg
IGJvb2wgaGFzTGlzdGVuZXJzKCkgY29uc3QgeyByZXR1cm4gIW1fb25lU2hvdHMuaXNFbXB0eSgp
IHx8ICFtX3dhdGNoZXJzLmlzRW1wdHkoKTsgfQogCiAgICAgdm9pZCBzZW5kRXJyb3IoVmVjdG9y
PFJlZlB0cjxHZW9Ob3RpZmllcj4gPiYsIFBvc2l0aW9uRXJyb3IqKTsKQEAgLTExMSwxMCArMTI2
LDkgQEAgcHJpdmF0ZToKICAgICB2b2lkIHJlcXVlc3RUaW1lZE91dChHZW9Ob3RpZmllciopOwog
CiAgICAgdHlwZWRlZiBIYXNoU2V0PFJlZlB0cjxHZW9Ob3RpZmllcj4gPiBHZW9Ob3RpZmllclNl
dDsKLSAgICB0eXBlZGVmIEhhc2hNYXA8aW50LCBSZWZQdHI8R2VvTm90aWZpZXI+ID4gR2VvTm90
aWZpZXJNYXA7CiAgICAgCiAgICAgR2VvTm90aWZpZXJTZXQgbV9vbmVTaG90czsKLSAgICBHZW9O
b3RpZmllck1hcCBtX3dhdGNoZXJzOworICAgIFdhdGNoZXJzIG1fd2F0Y2hlcnM7CiAgICAgRnJh
bWUqIG1fZnJhbWU7CiAgICAgT3duUHRyPEdlb2xvY2F0aW9uU2VydmljZT4gbV9zZXJ2aWNlOwog
Cg==
</data>
<flag name="review"
          id="23420"
          type_id="1"
          status="+"
          setter="darin"
    />
    <flag name="commit-queue"
          id="23445"
          type_id="3"
          status="-"
          setter="steveblock"
    />
          </attachment>
      

    </bug>

</bugzilla>