<?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>172548</bug_id>
          
          <creation_ts>2017-05-24 11:12:30 -0700</creation_ts>
          <short_desc>ObjectToStringAdaptiveInferredPropertyValueWatchpoint should not reinstall itself nor handleFire if it&apos;s dying shortly.</short_desc>
          <delta_ts>2017-05-25 10:58: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>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>172549</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>buildbot</cc>
    
    <cc>fpizlo</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1312317</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-05-24 11:12:30 -0700</bug_when>
    <thetext>Consider the following scenario:

1. A ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1, watches for structure transitions, e.g. structure S2 transitioning to structure S3.  In this case, O1 would be installed in S2&apos;s watchpoint set.
2. When the structure transition happens, structure S2 will fire watchpoint O1.
3. O1&apos;s handler will normally re-install itself in the watchpoint set of the new &quot;transitioned to&quot; structure S3.
4. &quot;Installation&quot; here requires writing into the StructureRareData SD3 of the new structure S3.  If SD3 does not exist yet, the installation process will trigger the allocation of StructureRareData SD3.
5. It is possible that the Structure S1, and StructureRareData SD1 that owns the ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1 is no longer reachable by the GC, and therefore will be collected soon.
6. The allocation of SD3 in (4) may trigger the sweeping of the StructureRareData SD1.  This, in turn, triggers the deletion of the ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1.

After O1 is deleted in (6) and SD3 is allocated in (4), execution continues in AdaptiveInferredPropertyValueWatchpointBase::fire() where O1 gets installed in structure S3&apos;s watchpoint set.  This is obviously incorrect because O1 is already deleted.  The result is that badness happens later when S3&apos;s watchpoint set fires its watchpoints and accesses the deleted O1.

The fix is to enhance AdaptiveInferredPropertyValueWatchpointBase::fire() to check if &quot;this&quot; is still valid before proceeding to re-install itself or to invoke its handleFire() method.  ObjectToStringAdaptiveInferredPropertyValueWatchpoint (which extends AdaptiveInferredPropertyValueWatchpointBase) will override its isValid() method, and return false its owner StructureRareData is no longer reachable by the GC.  This ensures that it won&apos;t be deleted while it&apos;s installed to any watchpoint set.

Additional considerations and notes:
1. In the above, I talked about the ObjectToStringAdaptiveInferredPropertyValueWatchpoint being installed in watchpoint sets.  What actually happens is that ObjectToStringAdaptiveInferredPropertyValueWatchpoint has 2 members (m_structureWatchpoint and m_propertyWatchpoint) which may be installed in watchpoint sets.  The ObjectToStringAdaptiveInferredPropertyValueWatchpoint is not itself a Watchpoint object.  But for brevity, in the above, I refer to the ObjectToStringAdaptiveInferredPropertyValueWatchpoint instead of its Watchpoint members.  The description of the issue is still accurate given the life-cycle of the Watchpoint members are embedded in the enclosing ObjectToStringAdaptiveInferredPropertyValueWatchpoint object, and hence, they share the same life-cycle.

2. The top of AdaptiveInferredPropertyValueWatchpointBase::fire() removes its m_structureWatchpoint and m_propertyWatchpoint if they have been added to any watchpoint sets.  This is safe to do even if the owner StructureRareData is no longer reachable by the GC.  This is because the only way we can get to AdaptiveInferredPropertyValueWatchpointBase::fire() is if its Watchpoint members are still installed in some watchpoint set that fired.  This means that the AdaptiveInferredPropertyValueWatchpointBase instance has not been deleted yet, because its destructor will automatically remove the Watchpoint members from any watchpoint sets.

&lt;rdar://problem/31458393&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312329</commentid>
    <comment_count>1</comment_count>
      <attachid>311139</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-05-24 11:28:24 -0700</bug_when>
    <thetext>Created attachment 311139
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312352</commentid>
    <comment_count>2</comment_count>
      <attachid>311139</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-05-24 12:12:05 -0700</bug_when>
    <thetext>Comment on attachment 311139
proposed patch.

Attachment 311139 did not pass jsc-ews (mac):
Output: http://webkit-queues.webkit.org/results/3808194

New failing tests:
stress/symbol-tostringtag-watchpoints.js.dfg-eager-no-cjit-validate
stress/symbol-tostringtag-watchpoints.js.ftl-eager
stress/symbol-tostringtag-watchpoints.js.no-llint
stress/symbol-tostringtag-watchpoints.js.dfg-maximal-flush-validate-no-cjit
stress/symbol-tostringtag-watchpoints.js.ftl-no-cjit-validate-sampling-profiler
stress/symbol-tostringtag-watchpoints.js.ftl-no-cjit-b3o1
stress/symbol-tostringtag-watchpoints.js.no-cjit-validate-phases
stress/symbol-tostringtag-watchpoints.js.ftl-no-cjit-no-inline-validate
stress/symbol-tostringtag-watchpoints.js.ftl-eager-no-cjit-b3o1
stress/symbol-tostringtag-watchpoints.js.no-ftl
stress/symbol-tostringtag-watchpoints.js.ftl-no-cjit-no-put-stack-validate
stress/symbol-tostringtag-watchpoints.js.default
stress/symbol-tostringtag-watchpoints.js.ftl-no-cjit-small-pool
apiTests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312360</commentid>
    <comment_count>3</comment_count>
      <attachid>311139</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-05-24 12:37:32 -0700</bug_when>
    <thetext>Comment on attachment 311139
proposed patch.

Tests found bugs. Will fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312424</commentid>
    <comment_count>4</comment_count>
      <attachid>311163</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-05-24 15:47:50 -0700</bug_when>
    <thetext>Created attachment 311163
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312495</commentid>
    <comment_count>5</comment_count>
      <attachid>311163</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-05-24 19:40:20 -0700</bug_when>
    <thetext>Comment on attachment 311163
proposed patch.

View in context: https://bugs.webkit.org/attachment.cgi?id=311163&amp;action=review

&gt; Source/JavaScriptCore/ChangeLog:25
&gt; +        5. It is possible that the Structure S1, and StructureRareData SD1 that owns the
&gt; +           ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1 is no longer reachable
&gt; +           by the GC, and therefore will be collected soon.
&gt; +        6. The allocation of SD3 in (4) may trigger the sweeping of the StructureRareData
&gt; +           SD1.  This, in turn, triggers the deletion of the
&gt; +           ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1.

What is SD1 here? How is it relevant? You&apos;re saying we&apos;re doing &quot;S2-&gt;S3&quot; transition.

Also, why can&apos;t this lifetime issue just be solved with moving the ObjectToStringAdaptiveInferredPropertyValueWatchpoint out of the rare data?

I don&apos;t get how this thing that was proven unreachable is actually reachable. Can you explain that a bit more?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312505</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-24 19:59:22 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #5)
&gt; Comment on attachment 311163 [details]
&gt; proposed patch.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=311163&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:25
&gt; &gt; +        5. It is possible that the Structure S1, and StructureRareData SD1 that owns the
&gt; &gt; +           ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1 is no longer reachable
&gt; &gt; +           by the GC, and therefore will be collected soon.
&gt; &gt; +        6. The allocation of SD3 in (4) may trigger the sweeping of the StructureRareData
&gt; &gt; +           SD1.  This, in turn, triggers the deletion of the
&gt; &gt; +           ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1.
&gt; 
&gt; What is SD1 here? How is it relevant? You&apos;re saying we&apos;re doing &quot;S2-&gt;S3&quot;
&gt; transition.
&gt; 
&gt; Also, why can&apos;t this lifetime issue just be solved with moving the
&gt; ObjectToStringAdaptiveInferredPropertyValueWatchpoint out of the rare data?

The problem is that isWatchable() allocates and so it may call the rare data&apos;s destructor.

Say that you have the ObjectToStringAdaptiveInferredPropertyValueWatchpoint be a separate object owned by the rare data.  Then when we do isWatchable(), the rare data destructor will run, and the watchpoint will be deleted.  That&apos;s still bad.

You could ref-count the ObjectToStringAdaptiveInferredPropertyValueWatchpoint, and it could ref itself before calling isWatchable, but I somewhat prefer being able to answer this via GC.  I want objects to be allowed to ask: &quot;am I really alive?&quot;

&gt; 
&gt; I don&apos;t get how this thing that was proven unreachable is actually
&gt; reachable. Can you explain that a bit more?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312506</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-05-24 20:05:08 -0700</bug_when>
    <thetext>Can somebody explain to me exactly what the object graph is in this example? The structures in question, their prototype fields, etc. I’m a bit confused still. 

I feel like we’re missing an easier solution</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312507</commentid>
    <comment_count>8</comment_count>
      <attachid>311163</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-24 20:06:22 -0700</bug_when>
    <thetext>Comment on attachment 311163
proposed patch.

View in context: https://bugs.webkit.org/attachment.cgi?id=311163&amp;action=review

&gt; Source/JavaScriptCore/heap/FreeList.cpp:48
&gt; +bool FreeList::contains(const void* target) const
&gt; +{
&gt; +    if (remaining) {
&gt; +        const void* start = (payloadEnd - remaining);
&gt; +        const void* end = payloadEnd;
&gt; +        return (start &lt;= target) &amp;&amp; (target &lt; end);
&gt; +    }
&gt; +
&gt; +    FreeCell* candidate = head;
&gt; +    while (candidate) {
&gt; +        if (candidate == target)
&gt; +            return true;
&gt; +        candidate = candidate-&gt;next;
&gt; +    }
&gt; +
&gt; +    return false;
&gt; +}
&gt; +

Nice.

&gt; Source/JavaScriptCore/heap/HeapCellInlines.h:42
&gt; +    if (markedBlockHandle.isFreeListed())
&gt; +        return !markedBlockHandle.isFreeListedCell(this);

I think you commented to me earlier that we could say that free-listed objects are &quot;live&quot;.  I get now that this would be correct for the purposes of your patch, but would just be inconsistent with the GC&apos;s lingo (in other contexts it&apos;s important to know that you&apos;re not &quot;live&quot; if you&apos;re still on the free list).

Maybe we want to eventually add something like HeapCell::isPendingDestruction(), which could just be:

if (isLargeAllocation())
    return !largeAllocation().isLive();
auto&amp; markedBlockHandle = markedBlock().handle();
if (markedBlockhandle.isFreeListed())
    return false;
return !markedBlockHandle.isLive(this);

Basically, we&apos;d say that isPendingDestruction() can only be called on objects that are either live right now, or objects that ceased to be live but have not yet been destructed.

You don&apos;t have to make this change.  It&apos;s just an observation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312508</commentid>
    <comment_count>9</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-24 20:10:06 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #7)
&gt; Can somebody explain to me exactly what the object graph is in this example?
&gt; The structures in question, their prototype fields, etc. I’m a bit confused
&gt; still. 
&gt; 
&gt; I feel like we’re missing an easier solution

Structure S has a rare data R.

Rare data R has a watchpoint W.

Watchpoint W is installed in a watchpoint set in structure T.

