<?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>186814</bug_id>
          
          <creation_ts>2018-06-19 13:16:57 -0700</creation_ts>
          <short_desc>CompareEq should be using KnownOtherUse instead of OtherUse</short_desc>
          <delta_ts>2018-07-20 12:16:38 -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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>rmorisset</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1434516</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-06-19 13:16:57 -0700</bug_when>
    <thetext>This is an interesting bug. We have two GetByOffsets, something like this:

block#1:
a: GetByOffset(@base, “x”, [Load, Constant:undefined, Constant:undefined])
Branch (#2, #3)
block#2:
b: GetByOffset(@base, “x”, [Constant:undefined, Constant:undefined])
d: Check(@Other:@b)
c: CompareEq(@something, Other:@b)

In Fixup, the CompareEq emits that check node @d. We remove @d from the IR, because we know @b produces undefined.  We get this IR:

block#1:
a: GetByOffset(@base, “x”, [Load, Constant:undefined, Constant:undefined])
Branch (#2, #3)
block#2:
b: GetByOffset(@base, “x”, [Constant:undefined, Constant:undefined])
c: CompareEq(@something, Other:@b)

Then, CSE changes the program to:
block#1:
a: GetByOffset(@base, “x”, [Load, Constant:undefined, Constant:undefined])
Branch (#2, #3)
block#2:
b: CheckStructure(@base, …)
c: CompareEq(@something, Other:@a)

But, we don’t emit type checks in the FTL backend for CompareEq, because we emitted the Check node in Fixup. This is quite the interesting bug. It’s interesting that we end up in a state with a GetByOffset that has less specific type info.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1434517</commentid>
    <comment_count>1</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-06-19 13:17:30 -0700</bug_when>
    <thetext>&lt;rdar://problem/39720030&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1434519</commentid>
    <comment_count>2</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-06-19 13:19:46 -0700</bug_when>
    <thetext>I&apos;m not sure yet on the exact way to fix this. Who knows what kind of optimizations we may have performed on the MultiGetByOffset before we eliminate it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1437478</commentid>
    <comment_count>3</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-06-28 12:19:18 -0700</bug_when>
    <thetext>Seems like the cleanest solution here is for the variants to be part of the CSE key. We&apos;d just need to make sure this doesn&apos;t prevent a bunch of CSEs. My bet is it won&apos;t</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1437481</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2018-06-28 12:33:50 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #3)
&gt; Seems like the cleanest solution here is for the variants to be part of the
&gt; CSE key. We&apos;d just need to make sure this doesn&apos;t prevent a bunch of CSEs.
&gt; My bet is it won&apos;t

I recommend something else: add code to CSE to do a posthoc verification that the replacement is valid.

If you tried to make this part of the key then the key would get a lot more complicated. Also, keys have no notion of &quot;key subtype&quot; so I don&apos;t see how that would work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1437495</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2018-06-28 12:55:23 -0700</bug_when>
    <thetext>(In reply to Filip Pizlo from comment #4)
&gt; (In reply to Saam Barati from comment #3)
&gt; &gt; Seems like the cleanest solution here is for the variants to be part of the
&gt; &gt; CSE key. We&apos;d just need to make sure this doesn&apos;t prevent a bunch of CSEs.
&gt; &gt; My bet is it won&apos;t
&gt; 
&gt; I recommend something else: add code to CSE to do a posthoc verification
&gt; that the replacement is valid.
&gt; 
&gt; If you tried to make this part of the key then the key would get a lot more
&gt; complicated. Also, keys have no notion of &quot;key subtype&quot; so I don&apos;t see how
&gt; that would work.

Thinking about this more, I think this even means CSE doing the AbstractValue computation for both MultiGetByOffsets and refusing if the first one (the one that survives) is not a subset of the second one (the one that gets replaced).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1437653</commentid>
    <comment_count>6</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-06-28 17:48:32 -0700</bug_when>
    <thetext>(In reply to Filip Pizlo from comment #5)
&gt; (In reply to Filip Pizlo from comment #4)
&gt; &gt; (In reply to Saam Barati from comment #3)
&gt; &gt; &gt; Seems like the cleanest solution here is for the variants to be part of the
&gt; &gt; &gt; CSE key. We&apos;d just need to make sure this doesn&apos;t prevent a bunch of CSEs.
&gt; &gt; &gt; My bet is it won&apos;t
&gt; &gt; 
&gt; &gt; I recommend something else: add code to CSE to do a posthoc verification
&gt; &gt; that the replacement is valid.
&gt; &gt; 
&gt; &gt; If you tried to make this part of the key then the key would get a lot more
&gt; &gt; complicated. Also, keys have no notion of &quot;key subtype&quot; so I don&apos;t see how
&gt; &gt; that would work.
&gt; 
&gt; Thinking about this more, I think this even means CSE doing the
&gt; AbstractValue computation for both MultiGetByOffsets and refusing if the
&gt; first one (the one that survives) is not a subset of the second one (the one
&gt; that gets replaced).

Right. This is what I first thought when I found this bug.

Let&apos;s go with this architecture. I&apos;ll work on a patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1437678</commentid>
    <comment_count>7</comment_count>
      <attachid>343886</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-06-28 19:15:07 -0700</bug_when>
    <thetext>Created attachment 343886
WIP

I need to figure out what to do w/ GetByOffset. We may need to note what StructureSet GetByOffset emits a check for.

We want to enable CSE between MultiGetByOffset and GetByOffset
and GetByOffset w/ GetByOffset. But we need to make sure the resulting type of the replacement w/ GetByOffset is a subtype of the node being replaced. Same w/ Multi</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1439652</commentid>
    <comment_count>8</comment_count>
      <attachid>344388</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-07-05 18:04:42 -0700</bug_when>
    <thetext>Created attachment 344388
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1439880</commentid>
    <comment_count>9</comment_count>
      <attachid>344388</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2018-07-06 13:00:47 -0700</bug_when>
    <thetext>Comment on attachment 344388
patch

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

Holding off r+ because it seems like there are two things that could be cleaner.

&gt; Source/JavaScriptCore/dfg/DFGCSEPhase.cpp:307
&gt; +        RegisteredStructureSet baseSet; // This is the structure set that this node does the moral equivalent of a CheckStructure on.

Why do you do anything with the structure set?  The Node::remove() code that replaces a MultiGetByOffset with a CheckStructure ensures that you don&apos;t have to worry about it.

&gt; Source/JavaScriptCore/dfg/DFGCSEPhase.cpp:376
&gt; +    if (forReplacement.second.value() != forNode.second.value()) {
&gt; +        if (DFGCSEPhaseInternal::verbose)
&gt; +            dataLogLn(&quot;Blocked replacement because values are not equal&quot;);
&gt; +        return true;
&gt; +    }
&gt; +    if (!forReplacement.second.isType(forNode.second.m_type)) {
&gt; +        if (DFGCSEPhaseInternal::verbose)
&gt; +            dataLogLn(&quot;Blocked replacement because type for replacement is not subtype of node&quot;);
&gt; +        return true;
&gt; +    }
&gt; +    if (forNode.second.m_structure.isFinite()) {
&gt; +        if (!forReplacement.second.m_structure.isSubsetOf(forNode.second.m_structure)) {
&gt; +            if (DFGCSEPhaseInternal::verbose)
&gt; +                dataLogLn(&quot;Blocked replacement because replacement result is not structure subset of node&quot;);
&gt; +            return true;
&gt; +        }
&gt; +    }
&gt; +    if (forReplacement.second.m_arrayModes != forNode.second.m_arrayModes) {
&gt; +        if (DFGCSEPhaseInternal::verbose)
&gt; +            dataLogLn(&quot;Blocked replacement because array modes are different&quot;);
&gt; +        return true;
&gt; +    }

Why not just do:

AbstractValue tmp = forNode;
tmp.merge(forReplacement);
if (tmp != forNode)
    return true; // blocked replacement because the replacement is more general</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1440157</commentid>
    <comment_count>10</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2018-07-07 13:00:33 -0700</bug_when>
    <thetext>I thought about this more, and I&apos;m not sure that this fix is right anymore.

If we have:

a: MultiGetByOffset(@o, S1 -&gt; Int32, S2 -&gt; Object, S3 -&gt; Boolean)
...
b: MultiGetByOffset(@o, S1 -&gt; Int32, S2 -&gt; Object)

Then it&apos;s actually totally OK to do the replacement.  It&apos;s true that @a could return a boolean, but we will replace @b with a CheckStructure(@o, [S1, S2]).  That CheckStructure actually proves that @a must only have returned either Int32 or Object, not Boolean.

Maybe the problem here is that we just have an overzealous assertion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1441052</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-07-10 17:48:41 -0700</bug_when>
    <thetext>I spoke with Phil offline, and the bug isn&apos;t in MultiGetByOffset, but rather, in CompareEq. CompareEq has code like this in fixup:

```
                m_insertionSet.insertNode(m_indexInBlock, SpecNone, Check, node-&gt;origin,
                    Edge(node-&gt;child1().node(), OtherUse));
                fixEdge&lt;OtherUse&gt;(node-&gt;child1());
```

Because it inserts this Check, it has no intention of emitting the check itself. So when its input is this MultiGetByOffset, we end up confusing AI. This exact scenario is why we need a KnownOtherUse node, and we need to use it here, like we use it for other KnownXYZ UseKinds in similar fixup rules.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1441066</commentid>
    <comment_count>12</comment_count>
      <attachid>344744</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2018-07-10 18:42:19 -0700</bug_when>
    <thetext>Created attachment 344744
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1443878</commentid>
    <comment_count>13</comment_count>
      <attachid>344744</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-07-20 12:16:36 -0700</bug_when>
    <thetext>Comment on attachment 344744
patch

Clearing flags on attachment: 344744

Committed r234060: &lt;https://trac.webkit.org/changeset/234060&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1443879</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-07-20 12:16:38 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>343886</attachid>
            <date>2018-06-28 19:15:07 -0700</date>
            <delta_ts>2018-07-05 18:04:42 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>6202</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvc3RyZXNzL211bHRpLWdldC1ieS1vZmZzZXQtY3NlLW11c3QtY29uc2lk
ZXItcmVzdWx0aW5nLXR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy9zdHJlc3MvbXVsdGkt
Z2V0LWJ5LW9mZnNldC1jc2UtbXVzdC1jb25zaWRlci1yZXN1bHRpbmctdHlwZS5qcwkobm9uZXhp
c3RlbnQpCisrKyBKU1Rlc3RzL3N0cmVzcy9tdWx0aS1nZXQtYnktb2Zmc2V0LWNzZS1tdXN0LWNv
bnNpZGVyLXJlc3VsdGluZy10eXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjkgQEAK
K2Z1bmN0aW9uIGJhcih0ZXN0QXJncykgeworICAoKCkgPT4geworICAgIHRyeSB7CisgICAgICB0
ZXN0QXJncy5mdW5jLmNhbGwoMSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKCF0ZXN0
QXJncy5xdXgpIHsKKyAgICAgICAgcmV0dXJuIGUgPT0gdGVzdEFyZ3MucXV4OworICAgICAgfQor
ICAgIH0KKyAgfSkoKTsKK30KK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKyAg
WworICAgIHsKKyAgICAgIGZ1bmM6ICgpPT57fSwKKyAgICB9LAorICAgIHsKKyAgICAgIGZ1bmM6
IEludDhBcnJheS5wcm90b3R5cGUudmFsdWVzLAorICAgICAgZm9vOiAwCisgICAgfSwKKyAgICB7
CisgICAgICBmdW5jOiBJbnQ4QXJyYXkucHJvdG90eXBlLnZhbHVlcywKKyAgICAgIHF1eDogMgor
ICAgIH0sCisgICAgeworICAgICAgZnVuYzogSW50OEFycmF5LnByb3RvdHlwZS52YWx1ZXMsCisg
ICAgfSwKKyAgXS5mb3JFYWNoKGJhcik7Cit9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0NTRVBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0NTRVBoYXNlLmNwcAkocmV2aXNpb24gMjMzMzQzKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3OSw2ICsyNzks
OTkgQEAgcHJpdmF0ZToKICNlbmRpZgogfTsKIAorc3RhdGljIGlubGluZSBib29sIHNob3VsZEJs
b2NrUmVwbGFjZW1lbnQoR3JhcGgmIGdyYXBoLCBjb25zdCBMYXp5Tm9kZSYgbGF6eU5vZGUsIGNv
bnN0IExhenlOb2RlJiBsYXp5UmVwbGFjZW1lbnQpCit7CisgICAgaWYgKCFsYXp5Tm9kZS5pc05v
ZGUoKSB8fCAhbGF6eVJlcGxhY2VtZW50LmlzTm9kZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAvLyBPT1BTOiBHZXRCeU9mZnNldCBpcyBwcm9icyBicm9rZW4hCisKKyAgICBOb2Rl
KiBub2RlID0gbGF6eU5vZGUuYXNOb2RlKCk7CisgICAgTm9kZSogcmVwbGFjZW1lbnQgPSBsYXp5
UmVwbGFjZW1lbnQuYXNOb2RlKCk7CisgICAgaWYgKG5vZGUtPm9wKCkgIT0gTXVsdGlHZXRCeU9m
ZnNldCAmJiBub2RlLT5vcCgpICE9IEdldEJ5T2Zmc2V0ICYmIHJlcGxhY2VtZW50LT5vcCgpICE9
IEdldEJ5T2Zmc2V0ICYmIHJlcGxhY2VtZW50LT5vcCgpICE9IE11bHRpR2V0QnlPZmZzZXQpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobm9kZS0+b3AoKSAhPSByZXBsYWNlbWVudC0+
b3AoKSkgLy8gQ2FuJ3QgQ1NFIGJldHdlZW4gR2V0QnlPZmZzZXQgYW5kIE11bHRpR2V0QnlPZmZz
ZXQuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChub2RlLT5vcCgpICE9IE11bHRpR2V0
QnlPZmZzZXQpIHsKKyAgICAgICAgLy8gT09QUzogZmlndXJlIG91dCBHZXRCeU9mZnNldC4KKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRhdGFMb2dMbigiLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBkYXRhTG9nTG4oIk5vZGU6ICIsIG5vZGUtPmluZGV4
KCksICIgcmVwbGFjZW1lbnQ6ICIsIHJlcGxhY2VtZW50LT5pbmRleCgpKTsKKworICAgIFJFTEVB
U0VfQVNTRVJUKG5vZGUtPm9wKCkgPT0gR2V0QnlPZmZzZXQgfHwgbm9kZS0+b3AoKSA9PSBNdWx0
aUdldEJ5T2Zmc2V0KTsKKyAgICBSRUxFQVNFX0FTU0VSVChyZXBsYWNlbWVudC0+b3AoKSA9PSBH
ZXRCeU9mZnNldCB8fCByZXBsYWNlbWVudC0+b3AoKSA9PSBNdWx0aUdldEJ5T2Zmc2V0KTsKKwor
ICAgIFVuaXF1ZWRTdHJpbmdJbXBsKiB1aWQgPSBncmFwaC5pZGVudGlmaWVycygpW25vZGUtPm11
bHRpR2V0QnlPZmZzZXREYXRhKCkuaWRlbnRpZmllck51bWJlcl07CisgICAgUkVMRUFTRV9BU1NF
UlQodWlkID09IGdyYXBoLmlkZW50aWZpZXJzKClbcmVwbGFjZW1lbnQtPm11bHRpR2V0QnlPZmZz
ZXREYXRhKCkuaWRlbnRpZmllck51bWJlcl0pOworCisgICAgYXV0byB2YWx1ZUZvciA9IFsmXSAo
Tm9kZSogbm9kZSkgLT4gc3RkOjpwYWlyPFJlZ2lzdGVyZWRTdHJ1Y3R1cmVTZXQsIEFic3RyYWN0
VmFsdWU+IHsKKyAgICAgICAgQWJzdHJhY3RWYWx1ZSByZXN1bHRWYWx1ZTsKKyAgICAgICAgUmVn
aXN0ZXJlZFN0cnVjdHVyZVNldCBiYXNlU2V0OyAvLyBUaGUgZmluYWwgcmVzdWx0IGhlcmUgaXMg
dGhlIHN0cnVjdHVyZXMgdGhlIGluY29taW5nIGJhc2UgY2FuIGJlLgorCisgICAgICAgIC8vIE9P
UFM6IHdlIG5lZWQgdG8gdHJhY2sgb2YgdGhlIHN0cnVjdHVyZSBzZXQgdGhhdCBHZXRCeU9mZnNl
dCB1c2VzIHRvIGNoZWNrIHRoZSBpbmNvbWluZyBiYXNlIHZhbHVlLgorICAgICAgICAvL2lmIChu
b2RlLT5vcCgpID09IEdldEJ5T2Zmc2V0KSB7CisKKyAgICAgICAgLy99CisKKyAgICAgICAgZm9y
IChjb25zdCBNdWx0aUdldEJ5T2Zmc2V0Q2FzZSYgZ2V0Q2FzZSA6IG5vZGUtPm11bHRpR2V0QnlP
ZmZzZXREYXRhKCkuY2FzZXMpIHsKKyAgICAgICAgICAgIFJlZ2lzdGVyZWRTdHJ1Y3R1cmVTZXQg
c2V0ID0gZ2V0Q2FzZS5zZXQoKTsKKyAgICAgICAgICAgIGJhc2VTZXQubWVyZ2Uoc2V0KTsKKwor
ICAgICAgICAgICAgc3dpdGNoIChnZXRDYXNlLm1ldGhvZCgpLmtpbmQoKSkgeworICAgICAgICAg
ICAgY2FzZSBHZXRCeU9mZnNldE1ldGhvZDo6Q29uc3RhbnQ6IHsKKyAgICAgICAgICAgICAgICBB
YnN0cmFjdFZhbHVlIHRoaXNSZXN1bHQ7CisgICAgICAgICAgICAgICAgdGhpc1Jlc3VsdC5zZXQo
CisgICAgICAgICAgICAgICAgICAgIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICAqZ2V0Q2Fz
ZS5tZXRob2QoKS5jb25zdGFudCgpLAorICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVzQXJl
V2F0Y2hlZCk7CisgICAgICAgICAgICAgICAgcmVzdWx0VmFsdWUubWVyZ2UodGhpc1Jlc3VsdCk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAg
Y2FzZSBHZXRCeU9mZnNldE1ldGhvZDo6TG9hZDogeworICAgICAgICAgICAgICAgIHJlc3VsdFZh
bHVlLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICBncmFwaC5pbmZlcnJlZFZhbHVlRm9yUHJv
cGVydHkoc2V0LCB1aWQsIFN0cnVjdHVyZXNBcmVXYXRjaGVkKSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAg
ICAgICAgICByZXN1bHRWYWx1ZS5tYWtlSGVhcFRvcCgpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfSB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geyBiYXNlU2V0
LCByZXN1bHRWYWx1ZSB9OworICAgIH07CisKKyAgICBhdXRvIGZvck5vZGUgPSB2YWx1ZUZvcihu
b2RlKTsKKyAgICBhdXRvIGZvclJlcGxhY2VtZW50ID0gdmFsdWVGb3IocmVwbGFjZW1lbnQpOwor
CisgICAgLy8gUmVwbGFjZW1lbnQgbXVzdCBiZSBhIHN1YnR5cGUgb2Ygbm9kZS4gV2UgbWF5IGhh
dmUgcGVyZm9ybWVkIG9wdGltaXphdGlvbnMgYmFzZWQgb24gdGhlIHR5cGUgb2YKKyAgICAvLyBu
b2RlIGFscmVhZHksIHNvIHdlIGNhbid0IHJlcGxhY2UgaXQgd2l0aCBzb21ldGhpbmcgYnJvYWRl
ci4KKyAgICBpZiAoIWZvclJlcGxhY2VtZW50LmZpcnN0LmlzU3Vic2V0T2YoZm9yTm9kZS5maXJz
dCkpIHsKKyAgICAgICAgZGF0YUxvZ0xuKCJCbG9ja2VkIHJlcGxhY2VtZW50IGIvYyBiYXNlIHNl
dCBvZiByZXBsYWNlbWVudCBpcyBub3Qgc3Vic2V0IG9mIG5vZGUiKTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorICAgIGlmIChmb3JSZXBsYWNlbWVudC5zZWNvbmQudmFsdWUoKSAhPSBm
b3JOb2RlLnNlY29uZC52YWx1ZSgpKSB7CisgICAgICAgIGRhdGFMb2dMbigiQmxvY2tlZCByZXBs
YWNlbWVudCBiL2MgdmFsdWVzIGFyZSBub3QgZXF1YWwiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIGlmICghZm9yUmVwbGFjZW1lbnQuc2Vjb25kLmlzVHlwZShmb3JOb2RlLnNl
Y29uZC5tX3R5cGUpKSB7CisgICAgICAgIGRhdGFMb2dMbigiQmxvY2tlZCByZXBsYWNlbWVudCBi
L2MgdHlwZSBmb3IgcmVwbGFjZW1lbnQgaXMgbm90IHN1YnR5cGUgb2Ygbm9kZSIpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZvck5vZGUuc2Vjb25kLm1fc3RydWN0dXJl
LmlzRmluaXRlKCkpIHsKKyAgICAgICAgaWYgKCFmb3JSZXBsYWNlbWVudC5zZWNvbmQubV9zdHJ1
Y3R1cmUuaXNTdWJzZXRPZihmb3JOb2RlLnNlY29uZC5tX3N0cnVjdHVyZSkpIHsKKyAgICAgICAg
ICAgIGRhdGFMb2dMbigiQmxvY2tlZCByZXBsYWNlbWVudCBiL2MgcmVwbGFjZW1lbnQgcmVzdWx0
IGlzIG5vdCBzdHJ1Y3R1cmUgc3Vic2V0IG9mIG5vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogY2xhc3MgTG9j
YWxDU0VQaGFzZSA6IHB1YmxpYyBQaGFzZSB7CiBwdWJsaWM6CiAgICAgTG9jYWxDU0VQaGFzZShH
cmFwaCYgZ3JhcGgpCkBAIC01NDAsNiArNjMzLDkgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIExh
enlOb2RlIG1hdGNoID0gbV9tYXBzLmFkZEltcHVyZShsb2NhdGlvbiwgdmFsdWUpOwogICAgICAg
ICAgICAgaWYgKCFtYXRjaCkKICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAg
IGlmIChzaG91bGRCbG9ja1JlcGxhY2VtZW50KG1fZ3JhcGgsIHZhbHVlLCBtYXRjaCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAKICAgICAgICAgICAgIGlmIChtX25vZGUtPm9w
KCkgPT0gR2V0TG9jYWwpIHsKICAgICAgICAgICAgICAgICAvLyBVc3VhbGx5IHRoZSBDUFMgcmV0
aHJlYWRpbmcgcGhhc2UgZG9lcyB0aGlzLiBCdXQgaXQncyBPSyBmb3IgdXMgdG8gbWVzcyB3aXRo
CkBAIC04MzUsNyArOTMxLDcgQEAgcHVibGljOgogICAgICAgICAgICAgZGF0YUxvZygiICAgIEdv
dCBoZWFwIGxvY2F0aW9uIGRlZjogIiwgbG9jYXRpb24sICIgLT4gIiwgdmFsdWUsICJcbiIpOwog
ICAgICAgICAKICAgICAgICAgTGF6eU5vZGUgbWF0Y2ggPSBmaW5kUmVwbGFjZW1lbnQobG9jYXRp
b24pOwotICAgICAgICAKKwogICAgICAgICBpZiAoREZHQ1NFUGhhc2VJbnRlcm5hbDo6dmVyYm9z
ZSkKICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgIEdvdCBtYXRjaDogIiwgbWF0Y2gsICJcbiIp
OwogICAgICAgICAKQEAgLTg0Nyw2ICs5NDMsOSBAQCBwdWJsaWM6CiAgICAgICAgICAgICByZXR1
cm47CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoc2hvdWxkQmxvY2tSZXBsYWNlbWVudChtX2dy
YXBoLCB2YWx1ZSwgbWF0Y2gpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKICAgICAg
ICAgaWYgKHZhbHVlLmlzTm9kZSgpICYmIHZhbHVlLmFzTm9kZSgpID09IG1fbm9kZSkgewogICAg
ICAgICAgICAgaWYgKCFtYXRjaC5pc05vZGUoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIG5l
ZWQgdG8gcHJvcGVybHkgcmVjb3JkIHRoZSBjb25zdGFudCBpbiBvcmRlciB0byB1c2UgYW4gZXhp
c3Rpbmcgb25lIGlmIGFwcGxpY2FibGUuCkBAIC05MDUsMTEgKzEwMDQsMTMgQEAgcHVibGljOgog
CiBib29sIHBlcmZvcm1Mb2NhbENTRShHcmFwaCYgZ3JhcGgpCiB7CisgICAgZ3JhcGguZHVtcCgp
OwogICAgIHJldHVybiBydW5QaGFzZTxMb2NhbENTRVBoYXNlPihncmFwaCk7CiB9CiAKIGJvb2wg
cGVyZm9ybUdsb2JhbENTRShHcmFwaCYgZ3JhcGgpCiB7CisgICAgZ3JhcGguZHVtcCgpOwogICAg
IHJldHVybiBydW5QaGFzZTxHbG9iYWxDU0VQaGFzZT4oZ3JhcGgpOwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>344388</attachid>
            <date>2018-07-05 18:04:42 -0700</date>
            <delta_ts>2018-07-10 18:42:19 -0700</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>8599</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMzM1NTQpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE1IEBACisyMDE4LTA3LTA1ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIE11bHRpR2V0QnlPZmZzZXQgQ1NFIG1heSBsZWFkIHRvIHVzZSBjaG9v
c2luZyBhIE11bHRpR2V0QnlPZmZzZXQgd2l0aCBhIGxlc3Mgc3BlY2lmaWMgdHlwZQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg2ODE0CisgICAgICAg
IDxyZGFyOi8vcHJvYmxlbS8zOTcyMDAzMD4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICAqIHN0cmVzcy9tdWx0aS1nZXQtYnktb2Zmc2V0LWNzZS1tdXN0
LWNvbnNpZGVyLXJlc3VsdGluZy10eXBlLmpzOiBBZGRlZC4KKyAgICAgICAgKGJhcik6CisgICAg
ICAgIChpLmZ1bmMpOgorCiAyMDE4LTA3LTAyICBTdWtvbHNhayBTYWtzaHV3b25nICA8c3Vrb2xz
YWtAZ21haWwuY29tPgogCiAgICAgICAgIFJlZ0V4cC5leGVjIHJldHVybnMgd3JvbmcgdmFsdWUg
d2l0aCBhIGxvbmcgaW50ZWdlciBxdWFudGlmaWVyCkluZGV4OiBKU1Rlc3RzL3N0cmVzcy9tdWx0
aS1nZXQtYnktb2Zmc2V0LWNzZS1tdXN0LWNvbnNpZGVyLXJlc3VsdGluZy10eXBlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEpTVGVzdHMvc3RyZXNzL211bHRpLWdldC1ieS1vZmZzZXQtY3NlLW11c3QtY29u
c2lkZXItcmVzdWx0aW5nLXR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgSlNUZXN0cy9zdHJlc3Mv
bXVsdGktZ2V0LWJ5LW9mZnNldC1jc2UtbXVzdC1jb25zaWRlci1yZXN1bHRpbmctdHlwZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI5IEBACitmdW5jdGlvbiBiYXIodGVzdEFyZ3MpIHsK
KyAgICAoKCkgPT4geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdEFyZ3MuZnVuYy5j
YWxsKDEpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBpZiAoIXRlc3RBcmdz
LnF1eCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlID09IHRlc3RBcmdzLnF1eDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pKCk7Cit9Citmb3IgKHZhciBpID0gMDsgaSA8IDEw
MDAwMDsgaSsrKSB7CisgICAgWworICAgICAgICB7CisgICAgICAgICAgICBmdW5jOiAoKT0+e30s
CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1bmM6IEludDhBcnJheS5wcm90
b3R5cGUudmFsdWVzLAorICAgICAgICAgICAgZm9vOiAwCisgICAgICAgIH0sCisgICAgICAgIHsK
KyAgICAgICAgICAgIGZ1bmM6IEludDhBcnJheS5wcm90b3R5cGUudmFsdWVzLAorICAgICAgICAg
ICAgcXV4OiAyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1bmM6IEludDhB
cnJheS5wcm90b3R5cGUudmFsdWVzLAorICAgICAgICB9LAorICAgIF0uZm9yRWFjaChiYXIpOwor
fQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMzM1NDEpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjUg
QEAKKzIwMTgtMDctMDUgIFNhYW0gQmFyYXRpICA8c2JhcmF0aUBhcHBsZS5jb20+CisKKyAgICAg
ICAgTXVsdGlHZXRCeU9mZnNldCBDU0UgbWF5IGxlYWQgdG8gdXNlIGNob29zaW5nIGEgTXVsdGlH
ZXRCeU9mZnNldCB3aXRoIGEgbGVzcyBzcGVjaWZpYyB0eXBlCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODY4MTQKKyAgICAgICAgPHJkYXI6Ly9wcm9i
bGVtLzM5NzIwMDMwPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgaXQgc28gdGhhdCBhIHJlcGxhY2VtZW50IE11bHRpR2V0
QnlPZmZzZXQgbXVzdCBiZSBhIHN1YnR5cGUKKyAgICAgICAgb2YgdGhlIG5vZGUgaXQncyByZXBs
YWNpbmcuIFdlIGNoZWNrIHRoaXMgaW4gdHdvIHdheXM6CisgICAgICAgIC0gVGhlIHJlcGxhY2Vt
ZW50J3MgQ2hlY2tTdHJ1Y3R1cmUgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgbm9kZSdzIENoZWNr
U3RydWN0dXJlLgorICAgICAgICAtIFRoZSByZXN1bHQgdmFsdWUgb2YgcmVwbGFjZW1lbnQgbXVz
dCBiZSBhIHN1YnR5cGUgb2Ygbm9kZSdzIHJlc3VsdCB2YWx1ZS4KKyAgICAgICAgV2UgbWF5IGhh
dmUgcGVyZm9ybWVkIG9wdGltaXphdGlvbnMgYmFzZWQgb24gdGhlc2UgdGhpbmdzLCBzbyB3ZSBu
ZWVkIHRvIG1ha2Ugc3VyZQorICAgICAgICB3ZSBkb24ndCBicmVhayBwcm9ncmFtIGJlaGF2aW9y
IGJhc2VkIG9uIHRoZXNlIGFzc3VtcHRpb25zLiBGb3IgZXhhbXBsZSwgdGhlIHJlc3VsdAorICAg
ICAgICB0eXBlIG9mIG5vZGUgbWF5IGJlIG1vcmUgc3BlY2lmaWMgdGhhbiByZXBsYWNlbWVudCwg
YW5kIHdlIG1heSBoYXZlIHBlcmZvcm1lZAorICAgICAgICBvcHRpbWl6YXRpb25zIGJhc2VkIG9u
IHRoYXQgcmVzdWx0IHR5cGUuIE9yLCB3ZSBtYXkgcGVyZm9ybSBvcHRpbWl6YXRpb25zCisgICAg
ICAgIGJhc2VkIG9uIHRoZSBDaGVja1N0cnVjdHVyZSB0aGF0IG5vZGUgZW1pdHMgdGhhdCB0aGUg
cmVwbGFjZW1lbnQgZG9lcyBub3QuCisKKyAgICAgICAgKiBkZmcvREZHQ1NFUGhhc2UuY3BwOgor
ICAgICAgICAoSlNDOjpERkc6OnBlcmZvcm1Mb2NhbENTRSk6CisgICAgICAgIChKU0M6OkRGRzo6
cGVyZm9ybUdsb2JhbENTRSk6CisKIDIwMTgtMDctMDUgIFNhYW0gQmFyYXRpICA8c2JhcmF0aUBh
cHBsZS5jb20+CiAKICAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUgbWF5IGJlIGNvbGxlY3RlZCBh
cyB3ZSBjaGVja1N5bnRheCBvbiBpdApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdDU0VQaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdDU0VQaGFzZS5jcHAJKHJldmlzaW9uIDIzMzU0MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHQ1NFUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNzksNiArMjc5LDEwNiBA
QCBwcml2YXRlOgogI2VuZGlmCiB9OwogCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQmxvY2tS
ZXBsYWNlbWVudChHcmFwaCYgZ3JhcGgsIGNvbnN0IExhenlOb2RlJiBsYXp5Tm9kZSwgY29uc3Qg
TGF6eU5vZGUmIGxhenlSZXBsYWNlbWVudCkKK3sKKyAgICBpZiAoIWxhenlOb2RlLmlzTm9kZSgp
IHx8ICFsYXp5UmVwbGFjZW1lbnQuaXNOb2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIE5vZGUqIG5vZGUgPSBsYXp5Tm9kZS5hc05vZGUoKTsKKyAgICBOb2RlKiByZXBsYWNlbWVu
dCA9IGxhenlSZXBsYWNlbWVudC5hc05vZGUoKTsKKworICAgIGlmIChub2RlLT5vcCgpICE9IE11
bHRpR2V0QnlPZmZzZXQgJiYgcmVwbGFjZW1lbnQtPm9wKCkgIT0gTXVsdGlHZXRCeU9mZnNldCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG5vZGUtPm9wKCkgIT0gcmVwbGFjZW1l
bnQtPm9wKCkpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgQ1NFIGJldHdlZW4gTXVsdGlH
ZXRCeU9mZnNldCBhbmQgb3RoZXIgbm9kZSB0eXBlcy4gSXQgd291bGQgYmUgbmljZSB0byByZWxh
eCB0aGlzIGF0CisgICAgICAgIC8vIHNvbWUgcG9pbnQsIGJ1dCBpdCByZXF1aXJlcyBkb2luZyBh
bmFseXNpcyBiYXNlZCBvbiBBSSB0eXBlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmNvbWluZyBi
YXNlIHZhbHVlCisgICAgICAgIC8vIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBkdXJpbmcgQ1NFLgor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBBU1NFUlQobm9kZS0+b3AoKSA9PSBN
dWx0aUdldEJ5T2Zmc2V0ICYmIHJlcGxhY2VtZW50LT5vcCgpID09IE11bHRpR2V0QnlPZmZzZXQp
OworCisgICAgVW5pcXVlZFN0cmluZ0ltcGwqIHVpZCA9IGdyYXBoLmlkZW50aWZpZXJzKClbbm9k
ZS0+bXVsdGlHZXRCeU9mZnNldERhdGEoKS5pZGVudGlmaWVyTnVtYmVyXTsKKyAgICBBU1NFUlQo
dWlkID09IGdyYXBoLmlkZW50aWZpZXJzKClbcmVwbGFjZW1lbnQtPm11bHRpR2V0QnlPZmZzZXRE
YXRhKCkuaWRlbnRpZmllck51bWJlcl0pOworCisgICAgYXV0byB2YWx1ZUZvciA9IFsmXSAoTm9k
ZSogbm9kZSkgLT4gc3RkOjpwYWlyPFJlZ2lzdGVyZWRTdHJ1Y3R1cmVTZXQsIEFic3RyYWN0VmFs
dWU+IHsKKyAgICAgICAgQWJzdHJhY3RWYWx1ZSByZXN1bHRWYWx1ZTsgLy8gVGhpcyBpcyB0aGUg
QWJzdHJhY3RWYWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGlzIG5vZGUuCisgICAg
ICAgIFJlZ2lzdGVyZWRTdHJ1Y3R1cmVTZXQgYmFzZVNldDsgLy8gVGhpcyBpcyB0aGUgc3RydWN0
dXJlIHNldCB0aGF0IHRoaXMgbm9kZSBkb2VzIHRoZSBtb3JhbCBlcXVpdmFsZW50IG9mIGEgQ2hl
Y2tTdHJ1Y3R1cmUgb24uCisKKyAgICAgICAgZm9yIChjb25zdCBNdWx0aUdldEJ5T2Zmc2V0Q2Fz
ZSYgZ2V0Q2FzZSA6IG5vZGUtPm11bHRpR2V0QnlPZmZzZXREYXRhKCkuY2FzZXMpIHsKKyAgICAg
ICAgICAgIFJlZ2lzdGVyZWRTdHJ1Y3R1cmVTZXQgc2V0ID0gZ2V0Q2FzZS5zZXQoKTsKKyAgICAg
ICAgICAgIGJhc2VTZXQubWVyZ2Uoc2V0KTsKKworICAgICAgICAgICAgc3dpdGNoIChnZXRDYXNl
Lm1ldGhvZCgpLmtpbmQoKSkgeworICAgICAgICAgICAgY2FzZSBHZXRCeU9mZnNldE1ldGhvZDo6
Q29uc3RhbnQ6IHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFZhbHVlIHRoaXNSZXN1bHQ7Cisg
ICAgICAgICAgICAgICAgdGhpc1Jlc3VsdC5zZXQoCisgICAgICAgICAgICAgICAgICAgIGdyYXBo
LAorICAgICAgICAgICAgICAgICAgICAqZ2V0Q2FzZS5tZXRob2QoKS5jb25zdGFudCgpLAorICAg
ICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVzQXJlV2F0Y2hlZCk7CisgICAgICAgICAgICAgICAg
cmVzdWx0VmFsdWUubWVyZ2UodGhpc1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR2V0QnlPZmZzZXRNZXRob2Q6OkxvYWQ6
IHsKKyAgICAgICAgICAgICAgICByZXN1bHRWYWx1ZS5tZXJnZSgKKyAgICAgICAgICAgICAgICAg
ICAgZ3JhcGguaW5mZXJyZWRWYWx1ZUZvclByb3BlcnR5KHNldCwgdWlkLCBTdHJ1Y3R1cmVzQXJl
V2F0Y2hlZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgcmVzdWx0VmFsdWUubWFrZUhlYXBU
b3AoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gfQorICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHsgYmFzZVNldCwgcmVzdWx0VmFsdWUgfTsKKyAgICB9OworCisg
ICAgYXV0byBmb3JOb2RlID0gdmFsdWVGb3Iobm9kZSk7CisgICAgYXV0byBmb3JSZXBsYWNlbWVu
dCA9IHZhbHVlRm9yKHJlcGxhY2VtZW50KTsKKworICAgIC8vIFJlcGxhY2VtZW50IG11c3QgYmUg
YSBzdWJ0eXBlIG9mIG5vZGUuIFdlIGNoZWNrIHRoaXMgaW4gdHdvIHdheXM6CisgICAgLy8gLSBU
aGUgcmVwbGFjZW1lbnQncyBDaGVja1N0cnVjdHVyZSBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBu
b2RlJ3MgQ2hlY2tTdHJ1Y3R1cmUuCisgICAgLy8gLSBUaGUgcmVzdWx0IHZhbHVlIG9mIHJlcGxh
Y2VtZW50IG11c3QgYmUgYSBzdWJ0eXBlIG9mIG5vZGUncyByZXN1bHQgdmFsdWUuCisgICAgLy8g
V2UgbWF5IGhhdmUgcGVyZm9ybWVkIG9wdGltaXphdGlvbnMgYmFzZWQgb24gdGhlc2UgdGhpbmdz
LCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorICAgIC8vIHdlIGRvbid0IGJyZWFrIHByb2dyYW0g
YmVoYXZpb3IgYmFzZWQgb24gdGhlc2UgYXNzdW1wdGlvbnMuIEZvciBleGFtcGxlLCB0aGUgcmVz
dWx0CisgICAgLy8gdHlwZSBvZiBub2RlIG1heSBiZSBtb3JlIHNwZWNpZmljIHRoYW4gcmVwbGFj
ZW1lbnQsIGFuZCB3ZSBtYXkgaGF2ZSBwZXJmb3JtZWQKKyAgICAvLyBvcHRpbWl6YXRpb25zIGJh
c2VkIG9uIHRoYXQgcmVzdWx0IHR5cGUuCisKKyAgICBpZiAoIWZvclJlcGxhY2VtZW50LmZpcnN0
LmlzU3Vic2V0T2YoZm9yTm9kZS5maXJzdCkpIHsKKyAgICAgICAgaWYgKERGR0NTRVBoYXNlSW50
ZXJuYWw6OnZlcmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nTG4oIkJsb2NrZWQgcmVwbGFjZW1l
bnQgYmVjYXVzZSBiYXNlIHNldCBvZiByZXBsYWNlbWVudCBpcyBub3Qgc3Vic2V0IG9mIGJhc2Ug
c2V0IG9mIG5vZGUiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChmb3JS
ZXBsYWNlbWVudC5zZWNvbmQudmFsdWUoKSAhPSBmb3JOb2RlLnNlY29uZC52YWx1ZSgpKSB7Cisg
ICAgICAgIGlmIChERkdDU0VQaGFzZUludGVybmFsOjp2ZXJib3NlKQorICAgICAgICAgICAgZGF0
YUxvZ0xuKCJCbG9ja2VkIHJlcGxhY2VtZW50IGJlY2F1c2UgdmFsdWVzIGFyZSBub3QgZXF1YWwi
KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghZm9yUmVwbGFjZW1lbnQu
c2Vjb25kLmlzVHlwZShmb3JOb2RlLnNlY29uZC5tX3R5cGUpKSB7CisgICAgICAgIGlmIChERkdD
U0VQaGFzZUludGVybmFsOjp2ZXJib3NlKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCJCbG9ja2Vk
IHJlcGxhY2VtZW50IGJlY2F1c2UgdHlwZSBmb3IgcmVwbGFjZW1lbnQgaXMgbm90IHN1YnR5cGUg
b2Ygbm9kZSIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZvck5vZGUu
c2Vjb25kLm1fc3RydWN0dXJlLmlzRmluaXRlKCkpIHsKKyAgICAgICAgaWYgKCFmb3JSZXBsYWNl
bWVudC5zZWNvbmQubV9zdHJ1Y3R1cmUuaXNTdWJzZXRPZihmb3JOb2RlLnNlY29uZC5tX3N0cnVj
dHVyZSkpIHsKKyAgICAgICAgICAgIGlmIChERkdDU0VQaGFzZUludGVybmFsOjp2ZXJib3NlKQor
ICAgICAgICAgICAgICAgIGRhdGFMb2dMbigiQmxvY2tlZCByZXBsYWNlbWVudCBiZWNhdXNlIHJl
cGxhY2VtZW50IHJlc3VsdCBpcyBub3Qgc3RydWN0dXJlIHN1YnNldCBvZiBub2RlIik7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZm9yUmVwbGFj
ZW1lbnQuc2Vjb25kLm1fYXJyYXlNb2RlcyAhPSBmb3JOb2RlLnNlY29uZC5tX2FycmF5TW9kZXMp
IHsKKyAgICAgICAgaWYgKERGR0NTRVBoYXNlSW50ZXJuYWw6OnZlcmJvc2UpCisgICAgICAgICAg
ICBkYXRhTG9nTG4oIkJsb2NrZWQgcmVwbGFjZW1lbnQgYmVjYXVzZSBhcnJheSBtb2RlcyBhcmUg
ZGlmZmVyZW50Iik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFdlJ3Jl
IGdvb2QgdG8gZ28sIHdlIGNhbiBDU0UgdGhlc2UgdHdvIE11bHRpR2V0QnlPZmZzZXQgbm9kZXMh
CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBjbGFzcyBMb2NhbENTRVBoYXNlIDogcHVibGljIFBo
YXNlIHsKIHB1YmxpYzoKICAgICBMb2NhbENTRVBoYXNlKEdyYXBoJiBncmFwaCkKQEAgLTU0MCw2
ICs2NDAsOSBAQCBwcml2YXRlOgogICAgICAgICAgICAgTGF6eU5vZGUgbWF0Y2ggPSBtX21hcHMu
YWRkSW1wdXJlKGxvY2F0aW9uLCB2YWx1ZSk7CiAgICAgICAgICAgICBpZiAoIW1hdGNoKQogICAg
ICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKHNob3VsZEJsb2NrUmVwbGFj
ZW1lbnQobV9ncmFwaCwgdmFsdWUsIG1hdGNoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgIAogICAgICAgICAgICAgaWYgKG1fbm9kZS0+b3AoKSA9PSBHZXRMb2NhbCkgewogICAg
ICAgICAgICAgICAgIC8vIFVzdWFsbHkgdGhlIENQUyByZXRocmVhZGluZyBwaGFzZSBkb2VzIHRo
aXMuIEJ1dCBpdCdzIE9LIGZvciB1cyB0byBtZXNzIHdpdGgKQEAgLTg0Nyw2ICs5NTAsOSBAQCBw
dWJsaWM6CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoc2hv
dWxkQmxvY2tSZXBsYWNlbWVudChtX2dyYXBoLCB2YWx1ZSwgbWF0Y2gpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAKICAgICAgICAgaWYgKHZhbHVlLmlzTm9kZSgpICYmIHZhbHVlLmFz
Tm9kZSgpID09IG1fbm9kZSkgewogICAgICAgICAgICAgaWYgKCFtYXRjaC5pc05vZGUoKSkgewog
ICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcHJvcGVybHkgcmVjb3JkIHRoZSBjb25zdGFu
dCBpbiBvcmRlciB0byB1c2UgYW4gZXhpc3Rpbmcgb25lIGlmIGFwcGxpY2FibGUuCg==
</data>
<flag name="review"
          id="362443"
          type_id="1"
          status="-"
          setter="saam"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>344744</attachid>
            <date>2018-07-10 18:42:19 -0700</date>
            <delta_ts>2018-07-20 12:16:36 -0700</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>11097</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMzM3MTgpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE1IEBACisyMDE4LTA3LTEwICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIENvbXBhcmVFcSBzaG91bGQgYmUgdXNpbmcgS25vd25PdGhlclVzZSBp
bnN0ZWFkIG9mIE90aGVyVXNlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xODY4MTQKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzM5NzIwMDMwPgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogc3RyZXNzL2Nv
bXBhcmUtZXEtc2hvdWxkLXVzZS1rbm93bi1vdGhlci11c2UuanM6IEFkZGVkLgorICAgICAgICAo
YmFyKToKKyAgICAgICAgKGkuZnVuYyk6CisKIDIwMTgtMDctMTAgIEtlaXRoIE1pbGxlciAgPGtl
aXRoX21pbGxlckBhcHBsZS5jb20+CiAKICAgICAgICAgaGFzT3duUHJvcGVydHkgcmV0dXJucyB0
cnVlIGZvciBvdXQgb2YgYm91bmRzIHByb3BlcnR5IGluZGV4IG9uIFR5cGVkQXJyYXkKSW5kZXg6
IEpTVGVzdHMvc3RyZXNzL2NvbXBhcmUtZXEtc2hvdWxkLXVzZS1rbm93bi1vdGhlci11c2UuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSlNUZXN0cy9zdHJlc3MvY29tcGFyZS1lcS1zaG91bGQtdXNlLWtub3du
LW90aGVyLXVzZS5qcwkobm9uZXhpc3RlbnQpCisrKyBKU1Rlc3RzL3N0cmVzcy9jb21wYXJlLWVx
LXNob3VsZC11c2Uta25vd24tb3RoZXItdXNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MjkgQEAKK2Z1bmN0aW9uIGJhcih0ZXN0QXJncykgeworICAgICgoKSA9PiB7CisgICAgICAgIHRy
eSB7CisgICAgICAgICAgICB0ZXN0QXJncy5mdW5jLmNhbGwoMSk7CisgICAgICAgIH0gY2F0Y2gg
KGUpIHsKKyAgICAgICAgICAgIGlmICghdGVzdEFyZ3MucXV4KSB7CisgICAgICAgICAgICAgICAg
cmV0dXJuIGUgPT0gdGVzdEFyZ3MucXV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fSkoKTsKK30KK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKyAgICBbCisgICAg
ICAgIHsKKyAgICAgICAgICAgIGZ1bmM6ICgpPT57fSwKKyAgICAgICAgfSwKKyAgICAgICAgewor
ICAgICAgICAgICAgZnVuYzogSW50OEFycmF5LnByb3RvdHlwZS52YWx1ZXMsCisgICAgICAgICAg
ICBmb286IDAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgZnVuYzogSW50OEFy
cmF5LnByb3RvdHlwZS52YWx1ZXMsCisgICAgICAgICAgICBxdXg6IDIKKyAgICAgICAgfSwKKyAg
ICAgICAgeworICAgICAgICAgICAgZnVuYzogSW50OEFycmF5LnByb3RvdHlwZS52YWx1ZXMsCisg
ICAgICAgIH0sCisgICAgXS5mb3JFYWNoKGJhcik7Cit9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFu
Z2VMb2cJKHJldmlzaW9uIDIzMzY5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw0NSBAQAorMjAxOC0wNy0xMCAgU2FhbSBCYXJh
dGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAgICBDb21wYXJlRXEgc2hvdWxkIGJlIHVz
aW5nIEtub3duT3RoZXJVc2UgaW5zdGVhZCBvZiBPdGhlclVzZQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg2ODE0CisgICAgICAgIDxyZGFyOi8vcHJv
YmxlbS8zOTcyMDAzMD4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBDb21wYXJlRXEgaW4gZml4dXAgcGhhc2Ugd2FzIGRvaW5nIHRoaXM6CisgICAgICAg
IGluc2VydENoZWNrKGNoaWxkLCBPdGhlclVzZSkKKyAgICAgICAgc2V0VXNlS2luZChjaGlsZCwg
T3RoZXJVc2UpCisgICAgICAgIEFuZCBpbiB0aGUgREZHL0ZUTCBiYWNrZW5kLCBpdCB3b3VsZCBu
b3QgZW1pdCBhIGNoZWNrIGZvciBPdGhlclVzZS4gVGhpcyBjb3VsZAorICAgICAgICBsZWFkIHRv
IGVkZ2UgdmVyaWZpY2F0aW9uIGNyYXNoaW5nIGJlY2F1c2UgYSBwaGFzZSBtYXkgb3B0aW1pemUg
dGhlIGNoZWNrIG91dAorICAgICAgICBieSByZW1vdmluZyB0aGUgbm9kZS4gSG93ZXZlciwgQUkg
bWF5IG5vdCBiZSBwcml2eSB0byB0aGF0IG9wdGltaXphdGlvbiwgYW5kCisgICAgICAgIEFJIG1h
eSB0aGluayB0aGUgaW5jb21pbmcgdmFsdWUgbWF5IG5vdCBiZSBPdGhlci4gQUkgaXMgZXhwZWN0
aW5nIHRoZSBERkcvRlRMCisgICAgICAgIGJhY2tlbmQgdG8gYWN0dWFsbHkgZW1pdCBhIGNoZWNr
IGhlcmUsIGJ1dCBpdCBkb2VzIG5vdC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgZXhhY3QgcGF0
dGVybiBpcyB3aHkgd2UgaGF2ZSBLbm93blhZWiB1c2Uga2luZHMuIFRoaXMgcGF0Y2ggaW50cm9k
dWNlcworICAgICAgICBLbm93bk90aGVyVXNlIGFuZCBjaGFuZ2VzIHRoZSBhYm92ZSBwYXR0ZXJu
IHRvIGJlOgorICAgICAgICBpbnNlcnRDaGVjayhjaGlsZCwgT3RoZXJVc2UpCisgICAgICAgIHNl
dFVzZUtpbmQoY2hpbGQsIEtub3duT3RoZXJVc2UpCisKKyAgICAgICAgKiBkZmcvREZHRml4dXBQ
aGFzZS5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6Rml4dXBQaGFzZTo6Zml4dXBOb2RlKToKKyAg
ICAgICAgKiBkZmcvREZHU2FmZVRvRXhlY3V0ZS5oOgorICAgICAgICAoSlNDOjpERkc6OlNhZmVU
b0V4ZWN1dGVFZGdlOjpvcGVyYXRvcigpKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVK
SVQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpzcGVjdWxhdGUpOgor
ICAgICAgICAqIGRmZy9ERkdVc2VLaW5kLmNwcDoKKyAgICAgICAgKFdURjo6cHJpbnRJbnRlcm5h
bCk6CisgICAgICAgICogZGZnL0RGR1VzZUtpbmQuaDoKKyAgICAgICAgKEpTQzo6REZHOjp0eXBl
RmlsdGVyRm9yKToKKyAgICAgICAgKEpTQzo6REZHOjpzaG91bGROb3RIYXZlVHlwZUNoZWNrKToK
KyAgICAgICAgKEpTQzo6REZHOjpjaGVja01heUNyYXNoSWZJbnB1dElzRW1wdHkpOgorICAgICAg
ICAqIGRmZy9ERkdXYXRjaHBvaW50Q29sbGVjdGlvblBoYXNlLmNwcDoKKyAgICAgICAgKEpTQzo6
REZHOjpXYXRjaHBvaW50Q29sbGVjdGlvblBoYXNlOjpoYW5kbGUpOgorICAgICAgICAqIGZ0bC9G
VExDYXBhYmlsaXRpZXMuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OmNhbkNvbXBpbGUpOgorICAg
ICAgICAqIGZ0bC9GVExMb3dlckRGR1RvQjMuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6
TG93ZXJERkdUb0IzOjpjb21waWxlQ29tcGFyZUVxKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6
Okxvd2VyREZHVG9CMzo6c3BlY3VsYXRlKToKKwogMjAxOC0wNy0xMCAgTWFyayBMYW0gIDxtYXJr
LmxhbUBhcHBsZS5jb20+CiAKICAgICAgICAgWzMyLWJpdCBKU0MgdGVzdHNdIEFTU0VSVElPTiBG
QUlMRUQ6ICFidXR0ZXJmbHktPnByb3BlcnR5U3RvcmFnZSgpWy1JIC0gMV0uZ2V0KCkgdW5kZXIg
SlNDOjpPYmplY3RJbml0aWFsaXphdGlvblNjb3BlOjp2ZXJpZnlQcm9wZXJ0aWVzQXJlSW5pdGlh
bGl6ZWQuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ZpeHVwUGhhc2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHRml4dXBQaGFzZS5j
cHAJKHJldmlzaW9uIDIzMzY5OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHRml4
dXBQaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU4NywyMSArNTg3LDIxIEBAIHByaXZhdGU6
CiAgICAgICAgICAgICAvLyBJZiBlaXRoZXIgY2hpbGQgY2FuIGJlIHByb3ZlZCB0byBiZSBOdWxs
IG9yIFVuZGVmaW5lZCwgY29tcGFyaW5nIHRoZW0gaXMgZ3JlYXRseSBzaW1wbGlmaWVkLgogICAg
ICAgICAgICAgYm9vbCBvbmVBcmd1bWVudElzVXNlZEFzU3BlY090aGVyID0gZmFsc2U7CiAgICAg
ICAgICAgICBpZiAobm9kZS0+Y2hpbGQxKCktPmlzVW5kZWZpbmVkT3JOdWxsQ29uc3RhbnQoKSkg
ewotICAgICAgICAgICAgICAgIGZpeEVkZ2U8T3RoZXJVc2U+KG5vZGUtPmNoaWxkMSgpKTsKKyAg
ICAgICAgICAgICAgICBmaXhFZGdlPEtub3duT3RoZXJVc2U+KG5vZGUtPmNoaWxkMSgpKTsKICAg
ICAgICAgICAgICAgICBvbmVBcmd1bWVudElzVXNlZEFzU3BlY090aGVyID0gdHJ1ZTsKICAgICAg
ICAgICAgIH0gZWxzZSBpZiAobm9kZS0+Y2hpbGQxKCktPnNob3VsZFNwZWN1bGF0ZU90aGVyKCkp
IHsKICAgICAgICAgICAgICAgICBtX2luc2VydGlvblNldC5pbnNlcnROb2RlKG1faW5kZXhJbkJs
b2NrLCBTcGVjTm9uZSwgQ2hlY2ssIG5vZGUtPm9yaWdpbiwKICAgICAgICAgICAgICAgICAgICAg
RWRnZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIE90aGVyVXNlKSk7Ci0gICAgICAgICAgICAgICAg
Zml4RWRnZTxPdGhlclVzZT4obm9kZS0+Y2hpbGQxKCkpOworICAgICAgICAgICAgICAgIGZpeEVk
Z2U8S25vd25PdGhlclVzZT4obm9kZS0+Y2hpbGQxKCkpOwogICAgICAgICAgICAgICAgIG9uZUFy
Z3VtZW50SXNVc2VkQXNTcGVjT3RoZXIgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAg
ICAgaWYgKG5vZGUtPmNoaWxkMigpLT5pc1VuZGVmaW5lZE9yTnVsbENvbnN0YW50KCkpIHsKLSAg
ICAgICAgICAgICAgICBmaXhFZGdlPE90aGVyVXNlPihub2RlLT5jaGlsZDIoKSk7CisgICAgICAg
ICAgICAgICAgZml4RWRnZTxLbm93bk90aGVyVXNlPihub2RlLT5jaGlsZDIoKSk7CiAgICAgICAg
ICAgICAgICAgb25lQXJndW1lbnRJc1VzZWRBc1NwZWNPdGhlciA9IHRydWU7CiAgICAgICAgICAg
ICB9IGVsc2UgaWYgKG5vZGUtPmNoaWxkMigpLT5zaG91bGRTcGVjdWxhdGVPdGhlcigpKSB7CiAg
ICAgICAgICAgICAgICAgbV9pbnNlcnRpb25TZXQuaW5zZXJ0Tm9kZShtX2luZGV4SW5CbG9jaywg
U3BlY05vbmUsIENoZWNrLCBub2RlLT5vcmlnaW4sCiAgICAgICAgICAgICAgICAgICAgIEVkZ2Uo
bm9kZS0+Y2hpbGQyKCkubm9kZSgpLCBPdGhlclVzZSkpOwotICAgICAgICAgICAgICAgIGZpeEVk
Z2U8T3RoZXJVc2U+KG5vZGUtPmNoaWxkMigpKTsKKyAgICAgICAgICAgICAgICBmaXhFZGdlPEtu
b3duT3RoZXJVc2U+KG5vZGUtPmNoaWxkMigpKTsKICAgICAgICAgICAgICAgICBvbmVBcmd1bWVu
dElzVXNlZEFzU3BlY090aGVyID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlm
IChvbmVBcmd1bWVudElzVXNlZEFzU3BlY090aGVyKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1NhZmVUb0V4ZWN1dGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1NhZmVUb0V4ZWN1dGUuaAkocmV2aXNpb24gMjMzNjk4KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTYWZlVG9FeGVjdXRlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEwNiw2ICsxMDYsMTEgQEAgcHVibGljOgogICAgICAgICAgICAgaWYgKG1fc3RhdGUuZm9y
Tm9kZShlZGdlKS5tX3R5cGUgJiB+KFNwZWNIZWFwVG9wICYgflNwZWNPYmplY3QpKQogICAgICAg
ICAgICAgICAgIG1fcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgY2FzZSBLbm93bk90aGVyVXNlOgorICAgICAgICAgICAgaWYgKG1fc3RhdGUuZm9yTm9kZShl
ZGdlKS5tX3R5cGUgJiB+U3BlY090aGVyKQorICAgICAgICAgICAgICAgIG1fcmVzdWx0ID0gZmFs
c2U7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAKICAgICAgICAgY2FzZSBMYXN0
VXNlS2luZDoKICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAko
cmV2aXNpb24gMjMzNjk4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxh
dGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwMjkwLDYgKzEwMjkwLDkgQEAgdm9pZCBT
cGVjdWxhdGl2ZUpJVDo6c3BlY3VsYXRlKE5vZGUqLCBFZAogICAgIGNhc2UgTm90Q2VsbFVzZToK
ICAgICAgICAgc3BlY3VsYXRlTm90Q2VsbChlZGdlKTsKICAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBLbm93bk90aGVyVXNlOgorICAgICAgICBBU1NFUlQoIW5lZWRzVHlwZUNoZWNrKGVkZ2UsIFNw
ZWNPdGhlcikpOworICAgICAgICBicmVhazsKICAgICBjYXNlIE90aGVyVXNlOgogICAgICAgICBz
cGVjdWxhdGVPdGhlcihlZGdlKTsKICAgICAgICAgYnJlYWs7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1VzZUtpbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHVXNlS2luZC5jcHAJKHJldmlzaW9uIDIzMzY5OCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHVXNlS2luZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1NCw2
ICsxNTQsOSBAQCB2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVXNlCiAgICAg
Y2FzZSBOb3RDZWxsVXNlOgogICAgICAgICBvdXQucHJpbnQoIk5vdENlbGwiKTsKICAgICAgICAg
cmV0dXJuOworICAgIGNhc2UgS25vd25PdGhlclVzZToKKyAgICAgICAgb3V0LnByaW50KCJLbm93
bk90aGVyIik7CisgICAgICAgIHJldHVybjsKICAgICBjYXNlIE90aGVyVXNlOgogICAgICAgICBv
dXQucHJpbnQoIk90aGVyIik7CiAgICAgICAgIHJldHVybjsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHVXNlS2luZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHVXNlS2luZC5oCShyZXZpc2lvbiAyMzM2OTgpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1VzZUtpbmQuaAkod29ya2luZyBjb3B5KQpAQCAtNzUsNiArNzUsNyBA
QCBlbnVtIFVzZUtpbmQgewogICAgIE5vdFN0cmluZ1ZhclVzZSwKICAgICBOb3RTeW1ib2xVc2Us
CiAgICAgTm90Q2VsbFVzZSwKKyAgICBLbm93bk90aGVyVXNlLAogICAgIE90aGVyVXNlLAogICAg
IE1pc2NVc2UsCiAKQEAgLTE2OSw2ICsxNzAsNyBAQCBpbmxpbmUgU3BlY3VsYXRlZFR5cGUgdHlw
ZUZpbHRlckZvcihVc2VLCiAgICAgICAgIHJldHVybiB+U3BlY1N5bWJvbDsKICAgICBjYXNlIE5v
dENlbGxVc2U6CiAgICAgICAgIHJldHVybiB+U3BlY0NlbGxDaGVjazsKKyAgICBjYXNlIEtub3du
T3RoZXJVc2U6CiAgICAgY2FzZSBPdGhlclVzZToKICAgICAgICAgcmV0dXJuIFNwZWNPdGhlcjsK
ICAgICBjYXNlIE1pc2NVc2U6CkBAIC0xODgsNiArMTkwLDcgQEAgaW5saW5lIGJvb2wgc2hvdWxk
Tm90SGF2ZVR5cGVDaGVjayhVc2VLaQogICAgIGNhc2UgS25vd25TdHJpbmdVc2U6CiAgICAgY2Fz
ZSBLbm93blByaW1pdGl2ZVVzZToKICAgICBjYXNlIEtub3duQm9vbGVhblVzZToKKyAgICBjYXNl
IEtub3duT3RoZXJVc2U6CiAgICAgY2FzZSBJbnQ1MlJlcFVzZToKICAgICBjYXNlIERvdWJsZVJl
cFVzZToKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMTMsNiArMzE2LDcgQEAgaW5saW5lIGJv
b2wgY2hlY2tNYXlDcmFzaElmSW5wdXRJc0VtcHR5KAogICAgIGNhc2UgQ2VsbFVzZToKICAgICBj
YXNlIEtub3duQ2VsbFVzZToKICAgICBjYXNlIENlbGxPck90aGVyVXNlOgorICAgIGNhc2UgS25v
d25PdGhlclVzZToKICAgICBjYXNlIE90aGVyVXNlOgogICAgIGNhc2UgTWlzY1VzZToKICAgICBj
YXNlIE5vdENlbGxVc2U6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1dhdGNo
cG9pbnRDb2xsZWN0aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHV2F0Y2hwb2ludENvbGxlY3Rpb25QaGFzZS5jcHAJKHJldmlzaW9uIDIzMzY5
OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHV2F0Y2hwb2ludENvbGxlY3Rpb25Q
aGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDcgKzgxLDcgQEAgcHJpdmF0ZToKICAgICAg
ICAgICAgIGlmIChtX25vZGUtPmlzQmluYXJ5VXNlS2luZChPYmplY3RVc2UpCiAgICAgICAgICAg
ICAgICAgfHwgKG1fbm9kZS0+Y2hpbGQxKCkudXNlS2luZCgpID09IE9iamVjdFVzZSAmJiBtX25v
ZGUtPmNoaWxkMigpLnVzZUtpbmQoKSA9PSBPYmplY3RPck90aGVyVXNlKQogICAgICAgICAgICAg
ICAgIHx8IChtX25vZGUtPmNoaWxkMSgpLnVzZUtpbmQoKSA9PSBPYmplY3RPck90aGVyVXNlICYm
IG1fbm9kZS0+Y2hpbGQyKCkudXNlS2luZCgpID09IE9iamVjdFVzZSkKLSAgICAgICAgICAgICAg
ICB8fCAobV9ub2RlLT5jaGlsZDEoKS51c2VLaW5kKCkgPT0gT3RoZXJVc2UgfHwgbV9ub2RlLT5j
aGlsZDIoKS51c2VLaW5kKCkgPT0gT3RoZXJVc2UpKQorICAgICAgICAgICAgICAgIHx8IChtX25v
ZGUtPmNoaWxkMSgpLnVzZUtpbmQoKSA9PSBLbm93bk90aGVyVXNlIHx8IG1fbm9kZS0+Y2hpbGQy
KCkudXNlS2luZCgpID09IEtub3duT3RoZXJVc2UpKQogICAgICAgICAgICAgICAgIGhhbmRsZU1h
c3F1ZXJhZGVzQXNVbmRlZmluZWQoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTENhcGFiaWxpdGllcy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExDYXBhYmlsaXRpZXMuY3Bw
CShyZXZpc2lvbiAyMzM2OTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTENhcGFi
aWxpdGllcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0Nyw2ICs0NDcsNyBAQCBDYXBhYmlsaXR5
TGV2ZWwgY2FuQ29tcGlsZShHcmFwaCYgZ3JhcGgpCiAgICAgICAgICAgICAgICAgY2FzZSBEZXJp
dmVkQXJyYXlVc2U6CiAgICAgICAgICAgICAgICAgY2FzZSBOb3RDZWxsVXNlOgogICAgICAgICAg
ICAgICAgIGNhc2UgT3RoZXJVc2U6CisgICAgICAgICAgICAgICAgY2FzZSBLbm93bk90aGVyVXNl
OgogICAgICAgICAgICAgICAgIGNhc2UgTWlzY1VzZToKICAgICAgICAgICAgICAgICBjYXNlIFN0
cmluZ0lkZW50VXNlOgogICAgICAgICAgICAgICAgIGNhc2UgTm90U3RyaW5nVmFyVXNlOgpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvQjMuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMTG93ZXJERkdUb0IzLmNwcAkocmV2
aXNpb24gMjMzNjk4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1Rv
QjMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02ODYwLDEzICs2ODYwLDEzIEBAIHByaXZhdGU6CiAg
ICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobV9ub2RlLT5jaGls
ZDEoKS51c2VLaW5kKCkgPT0gT3RoZXJVc2UpIHsKKyAgICAgICAgaWYgKG1fbm9kZS0+Y2hpbGQx
KCkudXNlS2luZCgpID09IEtub3duT3RoZXJVc2UpIHsKICAgICAgICAgICAgIEFTU0VSVCghbV9p
bnRlcnByZXRlci5uZWVkc1R5cGVDaGVjayhtX25vZGUtPmNoaWxkMSgpLCBTcGVjT3RoZXIpKTsK
ICAgICAgICAgICAgIHNldEJvb2xlYW4oZXF1YWxOdWxsT3JVbmRlZmluZWQobV9ub2RlLT5jaGls
ZDIoKSwgQWxsQ2VsbHNBcmVGYWxzZSwgRXF1YWxOdWxsT3JVbmRlZmluZWQsIE1hbnVhbE9wZXJh
bmRTcGVjdWxhdGlvbikpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAg
ICAgaWYgKG1fbm9kZS0+Y2hpbGQyKCkudXNlS2luZCgpID09IE90aGVyVXNlKSB7CisgICAgICAg
IGlmIChtX25vZGUtPmNoaWxkMigpLnVzZUtpbmQoKSA9PSBLbm93bk90aGVyVXNlKSB7CiAgICAg
ICAgICAgICBBU1NFUlQoIW1faW50ZXJwcmV0ZXIubmVlZHNUeXBlQ2hlY2sobV9ub2RlLT5jaGls
ZDIoKSwgU3BlY090aGVyKSk7CiAgICAgICAgICAgICBzZXRCb29sZWFuKGVxdWFsTnVsbE9yVW5k
ZWZpbmVkKG1fbm9kZS0+Y2hpbGQxKCksIEFsbENlbGxzQXJlRmFsc2UsIEVxdWFsTnVsbE9yVW5k
ZWZpbmVkLCBNYW51YWxPcGVyYW5kU3BlY3VsYXRpb24pKTsKICAgICAgICAgICAgIHJldHVybjsK
QEAgLTE0ODM5LDYgKzE0ODM5LDcgQEAgcHJpdmF0ZToKICAgICAgICAgY2FzZSBLbm93bkludDMy
VXNlOgogICAgICAgICBjYXNlIEtub3duU3RyaW5nVXNlOgogICAgICAgICBjYXNlIEtub3duUHJp
bWl0aXZlVXNlOgorICAgICAgICBjYXNlIEtub3duT3RoZXJVc2U6CiAgICAgICAgIGNhc2UgRG91
YmxlUmVwVXNlOgogICAgICAgICBjYXNlIEludDUyUmVwVXNlOgogICAgICAgICAgICAgQVNTRVJU
KCFtX2ludGVycHJldGVyLm5lZWRzVHlwZUNoZWNrKGVkZ2UpKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>