<?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>160800</bug_id>
          
          <creation_ts>2016-08-12 00:11:31 -0700</creation_ts>
          <short_desc>Add a helper function for enumerating elements in an iterable object</short_desc>
          <delta_ts>2016-08-12 19:03:35 -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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>160801</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>barraclough</cc>
    
    <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1219552</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 00:11:31 -0700</bug_when>
    <thetext>I want to improve the support for sequence&lt;T&gt; in WebIDL (http://heycam.github.io/webidl/#create-sequence-from-iterable),
and that requires me to enumerate items in an iterable object in WebCore.

I could manually call iteratorStep, iterhatorClose, but that seemed rather error prone for WebCore hackers.
So I&apos;m thinking of adding a new helper class that nicely wraps it around.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219553</commentid>
    <comment_count>1</comment_count>
      <attachid>285900</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 00:12:09 -0700</bug_when>
    <thetext>Created attachment 285900
Work in progress

Here&apos;s my working progress patch. Do you think a class like this is useful / desirable?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219628</commentid>
    <comment_count>2</comment_count>
      <attachid>285900</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-08-12 11:48:27 -0700</bug_when>
    <thetext>Comment on attachment 285900
Work in progress

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

&gt; Source/JavaScriptCore/runtime/SetConstructor.cpp:59
&gt; +    JSIteratorEnumerator(ExecState&amp; state, JSValue iterable)

I think ExecState&amp; instead of ExecState* is an anti pattern in JSC

&gt; Source/JavaScriptCore/runtime/SetConstructor.cpp:140
&gt;          if (exec-&gt;hadException())
&gt;              return JSValue::encode(jsUndefined());

Is it intentional to call iteratorClose here now? I suspect we don&apos;t want that behavior implicit in the destructor.

&gt; Source/JavaScriptCore/runtime/SetConstructor.cpp:148
&gt; +        if (exec-&gt;hadException())

IMO, it&apos;s really hard to see the correctness of this now because
the iteratorClose happens when JSIteratorEnumerator is destructed.
I think it might be nice to optionally provide a close() method
on the iterator. I&apos;m not sure if it&apos;s worth both having the iteratorClose
step implicitly be called. For example, the above is already different behavior than before.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219650</commentid>
    <comment_count>3</comment_count>
      <attachid>285900</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 12:28:24 -0700</bug_when>
    <thetext>Comment on attachment 285900
Work in progress

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

&gt;&gt; Source/JavaScriptCore/runtime/SetConstructor.cpp:140
&gt;&gt;              return JSValue::encode(jsUndefined());
&gt; 
&gt; Is it intentional to call iteratorClose here now? I suspect we don&apos;t want that behavior implicit in the destructor.

Oh, that&apos;s just a bug.

The whole point of this class is to have that behavior implicitly so that the user of this class doesn&apos;t need to worry about when &amp; when not to call iteratorClose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219654</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 12:33:35 -0700</bug_when>
    <thetext>Basically what I want to create is https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization for going over an iterable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219662</commentid>
    <comment_count>5</comment_count>
      <attachid>285900</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-08-12 12:56:36 -0700</bug_when>
    <thetext>Comment on attachment 285900
Work in progress

Have you considered using a functor callback thingy instead?

template&lt;typename Func&gt;
void forEach(Exectate* exec, JSValue iterable, const Func&amp; func)
{
     ... do the loop and call func for each element
}

These are usually easier to maintain.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219734</commentid>
    <comment_count>6</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-08-12 15:08:00 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Basically what I want to create is
&gt; https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization for
&gt; going over an iterable.

Right. I understand your intention. I&apos;m just commenting
that doing that might lead to bugs, because it will cause
exception handling to always handle not calling iteratorClose.
Or, it will require exception handling *to always* call iteratorClose.
Like in the Set code you changed, it depends on where the exception
is thrown. Anyways, I think the API needs to be able to handle
both such cases if we do go with an RAII style.

FWIW, I like Filip&apos;s idea.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219737</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-08-12 15:11:59 -0700</bug_when>
    <thetext>I guess the reason I don&apos;t like the RAII here
is that it just feels a bit wrong for an RAII
destructor to call arbitrary JS code. I&apos;m not sure
we have a pattern like that anywhere else. Maybe
we do. But it seems like it will be error prone.
Especially because of the prevalence of early
returns for exception checks.
What if we do Fil&apos;s idea, and the
&lt;template Func&gt; can take arguments:
Func(ExecState*, JSValue value) -&gt; IteratorNextAction

where IteratorNextAction is
enum class IteratorNextAction {
    Next,
    Close,
    etc... as needed
};</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219783</commentid>
    <comment_count>8</comment_count>
      <attachid>285976</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 16:40:15 -0700</bug_when>
    <thetext>Created attachment 285976
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219789</commentid>
    <comment_count>9</comment_count>
      <attachid>285976</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-08-12 16:47:50 -0700</bug_when>
    <thetext>Comment on attachment 285976
Patch

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

I still like the functor approach. If we go with this way, just one comment on not keeping ExecState&amp; as a field.

&gt; Source/JavaScriptCore/runtime/IteratorOperations.cpp:188
&gt; +        return JSValue(jsUndefined());

This should just be jsUndefined().

&gt; Source/JavaScriptCore/runtime/IteratorOperations.cpp:193
&gt; +        return JSValue(jsUndefined());

ditto

&gt; Source/JavaScriptCore/runtime/IteratorOperations.h:57
&gt; +    ExecState&amp; m_state;

It&apos;s really dangerous for ExecState to be held as a field of an object.
This will lead to bugs resulting from someone keeping a JSIteratorEnumerator around
even though the ExecState* it was passed in is no longer valid. Lets just make
it accepts an ExecState* for its next() function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219811</commentid>
    <comment_count>10</comment_count>
      <attachid>285987</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 17:58:07 -0700</bug_when>
    <thetext>Created attachment 285987
Functor approach</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219815</commentid>
    <comment_count>11</comment_count>
      <attachid>285987</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-08-12 18:10:59 -0700</bug_when>
    <thetext>Comment on attachment 285987
Functor approach

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

LGTM.

&gt; Source/JavaScriptCore/runtime/IteratorOperations.h:54
&gt; +        if (state-&gt;hadException() || next.isFalse())

I suggest getting the VM&amp; in a variable outside the loop and checking the exception on it instead of Exec.
ExecState::hadException() needs load the VM from memory before it can check the exception.

next.isFalse() is probably the more common case and should go first in the branch.

&gt; Source/JavaScriptCore/runtime/IteratorOperations.h:61
&gt; +        callback(state, nextValue);

And maybe give the VM as argument too to be able to check exceptions efficiently?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219821</commentid>
    <comment_count>12</comment_count>
      <attachid>285987</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 18:22:15 -0700</bug_when>
    <thetext>Comment on attachment 285987
Functor approach

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

&gt;&gt; Source/JavaScriptCore/runtime/IteratorOperations.h:54
&gt;&gt; +        if (state-&gt;hadException() || next.isFalse())
&gt; 
&gt; I suggest getting the VM&amp; in a variable outside the loop and checking the exception on it instead of Exec.
&gt; ExecState::hadException() needs load the VM from memory before it can check the exception.
&gt; 
&gt; next.isFalse() is probably the more common case and should go first in the branch.

Will do.

&gt;&gt; Source/JavaScriptCore/runtime/IteratorOperations.h:61
&gt;&gt; +        callback(state, nextValue);
&gt; 
&gt; And maybe give the VM as argument too to be able to check exceptions efficiently?

Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1219831</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-08-12 19:03:35 -0700</bug_when>
    <thetext>Committed r204438: &lt;http://trac.webkit.org/changeset/204438&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>285900</attachid>
            <date>2016-08-12 00:12:09 -0700</date>
            <delta_ts>2016-08-12 16:40:11 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>iterator-enumerator.patch</filename>
            <type>text/plain</type>
            <size>4223</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1NldENvbnN0cnVjdG9y
LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1NldENvbnN0cnVjdG9yLmNwcApp
bmRleCA5YTRlOTc4Li4wMGEyNDI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9TZXRDb25zdHJ1Y3Rvci5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvU2V0Q29uc3RydWN0b3IuY3BwCkBAIC01NCw2ICs1NCw2MiBAQCBzdGF0aWMgRW5jb2Rl
ZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjYWxsU2V0KEV4ZWNTdGF0ZSogZXhlYykKICAgICByZXR1
cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93Q29uc3RydWN0b3JDYW5ub3RCZUNhbGxlZEFzRnVuY3Rp
b25UeXBlRXJyb3IoZXhlYywgIlNldCIpKTsKIH0KIAorY2xhc3MgSlNJdGVyYXRvckVudW1lcmF0
b3IgeworcHVibGljOgorICAgIEpTSXRlcmF0b3JFbnVtZXJhdG9yKEV4ZWNTdGF0ZSYgc3RhdGUs
IEpTVmFsdWUgaXRlcmFibGUpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAgICB7CisgICAg
ICAgIEpTVmFsdWUgaXRlcmF0b3JGdW5jdGlvbiA9IGl0ZXJhYmxlLmdldCgmc3RhdGUsIG1fc3Rh
dGUucHJvcGVydHlOYW1lcygpLml0ZXJhdG9yU3ltYm9sKTsKKyAgICAgICAgaWYgKG1fc3RhdGUu
aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ2FsbERhdGEg
aXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhOworICAgICAgICBDYWxsVHlwZSBpdGVyYXRvckZ1bmN0
aW9uQ2FsbFR5cGUgPSBnZXRDYWxsRGF0YShpdGVyYXRvckZ1bmN0aW9uLCBpdGVyYXRvckZ1bmN0
aW9uQ2FsbERhdGEpOworICAgICAgICBpZiAoaXRlcmF0b3JGdW5jdGlvbkNhbGxUeXBlID09IENh
bGxUeXBlOjpOb25lKSB7CisgICAgICAgICAgICB0aHJvd1R5cGVFcnJvcigmc3RhdGUpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXJnTGlzdCBpdGVyYXRvckZ1
bmN0aW9uQXJndW1lbnRzOworICAgICAgICBKU1ZhbHVlIGl0ZXJhdG9yID0gY2FsbCgmc3RhdGUs
IGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSwgaXRlcmF0b3JGdW5j
dGlvbkNhbGxEYXRhLCBpdGVyYWJsZSwgaXRlcmF0b3JGdW5jdGlvbkFyZ3VtZW50cyk7CisgICAg
ICAgIGlmIChtX3N0YXRlLmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgIGlmICghaXRlcmF0b3IuaXNPYmplY3QoKSkKKyAgICAgICAgICAgIHRocm93VHlwZUVy
cm9yKCZzdGF0ZSk7CisgICAgICAgIG1faXRlcmF0b3JGdW5jdGlvbiA9IGl0ZXJhdG9yRnVuY3Rp
b247CisgICAgfQorCisgICAgfkpTSXRlcmF0b3JFbnVtZXJhdG9yKCkKKyAgICB7CisgICAgICAg
IGlmICghbV9kb25lKQorICAgICAgICAgICAgaXRlcmF0b3JDbG9zZSgmbV9zdGF0ZSwgbV9pdGVy
YXRvckZ1bmN0aW9uKTsKKyAgICB9CisKKyAgICBKU1ZhbHVlIG5leHQoKQorICAgIHsKKyAgICAg
ICAgSlNWYWx1ZSBuZXh0ID0gaXRlcmF0b3JTdGVwKCZtX3N0YXRlLCBtX2l0ZXJhdG9yRnVuY3Rp
b24pOworICAgICAgICBpZiAobV9zdGF0ZS5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgIHJl
dHVybiBKU1ZhbHVlKGpzVW5kZWZpbmVkKCkpOworICAgICAgICBpZiAobmV4dC5pc0ZhbHNlKCkp
IHsKKyAgICAgICAgICAgIG1fZG9uZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gSlNWYWx1
ZShqc1VuZGVmaW5lZCgpKTsKKyAgICAgICAgfQorICAgICAgICBKU1ZhbHVlIG5leHRWYWx1ZSA9
IGl0ZXJhdG9yVmFsdWUoJm1fc3RhdGUsIG5leHQpOworICAgICAgICBpZiAobV9zdGF0ZS5oYWRF
eGNlcHRpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlKGpzVW5kZWZpbmVkKCkpOwor
ICAgICAgICByZXR1cm4gbmV4dFZhbHVlOworICAgIH0KKworICAgIGJvb2wgaXNEb25lKCkgY29u
c3QgeyByZXR1cm4gbV9kb25lOyB9CisKK3ByaXZhdGU6CisgICAgRXhlY1N0YXRlJiBtX3N0YXRl
OworICAgIEpTVmFsdWUgbV9pdGVyYXRvckZ1bmN0aW9uOworICAgIHVuc2lnbmVkIG1faW5kZXgg
eyAwIH07CisgICAgYm9vbCBtX2RvbmUgeyBmYWxzZSB9OworfTsKKwogc3RhdGljIEVuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29uc3RydWN0U2V0KEV4ZWNTdGF0ZSogZXhlYykKIHsKICAg
ICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gYXNJbnRlcm5hbEZ1bmN0aW9uKGV4ZWMt
PmNhbGxlZSgpKS0+Z2xvYmFsT2JqZWN0KCk7CkBAIC03NCw0MiArMTMwLDIzIEBAIHN0YXRpYyBF
bmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnN0cnVjdFNldChFeGVjU3RhdGUqIGV4ZWMp
CiAgICAgaWYgKGFkZGVyRnVuY3Rpb25DYWxsVHlwZSA9PSBDYWxsVHlwZTo6Tm9uZSkKICAgICAg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd1R5cGVFcnJvcihleGVjKSk7CiAKLSAgICBK
U1ZhbHVlIGl0ZXJhdG9yRnVuY3Rpb24gPSBpdGVyYWJsZS5nZXQoZXhlYywgZXhlYy0+cHJvcGVy
dHlOYW1lcygpLml0ZXJhdG9yU3ltYm9sKTsKKyAgICBKU0l0ZXJhdG9yRW51bWVyYXRvciBlbnVt
ZXJhdG9yKCpleGVjLCBpdGVyYWJsZSk7CiAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQog
ICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwogCi0gICAgQ2Fs
bERhdGEgaXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhOwotICAgIENhbGxUeXBlIGl0ZXJhdG9yRnVu
Y3Rpb25DYWxsVHlwZSA9IGdldENhbGxEYXRhKGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVu
Y3Rpb25DYWxsRGF0YSk7Ci0gICAgaWYgKGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9PSBDYWxs
VHlwZTo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd1R5cGVFcnJv
cihleGVjKSk7Ci0KLSAgICBBcmdMaXN0IGl0ZXJhdG9yRnVuY3Rpb25Bcmd1bWVudHM7Ci0gICAg
SlNWYWx1ZSBpdGVyYXRvciA9IGNhbGwoZXhlYywgaXRlcmF0b3JGdW5jdGlvbiwgaXRlcmF0b3JG
dW5jdGlvbkNhbGxUeXBlLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEsIGl0ZXJhYmxlLCBpdGVy
YXRvckZ1bmN0aW9uQXJndW1lbnRzKTsKLSAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0g
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0KLSAgICBpZiAo
IWl0ZXJhdG9yLmlzT2JqZWN0KCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhy
b3dUeXBlRXJyb3IoZXhlYykpOwotCiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgSlNWYWx1
ZSBuZXh0ID0gaXRlcmF0b3JTdGVwKGV4ZWMsIGl0ZXJhdG9yKTsKKyAgICAgICAgSlNWYWx1ZSBu
ZXh0VmFsdWUgPSBlbnVtZXJhdG9yLm5leHQoKTsKICAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQogICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgp
KTsKIAotICAgICAgICBpZiAobmV4dC5pc0ZhbHNlKCkpCisgICAgICAgIGlmIChlbnVtZXJhdG9y
LmlzRG9uZSgpKQogICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShzZXQpOwogCi0g
ICAgICAgIEpTVmFsdWUgbmV4dFZhbHVlID0gaXRlcmF0b3JWYWx1ZShleGVjLCBuZXh0KTsKLSAg
ICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFs
dWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQogICAgICAgICBNYXJrZWRBcmd1bWVudEJ1ZmZl
ciBhcmd1bWVudHM7CiAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobmV4dFZhbHVlKTsKICAgICAg
ICAgY2FsbChleGVjLCBhZGRlckZ1bmN0aW9uLCBhZGRlckZ1bmN0aW9uQ2FsbFR5cGUsIGFkZGVy
RnVuY3Rpb25DYWxsRGF0YSwgc2V0LCBhcmd1bWVudHMpOwotICAgICAgICBpZiAoZXhlYy0+aGFk
RXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhlYywgaXRlcmF0b3Ip
OworICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICB9CiAgICAgfQogICAgIFJF
TEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShz
ZXQpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>285976</attachid>
            <date>2016-08-12 16:40:15 -0700</date>
            <delta_ts>2016-08-12 17:58:03 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-160800-20160812163835.patch</filename>
            <type>text/plain</type>
            <size>14250</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA0NDMzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMyIEBA
CisyMDE2LTA4LTEyICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAg
IEFkZCBhIGhlbHBlciBjbGFzcyBmb3IgZW51bWVyYXRpbmcgZWxlbWVudHMgaW4gYW4gaXRlcmFi
bGUgb2JqZWN0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNjA4MDAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRlZCBKU0l0ZXJhdG9yRW51bWVyYXRvciB3aGljaCBwcm92aWRlcyBhbiBhYnN0cmFjdGlv
biBmb3IgaXRlcmF0aW5nIG92ZXIgYW4gaXRlcmFibGUgb2JqZWN0LAorICAgICAgICBhbmQgZGVw
bG95ZWQgaXQgaW4gdGhlIGNvbnN0cnVjdG9ycyBvZiBTZXQsIFdlYWtTZXQsIE1hcCwgYW5kIFdl
YWtNYXAuCisKKyAgICAgICAgVGhlIGNsYXNzIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBpdGVy
YXRvciBpbiBpdHMgZGVzdHJ1Y3RvciBpZiB0aGUgaXRlcmF0aW9uIGhhZCBzdGFydGVkIGFuZAor
ICAgICAgICBkaWRuJ3QgZW5kIGNsZWFubHkgKGUuZy4gYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24g
b3V0c2lkZSB0aGUgaXRlcmF0b3IpLgorCisgICAgICAgICogcnVudGltZS9JdGVyYXRvck9wZXJh
dGlvbnMuY3BwOgorICAgICAgICAoSlNDOjpKU0l0ZXJhdG9yRW51bWVyYXRvcjo6SlNJdGVyYXRv
ckVudW1lcmF0b3IpOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6SlNJdGVyYXRvckVudW1lcmF0b3I6
Om5leHQpOiBBZGRlZC4KKyAgICAgICAgKiBydW50aW1lL0l0ZXJhdG9yT3BlcmF0aW9ucy5oOgor
ICAgICAgICAoSlNDOjpKU0l0ZXJhdG9yRW51bWVyYXRvcjo6fkpTSXRlcmF0b3JFbnVtZXJhdG9y
KTogQWRkZWQuCisgICAgICAgIChKU0M6OkpTSXRlcmF0b3JFbnVtZXJhdG9yOjppc0RvbmUpOiBB
ZGRlZC4gUmV0dXJucyB0cnVlIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaXRlcmF0
b3IKKyAgICAgICAgb3Igb25lIG9mIHRoZSBpdGVyYXRpb24gcmVzdWx0ZWQgaW4gYW4gZXhjZXB0
aW9uLgorICAgICAgICAqIHJ1bnRpbWUvTWFwQ29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlND
Ojpjb25zdHJ1Y3RNYXApOgorICAgICAgICAqIHJ1bnRpbWUvU2V0Q29uc3RydWN0b3IuY3BwOgor
ICAgICAgICAoSlNDOjpjb25zdHJ1Y3RTZXQpOgorICAgICAgICAqIHJ1bnRpbWUvV2Vha01hcENv
bnN0cnVjdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Y29uc3RydWN0V2Vha01hcCk6CisgICAgICAg
ICogcnVudGltZS9XZWFrU2V0Q29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlNDOjpjb25zdHJ1
Y3RXZWFrU2V0KToKKwogMjAxNi0wOC0xMiAgSm9zZXBoIFBlY29yYXJvICA8cGVjb3Jhcm9AYXBw
bGUuY29tPgogCiAgICAgICAgIFJlbW92ZSB1bnVzZWQgaW5jbHVkZXMgb2YgUmVmQ291bnRlZExl
YWtDb3VudGVyLmgKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0l0ZXJhdG9y
T3BlcmF0aW9ucy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvSXRlcmF0b3JPcGVyYXRpb25zLmNwcAkocmV2aXNpb24gMjA0NDE2KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSXRlcmF0b3JPcGVyYXRpb25zLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTUzLDQgKzE1Myw0NiBAQCBKU09iamVjdCogY3JlYXRlSXRlcmF0b3JSZXN1bHRPYmpl
Y3QoRXhlCiAgICAgcmV0dXJuIHJlc3VsdE9iamVjdDsKIH0KIAorSlNJdGVyYXRvckVudW1lcmF0
b3I6OkpTSXRlcmF0b3JFbnVtZXJhdG9yKEV4ZWNTdGF0ZSogc3RhdGUsIEpTVmFsdWUgaXRlcmFi
bGUpCisgICAgOiBtX3N0YXRlKCpzdGF0ZSkKK3sKKyAgICBKU1ZhbHVlIGl0ZXJhdG9yRnVuY3Rp
b24gPSBpdGVyYWJsZS5nZXQoc3RhdGUsIG1fc3RhdGUucHJvcGVydHlOYW1lcygpLml0ZXJhdG9y
U3ltYm9sKTsKKyAgICBpZiAobV9zdGF0ZS5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJu
OworICAgIAorICAgIENhbGxEYXRhIGl0ZXJhdG9yRnVuY3Rpb25DYWxsRGF0YTsKKyAgICBDYWxs
VHlwZSBpdGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUgPSBnZXRDYWxsRGF0YShpdGVyYXRvckZ1bmN0
aW9uLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEpOworICAgIGlmIChpdGVyYXRvckZ1bmN0aW9u
Q2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUpIHsKKyAgICAgICAgdGhyb3dUeXBlRXJyb3Ioc3Rh
dGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIEFyZ0xpc3QgaXRlcmF0b3JG
dW5jdGlvbkFyZ3VtZW50czsKKyAgICBKU1ZhbHVlIGl0ZXJhdG9yID0gY2FsbChzdGF0ZSwgaXRl
cmF0b3JGdW5jdGlvbiwgaXRlcmF0b3JGdW5jdGlvbkNhbGxUeXBlLCBpdGVyYXRvckZ1bmN0aW9u
Q2FsbERhdGEsIGl0ZXJhYmxlLCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzKTsKKyAgICBpZiAo
c3RhdGUtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgaWYgKCFp
dGVyYXRvci5pc09iamVjdCgpKSB7CisgICAgICAgIHRocm93VHlwZUVycm9yKHN0YXRlKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBtX2l0ZXJhdG9yID0gaXRlcmF0b3I7Cit9
CisKK0pTVmFsdWUgSlNJdGVyYXRvckVudW1lcmF0b3I6Om5leHQoKQoreworICAgIEpTVmFsdWUg
bmV4dCA9IGl0ZXJhdG9yU3RlcCgmbV9zdGF0ZSwgbV9pdGVyYXRvcik7CisgICAgaWYgKG1fc3Rh
dGUuaGFkRXhjZXB0aW9uKCkgfHwgbmV4dC5pc0ZhbHNlKCkpIHsKKyAgICAgICAgbV9kb25lID0g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWUoanNVbmRlZmluZWQoKSk7CisgICAgfQorICAg
IEpTVmFsdWUgbmV4dFZhbHVlID0gaXRlcmF0b3JWYWx1ZSgmbV9zdGF0ZSwgbmV4dCk7CisgICAg
aWYgKG1fc3RhdGUuaGFkRXhjZXB0aW9uKCkpIHsKKyAgICAgICAgbV9kb25lID0gdHJ1ZTsKKyAg
ICAgICAgcmV0dXJuIEpTVmFsdWUoanNVbmRlZmluZWQoKSk7CisgICAgfQorICAgIHJldHVybiBu
ZXh0VmFsdWU7Cit9CisKIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSXRlcmF0b3JPcGVyYXRpb25zLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSXRlcmF0b3JPcGVyYXRpb25zLmgJKHJldmlzaW9uIDIw
NDQxNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0l0ZXJhdG9yT3BlcmF0aW9u
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC00MSw2ICs0MSwyNCBAQCBKU19FWFBPUlRfUFJJVkFURSBK
U09iamVjdCogY3JlYXRlSXRlcmF0CiAKIFN0cnVjdHVyZSogY3JlYXRlSXRlcmF0b3JSZXN1bHRP
YmplY3RTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCYpOwogCitjbGFzcyBKU0l0ZXJhdG9y
RW51bWVyYXRvciB7CitwdWJsaWM6CisgICAgSlNJdGVyYXRvckVudW1lcmF0b3IoRXhlY1N0YXRl
KiwgSlNWYWx1ZSBpdGVyYWJsZSk7CisgICAgfkpTSXRlcmF0b3JFbnVtZXJhdG9yKCkKKyAgICB7
CisgICAgICAgIGlmIChtX2l0ZXJhdG9yICYmICFtX2RvbmUpCisgICAgICAgICAgICBpdGVyYXRv
ckNsb3NlKCZtX3N0YXRlLCBtX2l0ZXJhdG9yKTsKKyAgICB9CisKKyAgICBKU1ZhbHVlIG5leHQo
KTsKKyAgICBib29sIGlzRG9uZSgpIGNvbnN0IHsgcmV0dXJuIG1fZG9uZTsgfQorCitwcml2YXRl
OgorICAgIEV4ZWNTdGF0ZSYgbV9zdGF0ZTsKKyAgICBKU1ZhbHVlIG1faXRlcmF0b3I7CisgICAg
Ym9vbCBtX2RvbmUgeyBmYWxzZSB9OworfTsKKwogfQogCiAjZW5kaWYgLy8gIWRlZmluZWQoSXRl
cmF0b3JPcGVyYXRpb25zX2gpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9N
YXBDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvTWFwQ29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiAyMDQ0MTYpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9NYXBDb25zdHJ1Y3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTczLDYxICs3MywzNyBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjb25z
CiAgICAgaWYgKGFkZGVyRnVuY3Rpb25DYWxsVHlwZSA9PSBDYWxsVHlwZTo6Tm9uZSkKICAgICAg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd1R5cGVFcnJvcihleGVjKSk7CiAKLSAgICBK
U1ZhbHVlIGl0ZXJhdG9yRnVuY3Rpb24gPSBpdGVyYWJsZS5nZXQoZXhlYywgZXhlYy0+cHJvcGVy
dHlOYW1lcygpLml0ZXJhdG9yU3ltYm9sKTsKKyAgICBKU0l0ZXJhdG9yRW51bWVyYXRvciBlbnVt
ZXJhdG9yKGV4ZWMsIGl0ZXJhYmxlKTsKICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCiAg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CiAKLSAgICBDYWxs
RGF0YSBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGE7Ci0gICAgQ2FsbFR5cGUgaXRlcmF0b3JGdW5j
dGlvbkNhbGxUeXBlID0gZ2V0Q2FsbERhdGEoaXRlcmF0b3JGdW5jdGlvbiwgaXRlcmF0b3JGdW5j
dGlvbkNhbGxEYXRhKTsKLSAgICBpZiAoaXRlcmF0b3JGdW5jdGlvbkNhbGxUeXBlID09IENhbGxU
eXBlOjpOb25lKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9y
KGV4ZWMpKTsKLQotICAgIEFyZ0xpc3QgaXRlcmF0b3JGdW5jdGlvbkFyZ3VtZW50czsKLSAgICBK
U1ZhbHVlIGl0ZXJhdG9yID0gY2FsbChleGVjLCBpdGVyYXRvckZ1bmN0aW9uLCBpdGVyYXRvckZ1
bmN0aW9uQ2FsbFR5cGUsIGl0ZXJhdG9yRnVuY3Rpb25DYWxsRGF0YSwgaXRlcmFibGUsIGl0ZXJh
dG9yRnVuY3Rpb25Bcmd1bWVudHMpOwotICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAg
ICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQotICAgIGlmICgh
aXRlcmF0b3IuaXNPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJv
d1R5cGVFcnJvcihleGVjKSk7Ci0KICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBKU1ZhbHVl
IG5leHQgPSBpdGVyYXRvclN0ZXAoZXhlYywgaXRlcmF0b3IpOworICAgICAgICBKU1ZhbHVlIG5l
eHRJdGVtID0gZW51bWVyYXRvci5uZXh0KCk7CiAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkKICAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7
CiAKLSAgICAgICAgaWYgKG5leHQuaXNGYWxzZSgpKQorICAgICAgICBpZiAoZW51bWVyYXRvci5p
c0RvbmUoKSkKICAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUobWFwKTsKIAotICAg
ICAgICBKU1ZhbHVlIG5leHRJdGVtID0gaXRlcmF0b3JWYWx1ZShleGVjLCBuZXh0KTsKLSAgICAg
ICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQogICAgICAgICBpZiAoIW5leHRJdGVtLmlzT2JqZWN0
KCkpIHsKICAgICAgICAgICAgIHRocm93VHlwZUVycm9yKGV4ZWMpOwotICAgICAgICAgICAgaXRl
cmF0b3JDbG9zZShleGVjLCBpdGVyYXRvcik7CiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwogICAgICAgICB9CiAKICAgICAgICAgSlNWYWx1ZSBrZXkg
PSBuZXh0SXRlbS5nZXQoZXhlYywgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KDApKTsKLSAgICAgICAg
aWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICBpdGVyYXRvckNsb3NlKGV4
ZWMsIGl0ZXJhdG9yKTsKKyAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQogICAgICAg
ICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLSAgICAgICAgfQog
CiAgICAgICAgIEpTVmFsdWUgdmFsdWUgPSBuZXh0SXRlbS5nZXQoZXhlYywgc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KDEpKTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7Ci0gICAg
ICAgICAgICBpdGVyYXRvckNsb3NlKGV4ZWMsIGl0ZXJhdG9yKTsKKyAgICAgICAgaWYgKGV4ZWMt
PmhhZEV4Y2VwdGlvbigpKQogICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1Vu
ZGVmaW5lZCgpKTsKLSAgICAgICAgfQogCiAgICAgICAgIE1hcmtlZEFyZ3VtZW50QnVmZmVyIGFy
Z3VtZW50czsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChrZXkpOwogICAgICAgICBhcmd1bWVu
dHMuYXBwZW5kKHZhbHVlKTsKICAgICAgICAgY2FsbChleGVjLCBhZGRlckZ1bmN0aW9uLCBhZGRl
ckZ1bmN0aW9uQ2FsbFR5cGUsIGFkZGVyRnVuY3Rpb25DYWxsRGF0YSwgbWFwLCBhcmd1bWVudHMp
OwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJh
dG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOworICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwot
ICAgICAgICB9CiAgICAgfQogICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAg
cmV0dXJuIEpTVmFsdWU6OmVuY29kZShtYXApOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvU2V0Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL1NldENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gMjA0NDE2KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU2V0Q29uc3RydWN0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC03NCw0MiArNzQsMjMgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgY29ucwogICAgIGlmIChhZGRlckZ1bmN0aW9uQ2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5v
bmUpCiAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykp
OwogCi0gICAgSlNWYWx1ZSBpdGVyYXRvckZ1bmN0aW9uID0gaXRlcmFibGUuZ2V0KGV4ZWMsIGV4
ZWMtPnByb3BlcnR5TmFtZXMoKS5pdGVyYXRvclN5bWJvbCk7CisgICAgSlNJdGVyYXRvckVudW1l
cmF0b3IgZW51bWVyYXRvcihleGVjLCBpdGVyYWJsZSk7CiAgICAgaWYgKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQogICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwog
Ci0gICAgQ2FsbERhdGEgaXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhOwotICAgIENhbGxUeXBlIGl0
ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9IGdldENhbGxEYXRhKGl0ZXJhdG9yRnVuY3Rpb24sIGl0
ZXJhdG9yRnVuY3Rpb25DYWxsRGF0YSk7Ci0gICAgaWYgKGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlw
ZSA9PSBDYWxsVHlwZTo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJv
d1R5cGVFcnJvcihleGVjKSk7Ci0KLSAgICBBcmdMaXN0IGl0ZXJhdG9yRnVuY3Rpb25Bcmd1bWVu
dHM7Ci0gICAgSlNWYWx1ZSBpdGVyYXRvciA9IGNhbGwoZXhlYywgaXRlcmF0b3JGdW5jdGlvbiwg
aXRlcmF0b3JGdW5jdGlvbkNhbGxUeXBlLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEsIGl0ZXJh
YmxlLCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzKTsKLSAgICBpZiAoZXhlYy0+aGFkRXhjZXB0
aW9uKCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0K
LSAgICBpZiAoIWl0ZXJhdG9yLmlzT2JqZWN0KCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwotCiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgSlNWYWx1ZSBuZXh0ID0gaXRlcmF0b3JTdGVwKGV4ZWMsIGl0ZXJhdG9yKTsKKyAgICAgICAg
SlNWYWx1ZSBuZXh0VmFsdWUgPSBlbnVtZXJhdG9yLm5leHQoKTsKICAgICAgICAgaWYgKGV4ZWMt
PmhhZEV4Y2VwdGlvbigpKQogICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1Vu
ZGVmaW5lZCgpKTsKIAotICAgICAgICBpZiAobmV4dC5pc0ZhbHNlKCkpCisgICAgICAgIGlmIChl
bnVtZXJhdG9yLmlzRG9uZSgpKQogICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShz
ZXQpOwogCi0gICAgICAgIEpTVmFsdWUgbmV4dFZhbHVlID0gaXRlcmF0b3JWYWx1ZShleGVjLCBu
ZXh0KTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQogICAgICAgICBNYXJrZWRBcmd1
bWVudEJ1ZmZlciBhcmd1bWVudHM7CiAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobmV4dFZhbHVl
KTsKICAgICAgICAgY2FsbChleGVjLCBhZGRlckZ1bmN0aW9uLCBhZGRlckZ1bmN0aW9uQ2FsbFR5
cGUsIGFkZGVyRnVuY3Rpb25DYWxsRGF0YSwgc2V0LCBhcmd1bWVudHMpOwotICAgICAgICBpZiAo
ZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhlYywg
aXRlcmF0b3IpOworICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgICAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICB9CiAgICAg
fQogICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShzZXQpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvV2Vha01h
cENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9XZWFrTWFwQ29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiAyMDQ0MTYpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9XZWFrTWFwQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC03MSw2MSArNzEsMzcgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NB
TEwgY29ucwogICAgIGlmIChhZGRlckZ1bmN0aW9uQ2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUp
CiAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwog
Ci0gICAgSlNWYWx1ZSBpdGVyYXRvckZ1bmN0aW9uID0gaXRlcmFibGUuZ2V0KGV4ZWMsIGV4ZWMt
PnByb3BlcnR5TmFtZXMoKS5pdGVyYXRvclN5bWJvbCk7CisgICAgSlNJdGVyYXRvckVudW1lcmF0
b3IgZW51bWVyYXRvcihleGVjLCBpdGVyYWJsZSk7CiAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlv
bigpKQogICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwogCi0g
ICAgQ2FsbERhdGEgaXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhOwotICAgIENhbGxUeXBlIGl0ZXJh
dG9yRnVuY3Rpb25DYWxsVHlwZSA9IGdldENhbGxEYXRhKGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJh
dG9yRnVuY3Rpb25DYWxsRGF0YSk7Ci0gICAgaWYgKGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9
PSBDYWxsVHlwZTo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd1R5
cGVFcnJvcihleGVjKSk7Ci0KLSAgICBBcmdMaXN0IGl0ZXJhdG9yRnVuY3Rpb25Bcmd1bWVudHM7
Ci0gICAgSlNWYWx1ZSBpdGVyYXRvciA9IGNhbGwoZXhlYywgaXRlcmF0b3JGdW5jdGlvbiwgaXRl
cmF0b3JGdW5jdGlvbkNhbGxUeXBlLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEsIGl0ZXJhYmxl
LCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzKTsKLSAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0KLSAg
ICBpZiAoIWl0ZXJhdG9yLmlzT2JqZWN0KCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwotCiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAg
SlNWYWx1ZSBuZXh0ID0gaXRlcmF0b3JTdGVwKGV4ZWMsIGl0ZXJhdG9yKTsKKyAgICAgICAgSlNW
YWx1ZSBuZXh0SXRlbSA9IGVudW1lcmF0b3IubmV4dCgpOwogICAgICAgICBpZiAoZXhlYy0+aGFk
RXhjZXB0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZp
bmVkKCkpOwogCi0gICAgICAgIGlmIChuZXh0LmlzRmFsc2UoKSkKKyAgICAgICAgaWYgKGVudW1l
cmF0b3IuaXNEb25lKCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHdlYWtN
YXApOwogCi0gICAgICAgIEpTVmFsdWUgbmV4dEl0ZW0gPSBpdGVyYXRvclZhbHVlKGV4ZWMsIG5l
eHQpOwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1
cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotCiAgICAgICAgIGlmICghbmV4dEl0
ZW0uaXNPYmplY3QoKSkgewogICAgICAgICAgICAgdGhyb3dUeXBlRXJyb3IoZXhlYyk7Ci0gICAg
ICAgICAgICBpdGVyYXRvckNsb3NlKGV4ZWMsIGl0ZXJhdG9yKTsKICAgICAgICAgICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBK
U1ZhbHVlIGtleSA9IG5leHRJdGVtLmdldChleGVjLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oMCkp
OwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJh
dG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOworICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwot
ICAgICAgICB9CiAKICAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9IG5leHRJdGVtLmdldChleGVjLCBz
dGF0aWNfY2FzdDx1bnNpZ25lZD4oMSkpOwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOworICAgICAg
ICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICB9CiAKICAgICAgICAgTWFya2VkQXJndW1l
bnRCdWZmZXIgYXJndW1lbnRzOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGtleSk7CiAgICAg
ICAgIGFyZ3VtZW50cy5hcHBlbmQodmFsdWUpOwogICAgICAgICBjYWxsKGV4ZWMsIGFkZGVyRnVu
Y3Rpb24sIGFkZGVyRnVuY3Rpb25DYWxsVHlwZSwgYWRkZXJGdW5jdGlvbkNhbGxEYXRhLCB3ZWFr
TWFwLCBhcmd1bWVudHMpOwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAg
ICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOworICAgICAgICBpZiAoZXhl
Yy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpz
VW5kZWZpbmVkKCkpOwotICAgICAgICB9CiAgICAgfQogICAgIFJFTEVBU0VfQVNTRVJUX05PVF9S
RUFDSEVEKCk7CiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh3ZWFrTWFwKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1dlYWtTZXRDb25zdHJ1Y3Rvci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvV2Vha1NldENvbnN0cnVjdG9y
LmNwcAkocmV2aXNpb24gMjA0NDE2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
V2Vha1NldENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzEsNDIgKzcxLDIzIEBA
IHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnMKICAgICBpZiAoYWRkZXJG
dW5jdGlvbkNhbGxUeXBlID09IENhbGxUeXBlOjpOb25lKQogICAgICAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9yKGV4ZWMpKTsKIAotICAgIEpTVmFsdWUgaXRlcmF0b3JG
dW5jdGlvbiA9IGl0ZXJhYmxlLmdldChleGVjLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkuaXRlcmF0
b3JTeW1ib2wpOworICAgIEpTSXRlcmF0b3JFbnVtZXJhdG9yIGVudW1lcmF0b3IoZXhlYywgaXRl
cmFibGUpOwogICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKICAgICAgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKIAotICAgIENhbGxEYXRhIGl0ZXJhdG9yRnVu
Y3Rpb25DYWxsRGF0YTsKLSAgICBDYWxsVHlwZSBpdGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUgPSBn
ZXRDYWxsRGF0YShpdGVyYXRvckZ1bmN0aW9uLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEpOwot
ICAgIGlmIChpdGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUpCi0gICAg
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwotCi0gICAg
QXJnTGlzdCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzOwotICAgIEpTVmFsdWUgaXRlcmF0b3Ig
PSBjYWxsKGV4ZWMsIGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSwg
aXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhLCBpdGVyYWJsZSwgaXRlcmF0b3JGdW5jdGlvbkFyZ3Vt
ZW50cyk7Ci0gICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICByZXR1cm4gSlNW
YWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotCi0gICAgaWYgKCFpdGVyYXRvci5pc09iamVj
dCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9yKGV4ZWMp
KTsKLQogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIEpTVmFsdWUgbmV4dCA9IGl0ZXJhdG9y
U3RlcChleGVjLCBpdGVyYXRvcik7CisgICAgICAgIEpTVmFsdWUgbmV4dFZhbHVlID0gZW51bWVy
YXRvci5uZXh0KCk7CiAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKICAgICAgICAg
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CiAKLSAgICAgICAgaWYg
KG5leHQuaXNGYWxzZSgpKQorICAgICAgICBpZiAoZW51bWVyYXRvci5pc0RvbmUoKSkKICAgICAg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUod2Vha1NldCk7CiAKLSAgICAgICAgSlNWYWx1
ZSBuZXh0VmFsdWUgPSBpdGVyYXRvclZhbHVlKGV4ZWMsIG5leHQpOwotICAgICAgICBpZiAoZXhl
Yy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpz
VW5kZWZpbmVkKCkpOwotCiAgICAgICAgIE1hcmtlZEFyZ3VtZW50QnVmZmVyIGFyZ3VtZW50czsK
ICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChuZXh0VmFsdWUpOwogICAgICAgICBjYWxsKGV4ZWMs
IGFkZGVyRnVuY3Rpb24sIGFkZGVyRnVuY3Rpb25DYWxsVHlwZSwgYWRkZXJGdW5jdGlvbkNhbGxE
YXRhLCB3ZWFrU2V0LCBhcmd1bWVudHMpOwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOworICAgICAg
ICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICB9CiAgICAgfQogICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh3ZWFrU2V0KTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>285987</attachid>
            <date>2016-08-12 17:58:07 -0700</date>
            <delta_ts>2016-08-12 18:10:59 -0700</delta_ts>
            <desc>Functor approach</desc>
            <filename>bug-160800-20160812175627.patch</filename>
            <type>text/plain</type>
            <size>13926</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA0NDM2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBA
CisyMDE2LTA4LTEyICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAg
IEFkZCBhIGhlbHBlciBjbGFzcyBmb3IgZW51bWVyYXRpbmcgZWxlbWVudHMgaW4gYW4gaXRlcmFi
bGUgb2JqZWN0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNjA4MDAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRlZCBpdGVyYXRvckZvckl0ZXJhYmxlIHdoaWNoIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9u
IGZvciBpdGVyYXRpbmcgb3ZlciBhbiBpdGVyYWJsZSBvYmplY3QsCisgICAgICAgIGFuZCBkZXBs
b3llZCBpdCBpbiB0aGUgY29uc3RydWN0b3JzIG9mIFNldCwgV2Vha1NldCwgTWFwLCBhbmQgV2Vh
a01hcC4KKworICAgICAgICBBbHNvIGFkZGVkIGEgaGVscGVyIGZ1bmN0aW9uIGl0ZXJhdG9yRm9y
SXRlcmFibGUsIHdoaWNoIHJldHJpZXZlcyB0aGUgaXRlcmF0b3Igb3V0IG9mIGFuIGl0ZXJhYmxl
IG9iamVjdC4KKworICAgICAgICAqIHJ1bnRpbWUvSXRlcmF0b3JPcGVyYXRpb25zLmNwcDoKKyAg
ICAgICAgKEpTQzo6aXRlcmF0b3JGb3JJdGVyYWJsZSk6IEFkZGVkLgorICAgICAgICAqIHJ1bnRp
bWUvSXRlcmF0b3JPcGVyYXRpb25zLmg6CisgICAgICAgIChKU0M6OmZvckVhY2hJbkl0ZXJhYmxl
KTogQWRkZWQuCisgICAgICAgICogcnVudGltZS9NYXBDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAg
IChKU0M6OmNvbnN0cnVjdE1hcCk6CisgICAgICAgICogcnVudGltZS9TZXRDb25zdHJ1Y3Rvci5j
cHA6CisgICAgICAgIChKU0M6OmNvbnN0cnVjdFNldCk6CisgICAgICAgICogcnVudGltZS9XZWFr
TWFwQ29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlNDOjpjb25zdHJ1Y3RXZWFrTWFwKToKKyAg
ICAgICAgKiBydW50aW1lL1dlYWtTZXRDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChKU0M6OmNv
bnN0cnVjdFdlYWtTZXQpOgorCiAyMDE2LTA4LTEyICBKb3NlcGggUGVjb3Jhcm8gIDxwZWNvcmFy
b0BhcHBsZS5jb20+CiAKICAgICAgICAgUmVtb3ZlIHVudXNlZCBpbmNsdWRlcyBvZiBSZWZDb3Vu
dGVkTGVha0NvdW50ZXIuaApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSXRl
cmF0b3JPcGVyYXRpb25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9JdGVyYXRvck9wZXJhdGlvbnMuY3BwCShyZXZpc2lvbiAyMDQ0MTYpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JdGVyYXRvck9wZXJhdGlvbnMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xNTMsNCArMTUzLDMwIEBAIEpTT2JqZWN0KiBjcmVhdGVJdGVyYXRvclJlc3Vs
dE9iamVjdChFeGUKICAgICByZXR1cm4gcmVzdWx0T2JqZWN0OwogfQogCitKU1ZhbHVlIGl0ZXJh
dG9yRm9ySXRlcmFibGUoRXhlY1N0YXRlKiBzdGF0ZSwgSlNWYWx1ZSBpdGVyYWJsZSkKK3sKKyAg
ICBKU1ZhbHVlIGl0ZXJhdG9yRnVuY3Rpb24gPSBpdGVyYWJsZS5nZXQoc3RhdGUsIHN0YXRlLT5w
cm9wZXJ0eU5hbWVzKCkuaXRlcmF0b3JTeW1ib2wpOworICAgIGlmIChzdGF0ZS0+aGFkRXhjZXB0
aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlKCk7CisgICAgCisgICAgQ2FsbERhdGEgaXRl
cmF0b3JGdW5jdGlvbkNhbGxEYXRhOworICAgIENhbGxUeXBlIGl0ZXJhdG9yRnVuY3Rpb25DYWxs
VHlwZSA9IGdldENhbGxEYXRhKGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVuY3Rpb25DYWxs
RGF0YSk7CisgICAgaWYgKGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9PSBDYWxsVHlwZTo6Tm9u
ZSkgeworICAgICAgICB0aHJvd1R5cGVFcnJvcihzdGF0ZSk7CisgICAgICAgIHJldHVybiBKU1Zh
bHVlKCk7CisgICAgfQorCisgICAgQXJnTGlzdCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzOwor
ICAgIEpTVmFsdWUgaXRlcmF0b3IgPSBjYWxsKHN0YXRlLCBpdGVyYXRvckZ1bmN0aW9uLCBpdGVy
YXRvckZ1bmN0aW9uQ2FsbFR5cGUsIGl0ZXJhdG9yRnVuY3Rpb25DYWxsRGF0YSwgaXRlcmFibGUs
IGl0ZXJhdG9yRnVuY3Rpb25Bcmd1bWVudHMpOworICAgIGlmIChzdGF0ZS0+aGFkRXhjZXB0aW9u
KCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlKCk7CisKKyAgICBpZiAoIWl0ZXJhdG9yLmlzT2Jq
ZWN0KCkpIHsKKyAgICAgICAgdGhyb3dUeXBlRXJyb3Ioc3RhdGUpOworICAgICAgICByZXR1cm4g
SlNWYWx1ZSgpOworICAgIH0KKworICAgIHJldHVybiBpdGVyYXRvcjsKK30KKwogfSAvLyBuYW1l
c3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JdGVyYXRvck9w
ZXJhdGlvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9J
dGVyYXRvck9wZXJhdGlvbnMuaAkocmV2aXNpb24gMjA0NDE2KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSXRlcmF0b3JPcGVyYXRpb25zLmgJKHdvcmtpbmcgY29weSkKQEAgLTQx
LDYgKzQxLDMxIEBAIEpTX0VYUE9SVF9QUklWQVRFIEpTT2JqZWN0KiBjcmVhdGVJdGVyYXQKIAog
U3RydWN0dXJlKiBjcmVhdGVJdGVyYXRvclJlc3VsdE9iamVjdFN0cnVjdHVyZShWTSYsIEpTR2xv
YmFsT2JqZWN0Jik7CiAKK0pTVmFsdWUgaXRlcmF0b3JGb3JJdGVyYWJsZShFeGVjU3RhdGUqLCBK
U1ZhbHVlIGl0ZXJhYmxlKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENhbGxCYWNrVHlwZT4KK3Zv
aWQgZm9yRWFjaEluSXRlcmFibGUoRXhlY1N0YXRlKiBzdGF0ZSwgSlNWYWx1ZSBpdGVyYWJsZSwg
Y29uc3QgQ2FsbEJhY2tUeXBlJiBjYWxsYmFjaykKK3sKKyAgICBKU1ZhbHVlIGl0ZXJhdG9yID0g
aXRlcmF0b3JGb3JJdGVyYWJsZShzdGF0ZSwgaXRlcmFibGUpOworICAgIGlmIChzdGF0ZS0+aGFk
RXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybjsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAg
ICBKU1ZhbHVlIG5leHQgPSBpdGVyYXRvclN0ZXAoc3RhdGUsIGl0ZXJhdG9yKTsKKyAgICAgICAg
aWYgKHN0YXRlLT5oYWRFeGNlcHRpb24oKSB8fCBuZXh0LmlzRmFsc2UoKSkKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICBKU1ZhbHVlIG5leHRWYWx1ZSA9IGl0ZXJhdG9yVmFsdWUoc3Rh
dGUsIG5leHQpOworICAgICAgICBpZiAoc3RhdGUtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIGNhbGxiYWNrKHN0YXRlLCBuZXh0VmFsdWUpOworICAgICAg
ICBpZiAoc3RhdGUtPmhhZEV4Y2VwdGlvbigpKSB7CisgICAgICAgICAgICBpdGVyYXRvckNsb3Nl
KHN0YXRlLCBpdGVyYXRvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9
Cit9CisKIH0KIAogI2VuZGlmIC8vICFkZWZpbmVkKEl0ZXJhdG9yT3BlcmF0aW9uc19oKQpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTWFwQ29uc3RydWN0b3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01hcENvbnN0cnVjdG9yLmNw
cAkocmV2aXNpb24gMjA0NDE2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTWFw
Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Myw2MyArNzMsMjYgQEAgc3RhdGlj
IEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29ucwogICAgIGlmIChhZGRlckZ1bmN0aW9u
Q2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUpCiAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwogCi0gICAgSlNWYWx1ZSBpdGVyYXRvckZ1bmN0aW9u
ID0gaXRlcmFibGUuZ2V0KGV4ZWMsIGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5pdGVyYXRvclN5bWJv
bCk7Ci0gICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotCi0gICAgQ2FsbERhdGEgaXRlcmF0b3JGdW5jdGlv
bkNhbGxEYXRhOwotICAgIENhbGxUeXBlIGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9IGdldENh
bGxEYXRhKGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVuY3Rpb25DYWxsRGF0YSk7Ci0gICAg
aWYgKGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9PSBDYWxsVHlwZTo6Tm9uZSkKLSAgICAgICAg
cmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd1R5cGVFcnJvcihleGVjKSk7Ci0KLSAgICBBcmdM
aXN0IGl0ZXJhdG9yRnVuY3Rpb25Bcmd1bWVudHM7Ci0gICAgSlNWYWx1ZSBpdGVyYXRvciA9IGNh
bGwoZXhlYywgaXRlcmF0b3JGdW5jdGlvbiwgaXRlcmF0b3JGdW5jdGlvbkNhbGxUeXBlLCBpdGVy
YXRvckZ1bmN0aW9uQ2FsbERhdGEsIGl0ZXJhYmxlLCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRz
KTsKLSAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0KLSAgICBpZiAoIWl0ZXJhdG9yLmlzT2JqZWN0KCkp
Ci0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwot
Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgSlNWYWx1ZSBuZXh0ID0gaXRlcmF0b3JTdGVw
KGV4ZWMsIGl0ZXJhdG9yKTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAg
ICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQotICAgICAg
ICBpZiAobmV4dC5pc0ZhbHNlKCkpCi0gICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2Rl
KG1hcCk7Ci0KLSAgICAgICAgSlNWYWx1ZSBuZXh0SXRlbSA9IGl0ZXJhdG9yVmFsdWUoZXhlYywg
bmV4dCk7Ci0gICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgIHJl
dHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0KKyAgICBmb3JFYWNoSW5JdGVy
YWJsZShleGVjLCBpdGVyYWJsZSwgW21hcCwgYWRkZXJGdW5jdGlvbiwgJmFkZGVyRnVuY3Rpb25D
YWxsVHlwZSwgJmFkZGVyRnVuY3Rpb25DYWxsRGF0YV0oRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVl
IG5leHRJdGVtKSB7CiAgICAgICAgIGlmICghbmV4dEl0ZW0uaXNPYmplY3QoKSkgewogICAgICAg
ICAgICAgdGhyb3dUeXBlRXJyb3IoZXhlYyk7Ci0gICAgICAgICAgICBpdGVyYXRvckNsb3NlKGV4
ZWMsIGl0ZXJhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBKU1Zh
bHVlIGtleSA9IG5leHRJdGVtLmdldChleGVjLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oMCkpOwot
ICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9y
Q2xvc2UoZXhlYywgaXRlcmF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZShqc1VuZGVmaW5lZCgpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0
aW9uKCkpCisgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9IG5l
eHRJdGVtLmdldChleGVjLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oMSkpOwotICAgICAgICBpZiAo
ZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhlYywg
aXRlcmF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5l
ZCgpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAg
ICAgICAgICByZXR1cm47CiAKICAgICAgICAgTWFya2VkQXJndW1lbnRCdWZmZXIgYXJndW1lbnRz
OwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGtleSk7CiAgICAgICAgIGFyZ3VtZW50cy5hcHBl
bmQodmFsdWUpOwogICAgICAgICBjYWxsKGV4ZWMsIGFkZGVyRnVuY3Rpb24sIGFkZGVyRnVuY3Rp
b25DYWxsVHlwZSwgYWRkZXJGdW5jdGlvbkNhbGxEYXRhLCBtYXAsIGFyZ3VtZW50cyk7Ci0gICAg
ICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkgewotICAgICAgICAgICAgaXRlcmF0b3JDbG9z
ZShleGVjLCBpdGVyYXRvcik7Ci0gICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpz
VW5kZWZpbmVkKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIFJFTEVBU0VfQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgfSk7CisKICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKG1hcCk7CiB9
CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1NldENvbnN0cnVjdG9yLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TZXRDb25zdHJ1
Y3Rvci5jcHAJKHJldmlzaW9uIDIwNDQxNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1NldENvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzQsNDQgKzc0LDEyIEBA
IHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnMKICAgICBpZiAoYWRkZXJG
dW5jdGlvbkNhbGxUeXBlID09IENhbGxUeXBlOjpOb25lKQogICAgICAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9yKGV4ZWMpKTsKIAotICAgIEpTVmFsdWUgaXRlcmF0b3JG
dW5jdGlvbiA9IGl0ZXJhYmxlLmdldChleGVjLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkuaXRlcmF0
b3JTeW1ib2wpOwotICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQotICAgIENhbGxEYXRhIGl0ZXJhdG9y
RnVuY3Rpb25DYWxsRGF0YTsKLSAgICBDYWxsVHlwZSBpdGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUg
PSBnZXRDYWxsRGF0YShpdGVyYXRvckZ1bmN0aW9uLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEp
OwotICAgIGlmIChpdGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUpCi0g
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwotCi0g
ICAgQXJnTGlzdCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzOwotICAgIEpTVmFsdWUgaXRlcmF0
b3IgPSBjYWxsKGV4ZWMsIGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlw
ZSwgaXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhLCBpdGVyYWJsZSwgaXRlcmF0b3JGdW5jdGlvbkFy
Z3VtZW50cyk7Ci0gICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotCi0gICAgaWYgKCFpdGVyYXRvci5pc09i
amVjdCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9yKGV4
ZWMpKTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIEpTVmFsdWUgbmV4dCA9IGl0ZXJh
dG9yU3RlcChleGVjLCBpdGVyYXRvcik7Ci0gICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24o
KSkKLSAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0K
LSAgICAgICAgaWYgKG5leHQuaXNGYWxzZSgpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShzZXQpOwotCi0gICAgICAgIEpTVmFsdWUgbmV4dFZhbHVlID0gaXRlcmF0b3JWYWx1
ZShleGVjLCBuZXh0KTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAg
ICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQorICAgIGZvckVh
Y2hJbkl0ZXJhYmxlKGV4ZWMsIGl0ZXJhYmxlLCBbc2V0LCBhZGRlckZ1bmN0aW9uLCAmYWRkZXJG
dW5jdGlvbkNhbGxUeXBlLCAmYWRkZXJGdW5jdGlvbkNhbGxEYXRhXShFeGVjU3RhdGUqIGV4ZWMs
IEpTVmFsdWUgbmV4dFZhbHVlKSB7CiAgICAgICAgIE1hcmtlZEFyZ3VtZW50QnVmZmVyIGFyZ3Vt
ZW50czsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChuZXh0VmFsdWUpOwogICAgICAgICBjYWxs
KGV4ZWMsIGFkZGVyRnVuY3Rpb24sIGFkZGVyRnVuY3Rpb25DYWxsVHlwZSwgYWRkZXJGdW5jdGlv
bkNhbGxEYXRhLCBzZXQsIGFyZ3VtZW50cyk7Ci0gICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkgewotICAgICAgICAgICAgaXRlcmF0b3JDbG9zZShleGVjLCBpdGVyYXRvcik7Ci0gICAg
ICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwotICAgICAgICB9
Ci0gICAgfQotICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfSk7CisKICAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHNldCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL1dlYWtNYXBDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvV2Vha01hcENvbnN0cnVjdG9yLmNwcAkocmV2aXNp
b24gMjA0NDE2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvV2Vha01hcENvbnN0
cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzEsNjMgKzcxLDI2IEBAIHN0YXRpYyBFbmNv
ZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnMKICAgICBpZiAoYWRkZXJGdW5jdGlvbkNhbGxU
eXBlID09IENhbGxUeXBlOjpOb25lKQogICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRo
cm93VHlwZUVycm9yKGV4ZWMpKTsKIAotICAgIEpTVmFsdWUgaXRlcmF0b3JGdW5jdGlvbiA9IGl0
ZXJhYmxlLmdldChleGVjLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkuaXRlcmF0b3JTeW1ib2wpOwot
ICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVu
Y29kZShqc1VuZGVmaW5lZCgpKTsKLQotICAgIENhbGxEYXRhIGl0ZXJhdG9yRnVuY3Rpb25DYWxs
RGF0YTsKLSAgICBDYWxsVHlwZSBpdGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUgPSBnZXRDYWxsRGF0
YShpdGVyYXRvckZ1bmN0aW9uLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEpOwotICAgIGlmIChp
dGVyYXRvckZ1bmN0aW9uQ2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUpCi0gICAgICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwotCi0gICAgQXJnTGlzdCBp
dGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzOwotICAgIEpTVmFsdWUgaXRlcmF0b3IgPSBjYWxsKGV4
ZWMsIGl0ZXJhdG9yRnVuY3Rpb24sIGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSwgaXRlcmF0b3JG
dW5jdGlvbkNhbGxEYXRhLCBpdGVyYWJsZSwgaXRlcmF0b3JGdW5jdGlvbkFyZ3VtZW50cyk7Ci0g
ICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5j
b2RlKGpzVW5kZWZpbmVkKCkpOwotCi0gICAgaWYgKCFpdGVyYXRvci5pc09iamVjdCgpKQotICAg
ICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9yKGV4ZWMpKTsKLQotICAg
IHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIEpTVmFsdWUgbmV4dCA9IGl0ZXJhdG9yU3RlcChleGVj
LCBpdGVyYXRvcik7Ci0gICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAg
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0KLSAgICAgICAgaWYg
KG5leHQuaXNGYWxzZSgpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh3ZWFr
TWFwKTsKLQotICAgICAgICBKU1ZhbHVlIG5leHRJdGVtID0gaXRlcmF0b3JWYWx1ZShleGVjLCBu
ZXh0KTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKLQorICAgIGZvckVhY2hJbkl0ZXJh
YmxlKGV4ZWMsIGl0ZXJhYmxlLCBbd2Vha01hcCwgYWRkZXJGdW5jdGlvbiwgJmFkZGVyRnVuY3Rp
b25DYWxsVHlwZSwgJmFkZGVyRnVuY3Rpb25DYWxsRGF0YV0oRXhlY1N0YXRlKiBleGVjLCBKU1Zh
bHVlIG5leHRJdGVtKSB7CiAgICAgICAgIGlmICghbmV4dEl0ZW0uaXNPYmplY3QoKSkgewogICAg
ICAgICAgICAgdGhyb3dUeXBlRXJyb3IoZXhlYyk7Ci0gICAgICAgICAgICBpdGVyYXRvckNsb3Nl
KGV4ZWMsIGl0ZXJhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNV
bmRlZmluZWQoKSk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBK
U1ZhbHVlIGtleSA9IG5leHRJdGVtLmdldChleGVjLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oMCkp
OwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJh
dG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVu
Y29kZShqc1VuZGVmaW5lZCgpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAoZXhlYy0+aGFkRXhj
ZXB0aW9uKCkpCisgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9
IG5leHRJdGVtLmdldChleGVjLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oMSkpOwotICAgICAgICBp
ZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yQ2xvc2UoZXhl
YywgaXRlcmF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVm
aW5lZCgpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisg
ICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgTWFya2VkQXJndW1lbnRCdWZmZXIgYXJndW1l
bnRzOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGtleSk7CiAgICAgICAgIGFyZ3VtZW50cy5h
cHBlbmQodmFsdWUpOwogICAgICAgICBjYWxsKGV4ZWMsIGFkZGVyRnVuY3Rpb24sIGFkZGVyRnVu
Y3Rpb25DYWxsVHlwZSwgYWRkZXJGdW5jdGlvbkNhbGxEYXRhLCB3ZWFrTWFwLCBhcmd1bWVudHMp
OwotICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgIGl0ZXJh
dG9yQ2xvc2UoZXhlYywgaXRlcmF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVu
Y29kZShqc1VuZGVmaW5lZCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBSRUxFQVNFX0FTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIH0pOworCiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh3
ZWFrTWFwKTsKIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvV2Vha1Nl
dENvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9XZWFrU2V0Q29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiAyMDQ0MTYpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9XZWFrU2V0Q29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC03MSw0NCArNzEsMTIgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NB
TEwgY29ucwogICAgIGlmIChhZGRlckZ1bmN0aW9uQ2FsbFR5cGUgPT0gQ2FsbFR5cGU6Ok5vbmUp
CiAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwog
Ci0gICAgSlNWYWx1ZSBpdGVyYXRvckZ1bmN0aW9uID0gaXRlcmFibGUuZ2V0KGV4ZWMsIGV4ZWMt
PnByb3BlcnR5TmFtZXMoKS5pdGVyYXRvclN5bWJvbCk7Ci0gICAgaWYgKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwot
Ci0gICAgQ2FsbERhdGEgaXRlcmF0b3JGdW5jdGlvbkNhbGxEYXRhOwotICAgIENhbGxUeXBlIGl0
ZXJhdG9yRnVuY3Rpb25DYWxsVHlwZSA9IGdldENhbGxEYXRhKGl0ZXJhdG9yRnVuY3Rpb24sIGl0
ZXJhdG9yRnVuY3Rpb25DYWxsRGF0YSk7Ci0gICAgaWYgKGl0ZXJhdG9yRnVuY3Rpb25DYWxsVHlw
ZSA9PSBDYWxsVHlwZTo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJv
d1R5cGVFcnJvcihleGVjKSk7Ci0KLSAgICBBcmdMaXN0IGl0ZXJhdG9yRnVuY3Rpb25Bcmd1bWVu
dHM7Ci0gICAgSlNWYWx1ZSBpdGVyYXRvciA9IGNhbGwoZXhlYywgaXRlcmF0b3JGdW5jdGlvbiwg
aXRlcmF0b3JGdW5jdGlvbkNhbGxUeXBlLCBpdGVyYXRvckZ1bmN0aW9uQ2FsbERhdGEsIGl0ZXJh
YmxlLCBpdGVyYXRvckZ1bmN0aW9uQXJndW1lbnRzKTsKLSAgICBpZiAoZXhlYy0+aGFkRXhjZXB0
aW9uKCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0K
LSAgICBpZiAoIWl0ZXJhdG9yLmlzT2JqZWN0KCkpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUodGhyb3dUeXBlRXJyb3IoZXhlYykpOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgSlNWYWx1ZSBuZXh0ID0gaXRlcmF0b3JTdGVwKGV4ZWMsIGl0ZXJhdG9yKTsKLSAgICAgICAg
aWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVu
Y29kZShqc1VuZGVmaW5lZCgpKTsKLQotICAgICAgICBpZiAobmV4dC5pc0ZhbHNlKCkpCi0gICAg
ICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHdlYWtTZXQpOwotCi0gICAgICAgIEpTVmFs
dWUgbmV4dFZhbHVlID0gaXRlcmF0b3JWYWx1ZShleGVjLCBuZXh0KTsKLSAgICAgICAgaWYgKGV4
ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShq
c1VuZGVmaW5lZCgpKTsKLQorICAgIGZvckVhY2hJbkl0ZXJhYmxlKGV4ZWMsIGl0ZXJhYmxlLCBb
d2Vha1NldCwgYWRkZXJGdW5jdGlvbiwgJmFkZGVyRnVuY3Rpb25DYWxsVHlwZSwgJmFkZGVyRnVu
Y3Rpb25DYWxsRGF0YV0oRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIG5leHRWYWx1ZSkgewogICAg
ICAgICBNYXJrZWRBcmd1bWVudEJ1ZmZlciBhcmd1bWVudHM7CiAgICAgICAgIGFyZ3VtZW50cy5h
cHBlbmQobmV4dFZhbHVlKTsKICAgICAgICAgY2FsbChleGVjLCBhZGRlckZ1bmN0aW9uLCBhZGRl
ckZ1bmN0aW9uQ2FsbFR5cGUsIGFkZGVyRnVuY3Rpb25DYWxsRGF0YSwgd2Vha1NldCwgYXJndW1l
bnRzKTsKLSAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICBp
dGVyYXRvckNsb3NlKGV4ZWMsIGl0ZXJhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUoanNVbmRlZmluZWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgUkVMRUFTRV9B
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9KTsKKwogICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUod2Vha1NldCk7CiB9CiAK
</data>
<flag name="review"
          id="309557"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>