T != S.

Then:

1) GC happens, marks T but not S or R.  Note that S and R are dead but not destructed.  Therefore W is still installed in T.
2) T does something that fires W.
3) W calls isWatchable(), which allocates, which finally calls R&apos;s destructor - but not before we allocate another rare data right over it.
4) Heap corruption - the destruction of R, and the removal of W, overwrites a newly allocated rare data.

One way to view this problem is that watchpoints shouldn&apos;t allocate.

Another way to view this problem is that watchpoints owned by GC objects shouldn&apos;t allocate.

An even more specific way to view this problem is that watchpoints owned by GC objects shouldn&apos;t do anything if those objects are pending destruction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312550</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-05-24 22:54:04 -0700</bug_when>
    <thetext>(In reply to Filip Pizlo from comment #9)
&gt; (In reply to Saam Barati from comment #7)
&gt; &gt; Can somebody explain to me exactly what the object graph is in this example?
&gt; &gt; The structures in question, their prototype fields, etc. I’m a bit confused
&gt; &gt; still. 
&gt; &gt; 
&gt; &gt; I feel like we’re missing an easier solution
&gt; 
&gt; Structure S has a rare data R.
&gt; 
&gt; Rare data R has a watchpoint W.
&gt; 
&gt; Watchpoint W is installed in a watchpoint set in structure T.
&gt; 
&gt; T != S.
&gt; 
&gt; Then:
&gt; 
&gt; 1) GC happens, marks T but not S or R.  Note that S and R are dead but not
&gt; destructed.  Therefore W is still installed in T.
&gt; 2) T does something that fires W.
&gt; 3) W calls isWatchable(), which allocates, which finally calls R&apos;s
&gt; destructor - but not before we allocate another rare data right over it.
&gt; 4) Heap corruption - the destruction of R, and the removal of W, overwrites
&gt; a newly allocated rare data.
&gt; 
&gt; One way to view this problem is that watchpoints shouldn&apos;t allocate.
&gt; 
&gt; Another way to view this problem is that watchpoints owned by GC objects
&gt; shouldn&apos;t allocate.
&gt; 
&gt; An even more specific way to view this problem is that watchpoints owned by
&gt; GC objects shouldn&apos;t do anything if those objects are pending destruction.
This makes sense. Thanks for explaining. I see exactly what’s happening.

This patch employs this fix only for this particular adaptive watchpoint. Why don’t we apply this to all of them. My suggestion would be: adaptive watchpoints take an optional JSCell that represents their owner. If the owner is null, they’re always valid. Otherwise, they’re only valid if their owner is live.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312555</commentid>
    <comment_count>11</comment_count>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-05-24 23:04:57 -0700</bug_when>
    <thetext>Interesting I was under the impression we deferred GC while relocating watchpoints. I guess that was a bad assumption...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312557</commentid>
    <comment_count>12</comment_count>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-05-24 23:09:49 -0700</bug_when>
    <thetext>I still kinda feel like deferring GC when firing watchpoints would be a more comprehensive solution. Since I think this problem could happen with any adaptive watchpoint.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312562</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-05-24 23:18:41 -0700</bug_when>
    <thetext>(In reply to Keith Miller from comment #12)
&gt; I still kinda feel like deferring GC when firing watchpoints would be a more
&gt; comprehensive solution. Since I think this problem could happen with any
&gt; adaptive watchpoint.

I don’t think this solves the issue since we’ve already done the GC at this point. Does DeferGC guarantee we won’t destruct something on the free list?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312645</commentid>
    <comment_count>14</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-25 08:51:50 -0700</bug_when>
    <thetext>(In reply to Keith Miller from comment #12)
&gt; I still kinda feel like deferring GC when firing watchpoints would be a more
&gt; comprehensive solution. Since I think this problem could happen with any
&gt; adaptive watchpoint.

Deferring GC does not prevent sweeping.

The bug is sweeping, not GC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312646</commentid>
    <comment_count>15</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-25 08:52:13 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #13)
&gt; (In reply to Keith Miller from comment #12)
&gt; &gt; I still kinda feel like deferring GC when firing watchpoints would be a more
&gt; &gt; comprehensive solution. Since I think this problem could happen with any
&gt; &gt; adaptive watchpoint.
&gt; 
&gt; I don’t think this solves the issue since we’ve already done the GC at this
&gt; point. Does DeferGC guarantee we won’t destruct something on the free list?

No. There is no way to guarantee that we don&apos;t destruct when allocating.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312657</commentid>
    <comment_count>16</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-25 09:04:54 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #10)
&gt; (In reply to Filip Pizlo from comment #9)
&gt; &gt; (In reply to Saam Barati from comment #7)
&gt; &gt; &gt; Can somebody explain to me exactly what the object graph is in this example?
&gt; &gt; &gt; The structures in question, their prototype fields, etc. I’m a bit confused
&gt; &gt; &gt; still. 
&gt; &gt; &gt; 
&gt; &gt; &gt; I feel like we’re missing an easier solution
&gt; &gt; 
&gt; &gt; Structure S has a rare data R.
&gt; &gt; 
&gt; &gt; Rare data R has a watchpoint W.
&gt; &gt; 
&gt; &gt; Watchpoint W is installed in a watchpoint set in structure T.
&gt; &gt; 
&gt; &gt; T != S.
&gt; &gt; 
&gt; &gt; Then:
&gt; &gt; 
&gt; &gt; 1) GC happens, marks T but not S or R.  Note that S and R are dead but not
&gt; &gt; destructed.  Therefore W is still installed in T.
&gt; &gt; 2) T does something that fires W.
&gt; &gt; 3) W calls isWatchable(), which allocates, which finally calls R&apos;s
&gt; &gt; destructor - but not before we allocate another rare data right over it.
&gt; &gt; 4) Heap corruption - the destruction of R, and the removal of W, overwrites
&gt; &gt; a newly allocated rare data.
&gt; &gt; 
&gt; &gt; One way to view this problem is that watchpoints shouldn&apos;t allocate.
&gt; &gt; 
&gt; &gt; Another way to view this problem is that watchpoints owned by GC objects
&gt; &gt; shouldn&apos;t allocate.
&gt; &gt; 
&gt; &gt; An even more specific way to view this problem is that watchpoints owned by
&gt; &gt; GC objects shouldn&apos;t do anything if those objects are pending destruction.
&gt; This makes sense. Thanks for explaining. I see exactly what’s happening.
&gt; 
&gt; This patch employs this fix only for this particular adaptive watchpoint.
&gt; Why don’t we apply this to all of them. My suggestion would be: adaptive
&gt; watchpoints take an optional JSCell that represents their owner. If the
&gt; owner is null, they’re always valid. Otherwise, they’re only valid if their
&gt; owner is live.

This would only be better if the adaptive watchpoints that had an owner didn&apos;t already point to that owner in some way.

I do wonder how many other adaptive watchpoints have this bug.  Probably not many.  The reason why this all worked before is that watchpoints didn&apos;t allocate.  I think that there are a bunch of watchpoints that &quot;just work&quot; because of the lack of allocation.

I think that if we wanted to make this code make more sense, then we would teach Watchpoint about its m_owner. This would add some space bloat, but I think it would be worth it. Then watchpoints would not do anything if the owner was dead.

If we did this, then maybe we could also introduce the policy that watchpoints get fired when their owner dies. Perhaps it could be a special kind of firing - maybe a separate virtual method just for this purpose. If we were willing to make Watchpoints be JSCells, then we could trivially do this (allocate Watchpoints in a special Subspace that does a finalization action that fires all watchpoints whose owners died - note that doing it as a finalization action ensures that it does not happen during sweep.  The reason why we currently don&apos;t fire watchpoints when owners die is that we don&apos;t want to fire watchpoints while sweeping - that&apos;s even worse than sweeping while firing watchpoints.).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312659</commentid>
    <comment_count>17</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-05-25 09:06:44 -0700</bug_when>
    <thetext>(In reply to Filip Pizlo from comment #16)
&gt; (In reply to Saam Barati from comment #10)
&gt; &gt; (In reply to Filip Pizlo from comment #9)
&gt; &gt; &gt; (In reply to Saam Barati from comment #7)
&gt; &gt; &gt; &gt; Can somebody explain to me exactly what the object graph is in this example?
&gt; &gt; &gt; &gt; The structures in question, their prototype fields, etc. I’m a bit confused
&gt; &gt; &gt; &gt; still. 
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I feel like we’re missing an easier solution
&gt; &gt; &gt; 
&gt; &gt; &gt; Structure S has a rare data R.
&gt; &gt; &gt; 
&gt; &gt; &gt; Rare data R has a watchpoint W.
&gt; &gt; &gt; 
&gt; &gt; &gt; Watchpoint W is installed in a watchpoint set in structure T.
&gt; &gt; &gt; 
&gt; &gt; &gt; T != S.
&gt; &gt; &gt; 
&gt; &gt; &gt; Then:
&gt; &gt; &gt; 
&gt; &gt; &gt; 1) GC happens, marks T but not S or R.  Note that S and R are dead but not
&gt; &gt; &gt; destructed.  Therefore W is still installed in T.
&gt; &gt; &gt; 2) T does something that fires W.
&gt; &gt; &gt; 3) W calls isWatchable(), which allocates, which finally calls R&apos;s
&gt; &gt; &gt; destructor - but not before we allocate another rare data right over it.
&gt; &gt; &gt; 4) Heap corruption - the destruction of R, and the removal of W, overwrites
&gt; &gt; &gt; a newly allocated rare data.
&gt; &gt; &gt; 
&gt; &gt; &gt; One way to view this problem is that watchpoints shouldn&apos;t allocate.
&gt; &gt; &gt; 
&gt; &gt; &gt; Another way to view this problem is that watchpoints owned by GC objects
&gt; &gt; &gt; shouldn&apos;t allocate.
&gt; &gt; &gt; 
&gt; &gt; &gt; An even more specific way to view this problem is that watchpoints owned by
&gt; &gt; &gt; GC objects shouldn&apos;t do anything if those objects are pending destruction.
&gt; &gt; This makes sense. Thanks for explaining. I see exactly what’s happening.
&gt; &gt; 
&gt; &gt; This patch employs this fix only for this particular adaptive watchpoint.
&gt; &gt; Why don’t we apply this to all of them. My suggestion would be: adaptive
&gt; &gt; watchpoints take an optional JSCell that represents their owner. If the
&gt; &gt; owner is null, they’re always valid. Otherwise, they’re only valid if their
&gt; &gt; owner is live.
&gt; 
&gt; This would only be better if the adaptive watchpoints that had an owner
&gt; didn&apos;t already point to that owner in some way.
&gt; 
&gt; I do wonder how many other adaptive watchpoints have this bug.  Probably not
&gt; many.  The reason why this all worked before is that watchpoints didn&apos;t
&gt; allocate.  I think that there are a bunch of watchpoints that &quot;just work&quot;
&gt; because of the lack of allocation.
&gt; 
&gt; I think that if we wanted to make this code make more sense, then we would
&gt; teach Watchpoint about its m_owner. This would add some space bloat, but I
&gt; think it would be worth it. Then watchpoints would not do anything if the
&gt; owner was dead.
&gt; 
&gt; If we did this, then maybe we could also introduce the policy that
&gt; watchpoints get fired when their owner dies. Perhaps it could be a special
&gt; kind of firing - maybe a separate virtual method just for this purpose. If
&gt; we were willing to make Watchpoints be JSCells, then we could trivially do
&gt; this (allocate Watchpoints in a special Subspace that does a finalization
&gt; action that fires all watchpoints whose owners died - note that doing it as
&gt; a finalization action ensures that it does not happen during sweep.  The
&gt; reason why we currently don&apos;t fire watchpoints when owners die is that we
&gt; don&apos;t want to fire watchpoints while sweeping - that&apos;s even worse than
&gt; sweeping while firing watchpoints.).

Anyway - I still think we should land Mark&apos;s fix. It&apos;s a step in the right direction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312697</commentid>
    <comment_count>18</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-05-25 10:04:01 -0700</bug_when>
    <thetext>Thanks for the review.  Landed in r217429: &lt;http://trac.webkit.org/r217429&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1312735</commentid>
    <comment_count>19</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-05-25 10:58:36 -0700</bug_when>
    <thetext>(In reply to Filip Pizlo from comment #17)
&gt; (In reply to Filip Pizlo from comment #16)
&gt; &gt; (In reply to Saam Barati from comment #10)
&gt; &gt; &gt; (In reply to Filip Pizlo from comment #9)
&gt; &gt; &gt; &gt; (In reply to Saam Barati from comment #7)
&gt; &gt; &gt; &gt; &gt; Can somebody explain to me exactly what the object graph is in this example?
&gt; &gt; &gt; &gt; &gt; The structures in question, their prototype fields, etc. I’m a bit confused
&gt; &gt; &gt; &gt; &gt; still. 
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; I feel like we’re missing an easier solution
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Structure S has a rare data R.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Rare data R has a watchpoint W.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Watchpoint W is installed in a watchpoint set in structure T.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; T != S.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Then:
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; 1) GC happens, marks T but not S or R.  Note that S and R are dead but not
&gt; &gt; &gt; &gt; destructed.  Therefore W is still installed in T.
&gt; &gt; &gt; &gt; 2) T does something that fires W.
&gt; &gt; &gt; &gt; 3) W calls isWatchable(), which allocates, which finally calls R&apos;s
&gt; &gt; &gt; &gt; destructor - but not before we allocate another rare data right over it.
&gt; &gt; &gt; &gt; 4) Heap corruption - the destruction of R, and the removal of W, overwrites
&gt; &gt; &gt; &gt; a newly allocated rare data.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; One way to view this problem is that watchpoints shouldn&apos;t allocate.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Another way to view this problem is that watchpoints owned by GC objects
&gt; &gt; &gt; &gt; shouldn&apos;t allocate.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; An even more specific way to view this problem is that watchpoints owned by
&gt; &gt; &gt; &gt; GC objects shouldn&apos;t do anything if those objects are pending destruction.
&gt; &gt; &gt; This makes sense. Thanks for explaining. I see exactly what’s happening.
&gt; &gt; &gt; 
&gt; &gt; &gt; This patch employs this fix only for this particular adaptive watchpoint.
&gt; &gt; &gt; Why don’t we apply this to all of them. My suggestion would be: adaptive
&gt; &gt; &gt; watchpoints take an optional JSCell that represents their owner. If the
&gt; &gt; &gt; owner is null, they’re always valid. Otherwise, they’re only valid if their
&gt; &gt; &gt; owner is live.
&gt; &gt; 
&gt; &gt; This would only be better if the adaptive watchpoints that had an owner
&gt; &gt; didn&apos;t already point to that owner in some way.
&gt; &gt; 
&gt; &gt; I do wonder how many other adaptive watchpoints have this bug.  Probably not
&gt; &gt; many.  The reason why this all worked before is that watchpoints didn&apos;t
&gt; &gt; allocate.  I think that there are a bunch of watchpoints that &quot;just work&quot;
&gt; &gt; because of the lack of allocation.
&gt; &gt; 
&gt; &gt; I think that if we wanted to make this code make more sense, then we would
&gt; &gt; teach Watchpoint about its m_owner. This would add some space bloat, but I
&gt; &gt; think it would be worth it. Then watchpoints would not do anything if the
&gt; &gt; owner was dead.
&gt; &gt; 
&gt; &gt; If we did this, then maybe we could also introduce the policy that
&gt; &gt; watchpoints get fired when their owner dies. Perhaps it could be a special
&gt; &gt; kind of firing - maybe a separate virtual method just for this purpose. If
&gt; &gt; we were willing to make Watchpoints be JSCells, then we could trivially do
&gt; &gt; this (allocate Watchpoints in a special Subspace that does a finalization
&gt; &gt; action that fires all watchpoints whose owners died - note that doing it as
&gt; &gt; a finalization action ensures that it does not happen during sweep.  The
&gt; &gt; reason why we currently don&apos;t fire watchpoints when owners die is that we
&gt; &gt; don&apos;t want to fire watchpoints while sweeping - that&apos;s even worse than
&gt; &gt; sweeping while firing watchpoints.).
&gt; 
&gt; Anyway - I still think we should land Mark&apos;s fix. It&apos;s a step in the right
&gt; direction.
I agree. I also think it’s worth auditing other watchpoints for this exact bug. We can either employ a similar solution as we did here or one of your other suggested fixes.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>311139</attachid>
            <date>2017-05-24 11:28:24 -0700</date>
            <delta_ts>2017-05-24 15:47:50 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-172548.patch</filename>
            <type>text/plain</type>
            <size>12628</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMTczNzIpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDEzIEBACisyMDE3LTA1LTI0ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNv
bT4KKworICAgICAgICBPYmplY3RUb1N0cmluZ0FkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVl
V2F0Y2hwb2ludCBzaG91bGQgbm90IHJlaW5zdGFsbCBpdHNlbGYgbm9yIGhhbmRsZUZpcmUgaWYg
aXQncyBkeWluZyBzaG9ydGx5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTcyNTQ4CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8zMTQ1ODM5Mz4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHN0cmVzcy9y
ZWdyZXNzLTE3MjU0OC5wYXRjaDogQWRkZWQuCisKIDIwMTctMDUtMjMgIFNhYW0gQmFyYXRpICA8
c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAgV2Ugc2hvdWxkIG5vdCBtbWFwIHplcm8gYnl0
ZXMgZm9yIGEgbWVtb3J5IGluIFdhc20KSW5kZXg6IEpTVGVzdHMvc3RyZXNzL3JlZ3Jlc3MtMTcy
NTQ4LnBhdGNoCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvc3RyZXNzL3JlZ3Jlc3MtMTcyNTQ4LnBh
dGNoCShub25leGlzdGVudCkKKysrIEpTVGVzdHMvc3RyZXNzL3JlZ3Jlc3MtMTcyNTQ4LnBhdGNo
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8vQCBydW4oImN1c3RvbS1ub0NKSVQt
bm9Db25jdXJyZW50R0Mtbm9HZW5HQy1ub0RGRyIsICItLXVzZUNvbmN1cnJlbnRKSVQ9ZmFsc2Ui
LCAiLS11c2VDb25jdXJyZW50R0M9ZmFsc2UiLCAiLS11c2VHZW5lcmF0aW9uYWxHQz1mYWxzZSIs
ICItLXVzZURGR0pJVD1mYWxzZSIpCisKKy8vIFRoaXMgdGVzdCBzaG91bGQgbm90IGNyYXNoLgor
CisoZnVuY3Rpb24oKSB7CisgICAgZnVuY3Rpb24gZm9vKHgsIHkpIHsKKyAgICAgICAgcmV0dXJu
ICgoIH4gKCgoKChNYXRoLmZyb3VuZCgwICUgeSkgPj0geSkgKSAvICgoTWF0aC5tYXgoKChNYXRo
LmF0YW4yKCgoTWF0aC5wb3coKC1OdW1iZXIuTUFYX1ZBTFVFID4+PiAwKSwgKHggfCAwKSkgfCAw
KSA+Pj4gMCksIHkpID4+PiAwKSAtICggKyAoKCAhICgwIHwgMCkpIHwgMCkpKSwgTWF0aC5wb3co
TWF0aC5mcm91bmQoKCh4IHwgMCkgXiB5KSksICggISAoICsgeSkpKSkgfCAwKSB8IDApKSB8IDAp
IHwgMCkpIHwgMCk7CisgICAgfTsKKworICAgIHZhciBpbnB1dHMgPSBbbnVsbCwgTmFOLCAoMS8w
KSwgTmFOLCAoMS8wKSwgYXJndW1lbnRzLmNhbGxlZSwgbnVsbCwgKDEvMCksIGFyZ3VtZW50cy5j
YWxsZWUsIE5hTiwgKDEvMCksIGFyZ3VtZW50cy5jYWxsZWUsICgxLzApLCBhcmd1bWVudHMuY2Fs
bGVlLCBOYU4sIG51bGwsIE5hTiwgbnVsbCwgKDEvMCksIE5hTiwgYXJndW1lbnRzLmNhbGxlZSwg
KDEvMCksIE5hTiwgbnVsbCwgYXJndW1lbnRzLmNhbGxlZSwgKDEvMCksIE5hTiwgTmFOLCBOYU4s
IE5hTiwgTmFOLCBhcmd1bWVudHMuY2FsbGVlLCBudWxsLCAoMS8wKSwgTmFOLCBudWxsLCBudWxs
LCAoMS8wKSwgKDEvMCksIE5hTiwgTmFOLCBOYU4sIE5hTiwgTmFOLCBOYU4sIE5hTiwgTmFOLCBO
YU4sIE5hTiwgTmFOLCBOYU4sIE5hTiwgTmFOLCBOYU4sIE5hTiwgbnVsbCwgbnVsbCwgKDEvMCks
IE5hTiwgbnVsbCwgbnVsbCwgYXJndW1lbnRzLmNhbGxlZSwgTmFOLCBOYU4sIG51bGwsIG51bGws
IGFyZ3VtZW50cy5jYWxsZWUsIG51bGwsIE5hTiwgKDEvMCksIE5hTiwgTmFOLCBhcmd1bWVudHMu
Y2FsbGVlLCBOYU4sIGFyZ3VtZW50cy5jYWxsZWUsIG51bGwsIE5hTiwgTmFOLCBudWxsLCBhcmd1
bWVudHMuY2FsbGVlLCBOYU4sIG51bGwsICgxLzApLCBOYU4sIGFyZ3VtZW50cy5jYWxsZWUsIG51
bGwsIG51bGwsIE5hTiwgbnVsbCwgTmFOLCBhcmd1bWVudHMuY2FsbGVlLCBhcmd1bWVudHMuY2Fs
bGVlLCBhcmd1bWVudHMuY2FsbGVlLCBhcmd1bWVudHMuY2FsbGVlLCBudWxsLCBhcmd1bWVudHMu
Y2FsbGVlLCAoMS8wKSwgKDEvMCksICgxLzApLCAoMS8wKSwgKDEvMCksIE5hTiwgKDEvMCksIGFy
Z3VtZW50cy5jYWxsZWUsIE5hTiwgKDEvMCldOworCisgICAgZm9yICh2YXIgaiA9IDA7IGogPCBp
bnB1dHMubGVuZ3RoOyArK2opIHsgICAgICAgCisgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwg
aW5wdXRzLmxlbmd0aDsgKytrKSB7ICAgICAgICAgCisgICAgICAgICAgICBmb28oaW5wdXRzW2td
LCBpbnB1dHNba10pOworICAgICAgICB9ICAgICAKKyAgICB9ICAgCisKK30pKCk7CisKK01hdGgu
Y2VpbCA9ICJcdUVCMEQiOworCittMiA9IG5ldyBNYXA7CittMi50b1NvdXJjZSA9IChmdW5jdGlv
bigpIHsgfSk7CisKK20xID0gbmV3IE1hcDsKK20yLnRvU3RyaW5nKCk7CisKK28yID0gbTEuX19w
cm90b19fOworbTIgPSBuZXcgTWFwOworCit0ZXN0ID0gZnVuY3Rpb24oKSB7CisgICAgTWF0aC5s
b2cxcCgveC9nKSwgTWF0aC5sb2cxcCgveC9nKSwgTWF0aC5jZWlsKDB4MTAwMDAwMDAxKTsKK307
CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMzMwMDA7IGkrKykgeworICAgIHRyeSB7CisgICAgICAg
IHRlc3QoKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgfQorfQorCitvMi5nMCA9IHRoaXM7Citv
Mi5oMSA9IHt9OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMTcyMjAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsNzkgQEAKKzIwMTctMDUtMjQgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgor
CisgICAgICAgIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRj
aHBvaW50IHNob3VsZCBub3QgcmVpbnN0YWxsIGl0c2VsZiBub3IgaGFuZGxlRmlyZSBpZiBpdCdz
IGR5aW5nIHNob3J0bHkuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNzI1NDgKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzMxNDU4MzkzPgorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENvbnNpZGVyIHRoZSBm
b2xsb3dpbmcgc2NlbmFyaW86CisKKyAgICAgICAgMS4gQSBPYmplY3RUb1N0cmluZ0FkYXB0aXZl
SW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludCBPMSwgd2F0Y2hlcyBmb3IKKyAgICAgICAg
ICAgc3RydWN0dXJlIHRyYW5zaXRpb25zLCBlLmcuIHN0cnVjdHVyZSBTMiB0cmFuc2l0aW9uaW5n
IHRvIHN0cnVjdHVyZSBTMy4KKyAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBPMSB3b3VsZCBiZSBp
bnN0YWxsZWQgaW4gUzIncyB3YXRjaHBvaW50IHNldC4KKyAgICAgICAgMi4gV2hlbiB0aGUgc3Ry
dWN0dXJlIHRyYW5zaXRpb24gaGFwcGVucywgc3RydWN0dXJlIFMyIHdpbGwgZmlyZSB3YXRjaHBv
aW50IE8xLgorICAgICAgICAzLiBPMSdzIGhhbmRsZXIgd2lsbCBub3JtYWxseSByZS1pbnN0YWxs
IGl0c2VsZiBpbiB0aGUgd2F0Y2hwb2ludCBzZXQgb2YgdGhlIG5ldworICAgICAgICAgICAidHJh
bnNpdGlvbmVkIHRvIiBzdHJ1Y3R1cmUgUzMuCisgICAgICAgIDQuICJJbnN0YWxsYXRpb24iIGhl
cmUgcmVxdWlyZXMgd3JpdGluZyBpbnRvIHRoZSBTdHJ1Y3R1cmVSYXJlRGF0YSBTRDMgb2YgdGhl
IG5ldworICAgICAgICAgICBzdHJ1Y3R1cmUgUzMuICBJZiBTRDMgZG9lcyBub3QgZXhpc3QgeWV0
LCB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3Mgd2lsbCB0cmlnZ2VyCisgICAgICAgICAgIHRoZSBh
bGxvY2F0aW9uIG9mIFN0cnVjdHVyZVJhcmVEYXRhIFNEMy4KKyAgICAgICAgNS4gSXQgaXMgcG9z
c2libGUgdGhhdCB0aGUgU3RydWN0dXJlIFMxLCBhbmQgU3RydWN0dXJlUmFyZURhdGEgU0QxIHRo
YXQgb3ducyB0aGUKKyAgICAgICAgICAgT2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUluZmVycmVkUHJv
cGVydHlWYWx1ZVdhdGNocG9pbnQgTzEgaXMgbm8gbG9uZ2VyIHJlYWNoYWJsZQorICAgICAgICAg
ICBieSB0aGUgR0MsIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBjb2xsZWN0ZWQgc29vbi4KKyAgICAg
ICAgNi4gVGhlIGFsbG9jYXRpb24gb2YgU0QzIGluICg0KSBtYXkgdHJpZ2dlciB0aGUgc3dlZXBp
bmcgb2YgdGhlIFN0cnVjdHVyZVJhcmVEYXRhCisgICAgICAgICAgIFNEMS4gIFRoaXMsIGluIHR1
cm4sIHRyaWdnZXJzIHRoZSBkZWxldGlvbiBvZiB0aGUKKyAgICAgICAgICAgT2JqZWN0VG9TdHJp
bmdBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnQgTzEuCisKKyAgICAgICAg
QWZ0ZXIgTzEgaXMgZGVsZXRlZCBpbiAoNikgYW5kIFNEMyBpcyBhbGxvY2F0ZWQgaW4gKDQpLCBl
eGVjdXRpb24gY29udGludWVzIGluCisgICAgICAgIEFkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZh
bHVlV2F0Y2hwb2ludEJhc2U6OmZpcmUoKSB3aGVyZSBPMSBnZXRzIGluc3RhbGxlZCBpbgorICAg
ICAgICBzdHJ1Y3R1cmUgUzMncyB3YXRjaHBvaW50IHNldC4gIFRoaXMgaXMgb2J2aW91c2x5IGlu
Y29ycmVjdCBiZWNhdXNlIE8xIGlzIGFscmVhZHkKKyAgICAgICAgZGVsZXRlZC4gIFRoZSByZXN1
bHQgaXMgdGhhdCBiYWRuZXNzIGhhcHBlbnMgbGF0ZXIgd2hlbiBTMydzIHdhdGNocG9pbnQgc2V0
IGZpcmVzCisgICAgICAgIGl0cyB3YXRjaHBvaW50cyBhbmQgYWNjZXNzZXMgdGhlIGRlbGV0ZWQg
TzEuCisKKyAgICAgICAgVGhlIGZpeCBpcyB0byBlbmhhbmNlIEFkYXB0aXZlSW5mZXJyZWRQcm9w
ZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2U6OmZpcmUoKSB0bworICAgICAgICBjaGVjayBpZiAidGhp
cyIgaXMgc3RpbGwgdmFsaWQgYmVmb3JlIHByb2NlZWRpbmcgdG8gcmUtaW5zdGFsbCBpdHNlbGYg
b3IgdG8KKyAgICAgICAgaW52b2tlIGl0cyBoYW5kbGVGaXJlKCkgbWV0aG9kLgorCisgICAgICAg
IE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50ICh3
aGljaCBleHRlbmRzCisgICAgICAgIEFkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hw
b2ludEJhc2UpIHdpbGwgb3ZlcnJpZGUgaXRzIGlzVmFsaWQoKSBtZXRob2QsCisgICAgICAgIGFu
ZCByZXR1cm4gZmFsc2UgaXRzIG93bmVyIFN0cnVjdHVyZVJhcmVEYXRhIGlzIG5vIGxvbmdlciBy
ZWFjaGFibGUgYnkgdGhlIEdDLgorICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBpdCB3b24ndCBi
ZSBkZWxldGVkIHdoaWxlIGl0J3MgaW5zdGFsbGVkIHRvIGFueSB3YXRjaHBvaW50IHNldC4KKwor
ICAgICAgICBBZGRpdGlvbmFsIGNvbnNpZGVyYXRpb25zIGFuZCBub3RlczoKKyAgICAgICAgMS4g
SW4gdGhlIGFib3ZlLCBJIHRhbGtlZCBhYm91dCB0aGUgT2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUlu
ZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnQKKyAgICAgICAgICAgYmVpbmcgaW5zdGFsbGVk
IGluIHdhdGNocG9pbnQgc2V0cy4gIFdoYXQgYWN0dWFsbHkgaGFwcGVucyBpcyB0aGF0CisgICAg
ICAgICAgIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBv
aW50IGhhcyAyIG1lbWJlcnMKKyAgICAgICAgICAgKG1fc3RydWN0dXJlV2F0Y2hwb2ludCBhbmQg
bV9wcm9wZXJ0eVdhdGNocG9pbnQpIHdoaWNoIG1heSBiZSBpbnN0YWxsZWQgaW4KKyAgICAgICAg
ICAgd2F0Y2hwb2ludCBzZXRzLiAgVGhlIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFBy
b3BlcnR5VmFsdWVXYXRjaHBvaW50IGlzCisgICAgICAgICAgIG5vdCBpdHNlbGYgYSBXYXRjaHBv
aW50IG9iamVjdC4KKworICAgICAgICAgICBCdXQgZm9yIGJyZXZpdHksIGluIHRoZSBhYm92ZSwg
SSByZWZlciB0byB0aGUgT2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1
ZVdhdGNocG9pbnQKKyAgICAgICAgICAgaW5zdGVhZCBvZiBpdHMgV2F0Y2hwb2ludCBtZW1iZXJz
LiAgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpc3N1ZSBpcyBzdGlsbAorICAgICAgICAgICBhY2N1
cmF0ZSBnaXZlbiB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgV2F0Y2hwb2ludCBtZW1iZXJzIGFyZSBl
bWJlZGRlZCBpbiB0aGUKKyAgICAgICAgICAgZW5jbG9zaW5nIE9iamVjdFRvU3RyaW5nQWRhcHRp
dmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50IG9iamVjdCwgYW5kCisgICAgICAgICAg
IGhlbmNlLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGxpZmUtY3ljbGUuCisKKyAgICAgICAgMi4gVGhl
IHRvcCBvZiBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlOjpmaXJl
KCkgcmVtb3ZlcyBpdHMKKyAgICAgICAgICAgbV9zdHJ1Y3R1cmVXYXRjaHBvaW50IGFuZCBtX3By
b3BlcnR5V2F0Y2hwb2ludCBpZiB0aGV5IGhhdmUgYmVlbiBhZGRlZCB0byBhbnkKKyAgICAgICAg
ICAgd2F0Y2hwb2ludCBzZXRzLiAgVGhpcyBpcyBzYWZlIHRvIGRvIGV2ZW4gaWYgdGhlIG93bmVy
IFN0cnVjdHVyZVJhcmVEYXRhIGlzIG5vCisgICAgICAgICAgIGxvbmdlciByZWFjaGFibGUgYnkg
dGhlIEdDLgorCisgICAgICAgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB3YXkgd2UgY2Fu
IGdldCB0byBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlOjpmaXJl
KCkKKyAgICAgICAgICAgaXMgaWYgaXRzIFdhdGNocG9pbnQgbWVtYmVycyBhcmUgc3RpbGwgaW5z
dGFsbGVkIGluIHNvbWUgd2F0Y2hwb2ludCBzZXQgdGhhdAorICAgICAgICAgICBmaXJlZC4gIFRo
aXMgbWVhbnMgdGhhdCB0aGUgQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50
QmFzZQorICAgICAgICAgICBpbnN0YW5jZSBoYXMgbm90IGJlZW4gZGVsZXRlZCB5ZXQsIGJlY2F1
c2UgaXRzIGRlc3RydWN0b3Igd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgIHJlbW92ZSB0
aGUgV2F0Y2hwb2ludCBtZW1iZXJzIGZyb20gYW55IHdhdGNocG9pbnQgc2V0cy4KKworICAgICAg
ICAqIGJ5dGVjb2RlL0FkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2Uu
Y3BwOgorICAgICAgICAoSlNDOjpBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9p
bnRCYXNlOjpmaXJlKToKKyAgICAgICAgKEpTQzo6QWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFs
dWVXYXRjaHBvaW50QmFzZTo6aXNWYWxpZCk6CisgICAgICAgICogYnl0ZWNvZGUvQWRhcHRpdmVJ
bmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50QmFzZS5oOgorICAgICAgICAqIGhlYXAvSGVh
cENlbGwuaDoKKyAgICAgICAgKiBoZWFwL0hlYXBDZWxsSW5saW5lcy5oOgorICAgICAgICAoSlND
OjpIZWFwQ2VsbDo6aXNMaXZlKToKKyAgICAgICAgKiBydW50aW1lL1N0cnVjdHVyZVJhcmVEYXRh
LmNwcDoKKyAgICAgICAgKEpTQzo6T2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUluZmVycmVkUHJvcGVy
dHlWYWx1ZVdhdGNocG9pbnQ6OmlzVmFsaWQpOgorCiAyMDE3LTA1LTIwICBZdXN1a2UgU3V6dWtp
ICA8dXRhdGFuZS50ZWFAZ21haWwuY29tPgogCiAgICAgICAgIFtGVExdIFN1cHBvcnQgR2V0QnlW
YWwgd2l0aCBBcnJheVN0b3JhZ2UgYW5kIFNsb3dQdXRBcnJheVN0b3JhZ2UKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9BZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdh
dGNocG9pbnRCYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0
ZWNvZGUvQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50QmFzZS5jcHAJKHJl
dmlzaW9uIDIxNzIyMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9BZGFwdGl2
ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC01
Nyw2ICs1Nyw5IEBAIHZvaWQgQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHAKICAg
ICBpZiAobV9wcm9wZXJ0eVdhdGNocG9pbnQuaXNPbkxpc3QoKSkKICAgICAgICAgbV9wcm9wZXJ0
eVdhdGNocG9pbnQucmVtb3ZlKCk7CiAKKyAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgcmV0
dXJuOworCiAgICAgaWYgKG1fa2V5LmlzV2F0Y2hhYmxlKFByb3BlcnR5Q29uZGl0aW9uOjpFbnN1
cmVXYXRjaGFiaWxpdHkpKSB7CiAgICAgICAgIGluc3RhbGwoKTsKICAgICAgICAgcmV0dXJuOwpA
QCAtNjUsNiArNjgsMTEgQEAgdm9pZCBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNo
cAogICAgIGhhbmRsZUZpcmUoZGV0YWlsKTsKIH0KIAorYm9vbCBBZGFwdGl2ZUluZmVycmVkUHJv
cGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlOjppc1ZhbGlkKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwogdm9pZCBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRC
YXNlOjpTdHJ1Y3R1cmVXYXRjaHBvaW50OjpmaXJlSW50ZXJuYWwoY29uc3QgRmlyZURldGFpbCYg
ZGV0YWlsKQogewogICAgIHB0cmRpZmZfdCBteU9mZnNldCA9IE9CSkVDVF9PRkZTRVRPRihBZGFw
dGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlLCBtX3N0cnVjdHVyZVdhdGNo
cG9pbnQpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0FkYXB0aXZlSW5m
ZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRj
aHBvaW50QmFzZS5oCShyZXZpc2lvbiAyMTcyMjApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50QmFzZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKQEAgLTQ2LDYgKzQ2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgfkFkYXB0aXZl
SW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2UoKSA9IGRlZmF1bHQ7CiAKIHByb3Rl
Y3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9p
ZCBoYW5kbGVGaXJlKGNvbnN0IEZpcmVEZXRhaWwmKSA9IDA7CiAKIHByaXZhdGU6CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwQ2VsbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXBDZWxsLmgJKHJldmlzaW9uIDIxNzIyMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXBDZWxsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ3
LDcgKzQ3LDkgQEAgcHVibGljOgogICAgIAogICAgIHZvaWQgemFwKCkgeyAqcmVpbnRlcnByZXRf
Y2FzdF9wdHI8dWludHB0cl90Kio+KHRoaXMpID0gMDsgfQogICAgIGJvb2wgaXNaYXBwZWQoKSBj
b25zdCB7IHJldHVybiAhKnJlaW50ZXJwcmV0X2Nhc3RfcHRyPHVpbnRwdHJfdCogY29uc3QqPih0
aGlzKTsgfQotICAgIAorCisgICAgYm9vbCBpc0xpdmUoKTsKKwogICAgIGJvb2wgaXNMYXJnZUFs
bG9jYXRpb24oKSBjb25zdDsKICAgICBDZWxsQ29udGFpbmVyIGNlbGxDb250YWluZXIoKSBjb25z
dDsKICAgICBNYXJrZWRCbG9jayYgbWFya2VkQmxvY2soKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9oZWFwL0hlYXBDZWxsSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0hlYXBDZWxsSW5saW5lcy5oCShyZXZpc2lvbiAyMTcyMjAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwQ2VsbElubGluZXMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0zMyw2ICszMywxMyBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAorQUxXQVlTX0lOTElO
RSBib29sIEhlYXBDZWxsOjppc0xpdmUoKQoreworICAgIGlmIChpc0xhcmdlQWxsb2NhdGlvbigp
KQorICAgICAgICByZXR1cm4gbGFyZ2VBbGxvY2F0aW9uKCkuaXNMaXZlKCk7CisgICAgcmV0dXJu
IG1hcmtlZEJsb2NrKCkuaGFuZGxlKCkuaXNMaXZlKHRoaXMpOworfQorCiBBTFdBWVNfSU5MSU5F
IGJvb2wgSGVhcENlbGw6OmlzTGFyZ2VBbGxvY2F0aW9uKCkgY29uc3QKIHsKICAgICByZXR1cm4g
TGFyZ2VBbGxvY2F0aW9uOjppc0xhcmdlQWxsb2NhdGlvbihjb25zdF9jYXN0PEhlYXBDZWxsKj4o
dGhpcykpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3RydWN0dXJlUmFy
ZURhdGEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0
cnVjdHVyZVJhcmVEYXRhLmNwcAkocmV2aXNpb24gMjE3MjIwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvU3RydWN0dXJlUmFyZURhdGEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTkwLDYg
KzkwLDcgQEAgcHVibGljOgogICAgIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3Bl
cnR5VmFsdWVXYXRjaHBvaW50KGNvbnN0IE9iamVjdFByb3BlcnR5Q29uZGl0aW9uJiwgU3RydWN0
dXJlUmFyZURhdGEqKTsKIAogcHJpdmF0ZToKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCBvdmVy
cmlkZTsKICAgICB2b2lkIGhhbmRsZUZpcmUoY29uc3QgRmlyZURldGFpbCYpIG92ZXJyaWRlOwog
CiAgICAgU3RydWN0dXJlUmFyZURhdGEqIG1fc3RydWN0dXJlUmFyZURhdGE7CkBAIC0yMTIsNiAr
MjEzLDExIEBAIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmEKIHsKIH0K
IAorYm9vbCBPYmplY3RUb1N0cmluZ0FkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hw
b2ludDo6aXNWYWxpZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc3RydWN0dXJlUmFyZURhdGEt
PmlzTGl2ZSgpOworfQorCiB2b2lkIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3Bl
cnR5VmFsdWVXYXRjaHBvaW50OjpoYW5kbGVGaXJlKGNvbnN0IEZpcmVEZXRhaWwmIGRldGFpbCkK
IHsKICAgICBTdHJpbmdQcmludFN0cmVhbSBvdXQ7Cg==
</data>
<flag name="review"
          id="332152"
          type_id="1"
          status="-"
          setter="mark.lam"
    />
    <flag name="commit-queue"
          id="332158"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>311163</attachid>
            <date>2017-05-24 15:47:50 -0700</date>
            <delta_ts>2017-05-24 20:06:22 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-172548.patch</filename>
            <type>text/plain</type>
            <size>17043</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMTczNzIpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDEzIEBACisyMDE3LTA1LTI0ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNv
bT4KKworICAgICAgICBPYmplY3RUb1N0cmluZ0FkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVl
V2F0Y2hwb2ludCBzaG91bGQgbm90IHJlaW5zdGFsbCBpdHNlbGYgbm9yIGhhbmRsZUZpcmUgaWYg
aXQncyBkeWluZyBzaG9ydGx5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTcyNTQ4CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8zMTQ1ODM5Mz4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHN0cmVzcy9y
ZWdyZXNzLTE3MjU0OC5wYXRjaDogQWRkZWQuCisKIDIwMTctMDUtMjMgIFNhYW0gQmFyYXRpICA8
c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAgV2Ugc2hvdWxkIG5vdCBtbWFwIHplcm8gYnl0
ZXMgZm9yIGEgbWVtb3J5IGluIFdhc20KSW5kZXg6IEpTVGVzdHMvc3RyZXNzL3JlZ3Jlc3MtMTcy
NTQ4LnBhdGNoCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvc3RyZXNzL3JlZ3Jlc3MtMTcyNTQ4LnBh
dGNoCShub25leGlzdGVudCkKKysrIEpTVGVzdHMvc3RyZXNzL3JlZ3Jlc3MtMTcyNTQ4LnBhdGNo
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8vQCBydW4oImN1c3RvbS1ub0NKSVQt
bm9Db25jdXJyZW50R0Mtbm9HZW5HQy1ub0RGRyIsICItLXVzZUNvbmN1cnJlbnRKSVQ9ZmFsc2Ui
LCAiLS11c2VDb25jdXJyZW50R0M9ZmFsc2UiLCAiLS11c2VHZW5lcmF0aW9uYWxHQz1mYWxzZSIs
ICItLXVzZURGR0pJVD1mYWxzZSIpCisKKy8vIFRoaXMgdGVzdCBzaG91bGQgbm90IGNyYXNoLgor
CisoZnVuY3Rpb24oKSB7CisgICAgZnVuY3Rpb24gZm9vKHgsIHkpIHsKKyAgICAgICAgcmV0dXJu
ICgoIH4gKCgoKChNYXRoLmZyb3VuZCgwICUgeSkgPj0geSkgKSAvICgoTWF0aC5tYXgoKChNYXRo
LmF0YW4yKCgoTWF0aC5wb3coKC1OdW1iZXIuTUFYX1ZBTFVFID4+PiAwKSwgKHggfCAwKSkgfCAw
KSA+Pj4gMCksIHkpID4+PiAwKSAtICggKyAoKCAhICgwIHwgMCkpIHwgMCkpKSwgTWF0aC5wb3co
TWF0aC5mcm91bmQoKCh4IHwgMCkgXiB5KSksICggISAoICsgeSkpKSkgfCAwKSB8IDApKSB8IDAp
IHwgMCkpIHwgMCk7CisgICAgfTsKKworICAgIHZhciBpbnB1dHMgPSBbbnVsbCwgTmFOLCAoMS8w
KSwgTmFOLCAoMS8wKSwgYXJndW1lbnRzLmNhbGxlZSwgbnVsbCwgKDEvMCksIGFyZ3VtZW50cy5j
YWxsZWUsIE5hTiwgKDEvMCksIGFyZ3VtZW50cy5jYWxsZWUsICgxLzApLCBhcmd1bWVudHMuY2Fs
bGVlLCBOYU4sIG51bGwsIE5hTiwgbnVsbCwgKDEvMCksIE5hTiwgYXJndW1lbnRzLmNhbGxlZSwg
KDEvMCksIE5hTiwgbnVsbCwgYXJndW1lbnRzLmNhbGxlZSwgKDEvMCksIE5hTiwgTmFOLCBOYU4s
IE5hTiwgTmFOLCBhcmd1bWVudHMuY2FsbGVlLCBudWxsLCAoMS8wKSwgTmFOLCBudWxsLCBudWxs
LCAoMS8wKSwgKDEvMCksIE5hTiwgTmFOLCBOYU4sIE5hTiwgTmFOLCBOYU4sIE5hTiwgTmFOLCBO
YU4sIE5hTiwgTmFOLCBOYU4sIE5hTiwgTmFOLCBOYU4sIE5hTiwgbnVsbCwgbnVsbCwgKDEvMCks
IE5hTiwgbnVsbCwgbnVsbCwgYXJndW1lbnRzLmNhbGxlZSwgTmFOLCBOYU4sIG51bGwsIG51bGws
IGFyZ3VtZW50cy5jYWxsZWUsIG51bGwsIE5hTiwgKDEvMCksIE5hTiwgTmFOLCBhcmd1bWVudHMu
Y2FsbGVlLCBOYU4sIGFyZ3VtZW50cy5jYWxsZWUsIG51bGwsIE5hTiwgTmFOLCBudWxsLCBhcmd1
bWVudHMuY2FsbGVlLCBOYU4sIG51bGwsICgxLzApLCBOYU4sIGFyZ3VtZW50cy5jYWxsZWUsIG51
bGwsIG51bGwsIE5hTiwgbnVsbCwgTmFOLCBhcmd1bWVudHMuY2FsbGVlLCBhcmd1bWVudHMuY2Fs
bGVlLCBhcmd1bWVudHMuY2FsbGVlLCBhcmd1bWVudHMuY2FsbGVlLCBudWxsLCBhcmd1bWVudHMu
Y2FsbGVlLCAoMS8wKSwgKDEvMCksICgxLzApLCAoMS8wKSwgKDEvMCksIE5hTiwgKDEvMCksIGFy
Z3VtZW50cy5jYWxsZWUsIE5hTiwgKDEvMCldOworCisgICAgZm9yICh2YXIgaiA9IDA7IGogPCBp
bnB1dHMubGVuZ3RoOyArK2opIHsgICAgICAgCisgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwg
aW5wdXRzLmxlbmd0aDsgKytrKSB7ICAgICAgICAgCisgICAgICAgICAgICBmb28oaW5wdXRzW2td
LCBpbnB1dHNba10pOworICAgICAgICB9ICAgICAKKyAgICB9ICAgCisKK30pKCk7CisKK01hdGgu
Y2VpbCA9ICJcdUVCMEQiOworCittMiA9IG5ldyBNYXA7CittMi50b1NvdXJjZSA9IChmdW5jdGlv
bigpIHsgfSk7CisKK20xID0gbmV3IE1hcDsKK20yLnRvU3RyaW5nKCk7CisKK28yID0gbTEuX19w
cm90b19fOworbTIgPSBuZXcgTWFwOworCit0ZXN0ID0gZnVuY3Rpb24oKSB7CisgICAgTWF0aC5s
b2cxcCgveC9nKSwgTWF0aC5sb2cxcCgveC9nKSwgTWF0aC5jZWlsKDB4MTAwMDAwMDAxKTsKK307
CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMzMwMDA7IGkrKykgeworICAgIHRyeSB7CisgICAgICAg
IHRlc3QoKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgfQorfQorCitvMi5nMCA9IHRoaXM7Citv
Mi5oMSA9IHt9OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMTczODkp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsODcgQEAKKzIwMTctMDUtMjQgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgor
CisgICAgICAgIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRj
aHBvaW50IHNob3VsZCBub3QgcmVpbnN0YWxsIGl0c2VsZiBub3IgaGFuZGxlRmlyZSBpZiBpdCdz
IGR5aW5nIHNob3J0bHkuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNzI1NDgKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzMxNDU4MzkzPgorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENvbnNpZGVyIHRoZSBm
b2xsb3dpbmcgc2NlbmFyaW86CisKKyAgICAgICAgMS4gQSBPYmplY3RUb1N0cmluZ0FkYXB0aXZl
SW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludCBPMSwgd2F0Y2hlcyBmb3IKKyAgICAgICAg
ICAgc3RydWN0dXJlIHRyYW5zaXRpb25zLCBlLmcuIHN0cnVjdHVyZSBTMiB0cmFuc2l0aW9uaW5n
IHRvIHN0cnVjdHVyZSBTMy4KKyAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBPMSB3b3VsZCBiZSBp
bnN0YWxsZWQgaW4gUzIncyB3YXRjaHBvaW50IHNldC4KKyAgICAgICAgMi4gV2hlbiB0aGUgc3Ry
dWN0dXJlIHRyYW5zaXRpb24gaGFwcGVucywgc3RydWN0dXJlIFMyIHdpbGwgZmlyZSB3YXRjaHBv
aW50IE8xLgorICAgICAgICAzLiBPMSdzIGhhbmRsZXIgd2lsbCBub3JtYWxseSByZS1pbnN0YWxs
IGl0c2VsZiBpbiB0aGUgd2F0Y2hwb2ludCBzZXQgb2YgdGhlIG5ldworICAgICAgICAgICAidHJh
bnNpdGlvbmVkIHRvIiBzdHJ1Y3R1cmUgUzMuCisgICAgICAgIDQuICJJbnN0YWxsYXRpb24iIGhl
cmUgcmVxdWlyZXMgd3JpdGluZyBpbnRvIHRoZSBTdHJ1Y3R1cmVSYXJlRGF0YSBTRDMgb2YgdGhl
IG5ldworICAgICAgICAgICBzdHJ1Y3R1cmUgUzMuICBJZiBTRDMgZG9lcyBub3QgZXhpc3QgeWV0
LCB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3Mgd2lsbCB0cmlnZ2VyCisgICAgICAgICAgIHRoZSBh
bGxvY2F0aW9uIG9mIFN0cnVjdHVyZVJhcmVEYXRhIFNEMy4KKyAgICAgICAgNS4gSXQgaXMgcG9z
c2libGUgdGhhdCB0aGUgU3RydWN0dXJlIFMxLCBhbmQgU3RydWN0dXJlUmFyZURhdGEgU0QxIHRo
YXQgb3ducyB0aGUKKyAgICAgICAgICAgT2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUluZmVycmVkUHJv
cGVydHlWYWx1ZVdhdGNocG9pbnQgTzEgaXMgbm8gbG9uZ2VyIHJlYWNoYWJsZQorICAgICAgICAg
ICBieSB0aGUgR0MsIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBjb2xsZWN0ZWQgc29vbi4KKyAgICAg
ICAgNi4gVGhlIGFsbG9jYXRpb24gb2YgU0QzIGluICg0KSBtYXkgdHJpZ2dlciB0aGUgc3dlZXBp
bmcgb2YgdGhlIFN0cnVjdHVyZVJhcmVEYXRhCisgICAgICAgICAgIFNEMS4gIFRoaXMsIGluIHR1
cm4sIHRyaWdnZXJzIHRoZSBkZWxldGlvbiBvZiB0aGUKKyAgICAgICAgICAgT2JqZWN0VG9TdHJp
bmdBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnQgTzEuCisKKyAgICAgICAg
QWZ0ZXIgTzEgaXMgZGVsZXRlZCBpbiAoNikgYW5kIFNEMyBpcyBhbGxvY2F0ZWQgaW4gKDQpLCBl
eGVjdXRpb24gY29udGludWVzIGluCisgICAgICAgIEFkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZh
bHVlV2F0Y2hwb2ludEJhc2U6OmZpcmUoKSB3aGVyZSBPMSBnZXRzIGluc3RhbGxlZCBpbgorICAg
ICAgICBzdHJ1Y3R1cmUgUzMncyB3YXRjaHBvaW50IHNldC4gIFRoaXMgaXMgb2J2aW91c2x5IGlu
Y29ycmVjdCBiZWNhdXNlIE8xIGlzIGFscmVhZHkKKyAgICAgICAgZGVsZXRlZC4gIFRoZSByZXN1
bHQgaXMgdGhhdCBiYWRuZXNzIGhhcHBlbnMgbGF0ZXIgd2hlbiBTMydzIHdhdGNocG9pbnQgc2V0
IGZpcmVzCisgICAgICAgIGl0cyB3YXRjaHBvaW50cyBhbmQgYWNjZXNzZXMgdGhlIGRlbGV0ZWQg
TzEuCisKKyAgICAgICAgVGhlIGZpeCBpcyB0byBlbmhhbmNlIEFkYXB0aXZlSW5mZXJyZWRQcm9w
ZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2U6OmZpcmUoKSB0bworICAgICAgICBjaGVjayBpZiAidGhp
cyIgaXMgc3RpbGwgdmFsaWQgYmVmb3JlIHByb2NlZWRpbmcgdG8gcmUtaW5zdGFsbCBpdHNlbGYg
b3IgdG8KKyAgICAgICAgaW52b2tlIGl0cyBoYW5kbGVGaXJlKCkgbWV0aG9kLgorCisgICAgICAg
IE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50ICh3
aGljaCBleHRlbmRzCisgICAgICAgIEFkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hw
b2ludEJhc2UpIHdpbGwgb3ZlcnJpZGUgaXRzIGlzVmFsaWQoKSBtZXRob2QsCisgICAgICAgIGFu
ZCByZXR1cm4gZmFsc2UgaXRzIG93bmVyIFN0cnVjdHVyZVJhcmVEYXRhIGlzIG5vIGxvbmdlciBy
ZWFjaGFibGUgYnkgdGhlIEdDLgorICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBpdCB3b24ndCBi
ZSBkZWxldGVkIHdoaWxlIGl0J3MgaW5zdGFsbGVkIHRvIGFueSB3YXRjaHBvaW50IHNldC4KKwor
ICAgICAgICBBZGRpdGlvbmFsIGNvbnNpZGVyYXRpb25zIGFuZCBub3RlczoKKyAgICAgICAgMS4g
SW4gdGhlIGFib3ZlLCBJIHRhbGtlZCBhYm91dCB0aGUgT2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUlu
ZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnQKKyAgICAgICAgICAgYmVpbmcgaW5zdGFsbGVk
IGluIHdhdGNocG9pbnQgc2V0cy4gIFdoYXQgYWN0dWFsbHkgaGFwcGVucyBpcyB0aGF0CisgICAg
ICAgICAgIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBv
aW50IGhhcyAyIG1lbWJlcnMKKyAgICAgICAgICAgKG1fc3RydWN0dXJlV2F0Y2hwb2ludCBhbmQg
bV9wcm9wZXJ0eVdhdGNocG9pbnQpIHdoaWNoIG1heSBiZSBpbnN0YWxsZWQgaW4KKyAgICAgICAg
ICAgd2F0Y2hwb2ludCBzZXRzLiAgVGhlIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJbmZlcnJlZFBy
b3BlcnR5VmFsdWVXYXRjaHBvaW50IGlzCisgICAgICAgICAgIG5vdCBpdHNlbGYgYSBXYXRjaHBv
aW50IG9iamVjdC4KKworICAgICAgICAgICBCdXQgZm9yIGJyZXZpdHksIGluIHRoZSBhYm92ZSwg
SSByZWZlciB0byB0aGUgT2JqZWN0VG9TdHJpbmdBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1
ZVdhdGNocG9pbnQKKyAgICAgICAgICAgaW5zdGVhZCBvZiBpdHMgV2F0Y2hwb2ludCBtZW1iZXJz
LiAgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpc3N1ZSBpcyBzdGlsbAorICAgICAgICAgICBhY2N1
cmF0ZSBnaXZlbiB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgV2F0Y2hwb2ludCBtZW1iZXJzIGFyZSBl
bWJlZGRlZCBpbiB0aGUKKyAgICAgICAgICAgZW5jbG9zaW5nIE9iamVjdFRvU3RyaW5nQWRhcHRp
dmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50IG9iamVjdCwgYW5kCisgICAgICAgICAg
IGhlbmNlLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGxpZmUtY3ljbGUuCisKKyAgICAgICAgMi4gVGhl
IHRvcCBvZiBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlOjpmaXJl
KCkgcmVtb3ZlcyBpdHMKKyAgICAgICAgICAgbV9zdHJ1Y3R1cmVXYXRjaHBvaW50IGFuZCBtX3By
b3BlcnR5V2F0Y2hwb2ludCBpZiB0aGV5IGhhdmUgYmVlbiBhZGRlZCB0byBhbnkKKyAgICAgICAg
ICAgd2F0Y2hwb2ludCBzZXRzLiAgVGhpcyBpcyBzYWZlIHRvIGRvIGV2ZW4gaWYgdGhlIG93bmVy
IFN0cnVjdHVyZVJhcmVEYXRhIGlzIG5vCisgICAgICAgICAgIGxvbmdlciByZWFjaGFibGUgYnkg
dGhlIEdDLgorCisgICAgICAgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB3YXkgd2UgY2Fu
IGdldCB0byBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlOjpmaXJl
KCkKKyAgICAgICAgICAgaXMgaWYgaXRzIFdhdGNocG9pbnQgbWVtYmVycyBhcmUgc3RpbGwgaW5z
dGFsbGVkIGluIHNvbWUgd2F0Y2hwb2ludCBzZXQgdGhhdAorICAgICAgICAgICBmaXJlZC4gIFRo
aXMgbWVhbnMgdGhhdCB0aGUgQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50
QmFzZQorICAgICAgICAgICBpbnN0YW5jZSBoYXMgbm90IGJlZW4gZGVsZXRlZCB5ZXQsIGJlY2F1
c2UgaXRzIGRlc3RydWN0b3Igd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgIHJlbW92ZSB0
aGUgV2F0Y2hwb2ludCBtZW1iZXJzIGZyb20gYW55IHdhdGNocG9pbnQgc2V0cy4KKworICAgICAg
ICAqIGJ5dGVjb2RlL0FkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2Uu
Y3BwOgorICAgICAgICAoSlNDOjpBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9p
bnRCYXNlOjpmaXJlKToKKyAgICAgICAgKEpTQzo6QWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFs
dWVXYXRjaHBvaW50QmFzZTo6aXNWYWxpZCk6CisgICAgICAgICogYnl0ZWNvZGUvQWRhcHRpdmVJ
bmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50QmFzZS5oOgorICAgICAgICAqIGhlYXAvRnJl
ZUxpc3QuY3BwOgorICAgICAgICAoSlNDOjpGcmVlTGlzdDo6Y29udGFpbnMpOgorICAgICAgICAq
IGhlYXAvRnJlZUxpc3QuaDoKKyAgICAgICAgKiBoZWFwL0hlYXBDZWxsLmg6CisgICAgICAgICog
aGVhcC9IZWFwQ2VsbElubGluZXMuaDoKKyAgICAgICAgKEpTQzo6SGVhcENlbGw6OmlzTGl2ZSk6
CisgICAgICAgICogaGVhcC9NYXJrZWRBbGxvY2F0b3IuaDoKKyAgICAgICAgKEpTQzo6TWFya2Vk
QWxsb2NhdG9yOjppc0ZyZWVMaXN0ZWRDZWxsKToKKyAgICAgICAgKiBoZWFwL01hcmtlZEJsb2Nr
Lmg6CisgICAgICAgICogaGVhcC9NYXJrZWRCbG9ja0lubGluZXMuaDoKKyAgICAgICAgKEpTQzo6
TWFya2VkQmxvY2s6OkhhbmRsZTo6aXNGcmVlTGlzdGVkQ2VsbCk6CisgICAgICAgICogcnVudGlt
ZS9TdHJ1Y3R1cmVSYXJlRGF0YS5jcHA6CisgICAgICAgIChKU0M6Ok9iamVjdFRvU3RyaW5nQWRh
cHRpdmVJbmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50Ojppc1ZhbGlkKToKKwogMjAxNy0w
NS0yMyAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KIAogICAgICAgICBXZSBzaG91
bGQgbm90IG1tYXAgemVybyBieXRlcyBmb3IgYSBtZW1vcnkgaW4gV2FzbQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0FkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0
Y2hwb2ludEJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9BZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlLmNwcAkocmV2
aXNpb24gMjE3MjIwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0FkYXB0aXZl
SW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTU3
LDYgKzU3LDkgQEAgdm9pZCBBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocAogICAg
IGlmIChtX3Byb3BlcnR5V2F0Y2hwb2ludC5pc09uTGlzdCgpKQogICAgICAgICBtX3Byb3BlcnR5
V2F0Y2hwb2ludC5yZW1vdmUoKTsKIAorICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICByZXR1
cm47CisKICAgICBpZiAobV9rZXkuaXNXYXRjaGFibGUoUHJvcGVydHlDb25kaXRpb246OkVuc3Vy
ZVdhdGNoYWJpbGl0eSkpIHsKICAgICAgICAgaW5zdGFsbCgpOwogICAgICAgICByZXR1cm47CkBA
IC02NSw2ICs2OCwxMSBAQCB2b2lkIEFkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hw
CiAgICAgaGFuZGxlRmlyZShkZXRhaWwpOwogfQogCitib29sIEFkYXB0aXZlSW5mZXJyZWRQcm9w
ZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2U6OmlzVmFsaWQoKSBjb25zdAoreworICAgIHJldHVybiB0
cnVlOworfQorCiB2b2lkIEFkYXB0aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJh
c2U6OlN0cnVjdHVyZVdhdGNocG9pbnQ6OmZpcmVJbnRlcm5hbChjb25zdCBGaXJlRGV0YWlsJiBk
ZXRhaWwpCiB7CiAgICAgcHRyZGlmZl90IG15T2Zmc2V0ID0gT0JKRUNUX09GRlNFVE9GKEFkYXB0
aXZlSW5mZXJyZWRQcm9wZXJ0eVZhbHVlV2F0Y2hwb2ludEJhc2UsIG1fc3RydWN0dXJlV2F0Y2hw
b2ludCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQWRhcHRpdmVJbmZl
cnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50QmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9BZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNo
cG9pbnRCYXNlLmgJKHJldmlzaW9uIDIxNzIyMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9BZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnRCYXNlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtNDYsNiArNDYsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB+QWRhcHRpdmVJ
bmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50QmFzZSgpID0gZGVmYXVsdDsKIAogcHJvdGVj
dGVkOgorICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lk
IGhhbmRsZUZpcmUoY29uc3QgRmlyZURldGFpbCYpID0gMDsKIAogcHJpdmF0ZToKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0ZyZWVMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9GcmVlTGlzdC5jcHAJKHJldmlzaW9uIDIxNzIyMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0ZyZWVMaXN0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0y
OCw2ICsyOCwyNCBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAorYm9vbCBGcmVlTGlzdDo6Y29udGFp
bnMoY29uc3Qgdm9pZCogdGFyZ2V0KSBjb25zdAoreworICAgIGlmIChyZW1haW5pbmcpIHsKKyAg
ICAgICAgY29uc3Qgdm9pZCogc3RhcnQgPSAocGF5bG9hZEVuZCAtIHJlbWFpbmluZyk7CisgICAg
ICAgIGNvbnN0IHZvaWQqIGVuZCA9IHBheWxvYWRFbmQ7CisgICAgICAgIHJldHVybiAoc3RhcnQg
PD0gdGFyZ2V0KSAmJiAodGFyZ2V0IDwgZW5kKTsKKyAgICB9CisKKyAgICBGcmVlQ2VsbCogY2Fu
ZGlkYXRlID0gaGVhZDsKKyAgICB3aGlsZSAoY2FuZGlkYXRlKSB7CisgICAgICAgIGlmIChjYW5k
aWRhdGUgPT0gdGFyZ2V0KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhbmRp
ZGF0ZSA9IGNhbmRpZGF0ZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
IHZvaWQgRnJlZUxpc3Q6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKIHsKICAgICBvdXQu
cHJpbnQoIntoZWFkID0gIiwgUmF3UG9pbnRlcihoZWFkKSwgIiwgcGF5bG9hZEVuZCA9ICIsIFJh
d1BvaW50ZXIocGF5bG9hZEVuZCksICIsIHJlbWFpbmluZyA9ICIsIHJlbWFpbmluZywgIiwgb3Jp
Z2luYWxTaXplID0gIiwgb3JpZ2luYWxTaXplLCAifSIpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2hlYXAvRnJlZUxpc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaGVhcC9GcmVlTGlzdC5oCShyZXZpc2lvbiAyMTcyMjApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaGVhcC9GcmVlTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoK
LSAqIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTgwLDcgKzgwLDkgQEAgc3RydWN0
IEZyZWVMaXN0IHsKICAgICB7CiAgICAgICAgIHJldHVybiAqdGhpcyAhPSBGcmVlTGlzdCgpOwog
ICAgIH0KLSAgICAKKworICAgIGJvb2wgY29udGFpbnMoY29uc3Qgdm9pZCogdGFyZ2V0KSBjb25z
dDsKKwogICAgIGJvb2wgYWxsb2NhdGlvbldpbGxGYWlsKCkgY29uc3QgeyByZXR1cm4gIWhlYWQg
JiYgIXJlbWFpbmluZzsgfQogICAgIGJvb2wgYWxsb2NhdGlvbldpbGxTdWNjZWVkKCkgY29uc3Qg
eyByZXR1cm4gIWFsbG9jYXRpb25XaWxsRmFpbCgpOyB9CiAgICAgCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaGVhcC9IZWFwQ2VsbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9oZWFwL0hlYXBDZWxsLmgJKHJldmlzaW9uIDIxNzIyMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9oZWFwL0hlYXBDZWxsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDcgKzQ3LDkg
QEAgcHVibGljOgogICAgIAogICAgIHZvaWQgemFwKCkgeyAqcmVpbnRlcnByZXRfY2FzdF9wdHI8
dWludHB0cl90Kio+KHRoaXMpID0gMDsgfQogICAgIGJvb2wgaXNaYXBwZWQoKSBjb25zdCB7IHJl
dHVybiAhKnJlaW50ZXJwcmV0X2Nhc3RfcHRyPHVpbnRwdHJfdCogY29uc3QqPih0aGlzKTsgfQot
ICAgIAorCisgICAgYm9vbCBpc0xpdmUoKTsKKwogICAgIGJvb2wgaXNMYXJnZUFsbG9jYXRpb24o
KSBjb25zdDsKICAgICBDZWxsQ29udGFpbmVyIGNlbGxDb250YWluZXIoKSBjb25zdDsKICAgICBN
YXJrZWRCbG9jayYgbWFya2VkQmxvY2soKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9oZWFwL0hlYXBDZWxsSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9oZWFwL0hlYXBDZWxsSW5saW5lcy5oCShyZXZpc2lvbiAyMTcyMjApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwQ2VsbElubGluZXMuaAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0y
OCwxMSArMjgsMjEgQEAKICNpbmNsdWRlICJDZWxsQ29udGFpbmVyLmgiCiAjaW5jbHVkZSAiSGVh
cENlbGwuaCIKICNpbmNsdWRlICJMYXJnZUFsbG9jYXRpb24uaCIKLSNpbmNsdWRlICJNYXJrZWRC
bG9jay5oIgorI2luY2x1ZGUgIk1hcmtlZEJsb2NrSW5saW5lcy5oIgogI2luY2x1ZGUgIlZNLmgi
CiAKIG5hbWVzcGFjZSBKU0MgewogCitBTFdBWVNfSU5MSU5FIGJvb2wgSGVhcENlbGw6OmlzTGl2
ZSgpCit7CisgICAgaWYgKGlzTGFyZ2VBbGxvY2F0aW9uKCkpCisgICAgICAgIHJldHVybiBsYXJn
ZUFsbG9jYXRpb24oKS5pc0xpdmUoKTsKKyAgICBhdXRvJiBtYXJrZWRCbG9ja0hhbmRsZSA9IG1h
cmtlZEJsb2NrKCkuaGFuZGxlKCk7CisgICAgaWYgKG1hcmtlZEJsb2NrSGFuZGxlLmlzRnJlZUxp
c3RlZCgpKQorICAgICAgICByZXR1cm4gIW1hcmtlZEJsb2NrSGFuZGxlLmlzRnJlZUxpc3RlZENl
bGwodGhpcyk7CisgICAgcmV0dXJuIG1hcmtlZEJsb2NrSGFuZGxlLmlzTGl2ZSh0aGlzKTsKK30K
KwogQUxXQVlTX0lOTElORSBib29sIEhlYXBDZWxsOjppc0xhcmdlQWxsb2NhdGlvbigpIGNvbnN0
CiB7CiAgICAgcmV0dXJuIExhcmdlQWxsb2NhdGlvbjo6aXNMYXJnZUFsbG9jYXRpb24oY29uc3Rf
Y2FzdDxIZWFwQ2VsbCo+KHRoaXMpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFw
L01hcmtlZEFsbG9jYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9o
ZWFwL01hcmtlZEFsbG9jYXRvci5oCShyZXZpc2lvbiAyMTcyMjApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvaGVhcC9NYXJrZWRBbGxvY2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMTU2LDYg
KzE1Niw4IEBAIHB1YmxpYzoKICAgICB2b2lkKiB0cnlBbGxvY2F0ZShHQ0RlZmVycmFsQ29udGV4
dCogPSBudWxscHRyKTsKICAgICBIZWFwKiBoZWFwKCkgeyByZXR1cm4gbV9oZWFwOyB9CiAKKyAg
ICBib29sIGlzRnJlZUxpc3RlZENlbGwoY29uc3Qgdm9pZCogdGFyZ2V0KSBjb25zdCB7IHJldHVy
biBtX2ZyZWVMaXN0LmNvbnRhaW5zKHRhcmdldCk7IH0KKwogICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+IHZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IEZ1bmN0b3ImKTsKICAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBGdW5jdG9yPiB2b2lkIGZvckVhY2hOb3RFbXB0eUJsb2NrKGNvbnN0IEZ1bmN0
b3ImKTsKICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEJsb2Nr
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2su
aAkocmV2aXNpb24gMjE3MjIwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2Vk
QmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMTY2LDYgKzE2Niw4IEBAIHB1YmxpYzoKICAgICAg
ICAgYm9vbCBpc0xpdmUoY29uc3QgSGVhcENlbGwqKTsKICAgICAgICAgYm9vbCBpc0xpdmVDZWxs
KGNvbnN0IHZvaWQqKTsKIAorICAgICAgICBib29sIGlzRnJlZUxpc3RlZENlbGwoY29uc3Qgdm9p
ZCogdGFyZ2V0KSBjb25zdDsKKwogICAgICAgICBib29sIGlzTmV3bHlBbGxvY2F0ZWQoY29uc3Qg
dm9pZCopOwogICAgICAgICB2b2lkIHNldE5ld2x5QWxsb2NhdGVkKGNvbnN0IHZvaWQqKTsKICAg
ICAgICAgdm9pZCBjbGVhck5ld2x5QWxsb2NhdGVkKGNvbnN0IHZvaWQqKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEJsb2NrSW5saW5lcy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEJsb2NrSW5saW5lcy5oCShyZXZpc2lv
biAyMTcyMjApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRCbG9ja0lubGlu
ZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMTE3LDYgKzExNywxMiBAQCBpbmxpbmUgYm9vbCBNYXJr
ZWRCbG9jazo6SGFuZGxlOjppc0xpdmVDCiAgICAgcmV0dXJuIGlzTGl2ZShtYXJraW5nVmVyc2lv
biwgaXNNYXJraW5nLCBzdGF0aWNfY2FzdDxjb25zdCBIZWFwQ2VsbCo+KHApKTsKIH0KIAoraW5s
aW5lIGJvb2wgTWFya2VkQmxvY2s6OkhhbmRsZTo6aXNGcmVlTGlzdGVkQ2VsbChjb25zdCB2b2lk
KiB0YXJnZXQpIGNvbnN0Cit7CisgICAgQVNTRVJUKGlzRnJlZUxpc3RlZCgpKTsKKyAgICByZXR1
cm4gbV9hbGxvY2F0b3ItPmlzRnJlZUxpc3RlZENlbGwodGFyZ2V0KTsKK30KKwogLy8gVGhlIGZv
bGxvd2luZyBoYXMgdG8gYmUgdHJ1ZSBmb3Igc3BlY2lhbGl6YXRpb24gdG8ga2ljayBpbjoKIC8v
CiAvLyBzd2VlcE1vZGUgPT0gU3dlZXBUb0ZyZWVMaXN0CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9TdHJ1Y3R1cmVSYXJlRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3RydWN0dXJlUmFyZURhdGEuY3BwCShyZXZpc2lvbiAy
MTcyMjApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJ1Y3R1cmVSYXJlRGF0
YS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChD
KSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAxMy0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwpAQCAtOTAsNiArOTAsNyBAQCBwdWJsaWM6CiAgICAgT2JqZWN0VG9T
dHJpbmdBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnQoY29uc3QgT2JqZWN0
UHJvcGVydHlDb25kaXRpb24mLCBTdHJ1Y3R1cmVSYXJlRGF0YSopOwogCiBwcml2YXRlOgorICAg
IGJvb2wgaXNWYWxpZCgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgaGFuZGxlRmlyZShjb25z
dCBGaXJlRGV0YWlsJikgb3ZlcnJpZGU7CiAKICAgICBTdHJ1Y3R1cmVSYXJlRGF0YSogbV9zdHJ1
Y3R1cmVSYXJlRGF0YTsKQEAgLTIxMiw2ICsyMTMsMTEgQEAgT2JqZWN0VG9TdHJpbmdBZGFwdGl2
ZUluZmVycmVkUHJvcGVydHlWYQogewogfQogCitib29sIE9iamVjdFRvU3RyaW5nQWRhcHRpdmVJ
bmZlcnJlZFByb3BlcnR5VmFsdWVXYXRjaHBvaW50Ojppc1ZhbGlkKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9zdHJ1Y3R1cmVSYXJlRGF0YS0+aXNMaXZlKCk7Cit9CisKIHZvaWQgT2JqZWN0VG9T
dHJpbmdBZGFwdGl2ZUluZmVycmVkUHJvcGVydHlWYWx1ZVdhdGNocG9pbnQ6OmhhbmRsZUZpcmUo
Y29uc3QgRmlyZURldGFpbCYgZGV0YWlsKQogewogICAgIFN0cmluZ1ByaW50U3RyZWFtIG91dDsK
</data>
<flag name="review"
          id="332176"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>