<?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>206986</bug_id>
          
          <creation_ts>2020-01-29 22:02:02 -0800</creation_ts>
          <short_desc>[JSC] Remove unnecessary allocations in BytecodeBasicBlock</short_desc>
          <delta_ts>2020-01-30 14:33:59 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</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="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>ews-watchlist</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1612861</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-29 22:02:02 -0800</bug_when>
    <thetext>[JSC] Remove unnecessary allocations in BytecodeBasicBlock</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1612862</commentid>
    <comment_count>1</comment_count>
      <attachid>389229</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-29 22:09:37 -0800</bug_when>
    <thetext>Created attachment 389229
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613100</commentid>
    <comment_count>2</comment_count>
      <attachid>389229</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-30 12:55:49 -0800</bug_when>
    <thetext>Comment on attachment 389229
Patch

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

r=me with comments.

&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.cpp:38
&gt; +inline BytecodeBasicBlock::BytecodeBasicBlock(const InstructionStream::Ref&amp; instruction, unsigned index)

I recommend renaming index to blockIndex to make it clear that it&apos;s not the instruction index.

&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.cpp:46
&gt; +inline BytecodeBasicBlock::BytecodeBasicBlock(BytecodeBasicBlock::SpecialBlockType blockType, unsigned index)

Ditto.

&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h:53
&gt; +    BytecodeBasicBlock(const InstructionStream::Ref&amp;, unsigned);
&gt; +    BytecodeBasicBlock(SpecialBlockType, unsigned);

I recommend naming the unsigned params as blockIndex to document their intended use.
I also recommend explicitly declaring these as inline.  That will help the compiler error out immediately if any clients try to use these, rather than waiting for the linker to find the error.

Alternatively, make these private and declare the Vector template a friend (is that possible?) since they are only intended to be constructed in a Vector.

&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h:71
&gt; +    explicit operator bool() const { return true; }

Why do we need this?

My understanding is that this is only needed by the Vector implementation, and that it should always return true because we&apos;ll never have an &quot;empty&quot; BytecodeBasicBlock in the Vectors that we use it in.  If this is correct, can you add a comment to document that?  I this logic is not necessarily obvious.

&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h:82
&gt; +    void addLength(unsigned length);

nit: the length param name seems obvious and therefore, is probably not needed.

&gt; Source/JavaScriptCore/bytecode/Opcode.h:91
&gt; +#define CALCULATE_MAX_LENGTH(id, length) length,

This appears to be unused.  Please remove.

&gt; Source/JavaScriptCore/bytecode/Opcode.h:94
&gt; +#undef CALCULATE_MAX_LENGTH

Ditto.  Please remove.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613146</commentid>
    <comment_count>3</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-30 14:32:55 -0800</bug_when>
    <thetext>Committed r255459: &lt;https://trac.webkit.org/changeset/255459&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613147</commentid>
    <comment_count>4</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-01-30 14:33:16 -0800</bug_when>
    <thetext>&lt;rdar://problem/59042458&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1613149</commentid>
    <comment_count>5</comment_count>
      <attachid>389229</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-30 14:33:59 -0800</bug_when>
    <thetext>Comment on attachment 389229
Patch

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

&gt;&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.cpp:38
&gt;&gt; +inline BytecodeBasicBlock::BytecodeBasicBlock(const InstructionStream::Ref&amp; instruction, unsigned index)
&gt; 
&gt; I recommend renaming index to blockIndex to make it clear that it&apos;s not the instruction index.

Fixed.

&gt;&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.cpp:46
&gt;&gt; +inline BytecodeBasicBlock::BytecodeBasicBlock(BytecodeBasicBlock::SpecialBlockType blockType, unsigned index)
&gt; 
&gt; Ditto.

Fixed.

&gt;&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h:53
&gt;&gt; +    BytecodeBasicBlock(SpecialBlockType, unsigned);
&gt; 
&gt; I recommend naming the unsigned params as blockIndex to document their intended use.
&gt; I also recommend explicitly declaring these as inline.  That will help the compiler error out immediately if any clients try to use these, rather than waiting for the linker to find the error.
&gt; 
&gt; Alternatively, make these private and declare the Vector template a friend (is that possible?) since they are only intended to be constructed in a Vector.

putting inline looks better since it does not need to deal with weird Vector&lt;&gt; + friend class/function declaration. Fixed.

&gt;&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h:71
&gt;&gt; +    explicit operator bool() const { return true; }
&gt; 
&gt; Why do we need this?
&gt; 
&gt; My understanding is that this is only needed by the Vector implementation, and that it should always return true because we&apos;ll never have an &quot;empty&quot; BytecodeBasicBlock in the Vectors that we use it in.  If this is correct, can you add a comment to document that?  I this logic is not necessarily obvious.

This is required for IndexedContainerIterator::findNext.

&gt;&gt; Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h:82
&gt;&gt; +    void addLength(unsigned length);
&gt; 
&gt; nit: the length param name seems obvious and therefore, is probably not needed.

Removed.

&gt;&gt; Source/JavaScriptCore/bytecode/Opcode.h:91
&gt;&gt; +#define CALCULATE_MAX_LENGTH(id, length) length,
&gt; 
&gt; This appears to be unused.  Please remove.

Nice, removed.

&gt;&gt; Source/JavaScriptCore/bytecode/Opcode.h:94
&gt;&gt; +#undef CALCULATE_MAX_LENGTH
&gt; 
&gt; Ditto.  Please remove.

Removed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>389229</attachid>
            <date>2020-01-29 22:09:37 -0800</date>
            <delta_ts>2020-01-30 12:55:49 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-206986-20200129220936.patch</filename>
            <type>text/plain</type>
            <size>48525</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU1MzcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBj
NWY1MDc3NjZmNDRiNzdhN2E4ZmEzMDMwYmFmOWQyZmRhNzU1ZWYwLi5lNWI5Zjc0NjY3YjFhZWRi
MTJhMDQ5YTllNzFjMGRmYTFiMjUxZDkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw3OSBAQAorMjAyMC0wMS0yOSAgWXVzdWtlIFN1enVraSAgPHlzdXp1a2lAYXBwbGUuY29t
PgorCisgICAgICAgIFtKU0NdIFJlbW92ZSB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9ucyBpbiBCeXRl
Y29kZUJhc2ljQmxvY2sKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTIwNjk4NgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFdlIGtub3cgdGhhdCBCeXRlY29kZUJhc2ljQmxvY2sgaXRzZWxmIHRha2VzIDJNQiBp
biBHbWFpbC4gQW5kIGVhY2ggQnl0ZWNvZGVCYXNpY0Jsb2NrIGhhcyBWZWN0b3I8dW5zaWduZWQ+
CisgICAgICAgIGFuZCBWZWN0b3I8Qnl0ZWNvZGVCYXNpY0Jsb2NrKj4uCisKKyAgICAgICAgQnl0
ZWNvZGVCYXNpY0Jsb2NrIGhvbGRzIGFsbCB0aGUgb2Zmc2V0IHBlciBieXRlY29kZSBhcyB1bnNp
Z25lZCBpbiBtX29mZnNldHMuIEJ1dCB0aGlzIG9mZnNldCBpcworICAgICAgICBvbmx5IHVzZWQg
d2hlbiByZXZlcnNlIGl0ZXJhdGluZyBhIGJ5dGVjb2RlIGluIGEgQnl0ZWNvZGVCYXNpY0Jsb2Nr
LiBXZSBjYW4gaG9sZCBhIGxlbmd0aCBvZiBlYWNoCisgICAgICAgIGJ5dGVjb2RlIGluc3RlYWQs
IHdoaWNoIGlzIG11Y2ggc21hbGxlciAodW5zaWduZWQgdi5zLiB1aW50OF90KS4KKworICAgICAg
ICBTaW5jZSBlYWNoIEJ5dGVjb2RlQmFzaWNCbG9jayBoYXMgaW5kZXgsIHdlIHNob3VsZCBob2xk
IHN1Y2Nlc3NvcnMgaW4gVmVjdG9yPHVuc2lnbmVkPiBpbnN0ZWFkIG9mIFZlY3RvcjxCeXRlY29k
ZUJhc2ljQmxvY2sqPi4KKworICAgICAgICBXZSBhcmUgYWxzbyBhbGxvY2F0aW5nIEJ5dGVjb2Rl
QmFzaWNCbG9jayBpbiBtYWtlVW5pcXVlPD4gYW5kIGhhdmluZyB0aGVtIGluIFZlY3RvcjxzdGQ6
OnVuaXF1ZV9wdHI8Qnl0ZWNvZGVCYXNpY0Jsb2NrPj4uCisgICAgICAgIEJ1dCB0aGlzIGlzIG5v
dCBuZWNlc3Nhcnkgc2luY2Ugb25seSBCeXRlY29kZUJhc2ljQmxvY2s6OmNvbXB1dGUgY2FuIG1v
ZGlmeSB0aGlzIHZlY3Rvci4gV2Ugc2hvdWxkIGdlbmVyYXRlIFZlY3RvcjxCeXRlY29kZUJhc2lj
QmxvY2s+CisgICAgICAgIGZyb20gQnl0ZWNvZGVCYXNpY0Jsb2NrOjpjb21wdXRlLgorCisgICAg
ICAgIFdlIGFyZSBhbHNvIHBsYW5uaW5nIHB1cmdpbmcgQnl0ZWNvZGVCYXNpY0Jsb2NrIGluIFVu
bGlua2VkQ29kZUJsb2NrIGlmIGl0IGlzIG5vdCB1c2VkIHNvIG11Y2guIEJ1dCB0aGlzIHdpbGwg
YmUgZG9uZSBpbiBhIHNlcGFyYXRlIHBhdGNoLgorCisgICAgICAgICogYnl0ZWNvZGUvQnl0ZWNv
ZGVCYXNpY0Jsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVCYXNpY0Jsb2NrOjpCeXRl
Y29kZUJhc2ljQmxvY2spOgorICAgICAgICAoSlNDOjpCeXRlY29kZUJhc2ljQmxvY2s6OmFkZExl
bmd0aCk6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlQmFzaWNCbG9jazo6c2hyaW5rVG9GaXQpOgor
ICAgICAgICAoSlNDOjpCeXRlY29kZUJhc2ljQmxvY2s6OmNvbXB1dGVJbXBsKToKKyAgICAgICAg
KEpTQzo6Qnl0ZWNvZGVCYXNpY0Jsb2NrOjpjb21wdXRlKToKKyAgICAgICAgKiBieXRlY29kZS9C
eXRlY29kZUJhc2ljQmxvY2suaDoKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVCYXNpY0Jsb2NrOjpk
ZWx0YSBjb25zdCk6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlQmFzaWNCbG9jazo6c3VjY2Vzc29y
cyBjb25zdCk6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlQmFzaWNCbG9jazo6b3BlcmF0b3IgYm9v
bCBjb25zdCk6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlQmFzaWNCbG9jazo6YWRkU3VjY2Vzc29y
KToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVCYXNpY0Jsb2NrOjpvZmZzZXRzIGNvbnN0KTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVCYXNpY0Jsb2NrOjogY29uc3QpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpCeXRlY29kZUJhc2ljQmxvY2s6OkJ5dGVjb2RlQmFzaWNCbG9jayk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkJ5dGVjb2RlQmFzaWNCbG9jazo6YWRkTGVuZ3RoKTog
RGVsZXRlZC4KKyAgICAgICAgKiBieXRlY29kZS9CeXRlY29kZUdlbmVyYXRvcmlmaWNhdGlvbi5j
cHA6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlR2VuZXJhdG9yaWZpY2F0aW9uOjpCeXRlY29kZUdl
bmVyYXRvcmlmaWNhdGlvbik6CisgICAgICAgICogYnl0ZWNvZGUvQnl0ZWNvZGVHcmFwaC5oOgor
ICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBoOjpibG9ja0NvbnRhaW5zQnl0ZWNvZGVPZmZzZXQp
OgorICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBoOjpmaW5kQmFzaWNCbG9ja0ZvckJ5dGVjb2Rl
T2Zmc2V0KToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHcmFwaDo6ZmluZEJhc2ljQmxvY2tXaXRo
TGVhZGVyT2Zmc2V0KToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHcmFwaDo6YXQgY29uc3QpOgor
ICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBoOjpvcGVyYXRvcltdIGNvbnN0KToKKyAgICAgICAg
KEpTQzo6Qnl0ZWNvZGVHcmFwaDo6YmVnaW4pOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBo
OjplbmQpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBoOjpmaXJzdCk6CisgICAgICAgIChK
U0M6OkJ5dGVjb2RlR3JhcGg6Omxhc3QpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBoOjpC
eXRlY29kZUdyYXBoKToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVHcmFwaDo6YmVnaW4gY29uc3Qp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCeXRlY29kZUdyYXBoOjplbmQgY29uc3QpOiBEZWxl
dGVkLgorICAgICAgICAqIGJ5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNpcy5jcHA6Cisg
ICAgICAgIChKU0M6OkJ5dGVjb2RlTGl2ZW5lc3NBbmFseXNpczo6Z2V0TGl2ZW5lc3NJbmZvQXRC
eXRlY29kZUluZGV4KToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzOjpj
b21wdXRlRnVsbExpdmVuZXNzKToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVMaXZlbmVzc0FuYWx5
c2lzOjpjb21wdXRlS2lsbHMpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUxpdmVuZXNzQW5hbHlz
aXM6OmR1bXBSZXN1bHRzKToKKyAgICAgICAgKiBieXRlY29kZS9CeXRlY29kZUxpdmVuZXNzQW5h
bHlzaXMuaDoKKyAgICAgICAgKiBieXRlY29kZS9CeXRlY29kZUxpdmVuZXNzQW5hbHlzaXNJbmxp
bmVzLmg6CisgICAgICAgIChKU0M6OkJ5dGVjb2RlTGl2ZW5lc3NQcm9wYWdhdGlvbjo6Y29tcHV0
ZUxvY2FsTGl2ZW5lc3NGb3JCeXRlY29kZUluZGV4KToKKyAgICAgICAgKEpTQzo6Qnl0ZWNvZGVM
aXZlbmVzc1Byb3BhZ2F0aW9uOjpjb21wdXRlTG9jYWxMaXZlbmVzc0ZvckJsb2NrKToKKyAgICAg
ICAgKEpTQzo6Qnl0ZWNvZGVMaXZlbmVzc1Byb3BhZ2F0aW9uOjpnZXRMaXZlbmVzc0luZm9BdEJ5
dGVjb2RlSW5kZXgpOgorICAgICAgICAoSlNDOjpCeXRlY29kZUxpdmVuZXNzUHJvcGFnYXRpb246
OnJ1bkxpdmVuZXNzRml4cG9pbnQpOgorICAgICAgICAqIGJ5dGVjb2RlL0luc3RydWN0aW9uU3Ry
ZWFtLmg6CisgICAgICAgIChKU0M6Okluc3RydWN0aW9uU3RyZWFtOjpNdXRhYmxlUmVmOjpvcGVy
YXRvci0+IGNvbnN0KToKKyAgICAgICAgKEpTQzo6SW5zdHJ1Y3Rpb25TdHJlYW06Ok11dGFibGVS
ZWY6OnB0ciBjb25zdCk6CisgICAgICAgIChKU0M6Okluc3RydWN0aW9uU3RyZWFtOjpNdXRhYmxl
UmVmOjp1bndyYXAgY29uc3QpOgorICAgICAgICAqIGJ5dGVjb2RlL09wY29kZS5oOgorICAgICAg
ICAqIGdlbmVyYXRvci9TZWN0aW9uLnJiOgorICAgICAgICAqIGppdC9KSVQuY3BwOgorICAgICAg
ICAoSlNDOjpKSVQ6OnByaXZhdGVDb21waWxlTWFpblBhc3MpOgorICAgICAgICAqIGxsaW50L0xM
SW50RGF0YS5jcHA6CisgICAgICAgIChKU0M6OkxMSW50Ojppbml0aWFsaXplKToKKyAgICAgICAg
KiBsbGludC9Mb3dMZXZlbEludGVycHJldGVyLmNwcDoKKyAgICAgICAgKEpTQzo6Q0xvb3A6OmV4
ZWN1dGUpOgorCiAyMDIwLTAxLTI4ICBZdXN1a2UgU3V6dWtpICA8eXN1enVraUBhcHBsZS5jb20+
CiAKICAgICAgICAgW0pTQ10gR2l2ZSB1cCBJQyB3aGVuIHVua25vd24gc3RydWN0dXJlIHRyYW5z
aXRpb24gaGFwcGVucwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L0J5dGVjb2RlQmFzaWNCbG9jay5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUv
Qnl0ZWNvZGVCYXNpY0Jsb2NrLmNwcAppbmRleCBhNGZlZTY2MTY3MmE5YzQ0NTQzNGUxNDI3NTgy
OGVjNDBkMDk1NWEyLi43YzU5ZmRjMGI2MzNiNDI1YTI5ODg0ZDA2NDgxNTU0MzEyOTQ5MDM5IDEw
MDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVCYXNpY0Js
b2NrLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVCYXNp
Y0Jsb2NrLmNwcApAQCAtMzUsOSArMzUsMzAgQEAgbmFtZXNwYWNlIEpTQyB7CiAKIERFRklORV9B
TExPQ0FUT1JfV0lUSF9IRUFQX0lERU5USUZJRVIoQnl0ZWNvZGVCYXNpY0Jsb2NrKTsKIAoraW5s
aW5lIEJ5dGVjb2RlQmFzaWNCbG9jazo6Qnl0ZWNvZGVCYXNpY0Jsb2NrKGNvbnN0IEluc3RydWN0
aW9uU3RyZWFtOjpSZWYmIGluc3RydWN0aW9uLCB1bnNpZ25lZCBpbmRleCkKKyAgICA6IG1fbGVh
ZGVyT2Zmc2V0KGluc3RydWN0aW9uLm9mZnNldCgpKQorICAgICwgbV90b3RhbExlbmd0aCgwKQor
ICAgICwgbV9pbmRleChpbmRleCkKK3sKKyAgICBhZGRMZW5ndGgoaW5zdHJ1Y3Rpb24tPnNpemUo
KSk7Cit9CisKK2lubGluZSBCeXRlY29kZUJhc2ljQmxvY2s6OkJ5dGVjb2RlQmFzaWNCbG9jayhC
eXRlY29kZUJhc2ljQmxvY2s6OlNwZWNpYWxCbG9ja1R5cGUgYmxvY2tUeXBlLCB1bnNpZ25lZCBp
bmRleCkKKyAgICA6IG1fbGVhZGVyT2Zmc2V0KGJsb2NrVHlwZSA9PSBCeXRlY29kZUJhc2ljQmxv
Y2s6OkVudHJ5QmxvY2sgPyAwIDogVUlOVF9NQVgpCisgICAgLCBtX3RvdGFsTGVuZ3RoKGJsb2Nr
VHlwZSA9PSBCeXRlY29kZUJhc2ljQmxvY2s6OkVudHJ5QmxvY2sgPyAwIDogVUlOVF9NQVgpCisg
ICAgLCBtX2luZGV4KGluZGV4KQoreworfQorCitpbmxpbmUgdm9pZCBCeXRlY29kZUJhc2ljQmxv
Y2s6OmFkZExlbmd0aCh1bnNpZ25lZCBieXRlY29kZUxlbmd0aCkKK3sKKyAgICBtX2RlbHRhLmFw
cGVuZChieXRlY29kZUxlbmd0aCk7CisgICAgbV90b3RhbExlbmd0aCArPSBieXRlY29kZUxlbmd0
aDsKK30KKwogdm9pZCBCeXRlY29kZUJhc2ljQmxvY2s6OnNocmlua1RvRml0KCkKIHsKLSAgICBt
X29mZnNldHMuc2hyaW5rVG9GaXQoKTsKKyAgICBtX2RlbHRhLnNocmlua1RvRml0KCk7CiAgICAg
bV9zdWNjZXNzb3JzLnNocmlua1RvRml0KCk7CiB9CiAKQEAgLTUwLDc2ICs3MSw4MCBAQCBzdGF0
aWMgYm9vbCBpc0p1bXBUYXJnZXQoT3Bjb2RlSUQgb3Bjb2RlSUQsIGNvbnN0IFZlY3RvcjxJbnN0
cnVjdGlvblN0cmVhbTo6T2ZmcwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBCbG9jaz4KLXZvaWQg
Qnl0ZWNvZGVCYXNpY0Jsb2NrOjpjb21wdXRlSW1wbChCbG9jayogY29kZUJsb2NrLCBjb25zdCBJ
bnN0cnVjdGlvblN0cmVhbSYgaW5zdHJ1Y3Rpb25zLCBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJ5
dGVjb2RlQmFzaWNCbG9jaz4+JiBiYXNpY0Jsb2NrcykKK2F1dG8gQnl0ZWNvZGVCYXNpY0Jsb2Nr
Ojpjb21wdXRlSW1wbChCbG9jayogY29kZUJsb2NrLCBjb25zdCBJbnN0cnVjdGlvblN0cmVhbSYg
aW5zdHJ1Y3Rpb25zKSAtPiBCYXNpY0Jsb2NrVmVjdG9yCiB7CisgICAgQmFzaWNCbG9ja1ZlY3Rv
ciBiYXNpY0Jsb2NrczsKICAgICBWZWN0b3I8SW5zdHJ1Y3Rpb25TdHJlYW06Ok9mZnNldCwgMzI+
IGp1bXBUYXJnZXRzOwogICAgIGNvbXB1dGVQcmVjaXNlSnVtcFRhcmdldHMoY29kZUJsb2NrLCBp
bnN0cnVjdGlvbnMsIGp1bXBUYXJnZXRzKTsKIAotICAgIGF1dG8gYXBwZW5kQmxvY2sgPSBbJl0g
KHN0ZDo6dW5pcXVlX3B0cjxCeXRlY29kZUJhc2ljQmxvY2s+JiYgYmxvY2spIHsKLSAgICAgICAg
YmxvY2stPm1faW5kZXggPSBiYXNpY0Jsb2Nrcy5zaXplKCk7Ci0gICAgICAgIGJhc2ljQmxvY2tz
LmFwcGVuZChXVEZNb3ZlKGJsb2NrKSk7Ci0gICAgfTsKLQotICAgIGF1dG8gbGlua0Jsb2NrcyA9
IFsmXSAoQnl0ZWNvZGVCYXNpY0Jsb2NrKiBmcm9tLCBCeXRlY29kZUJhc2ljQmxvY2sqIHRvKSB7
Ci0gICAgICAgIGZyb20tPmFkZFN1Y2Nlc3Nvcih0byk7CisgICAgYXV0byBsaW5rQmxvY2tzID0g
WyZdIChCeXRlY29kZUJhc2ljQmxvY2smIGZyb20sIEJ5dGVjb2RlQmFzaWNCbG9jayYgdG8pIHsK
KyAgICAgICAgZnJvbS5hZGRTdWNjZXNzb3IodG8pOwogICAgIH07CiAKLSAgICAvLyBDcmVhdGUg
dGhlIGVudHJ5IGFuZCBleGl0IGJhc2ljIGJsb2Nrcy4KLSAgICBiYXNpY0Jsb2Nrcy5yZXNlcnZl
Q2FwYWNpdHkoanVtcFRhcmdldHMuc2l6ZSgpICsgMik7Ci0KLSAgICBhdXRvIGVudHJ5ID0gbWFr
ZVVuaXF1ZTxCeXRlY29kZUJhc2ljQmxvY2s+KEJ5dGVjb2RlQmFzaWNCbG9jazo6RW50cnlCbG9j
ayk7Ci0gICAgYXV0byBmaXJzdEJsb2NrID0gbWFrZVVuaXF1ZTxCeXRlY29kZUJhc2ljQmxvY2s+
KEJ5dGVjb2RlQmFzaWNCbG9jazo6RW50cnlCbG9jayk7Ci0gICAgbGlua0Jsb2NrcyhlbnRyeS5n
ZXQoKSwgZmlyc3RCbG9jay5nZXQoKSk7CisgICAgeworICAgICAgICAvLyBDcmVhdGUgdGhlIGVu
dHJ5IGFuZCBleGl0IGJhc2ljIGJsb2Nrcy4KKyAgICAgICAgYmFzaWNCbG9ja3MucmVzZXJ2ZUNh
cGFjaXR5KGp1bXBUYXJnZXRzLnNpemUoKSArIDIpOworICAgICAgICB7CisgICAgICAgICAgICAv
LyBFbnRyeSBibG9jay4KKyAgICAgICAgICAgIGJhc2ljQmxvY2tzLmNvbnN0cnVjdEFuZEFwcGVu
ZChCeXRlY29kZUJhc2ljQmxvY2s6OkVudHJ5QmxvY2ssIGJhc2ljQmxvY2tzLnNpemUoKSk7Cisg
ICAgICAgICAgICAvLyBGaXJzdCBibG9jay4KKyAgICAgICAgICAgIGJhc2ljQmxvY2tzLmNvbnN0
cnVjdEFuZEFwcGVuZChCeXRlY29kZUJhc2ljQmxvY2s6OkVudHJ5QmxvY2ssIGJhc2ljQmxvY2tz
LnNpemUoKSk7CisgICAgICAgICAgICBsaW5rQmxvY2tzKGJhc2ljQmxvY2tzWzBdLCBiYXNpY0Js
b2Nrc1sxXSk7CisgICAgICAgIH0KIAotICAgIGFwcGVuZEJsb2NrKFdURk1vdmUoZW50cnkpKTsK
LSAgICBCeXRlY29kZUJhc2ljQmxvY2sqIGN1cnJlbnQgPSBmaXJzdEJsb2NrLmdldCgpOwotICAg
IGFwcGVuZEJsb2NrKFdURk1vdmUoZmlyc3RCbG9jaykpOworICAgICAgICBCeXRlY29kZUJhc2lj
QmxvY2sqIGN1cnJlbnQgPSAmYmFzaWNCbG9ja3MubGFzdCgpOworICAgICAgICBhdXRvIGFwcGVu
ZEJsb2NrID0gWyZdIChjb25zdCBJbnN0cnVjdGlvblN0cmVhbTo6UmVmJiBpbnN0cnVjdGlvbikg
LT4gQnl0ZWNvZGVCYXNpY0Jsb2NrKiB7CisgICAgICAgICAgICBiYXNpY0Jsb2Nrcy5jb25zdHJ1
Y3RBbmRBcHBlbmQoaW5zdHJ1Y3Rpb24sIGJhc2ljQmxvY2tzLnNpemUoKSk7CisgICAgICAgICAg
ICByZXR1cm4gJmJhc2ljQmxvY2tzLmxhc3QoKTsKKyAgICAgICAgfTsKKyAgICAgICAgYm9vbCBu
ZXh0SW5zdHJ1Y3Rpb25Jc0xlYWRlciA9IGZhbHNlOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8m
IGluc3RydWN0aW9uIDogaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBhdXRvIGJ5dGVjb2Rl
T2Zmc2V0ID0gaW5zdHJ1Y3Rpb24ub2Zmc2V0KCk7CisgICAgICAgICAgICBPcGNvZGVJRCBvcGNv
ZGVJRCA9IGluc3RydWN0aW9uLT5vcGNvZGVJRCgpOwogCi0gICAgYXV0byBleGl0ID0gbWFrZVVu
aXF1ZTxCeXRlY29kZUJhc2ljQmxvY2s+KEJ5dGVjb2RlQmFzaWNCbG9jazo6RXhpdEJsb2NrKTsK
KyAgICAgICAgICAgIGJvb2wgY3JlYXRlZEJsb2NrID0gZmFsc2U7CisgICAgICAgICAgICAvLyBJ
ZiB0aGUgY3VycmVudCBieXRlY29kZSBpcyBhIGp1bXAgdGFyZ2V0LCB0aGVuIGl0J3MgdGhlIGxl
YWRlciBvZiBpdHMgb3duIGJhc2ljIGJsb2NrLgorICAgICAgICAgICAgaWYgKG5leHRJbnN0cnVj
dGlvbklzTGVhZGVyIHx8IGlzSnVtcFRhcmdldChvcGNvZGVJRCwganVtcFRhcmdldHMsIGJ5dGVj
b2RlT2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBhcHBlbmRCbG9jayhpbnN0
cnVjdGlvbik7CisgICAgICAgICAgICAgICAgY3JlYXRlZEJsb2NrID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICBuZXh0SW5zdHJ1Y3Rpb25Jc0xlYWRlciA9IGZhbHNlOworICAgICAgICAgICAgfQog
Ci0gICAgYm9vbCBuZXh0SW5zdHJ1Y3Rpb25Jc0xlYWRlciA9IGZhbHNlOworICAgICAgICAgICAg
Ly8gSWYgdGhlIGN1cnJlbnQgYnl0ZWNvZGUgaXMgYSBicmFuY2ggb3IgYSByZXR1cm4sIHRoZW4g
dGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgdGhlIGxlYWRlciBvZiBpdHMgb3duIGJhc2ljIGJsb2Nr
LgorICAgICAgICAgICAgaWYgKGlzQnJhbmNoKG9wY29kZUlEKSB8fCBpc1Rlcm1pbmFsKG9wY29k
ZUlEKSB8fCBpc1Rocm93KG9wY29kZUlEKSkKKyAgICAgICAgICAgICAgICBuZXh0SW5zdHJ1Y3Rp
b25Jc0xlYWRlciA9IHRydWU7CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGluc3RydWN0aW9uIDog
aW5zdHJ1Y3Rpb25zKSB7Ci0gICAgICAgIGF1dG8gYnl0ZWNvZGVPZmZzZXQgPSBpbnN0cnVjdGlv
bi5vZmZzZXQoKTsKLSAgICAgICAgT3Bjb2RlSUQgb3Bjb2RlSUQgPSBpbnN0cnVjdGlvbi0+b3Bj
b2RlSUQoKTsKKyAgICAgICAgICAgIGlmIChjcmVhdGVkQmxvY2spCisgICAgICAgICAgICAgICAg
Y29udGludWU7CiAKLSAgICAgICAgYm9vbCBjcmVhdGVkQmxvY2sgPSBmYWxzZTsKLSAgICAgICAg
Ly8gSWYgdGhlIGN1cnJlbnQgYnl0ZWNvZGUgaXMgYSBqdW1wIHRhcmdldCwgdGhlbiBpdCdzIHRo
ZSBsZWFkZXIgb2YgaXRzIG93biBiYXNpYyBibG9jay4KLSAgICAgICAgaWYgKGlzSnVtcFRhcmdl
dChvcGNvZGVJRCwganVtcFRhcmdldHMsIGJ5dGVjb2RlT2Zmc2V0KSB8fCBuZXh0SW5zdHJ1Y3Rp
b25Jc0xlYWRlcikgewotICAgICAgICAgICAgYXV0byBuZXdCbG9jayA9IG1ha2VVbmlxdWU8Qnl0
ZWNvZGVCYXNpY0Jsb2NrPihpbnN0cnVjdGlvbik7Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV3
QmxvY2suZ2V0KCk7Ci0gICAgICAgICAgICBhcHBlbmRCbG9jayhXVEZNb3ZlKG5ld0Jsb2NrKSk7
Ci0gICAgICAgICAgICBjcmVhdGVkQmxvY2sgPSB0cnVlOwotICAgICAgICAgICAgbmV4dEluc3Ry
dWN0aW9uSXNMZWFkZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwganVzdCBh
ZGQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBibG9jay4KKyAgICAgICAgICAgIGN1cnJl
bnQtPmFkZExlbmd0aChpbnN0cnVjdGlvbi0+c2l6ZSgpKTsKICAgICAgICAgfQotCi0gICAgICAg
IC8vIElmIHRoZSBjdXJyZW50IGJ5dGVjb2RlIGlzIGEgYnJhbmNoIG9yIGEgcmV0dXJuLCB0aGVu
IHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIHRoZSBsZWFkZXIgb2YgaXRzIG93biBiYXNpYyBibG9j
ay4KLSAgICAgICAgaWYgKGlzQnJhbmNoKG9wY29kZUlEKSB8fCBpc1Rlcm1pbmFsKG9wY29kZUlE
KSB8fCBpc1Rocm93KG9wY29kZUlEKSkKLSAgICAgICAgICAgIG5leHRJbnN0cnVjdGlvbklzTGVh
ZGVyID0gdHJ1ZTsKLQotICAgICAgICBpZiAoY3JlYXRlZEJsb2NrKQotICAgICAgICAgICAgY29u
dGludWU7Ci0KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFkZCB0byB0aGUgbGVuZ3RoIG9m
IHRoZSBjdXJyZW50IGJsb2NrLgotICAgICAgICBjdXJyZW50LT5hZGRMZW5ndGgoaW5zdHJ1Y3Rp
b24tPnNpemUoKSk7CisgICAgICAgIC8vIEV4aXQgYmxvY2suCisgICAgICAgIGJhc2ljQmxvY2tz
LmNvbnN0cnVjdEFuZEFwcGVuZChCeXRlY29kZUJhc2ljQmxvY2s6OkV4aXRCbG9jaywgYmFzaWNC
bG9ja3Muc2l6ZSgpKTsKKyAgICAgICAgYmFzaWNCbG9ja3Muc2hyaW5rVG9GaXQoKTsKKyAgICAg
ICAgQVNTRVJUKGJhc2ljQmxvY2tzLmxhc3QoKS5pc0V4aXRCbG9jaygpKTsKICAgICB9CisgICAg
Ly8gQWZ0ZXIgdGhpcyBwb2ludCwgd2UgbmV2ZXIgY2hhbmdlIGJhc2ljQmxvY2tzLgogCiAgICAg
Ly8gTGluayBiYXNpYyBibG9ja3MgdG9nZXRoZXIuCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGJhc2ljQmxvY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEJ5dGVjb2RlQmFzaWNCbG9j
ayogYmxvY2sgPSBiYXNpY0Jsb2Nrc1tpXS5nZXQoKTsKKyAgICAgICAgQnl0ZWNvZGVCYXNpY0Js
b2NrJiBibG9jayA9IGJhc2ljQmxvY2tzW2ldOwogCi0gICAgICAgIGlmIChibG9jay0+aXNFbnRy
eUJsb2NrKCkgfHwgYmxvY2stPmlzRXhpdEJsb2NrKCkpCisgICAgICAgIGlmIChibG9jay5pc0Vu
dHJ5QmxvY2soKSB8fCBibG9jay5pc0V4aXRCbG9jaygpKQogICAgICAgICAgICAgY29udGludWU7
CiAKICAgICAgICAgYm9vbCBmYWxsc1Rocm91Z2ggPSB0cnVlOwotICAgICAgICBmb3IgKGF1dG8g
Ynl0ZWNvZGVPZmZzZXQgOiBibG9jay0+b2Zmc2V0cygpKSB7Ci0gICAgICAgICAgICBhdXRvIGlu
c3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25zLmF0KGJ5dGVjb2RlT2Zmc2V0KTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCB2aXNpdGVkTGVuZ3RoID0gMDsgdmlzaXRlZExlbmd0aCA8IGJsb2NrLnRvdGFs
TGVuZ3RoKCk7KSB7CisgICAgICAgICAgICBJbnN0cnVjdGlvblN0cmVhbTo6UmVmIGluc3RydWN0
aW9uID0gaW5zdHJ1Y3Rpb25zLmF0KGJsb2NrLmxlYWRlck9mZnNldCgpICsgdmlzaXRlZExlbmd0
aCk7CiAgICAgICAgICAgICBPcGNvZGVJRCBvcGNvZGVJRCA9IGluc3RydWN0aW9uLT5vcGNvZGVJ
RCgpOwogCisgICAgICAgICAgICB2aXNpdGVkTGVuZ3RoICs9IGluc3RydWN0aW9uLT5zaXplKCk7
CisKICAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgdGVybWluYWwgYnl0ZWNvZGUsIGxpbmsg
dG8gdGhlIGV4aXQgYmxvY2suCiAgICAgICAgICAgICBpZiAoaXNUZXJtaW5hbChvcGNvZGVJRCkp
IHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoYnl0ZWNvZGVPZmZzZXQgKyBpbnN0cnVjdGlvbi0+
c2l6ZSgpID09IGJsb2NrLT5sZWFkZXJPZmZzZXQoKSArIGJsb2NrLT50b3RhbExlbmd0aCgpKTsK
LSAgICAgICAgICAgICAgICBsaW5rQmxvY2tzKGJsb2NrLCBleGl0LmdldCgpKTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQoaW5zdHJ1Y3Rpb24ub2Zmc2V0KCkgKyBpbnN0cnVjdGlvbi0+c2l6ZSgp
ID09IGJsb2NrLmxlYWRlck9mZnNldCgpICsgYmxvY2sudG90YWxMZW5ndGgoKSk7CisgICAgICAg
ICAgICAgICAgbGlua0Jsb2NrcyhibG9jaywgYmFzaWNCbG9ja3MubGFzdCgpKTsKICAgICAgICAg
ICAgICAgICBmYWxsc1Rocm91Z2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgICAgIH0KQEAgLTEyOCwxNiArMTUzLDE1IEBAIHZvaWQgQnl0ZWNvZGVCYXNpY0Jsb2Nr
Ojpjb21wdXRlSW1wbChCbG9jayogY29kZUJsb2NrLCBjb25zdCBJbnN0cnVjdGlvblN0cmVhbSYK
ICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzbid0IG9uZSwgdHJlYXQgdGhpcyB0aHJvdyBhcyBh
IHRlcm1pbmFsLiBUaGlzIGlzIHRydWUgZXZlbiBpZiB3ZSBoYXZlIGEgZmluYWxseQogICAgICAg
ICAgICAgLy8gYmxvY2sgYmVjYXVzZSB0aGUgZmluYWxseSBibG9jayB3aWxsIGNyZWF0ZSBpdHMg
b3duIGNhdGNoLCB3aGljaCB3aWxsIGdlbmVyYXRlIGEgSGFuZGxlckluZm8uCiAgICAgICAgICAg
ICBpZiAoaXNUaHJvdyhvcGNvZGVJRCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoYnl0ZWNv
ZGVPZmZzZXQgKyBpbnN0cnVjdGlvbi0+c2l6ZSgpID09IGJsb2NrLT5sZWFkZXJPZmZzZXQoKSAr
IGJsb2NrLT50b3RhbExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoaW5zdHJ1Y3Rp
b24ub2Zmc2V0KCkgKyBpbnN0cnVjdGlvbi0+c2l6ZSgpID09IGJsb2NrLmxlYWRlck9mZnNldCgp
ICsgYmxvY2sudG90YWxMZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgYXV0byogaGFuZGxlciA9
IGNvZGVCbG9jay0+aGFuZGxlckZvckJ5dGVjb2RlSW5kZXgoQnl0ZWNvZGVJbmRleChpbnN0cnVj
dGlvbi5vZmZzZXQoKSkpOwogICAgICAgICAgICAgICAgIGZhbGxzVGhyb3VnaCA9IGZhbHNlOwog
ICAgICAgICAgICAgICAgIGlmICghaGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICBsaW5r
QmxvY2tzKGJsb2NrLCBleGl0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua0Jsb2Nr
cyhibG9jaywgYmFzaWNCbG9ja3MubGFzdCgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBiYXNpY0Jsb2Nrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBCeXRl
Y29kZUJhc2ljQmxvY2sqIG90aGVyQmxvY2sgPSBiYXNpY0Jsb2Nrc1tpXS5nZXQoKTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGhhbmRsZXItPnRhcmdldCA9PSBvdGhlckJsb2NrLT5sZWFkZXJP
ZmZzZXQoKSkgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgb3RoZXJCbG9jayA6IGJhc2lj
QmxvY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLT50YXJnZXQgPT0gb3Ro
ZXJCbG9jay5sZWFkZXJPZmZzZXQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbGlua0Js
b2NrcyhibG9jaywgb3RoZXJCbG9jayk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
ICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQ3LDE1ICsxNzEsMTQgQEAgdm9pZCBCeXRlY29k
ZUJhc2ljQmxvY2s6OmNvbXB1dGVJbXBsKEJsb2NrKiBjb2RlQmxvY2ssIGNvbnN0IEluc3RydWN0
aW9uU3RyZWFtJgogCiAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGJyYW5jaCwgbGluayB0
byB0aGUgYmxvY2socykgdGhhdCB3ZSBqdW1wIHRvLgogICAgICAgICAgICAgaWYgKGlzQnJhbmNo
KG9wY29kZUlEKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChieXRlY29kZU9mZnNldCArIGlu
c3RydWN0aW9uLT5zaXplKCkgPT0gYmxvY2stPmxlYWRlck9mZnNldCgpICsgYmxvY2stPnRvdGFs
TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVChpbnN0cnVjdGlvbi5vZmZzZXQoKSAr
IGluc3RydWN0aW9uLT5zaXplKCkgPT0gYmxvY2subGVhZGVyT2Zmc2V0KCkgKyBibG9jay50b3Rh
bExlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBWZWN0b3I8SW5zdHJ1Y3Rpb25TdHJlYW06Ok9m
ZnNldCwgMT4gYnl0ZWNvZGVPZmZzZXRzSnVtcGVkVG87CiAgICAgICAgICAgICAgICAgZmluZEp1
bXBUYXJnZXRzRm9ySW5zdHJ1Y3Rpb24oY29kZUJsb2NrLCBpbnN0cnVjdGlvbiwgYnl0ZWNvZGVP
ZmZzZXRzSnVtcGVkVG8pOwogCiAgICAgICAgICAgICAgICAgc2l6ZV90IG51bWJlck9mSnVtcFRh
cmdldHMgPSBieXRlY29kZU9mZnNldHNKdW1wZWRUby5zaXplKCk7CiAgICAgICAgICAgICAgICAg
QVNTRVJUKG51bWJlck9mSnVtcFRhcmdldHMpOwotICAgICAgICAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBiYXNpY0Jsb2Nrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAg
ICAgICBCeXRlY29kZUJhc2ljQmxvY2sqIG90aGVyQmxvY2sgPSBiYXNpY0Jsb2Nrc1tpXS5nZXQo
KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVjb2RlT2Zmc2V0c0p1bXBlZFRvLmNvbnRh
aW5zKG90aGVyQmxvY2stPmxlYWRlck9mZnNldCgpKSkgeworICAgICAgICAgICAgICAgIGZvciAo
YXV0byYgb3RoZXJCbG9jayA6IGJhc2ljQmxvY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
IChieXRlY29kZU9mZnNldHNKdW1wZWRUby5jb250YWlucyhvdGhlckJsb2NrLmxlYWRlck9mZnNl
dCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbGlua0Jsb2NrcyhibG9jaywgb3RoZXJC
bG9jayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bWJlck9mSnVtcFRhcmdldHM7CiAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW51bWJlck9mSnVtcFRhcmdldHMpCkBAIC0xNzgs
MjUgKzIwMSwyNSBAQCB2b2lkIEJ5dGVjb2RlQmFzaWNCbG9jazo6Y29tcHV0ZUltcGwoQmxvY2sq
IGNvZGVCbG9jaywgY29uc3QgSW5zdHJ1Y3Rpb25TdHJlYW0mCiAgICAgICAgIC8vIElmIHdlIGZh
bGwgdGhyb3VnaCB0aGVuIGxpbmsgdG8gdGhlIG5leHQgYmxvY2sgaW4gcHJvZ3JhbSBvcmRlci4K
ICAgICAgICAgaWYgKGZhbGxzVGhyb3VnaCkgewogICAgICAgICAgICAgQVNTRVJUKGkgKyAxIDwg
YmFzaWNCbG9ja3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIEJ5dGVjb2RlQmFzaWNCbG9jayogbmV4
dEJsb2NrID0gYmFzaWNCbG9ja3NbaSArIDFdLmdldCgpOworICAgICAgICAgICAgQnl0ZWNvZGVC
YXNpY0Jsb2NrJiBuZXh0QmxvY2sgPSBiYXNpY0Jsb2Nrc1tpICsgMV07CiAgICAgICAgICAgICBs
aW5rQmxvY2tzKGJsb2NrLCBuZXh0QmxvY2spOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYXBw
ZW5kQmxvY2soV1RGTW92ZShleGl0KSk7Ci0KICAgICBmb3IgKGF1dG8mIGJhc2ljQmxvY2sgOiBi
YXNpY0Jsb2NrcykKLSAgICAgICAgYmFzaWNCbG9jay0+c2hyaW5rVG9GaXQoKTsKKyAgICAgICAg
YmFzaWNCbG9jay5zaHJpbmtUb0ZpdCgpOworCisgICAgcmV0dXJuIGJhc2ljQmxvY2tzOwogfQog
Ci12b2lkIEJ5dGVjb2RlQmFzaWNCbG9jazo6Y29tcHV0ZShDb2RlQmxvY2sqIGNvZGVCbG9jaywg
Y29uc3QgSW5zdHJ1Y3Rpb25TdHJlYW0mIGluc3RydWN0aW9ucywgVmVjdG9yPHN0ZDo6dW5pcXVl
X3B0cjxCeXRlY29kZUJhc2ljQmxvY2s+PiYgYmFzaWNCbG9ja3MpCithdXRvIEJ5dGVjb2RlQmFz
aWNCbG9jazo6Y29tcHV0ZShDb2RlQmxvY2sqIGNvZGVCbG9jaywgY29uc3QgSW5zdHJ1Y3Rpb25T
dHJlYW0mIGluc3RydWN0aW9ucykgLT4gQmFzaWNCbG9ja1ZlY3RvcgogewotICAgIGNvbXB1dGVJ
bXBsKGNvZGVCbG9jaywgaW5zdHJ1Y3Rpb25zLCBiYXNpY0Jsb2Nrcyk7CisgICAgcmV0dXJuIGNv
bXB1dGVJbXBsKGNvZGVCbG9jaywgaW5zdHJ1Y3Rpb25zKTsKIH0KIAotdm9pZCBCeXRlY29kZUJh
c2ljQmxvY2s6OmNvbXB1dGUoVW5saW5rZWRDb2RlQmxvY2sqIGNvZGVCbG9jaywgY29uc3QgSW5z
dHJ1Y3Rpb25TdHJlYW0mIGluc3RydWN0aW9ucywgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCeXRl
Y29kZUJhc2ljQmxvY2s+PiYgYmFzaWNCbG9ja3MpCithdXRvIEJ5dGVjb2RlQmFzaWNCbG9jazo6
Y29tcHV0ZShVbmxpbmtlZENvZGVCbG9jayogY29kZUJsb2NrLCBjb25zdCBJbnN0cnVjdGlvblN0
cmVhbSYgaW5zdHJ1Y3Rpb25zKSAtPiBCYXNpY0Jsb2NrVmVjdG9yCiB7Ci0gICAgY29tcHV0ZUlt
cGwoY29kZUJsb2NrLCBpbnN0cnVjdGlvbnMsIGJhc2ljQmxvY2tzKTsKKyAgICByZXR1cm4gY29t
cHV0ZUltcGwoY29kZUJsb2NrLCBpbnN0cnVjdGlvbnMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBK
U0MKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9CeXRlY29kZUJh
c2ljQmxvY2suaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9CeXRlY29kZUJhc2lj
QmxvY2suaAppbmRleCBhZGZjM2M3MWM1Y2UzZTk4ZjRjNWM3ZGY5MzkwZjFmZTdmZTcxMGJlLi4z
YmRhZjFjN2Y0NTk5MWU1MzE5ZTAyMDcyMzk3ZmU2NjVlMGY5YTQ1IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVCYXNpY0Jsb2NrLmgKKysrIGIvU291
cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlQmFzaWNCbG9jay5oCkBAIC0yNiwx
MiArMjYsMTUgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSAiSW5zdHJ1Y3Rpb25TdHJlYW0u
aCIKKyNpbmNsdWRlICJPcGNvZGUuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDx3
dGYvRmFzdEJpdFZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9QYWNrZWRJbnRWZWN0b3IuaD4KICNp
bmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBKU0MgewogCitjbGFzcyBCeXRlY29k
ZUdyYXBoOwogY2xhc3MgQ29kZUJsb2NrOwogY2xhc3MgVW5saW5rZWRDb2RlQmxvY2s7CiBzdHJ1
Y3QgSW5zdHJ1Y3Rpb247CkBAIC0zOSwxMiArNDIsMTcgQEAgc3RydWN0IEluc3RydWN0aW9uOwog
REVDTEFSRV9BTExPQ0FUT1JfV0lUSF9IRUFQX0lERU5USUZJRVIoQnl0ZWNvZGVCYXNpY0Jsb2Nr
KTsKIAogY2xhc3MgQnl0ZWNvZGVCYXNpY0Jsb2NrIHsKLSAgICBXVEZfTUFLRV9TVFJVQ1RfRkFT
VF9BTExPQ0FURURfV0lUSF9IRUFQX0lERU5USUZJRVIoQnl0ZWNvZGVCYXNpY0Jsb2NrKTsKKyAg
ICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRChCeXRlY29kZUJhc2ljQmxvY2spOworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKEJ5dGVjb2RlQmFzaWNCbG9jayk7CisgICAgZnJpZW5kIGNsYXNzIEJ5
dGVjb2RlR3JhcGg7CiBwdWJsaWM6CisgICAgdXNpbmcgQmFzaWNCbG9ja1ZlY3RvciA9IFZlY3Rv
cjxCeXRlY29kZUJhc2ljQmxvY2ssIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93LCAxNiwgQnl0ZWNv
ZGVCYXNpY0Jsb2NrTWFsbG9jPjsKKyAgICBzdGF0aWNfYXNzZXJ0KG1heE9wY29kZUxlbmd0aCA8
PSBVSU5UOF9NQVgpOwogICAgIGVudW0gU3BlY2lhbEJsb2NrVHlwZSB7IEVudHJ5QmxvY2ssIEV4
aXRCbG9jayB9OwotICAgIEJ5dGVjb2RlQmFzaWNCbG9jayhjb25zdCBJbnN0cnVjdGlvblN0cmVh
bTo6UmVmJik7Ci0gICAgQnl0ZWNvZGVCYXNpY0Jsb2NrKFNwZWNpYWxCbG9ja1R5cGUpOwotICAg
IHZvaWQgc2hyaW5rVG9GaXQoKTsKKyAgICBCeXRlY29kZUJhc2ljQmxvY2soY29uc3QgSW5zdHJ1
Y3Rpb25TdHJlYW06OlJlZiYsIHVuc2lnbmVkKTsKKyAgICBCeXRlY29kZUJhc2ljQmxvY2soU3Bl
Y2lhbEJsb2NrVHlwZSwgdW5zaWduZWQpOworICAgIEJ5dGVjb2RlQmFzaWNCbG9jayhCeXRlY29k
ZUJhc2ljQmxvY2smJikgPSBkZWZhdWx0OworCiAKICAgICBib29sIGlzRW50cnlCbG9jaygpIHsg
cmV0dXJuICFtX2xlYWRlck9mZnNldCAmJiAhbV90b3RhbExlbmd0aDsgfQogICAgIGJvb2wgaXNF
eGl0QmxvY2soKSB7IHJldHVybiBtX2xlYWRlck9mZnNldCA9PSBVSU5UX01BWCAmJiBtX3RvdGFs
TGVuZ3RoID09IFVJTlRfTUFYOyB9CkBAIC01Miw1MyArNjAsMzYgQEAgY2xhc3MgQnl0ZWNvZGVC
YXNpY0Jsb2NrIHsKICAgICB1bnNpZ25lZCBsZWFkZXJPZmZzZXQoKSBjb25zdCB7IHJldHVybiBt
X2xlYWRlck9mZnNldDsgfQogICAgIHVuc2lnbmVkIHRvdGFsTGVuZ3RoKCkgY29uc3QgeyByZXR1
cm4gbV90b3RhbExlbmd0aDsgfQogCi0gICAgY29uc3QgVmVjdG9yPEluc3RydWN0aW9uU3RyZWFt
OjpPZmZzZXQ+JiBvZmZzZXRzKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRzOyB9Ci0KLSAgICBj
b25zdCBWZWN0b3I8Qnl0ZWNvZGVCYXNpY0Jsb2NrKj4mIHN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJl
dHVybiBtX3N1Y2Nlc3NvcnM7IH0KKyAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRlbHRhKCkg
Y29uc3QgeyByZXR1cm4gbV9kZWx0YTsgfQorICAgIGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mIHN1
Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Y2Nlc3NvcnM7IH0KIAogICAgIEZhc3RCaXRW
ZWN0b3ImIGluKCkgeyByZXR1cm4gbV9pbjsgfQogICAgIEZhc3RCaXRWZWN0b3ImIG91dCgpIHsg
cmV0dXJuIG1fb3V0OyB9CiAKICAgICB1bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXg7IH0KIAotICAgIHN0YXRpYyB2b2lkIGNvbXB1dGUoQ29kZUJsb2NrKiwgY29uc3QgSW5z
dHJ1Y3Rpb25TdHJlYW0mIGluc3RydWN0aW9ucywgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCeXRl
Y29kZUJhc2ljQmxvY2s+PiYpOwotICAgIHN0YXRpYyB2b2lkIGNvbXB1dGUoVW5saW5rZWRDb2Rl
QmxvY2sqLCBjb25zdCBJbnN0cnVjdGlvblN0cmVhbSYgaW5zdHJ1Y3Rpb25zLCBWZWN0b3I8c3Rk
Ojp1bmlxdWVfcHRyPEJ5dGVjb2RlQmFzaWNCbG9jaz4+Jik7CisgICAgZXhwbGljaXQgb3BlcmF0
b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIAogcHJpdmF0ZToKLSAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBCbG9jaz4gc3RhdGljIHZvaWQgY29tcHV0ZUltcGwoQmxvY2sqIGNvZGVCbG9j
aywgY29uc3QgSW5zdHJ1Y3Rpb25TdHJlYW0mIGluc3RydWN0aW9ucywgVmVjdG9yPHN0ZDo6dW5p
cXVlX3B0cjxCeXRlY29kZUJhc2ljQmxvY2s+PiYgYmFzaWNCbG9ja3MpOworICAgIC8vIE9ubHkg
Y2FsbGVkIGZyb20gQnl0ZWNvZGVHcmFwaC4KKyAgICBzdGF0aWMgQmFzaWNCbG9ja1ZlY3RvciBj
b21wdXRlKENvZGVCbG9jayosIGNvbnN0IEluc3RydWN0aW9uU3RyZWFtJiBpbnN0cnVjdGlvbnMp
OworICAgIHN0YXRpYyBCYXNpY0Jsb2NrVmVjdG9yIGNvbXB1dGUoVW5saW5rZWRDb2RlQmxvY2sq
LCBjb25zdCBJbnN0cnVjdGlvblN0cmVhbSYgaW5zdHJ1Y3Rpb25zKTsKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBCbG9jaz4gc3RhdGljIEJhc2ljQmxvY2tWZWN0b3IgY29tcHV0ZUltcGwoQmxvY2sq
IGNvZGVCbG9jaywgY29uc3QgSW5zdHJ1Y3Rpb25TdHJlYW0mIGluc3RydWN0aW9ucyk7CisgICAg
dm9pZCBzaHJpbmtUb0ZpdCgpOwogCi0gICAgdm9pZCBhZGRTdWNjZXNzb3IoQnl0ZWNvZGVCYXNp
Y0Jsb2NrKiBibG9jaykgeyBtX3N1Y2Nlc3NvcnMuYXBwZW5kKGJsb2NrKTsgfQorICAgIHZvaWQg
YWRkU3VjY2Vzc29yKEJ5dGVjb2RlQmFzaWNCbG9jayYgYmxvY2spIHsgbV9zdWNjZXNzb3JzLmFw
cGVuZChibG9jay5pbmRleCgpKTsgfQogCi0gICAgdm9pZCBhZGRMZW5ndGgodW5zaWduZWQpOwor
ICAgIHZvaWQgYWRkTGVuZ3RoKHVuc2lnbmVkIGxlbmd0aCk7CiAKICAgICBJbnN0cnVjdGlvblN0
cmVhbTo6T2Zmc2V0IG1fbGVhZGVyT2Zmc2V0OwogICAgIHVuc2lnbmVkIG1fdG90YWxMZW5ndGg7
CiAgICAgdW5zaWduZWQgbV9pbmRleDsKIAotICAgIFZlY3RvcjxJbnN0cnVjdGlvblN0cmVhbTo6
T2Zmc2V0PiBtX29mZnNldHM7Ci0gICAgVmVjdG9yPEJ5dGVjb2RlQmFzaWNCbG9jayo+IG1fc3Vj
Y2Vzc29yczsKKyAgICBWZWN0b3I8dWludDhfdD4gbV9kZWx0YTsKKyAgICBWZWN0b3I8dW5zaWdu
ZWQ+IG1fc3VjY2Vzc29yczsKIAogICAgIEZhc3RCaXRWZWN0b3IgbV9pbjsKICAgICBGYXN0Qml0
VmVjdG9yIG1fb3V0OwogfTsKIAotaW5saW5lIEJ5dGVjb2RlQmFzaWNCbG9jazo6Qnl0ZWNvZGVC
YXNpY0Jsb2NrKGNvbnN0IEluc3RydWN0aW9uU3RyZWFtOjpSZWYmIGluc3RydWN0aW9uKQotICAg
IDogbV9sZWFkZXJPZmZzZXQoaW5zdHJ1Y3Rpb24ub2Zmc2V0KCkpCi0gICAgLCBtX3RvdGFsTGVu
Z3RoKGluc3RydWN0aW9uLT5zaXplKCkpCi17Ci0gICAgbV9vZmZzZXRzLmFwcGVuZChtX2xlYWRl
ck9mZnNldCk7Ci19Ci0KLWlubGluZSBCeXRlY29kZUJhc2ljQmxvY2s6OkJ5dGVjb2RlQmFzaWNC
bG9jayhCeXRlY29kZUJhc2ljQmxvY2s6OlNwZWNpYWxCbG9ja1R5cGUgYmxvY2tUeXBlKQotICAg
IDogbV9sZWFkZXJPZmZzZXQoYmxvY2tUeXBlID09IEJ5dGVjb2RlQmFzaWNCbG9jazo6RW50cnlC
bG9jayA/IDAgOiBVSU5UX01BWCkKLSAgICAsIG1fdG90YWxMZW5ndGgoYmxvY2tUeXBlID09IEJ5
dGVjb2RlQmFzaWNCbG9jazo6RW50cnlCbG9jayA/IDAgOiBVSU5UX01BWCkKLXsKLX0KLQotaW5s
aW5lIHZvaWQgQnl0ZWNvZGVCYXNpY0Jsb2NrOjphZGRMZW5ndGgodW5zaWduZWQgYnl0ZWNvZGVM
ZW5ndGgpCi17Ci0gICAgbV9vZmZzZXRzLmFwcGVuZChtX2xlYWRlck9mZnNldCArIG1fdG90YWxM
ZW5ndGgpOwotICAgIG1fdG90YWxMZW5ndGggKz0gYnl0ZWNvZGVMZW5ndGg7Ci19Ci0KIH0gLy8g
bmFtZXNwYWNlIEpTQwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L0J5dGVjb2RlR2VuZXJhdG9yaWZpY2F0aW9uLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9CeXRlY29kZUdlbmVyYXRvcmlmaWNhdGlvbi5jcHAKaW5kZXggNTEzNDMxODJhODY4
NDBjMTI4MWNjODNlZjIzNjljMDM4NzMxZWI0NC4uYjBiNTcwZTkwMjA5NmMyOTI1MWZiNmZhNDQ3
YzFhZTJiZmQ1ZTgyNiAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L0J5dGVjb2RlR2VuZXJhdG9yaWZpY2F0aW9uLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQnl0ZWNvZGVHZW5lcmF0b3JpZmljYXRpb24uY3BwCkBAIC03Miw0MSArNzIs
MzggQEAgY2xhc3MgQnl0ZWNvZGVHZW5lcmF0b3JpZmljYXRpb24gewogICAgICAgICAsIG1fZ2Vu
ZXJhdG9yRnJhbWVTeW1ib2xUYWJsZShjb2RlQmxvY2stPnZtKCksIGdlbmVyYXRvckZyYW1lU3lt
Ym9sVGFibGUpCiAgICAgICAgICwgbV9nZW5lcmF0b3JGcmFtZVN5bWJvbFRhYmxlSW5kZXgoZ2Vu
ZXJhdG9yRnJhbWVTeW1ib2xUYWJsZUluZGV4KQogICAgIHsKLSAgICAgICAgZm9yIChCeXRlY29k
ZUJhc2ljQmxvY2sqIGJsb2NrIDogbV9ncmFwaCkgewotICAgICAgICAgICAgZm9yIChjb25zdCBh
dXRvIG9mZnNldCA6IGJsb2NrLT5vZmZzZXRzKCkpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBh
dXRvIGluc3RydWN0aW9uID0gbV9pbnN0cnVjdGlvbnMuYXQob2Zmc2V0KTsKLSAgICAgICAgICAg
ICAgICBzd2l0Y2ggKGluc3RydWN0aW9uLT5vcGNvZGVJRCgpKSB7Ci0gICAgICAgICAgICAgICAg
Y2FzZSBvcF9lbnRlcjogewotICAgICAgICAgICAgICAgICAgICBtX2VudGVyUG9pbnQgPSBpbnN0
cnVjdGlvbi5vZmZzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBvcF95aWVsZDogewotICAgICAgICAgICAg
ICAgICAgICBhdXRvIGJ5dGVjb2RlID0gaW5zdHJ1Y3Rpb24tPmFzPE9wWWllbGQ+KCk7Ci0gICAg
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpdmVDYWxsZWVMb2NhbHNJbmRleCA9IGJ5dGVjb2Rl
Lm1feWllbGRQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVDYWxsZWVMb2NhbHNJ
bmRleCA+PSBtX3lpZWxkcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3lpZWxk
cy5yZXNpemUobGl2ZUNhbGxlZUxvY2Fsc0luZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAg
IFlpZWxkRGF0YSYgZGF0YSA9IG1feWllbGRzW2xpdmVDYWxsZWVMb2NhbHNJbmRleF07Ci0gICAg
ICAgICAgICAgICAgICAgIGRhdGEucG9pbnQgPSBpbnN0cnVjdGlvbi5vZmZzZXQoKTsKLSAgICAg
ICAgICAgICAgICAgICAgZGF0YS5hcmd1bWVudCA9IGJ5dGVjb2RlLm1fYXJndW1lbnQ7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
ICAgIGNhc2Ugb3BfY3JlYXRlX2dlbmVyYXRvcl9mcmFtZV9lbnZpcm9ubWVudDogewotICAgICAg
ICAgICAgICAgICAgICBhdXRvIGJ5dGVjb2RlID0gaW5zdHJ1Y3Rpb24tPmFzPE9wQ3JlYXRlR2Vu
ZXJhdG9yRnJhbWVFbnZpcm9ubWVudD4oKTsKLSAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9y
RnJhbWVEYXRhIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEubV9wb2ludCA9IGluc3Ry
dWN0aW9uLm9mZnNldCgpOwotICAgICAgICAgICAgICAgICAgICBkYXRhLm1fZHN0ID0gYnl0ZWNv
ZGUubV9kc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEubV9zY29wZSA9IGJ5dGVjb2RlLm1f
c2NvcGU7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEubV9zeW1ib2xUYWJsZSA9IGJ5dGVjb2Rl
Lm1fc3ltYm9sVGFibGU7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEubV9pbml0aWFsVmFsdWUg
PSBieXRlY29kZS5tX2luaXRpYWxWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgbV9nZW5lcmF0
b3JGcmFtZURhdGEgPSBXVEZNb3ZlKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3Qg
YXV0byYgaW5zdHJ1Y3Rpb24gOiBtX2luc3RydWN0aW9ucykgeworICAgICAgICAgICAgc3dpdGNo
IChpbnN0cnVjdGlvbi0+b3Bjb2RlSUQoKSkgeworICAgICAgICAgICAgY2FzZSBvcF9lbnRlcjog
eworICAgICAgICAgICAgICAgIG1fZW50ZXJQb2ludCA9IGluc3RydWN0aW9uLm9mZnNldCgpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNl
IG9wX3lpZWxkOiB7CisgICAgICAgICAgICAgICAgYXV0byBieXRlY29kZSA9IGluc3RydWN0aW9u
LT5hczxPcFlpZWxkPigpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpdmVDYWxsZWVMb2Nh
bHNJbmRleCA9IGJ5dGVjb2RlLm1feWllbGRQb2ludDsKKyAgICAgICAgICAgICAgICBpZiAobGl2
ZUNhbGxlZUxvY2Fsc0luZGV4ID49IG1feWllbGRzLnNpemUoKSkKKyAgICAgICAgICAgICAgICAg
ICAgbV95aWVsZHMucmVzaXplKGxpdmVDYWxsZWVMb2NhbHNJbmRleCArIDEpOworICAgICAgICAg
ICAgICAgIFlpZWxkRGF0YSYgZGF0YSA9IG1feWllbGRzW2xpdmVDYWxsZWVMb2NhbHNJbmRleF07
CisgICAgICAgICAgICAgICAgZGF0YS5wb2ludCA9IGluc3RydWN0aW9uLm9mZnNldCgpOworICAg
ICAgICAgICAgICAgIGRhdGEuYXJndW1lbnQgPSBieXRlY29kZS5tX2FyZ3VtZW50OworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIG9wX2Ny
ZWF0ZV9nZW5lcmF0b3JfZnJhbWVfZW52aXJvbm1lbnQ6IHsKKyAgICAgICAgICAgICAgICBhdXRv
IGJ5dGVjb2RlID0gaW5zdHJ1Y3Rpb24tPmFzPE9wQ3JlYXRlR2VuZXJhdG9yRnJhbWVFbnZpcm9u
bWVudD4oKTsKKyAgICAgICAgICAgICAgICBHZW5lcmF0b3JGcmFtZURhdGEgZGF0YTsKKyAgICAg
ICAgICAgICAgICBkYXRhLm1fcG9pbnQgPSBpbnN0cnVjdGlvbi5vZmZzZXQoKTsKKyAgICAgICAg
ICAgICAgICBkYXRhLm1fZHN0ID0gYnl0ZWNvZGUubV9kc3Q7CisgICAgICAgICAgICAgICAgZGF0
YS5tX3Njb3BlID0gYnl0ZWNvZGUubV9zY29wZTsKKyAgICAgICAgICAgICAgICBkYXRhLm1fc3lt
Ym9sVGFibGUgPSBieXRlY29kZS5tX3N5bWJvbFRhYmxlOworICAgICAgICAgICAgICAgIGRhdGEu
bV9pbml0aWFsVmFsdWUgPSBieXRlY29kZS5tX2luaXRpYWxWYWx1ZTsKKyAgICAgICAgICAgICAg
ICBtX2dlbmVyYXRvckZyYW1lRGF0YSA9IFdURk1vdmUoZGF0YSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQg
YS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVHcmFwaC5oIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlR3JhcGguaAppbmRleCBlZTJkYTE4NWMz
NTE5ZTU1NWQ1ZWM3MDZlNjU0MjExNThjYWRhNWI2Li5kYjJjNjVhNmUwMWE0OTE4NTJkNzE0ZTg0
MjFhZmViZjcyYmYyYTFlIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNv
ZGUvQnl0ZWNvZGVHcmFwaC5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9C
eXRlY29kZUdyYXBoLmgKQEAgLTM5LDcgKzM5LDcgQEAgY2xhc3MgQnl0ZWNvZGVHcmFwaCB7CiAg
ICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQnl0
ZWNvZGVHcmFwaCk7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBWZWN0b3I8c3RkOjp1bmlxdWVfcHRy
PEJ5dGVjb2RlQmFzaWNCbG9jaz4+IEJhc2ljQmxvY2tzVmVjdG9yOworICAgIHVzaW5nIEJhc2lj
QmxvY2tzVmVjdG9yID0gQnl0ZWNvZGVCYXNpY0Jsb2NrOjpCYXNpY0Jsb2NrVmVjdG9yOwogCiAg
ICAgdHlwZWRlZiBXVEY6OkluZGV4ZWRDb250YWluZXJJdGVyYXRvcjxCeXRlY29kZUdyYXBoPiBp
dGVyYXRvcjsKIApAQCAtNTEsNTMgKzUxLDUzIEBAIGNsYXNzIEJ5dGVjb2RlR3JhcGggewogICAg
ICAgICByZXR1cm4gV1RGOjptYWtlSXRlcmF0b3JSYW5nZShtX2Jhc2ljQmxvY2tzLnJiZWdpbigp
LCBtX2Jhc2ljQmxvY2tzLnJlbmQoKSk7CiAgICAgfQogCi0gICAgc3RhdGljIGJvb2wgYmxvY2tD
b250YWluc0J5dGVjb2RlT2Zmc2V0KEJ5dGVjb2RlQmFzaWNCbG9jayogYmxvY2ssIEluc3RydWN0
aW9uU3RyZWFtOjpPZmZzZXQgYnl0ZWNvZGVPZmZzZXQpCisgICAgc3RhdGljIGJvb2wgYmxvY2tD
b250YWluc0J5dGVjb2RlT2Zmc2V0KGNvbnN0IEJ5dGVjb2RlQmFzaWNCbG9jayYgYmxvY2ssIElu
c3RydWN0aW9uU3RyZWFtOjpPZmZzZXQgYnl0ZWNvZGVPZmZzZXQpCiAgICAgewotICAgICAgICB1
bnNpZ25lZCBsZWFkZXJPZmZzZXQgPSBibG9jay0+bGVhZGVyT2Zmc2V0KCk7Ci0gICAgICAgIHJl
dHVybiBieXRlY29kZU9mZnNldCA+PSBsZWFkZXJPZmZzZXQgJiYgYnl0ZWNvZGVPZmZzZXQgPCBs
ZWFkZXJPZmZzZXQgKyBibG9jay0+dG90YWxMZW5ndGgoKTsKKyAgICAgICAgdW5zaWduZWQgbGVh
ZGVyT2Zmc2V0ID0gYmxvY2subGVhZGVyT2Zmc2V0KCk7CisgICAgICAgIHJldHVybiBieXRlY29k
ZU9mZnNldCA+PSBsZWFkZXJPZmZzZXQgJiYgYnl0ZWNvZGVPZmZzZXQgPCBsZWFkZXJPZmZzZXQg
KyBibG9jay50b3RhbExlbmd0aCgpOwogICAgIH0KIAogICAgIEJ5dGVjb2RlQmFzaWNCbG9jayog
ZmluZEJhc2ljQmxvY2tGb3JCeXRlY29kZU9mZnNldChJbnN0cnVjdGlvblN0cmVhbTo6T2Zmc2V0
IGJ5dGVjb2RlT2Zmc2V0KQogICAgIHsKICAgICAgICAgLyoKICAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBtX2Jhc2ljQmxvY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKGJsb2NrQ29udGFpbnNCeXRlY29kZU9mZnNldChtX2Jhc2ljQmxvY2tzW2ldLmdl
dCgpLCBieXRlY29kZU9mZnNldCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2Jhc2lj
QmxvY2tzW2ldLmdldCgpOworICAgICAgICAgICAgICAgIGlmIChibG9ja0NvbnRhaW5zQnl0ZWNv
ZGVPZmZzZXQobV9iYXNpY0Jsb2Nrc1tpXSwgYnl0ZWNvZGVPZmZzZXQpKQorICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gJm1fYmFzaWNCbG9ja3NbaV07CiAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICByZXR1cm4gMDsKICAgICAgICAgKi8KIAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Qnl0
ZWNvZGVCYXNpY0Jsb2NrPiogYmFzaWNCbG9jayA9IGFwcHJveGltYXRlQmluYXJ5U2VhcmNoPHN0
ZDo6dW5pcXVlX3B0cjxCeXRlY29kZUJhc2ljQmxvY2s+LCB1bnNpZ25lZD4obV9iYXNpY0Jsb2Nr
cywgbV9iYXNpY0Jsb2Nrcy5zaXplKCksIGJ5dGVjb2RlT2Zmc2V0LCBbXSAoc3RkOjp1bmlxdWVf
cHRyPEJ5dGVjb2RlQmFzaWNCbG9jaz4qIGJhc2ljQmxvY2spIHsgcmV0dXJuICgqYmFzaWNCbG9j
ayktPmxlYWRlck9mZnNldCgpOyB9KTsKKyAgICAgICAgQnl0ZWNvZGVCYXNpY0Jsb2NrKiBiYXNp
Y0Jsb2NrID0gYXBwcm94aW1hdGVCaW5hcnlTZWFyY2g8Qnl0ZWNvZGVCYXNpY0Jsb2NrLCB1bnNp
Z25lZD4obV9iYXNpY0Jsb2NrcywgbV9iYXNpY0Jsb2Nrcy5zaXplKCksIGJ5dGVjb2RlT2Zmc2V0
LCBbXSAoQnl0ZWNvZGVCYXNpY0Jsb2NrKiBiYXNpY0Jsb2NrKSB7IHJldHVybiBiYXNpY0Jsb2Nr
LT5sZWFkZXJPZmZzZXQoKTsgfSk7CiAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBibG9jayB3ZSB3
ZXJlIGxvb2tpbmcgZm9yLgotICAgICAgICBpZiAoYmxvY2tDb250YWluc0J5dGVjb2RlT2Zmc2V0
KCgqYmFzaWNCbG9jaykuZ2V0KCksIGJ5dGVjb2RlT2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVy
biAoKmJhc2ljQmxvY2spLmdldCgpOworICAgICAgICBpZiAoYmxvY2tDb250YWluc0J5dGVjb2Rl
T2Zmc2V0KCpiYXNpY0Jsb2NrLCBieXRlY29kZU9mZnNldCkpCisgICAgICAgICAgICByZXR1cm4g
YmFzaWNCbG9jazsKIAogICAgICAgICAvLyBCYXNpYyBibG9jayBpcyB0byB0aGUgbGVmdCBvZiB0
aGUgcmV0dXJuZWQgYmxvY2suCi0gICAgICAgIGlmIChieXRlY29kZU9mZnNldCA8ICgqYmFzaWNC
bG9jayktPmxlYWRlck9mZnNldCgpKSB7CisgICAgICAgIGlmIChieXRlY29kZU9mZnNldCA8IGJh
c2ljQmxvY2stPmxlYWRlck9mZnNldCgpKSB7CiAgICAgICAgICAgICBBU1NFUlQoYmFzaWNCbG9j
ayAtIDEgPj0gbV9iYXNpY0Jsb2Nrcy5kYXRhKCkpOwotICAgICAgICAgICAgQVNTRVJUKGJsb2Nr
Q29udGFpbnNCeXRlY29kZU9mZnNldChiYXNpY0Jsb2NrWy0xXS5nZXQoKSwgYnl0ZWNvZGVPZmZz
ZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBiYXNpY0Jsb2NrWy0xXS5nZXQoKTsKKyAgICAgICAg
ICAgIEFTU0VSVChibG9ja0NvbnRhaW5zQnl0ZWNvZGVPZmZzZXQoYmFzaWNCbG9ja1stMV0sIGJ5
dGVjb2RlT2Zmc2V0KSk7CisgICAgICAgICAgICByZXR1cm4gJmJhc2ljQmxvY2tbLTFdOwogICAg
ICAgICB9CiAKICAgICAgICAgLy8gQmFzaWMgYmxvY2sgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBy
ZXR1cm5lZCBibG9jay4KICAgICAgICAgQVNTRVJUKCZiYXNpY0Jsb2NrWzFdIDw9ICZtX2Jhc2lj
QmxvY2tzLmxhc3QoKSk7Ci0gICAgICAgIEFTU0VSVChibG9ja0NvbnRhaW5zQnl0ZWNvZGVPZmZz
ZXQoYmFzaWNCbG9ja1sxXS5nZXQoKSwgYnl0ZWNvZGVPZmZzZXQpKTsKLSAgICAgICAgcmV0dXJu
IGJhc2ljQmxvY2tbMV0uZ2V0KCk7CisgICAgICAgIEFTU0VSVChibG9ja0NvbnRhaW5zQnl0ZWNv
ZGVPZmZzZXQoYmFzaWNCbG9ja1sxXSwgYnl0ZWNvZGVPZmZzZXQpKTsKKyAgICAgICAgcmV0dXJu
ICZiYXNpY0Jsb2NrWzFdOwogICAgIH0KIAogICAgIEJ5dGVjb2RlQmFzaWNCbG9jayogZmluZEJh
c2ljQmxvY2tXaXRoTGVhZGVyT2Zmc2V0KEluc3RydWN0aW9uU3RyZWFtOjpPZmZzZXQgbGVhZGVy
T2Zmc2V0KQogICAgIHsKLSAgICAgICAgcmV0dXJuICgqdHJ5QmluYXJ5U2VhcmNoPHN0ZDo6dW5p
cXVlX3B0cjxCeXRlY29kZUJhc2ljQmxvY2s+LCB1bnNpZ25lZD4obV9iYXNpY0Jsb2NrcywgbV9i
YXNpY0Jsb2Nrcy5zaXplKCksIGxlYWRlck9mZnNldCwgW10gKHN0ZDo6dW5pcXVlX3B0cjxCeXRl
Y29kZUJhc2ljQmxvY2s+KiBiYXNpY0Jsb2NrKSB7IHJldHVybiAoKmJhc2ljQmxvY2spLT5sZWFk
ZXJPZmZzZXQoKTsgfSkpLmdldCgpOworICAgICAgICByZXR1cm4gdHJ5QmluYXJ5U2VhcmNoPEJ5
dGVjb2RlQmFzaWNCbG9jaywgdW5zaWduZWQ+KG1fYmFzaWNCbG9ja3MsIG1fYmFzaWNCbG9ja3Mu
c2l6ZSgpLCBsZWFkZXJPZmZzZXQsIFtdIChCeXRlY29kZUJhc2ljQmxvY2sqIGJhc2ljQmxvY2sp
IHsgcmV0dXJuIGJhc2ljQmxvY2stPmxlYWRlck9mZnNldCgpOyB9KTsKICAgICB9CiAKICAgICB1
bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9iYXNpY0Jsb2Nrcy5zaXplKCk7IH0KLSAg
ICBCeXRlY29kZUJhc2ljQmxvY2sqIGF0KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBt
X2Jhc2ljQmxvY2tzW2luZGV4XS5nZXQoKTsgfQotICAgIEJ5dGVjb2RlQmFzaWNCbG9jayogb3Bl
cmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXQoaW5kZXgpOyB9CisgICAg
Qnl0ZWNvZGVCYXNpY0Jsb2NrJiBhdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gY29u
c3RfY2FzdDxCeXRlY29kZUdyYXBoKj4odGhpcyktPm1fYmFzaWNCbG9ja3NbaW5kZXhdOyB9Cisg
ICAgQnl0ZWNvZGVCYXNpY0Jsb2NrJiBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7
IHJldHVybiBhdChpbmRleCk7IH0KIAotICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1
cm4gaXRlcmF0b3IoKnRoaXMsIDApOyB9Ci0gICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1
cm4gaXRlcmF0b3IoKnRoaXMsIHNpemUoKSk7IH0KLSAgICBCeXRlY29kZUJhc2ljQmxvY2sqIGZp
cnN0KCkgeyByZXR1cm4gYXQoMCk7IH0KLSAgICBCeXRlY29kZUJhc2ljQmxvY2sqIGxhc3QoKSB7
IHJldHVybiBhdChzaXplKCkgLSAxKTsgfQorICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4g
aXRlcmF0b3IoKnRoaXMsIDApOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0
b3IoKnRoaXMsIHNpemUoKSk7IH0KKyAgICBCeXRlY29kZUJhc2ljQmxvY2smIGZpcnN0KCkgeyBy
ZXR1cm4gYXQoMCk7IH0KKyAgICBCeXRlY29kZUJhc2ljQmxvY2smIGxhc3QoKSB7IHJldHVybiBh
dChzaXplKCkgLSAxKTsgfQogCiBwcml2YXRlOgogICAgIEJhc2ljQmxvY2tzVmVjdG9yIG1fYmFz
aWNCbG9ja3M7CkBAIC0xMDYsOCArMTA2LDggQEAgY2xhc3MgQnl0ZWNvZGVHcmFwaCB7CiAKIHRl
bXBsYXRlPHR5cGVuYW1lIENvZGVCbG9ja1R5cGU+CiBCeXRlY29kZUdyYXBoOjpCeXRlY29kZUdy
YXBoKENvZGVCbG9ja1R5cGUqIGNvZGVCbG9jaywgY29uc3QgSW5zdHJ1Y3Rpb25TdHJlYW0mIGlu
c3RydWN0aW9ucykKKyAgICA6IG1fYmFzaWNCbG9ja3MoQnl0ZWNvZGVCYXNpY0Jsb2NrOjpjb21w
dXRlKGNvZGVCbG9jaywgaW5zdHJ1Y3Rpb25zKSkKIHsKLSAgICBCeXRlY29kZUJhc2ljQmxvY2s6
OmNvbXB1dGUoY29kZUJsb2NrLCBpbnN0cnVjdGlvbnMsIG1fYmFzaWNCbG9ja3MpOwogICAgIEFT
U0VSVChtX2Jhc2ljQmxvY2tzLnNpemUoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9CeXRlY29kZUxpdmVuZXNzQW5hbHlzaXMuY3BwIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNpcy5jcHAKaW5k
ZXggMWU1YzQwODExMDVmM2NlNGFiMjEzZWRiNzBjOGQ0MDQxOGU4MDg1NS4uYzZlZmUwZDhmZjZj
Nzk4OTZhZmQwMGUyMGNjNDI3NzlkM2E0YjBjNyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNpcy5jcHAKKysrIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNpcy5jcHAKQEAg
LTUzLDcgKzUzLDcgQEAgdm9pZCBCeXRlY29kZUxpdmVuZXNzQW5hbHlzaXM6OmdldExpdmVuZXNz
SW5mb0F0Qnl0ZWNvZGVJbmRleChDb2RlQmxvY2sqIGNvZGVCbG8KICAgICBBU1NFUlQoIWJsb2Nr
LT5pc0VudHJ5QmxvY2soKSk7CiAgICAgQVNTRVJUKCFibG9jay0+aXNFeGl0QmxvY2soKSk7CiAg
ICAgcmVzdWx0LnJlc2l6ZShibG9jay0+b3V0KCkubnVtQml0cygpKTsKLSAgICBjb21wdXRlTG9j
YWxMaXZlbmVzc0ZvckJ5dGVjb2RlSW5kZXgoY29kZUJsb2NrLCBjb2RlQmxvY2stPmluc3RydWN0
aW9ucygpLCBtX2dyYXBoLCBibG9jaywgYnl0ZWNvZGVJbmRleCwgcmVzdWx0KTsKKyAgICBjb21w
dXRlTG9jYWxMaXZlbmVzc0ZvckJ5dGVjb2RlSW5kZXgoY29kZUJsb2NrLCBjb2RlQmxvY2stPmlu
c3RydWN0aW9ucygpLCBtX2dyYXBoLCAqYmxvY2ssIGJ5dGVjb2RlSW5kZXgsIHJlc3VsdCk7CiB9
CiAKIEZhc3RCaXRWZWN0b3IgQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzOjpnZXRMaXZlbmVzc0lu
Zm9BdEJ5dGVjb2RlSW5kZXgoQ29kZUJsb2NrKiBjb2RlQmxvY2ssIEJ5dGVjb2RlSW5kZXggYnl0
ZWNvZGVJbmRleCkKQEAgLTcwLDExICs3MCwxMSBAQCB2b2lkIEJ5dGVjb2RlTGl2ZW5lc3NBbmFs
eXNpczo6Y29tcHV0ZUZ1bGxMaXZlbmVzcyhDb2RlQmxvY2sqIGNvZGVCbG9jaywgRnVsbEJ5dAog
ICAgIHJlc3VsdC5tX2JlZm9yZVVzZVZlY3Rvci5yZXNpemUoY29kZUJsb2NrLT5pbnN0cnVjdGlv
bnMoKS5zaXplKCkpOwogICAgIHJlc3VsdC5tX2FmdGVyVXNlVmVjdG9yLnJlc2l6ZShjb2RlQmxv
Y2stPmluc3RydWN0aW9ucygpLnNpemUoKSk7CiAgICAgCi0gICAgZm9yIChzdGQ6OnVuaXF1ZV9w
dHI8Qnl0ZWNvZGVCYXNpY0Jsb2NrPiYgYmxvY2sgOiBtX2dyYXBoLmJhc2ljQmxvY2tzSW5SZXZl
cnNlT3JkZXIoKSkgewotICAgICAgICBpZiAoYmxvY2stPmlzRW50cnlCbG9jaygpIHx8IGJsb2Nr
LT5pc0V4aXRCbG9jaygpKQorICAgIGZvciAoQnl0ZWNvZGVCYXNpY0Jsb2NrJiBibG9jayA6IG1f
Z3JhcGguYmFzaWNCbG9ja3NJblJldmVyc2VPcmRlcigpKSB7CisgICAgICAgIGlmIChibG9jay5p
c0VudHJ5QmxvY2soKSB8fCBibG9jay5pc0V4aXRCbG9jaygpKQogICAgICAgICAgICAgY29udGlu
dWU7CiAgICAgICAgIAotICAgICAgICBvdXQgPSBibG9jay0+b3V0KCk7CisgICAgICAgIG91dCA9
IGJsb2NrLm91dCgpOwogICAgICAgICAKICAgICAgICAgYXV0byB1c2UgPSBbJl0gKHVuc2lnbmVk
IGJpdEluZGV4KSB7CiAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSB1c2UgZnVuY3Rvciwgc28g
d2Ugc2V0IHRoZSBiaXQuCkBAIC04Nyw4ICs4NywxMCBAQCB2b2lkIEJ5dGVjb2RlTGl2ZW5lc3NB
bmFseXNpczo6Y29tcHV0ZUZ1bGxMaXZlbmVzcyhDb2RlQmxvY2sqIGNvZGVCbG9jaywgRnVsbEJ5
dAogICAgICAgICB9OwogCiAgICAgICAgIGF1dG8mIGluc3RydWN0aW9ucyA9IGNvZGVCbG9jay0+
aW5zdHJ1Y3Rpb25zKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IGJsb2NrLT5vZmZzZXRz
KCkuc2l6ZSgpOyBpLS07KSB7Ci0gICAgICAgICAgICBCeXRlY29kZUluZGV4IGJ5dGVjb2RlSW5k
ZXggPSBCeXRlY29kZUluZGV4KGJsb2NrLT5vZmZzZXRzKClbaV0pOworICAgICAgICB1bnNpZ25l
ZCBjdXJzb3IgPSBibG9jay50b3RhbExlbmd0aCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSBibG9jay5kZWx0YSgpLnNpemUoKTsgaS0tOykgeworICAgICAgICAgICAgY3Vyc29yIC09IGJs
b2NrLmRlbHRhKClbaV07CisgICAgICAgICAgICBCeXRlY29kZUluZGV4IGJ5dGVjb2RlSW5kZXgg
PSBCeXRlY29kZUluZGV4KGJsb2NrLmxlYWRlck9mZnNldCgpICsgY3Vyc29yKTsKIAogICAgICAg
ICAgICAgc3RlcE92ZXJJbnN0cnVjdGlvbkRlZihjb2RlQmxvY2ssIGluc3RydWN0aW9ucywgbV9n
cmFwaCwgYnl0ZWNvZGVJbmRleCwgZGVmKTsKICAgICAgICAgICAgIHN0ZXBPdmVySW5zdHJ1Y3Rp
b25Vc2VJbkV4Y2VwdGlvbkhhbmRsZXIoY29kZUJsb2NrLCBpbnN0cnVjdGlvbnMsIG1fZ3JhcGgs
IGJ5dGVjb2RlSW5kZXgsIHVzZSk7CkBAIC0xMDcsMjEgKzEwOSwyMyBAQCB2b2lkIEJ5dGVjb2Rl
TGl2ZW5lc3NBbmFseXNpczo6Y29tcHV0ZUtpbGxzKENvZGVCbG9jayogY29kZUJsb2NrLCBCeXRl
Y29kZUtpbGxzJgogICAgIHJlc3VsdC5tX2NvZGVCbG9jayA9IGNvZGVCbG9jazsKICAgICByZXN1
bHQubV9raWxsU2V0cyA9IG1ha2VVbmlxdWVBcnJheTxCeXRlY29kZUtpbGxzOjpLaWxsU2V0Pihj
b2RlQmxvY2stPmluc3RydWN0aW9ucygpLnNpemUoKSk7CiAgICAgCi0gICAgZm9yIChzdGQ6OnVu
aXF1ZV9wdHI8Qnl0ZWNvZGVCYXNpY0Jsb2NrPiYgYmxvY2sgOiBtX2dyYXBoLmJhc2ljQmxvY2tz
SW5SZXZlcnNlT3JkZXIoKSkgewotICAgICAgICBpZiAoYmxvY2stPmlzRW50cnlCbG9jaygpIHx8
IGJsb2NrLT5pc0V4aXRCbG9jaygpKQorICAgIGZvciAoQnl0ZWNvZGVCYXNpY0Jsb2NrJiBibG9j
ayA6IG1fZ3JhcGguYmFzaWNCbG9ja3NJblJldmVyc2VPcmRlcigpKSB7CisgICAgICAgIGlmIChi
bG9jay5pc0VudHJ5QmxvY2soKSB8fCBibG9jay5pc0V4aXRCbG9jaygpKQogICAgICAgICAgICAg
Y29udGludWU7CiAgICAgICAgIAotICAgICAgICBvdXQgPSBibG9jay0+b3V0KCk7CisgICAgICAg
IG91dCA9IGJsb2NrLm91dCgpOwogICAgICAgICAKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
YmxvY2stPm9mZnNldHMoKS5zaXplKCk7IGktLTspIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGJ5
dGVjb2RlT2Zmc2V0ID0gYmxvY2stPm9mZnNldHMoKVtpXTsKKyAgICAgICAgdW5zaWduZWQgY3Vy
c29yID0gYmxvY2sudG90YWxMZW5ndGgoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gYmxv
Y2suZGVsdGEoKS5zaXplKCk7IGktLTspIHsKKyAgICAgICAgICAgIGN1cnNvciAtPSBibG9jay5k
ZWx0YSgpW2ldOworICAgICAgICAgICAgQnl0ZWNvZGVJbmRleCBieXRlY29kZUluZGV4ID0gQnl0
ZWNvZGVJbmRleChibG9jay5sZWFkZXJPZmZzZXQoKSArIGN1cnNvcik7CiAgICAgICAgICAgICBz
dGVwT3Zlckluc3RydWN0aW9uKAotICAgICAgICAgICAgICAgIGNvZGVCbG9jaywgY29kZUJsb2Nr
LT5pbnN0cnVjdGlvbnMoKSwgbV9ncmFwaCwgQnl0ZWNvZGVJbmRleChieXRlY29kZU9mZnNldCks
CisgICAgICAgICAgICAgICAgY29kZUJsb2NrLCBjb2RlQmxvY2stPmluc3RydWN0aW9ucygpLCBt
X2dyYXBoLCBieXRlY29kZUluZGV4LAogICAgICAgICAgICAgICAgIFsmXSAodW5zaWduZWQgaW5k
ZXgpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgdXNlcy4KICAgICAgICAg
ICAgICAgICAgICAgaWYgKG91dFtpbmRleF0pCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tX2tpbGxTZXRzW2J5dGVjb2RlT2Zmc2V0
XS5hZGQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQubV9raWxsU2V0c1tieXRl
Y29kZUluZGV4Lm9mZnNldCgpXS5hZGQoaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBvdXRb
aW5kZXhdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIFsmXSAo
dW5zaWduZWQgaW5kZXgpIHsKQEAgLTE0MCwxMiArMTQ0LDExIEBAIHZvaWQgQnl0ZWNvZGVMaXZl
bmVzc0FuYWx5c2lzOjpkdW1wUmVzdWx0cyhDb2RlQmxvY2sqIGNvZGVCbG9jaykKIAogICAgIHVu
c2lnbmVkIG51bWJlck9mQmxvY2tzID0gbV9ncmFwaC5zaXplKCk7CiAgICAgVmVjdG9yPEZhc3RC
aXRWZWN0b3I+IHByZWRlY2Vzc29ycyhudW1iZXJPZkJsb2Nrcyk7Ci0gICAgZm9yIChCeXRlY29k
ZUJhc2ljQmxvY2sqIGJsb2NrIDogbV9ncmFwaCkKLSAgICAgICAgcHJlZGVjZXNzb3JzW2Jsb2Nr
LT5pbmRleCgpXS5yZXNpemUobnVtYmVyT2ZCbG9ja3MpOwotICAgIGZvciAoQnl0ZWNvZGVCYXNp
Y0Jsb2NrKiBibG9jayA6IG1fZ3JhcGgpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsg
aiA8IGJsb2NrLT5zdWNjZXNzb3JzKCkuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHVuc2ln
bmVkIGJsb2NrSW5kZXggPSBibG9jay0+aW5kZXgoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIHN1
Y2Nlc3NvckluZGV4ID0gYmxvY2stPnN1Y2Nlc3NvcnMoKVtqXS0+aW5kZXgoKTsKKyAgICBmb3Ig
KEJ5dGVjb2RlQmFzaWNCbG9jayYgYmxvY2sgOiBtX2dyYXBoKQorICAgICAgICBwcmVkZWNlc3Nv
cnNbYmxvY2suaW5kZXgoKV0ucmVzaXplKG51bWJlck9mQmxvY2tzKTsKKyAgICBmb3IgKEJ5dGVj
b2RlQmFzaWNCbG9jayYgYmxvY2sgOiBtX2dyYXBoKSB7CisgICAgICAgIGZvciAodW5zaWduZWQg
c3VjY2Vzc29ySW5kZXggOiBibG9jay5zdWNjZXNzb3JzKCkpIHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIGJsb2NrSW5kZXggPSBibG9jay5pbmRleCgpOwogICAgICAgICAgICAgcHJlZGVjZXNzb3Jz
W3N1Y2Nlc3NvckluZGV4XVtibG9ja0luZGV4XSA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CkBA
IC0xNTcsMzIgKzE2MCwzMCBAQCB2b2lkIEJ5dGVjb2RlTGl2ZW5lc3NBbmFseXNpczo6ZHVtcFJl
c3VsdHMoQ29kZUJsb2NrKiBjb2RlQmxvY2spCiAgICAgICAgIH0KICAgICB9OwogCi0gICAgZm9y
IChCeXRlY29kZUJhc2ljQmxvY2sqIGJsb2NrIDogbV9ncmFwaCkgewotICAgICAgICBkYXRhTG9n
RigiXG5CeXRlY29kZSBiYXNpYyBibG9jayAldTogJXAgKG9mZnNldDogJXUsIGxlbmd0aDogJXUp
XG4iLCBpKyssIGJsb2NrLCBibG9jay0+bGVhZGVyT2Zmc2V0KCksIGJsb2NrLT50b3RhbExlbmd0
aCgpKTsKKyAgICBmb3IgKEJ5dGVjb2RlQmFzaWNCbG9jayYgYmxvY2sgOiBtX2dyYXBoKSB7Cisg
ICAgICAgIGRhdGFMb2dGKCJcbkJ5dGVjb2RlIGJhc2ljIGJsb2NrICV1OiAlcCAob2Zmc2V0OiAl
dSwgbGVuZ3RoOiAldSlcbiIsIGkrKywgJmJsb2NrLCBibG9jay5sZWFkZXJPZmZzZXQoKSwgYmxv
Y2sudG90YWxMZW5ndGgoKSk7CiAKICAgICAgICAgZGF0YUxvZ0YoIlByZWRlY2Vzc29yczoiKTsK
LSAgICAgICAgZHVtcEJpdFZlY3RvcihwcmVkZWNlc3NvcnNbYmxvY2stPmluZGV4KCldKTsKKyAg
ICAgICAgZHVtcEJpdFZlY3RvcihwcmVkZWNlc3NvcnNbYmxvY2suaW5kZXgoKV0pOwogICAgICAg
ICBkYXRhTG9nRigiXG4iKTsKIAogICAgICAgICBkYXRhTG9nRigiU3VjY2Vzc29yczoiKTsKICAg
ICAgICAgRmFzdEJpdFZlY3RvciBzdWNjZXNzb3JzOwogICAgICAgICBzdWNjZXNzb3JzLnJlc2l6
ZShudW1iZXJPZkJsb2Nrcyk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBibG9j
ay0+c3VjY2Vzc29ycygpLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBCeXRlY29kZUJhc2lj
QmxvY2sqIHN1Y2Nlc3NvciA9IGJsb2NrLT5zdWNjZXNzb3JzKClbal07Ci0gICAgICAgICAgICBz
dWNjZXNzb3JzW3N1Y2Nlc3Nvci0+aW5kZXgoKV0gPSB0cnVlOwotICAgICAgICB9CisgICAgICAg
IGZvciAodW5zaWduZWQgc3VjY2Vzc29ySW5kZXggOiBibG9jay5zdWNjZXNzb3JzKCkpCisgICAg
ICAgICAgICBzdWNjZXNzb3JzW3N1Y2Nlc3NvckluZGV4XSA9IHRydWU7CiAgICAgICAgIGR1bXBC
aXRWZWN0b3Ioc3VjY2Vzc29ycyk7IC8vIER1bXAgaW4gc29ydGVkIG9yZGVyLgogICAgICAgICBk
YXRhTG9nRigiXG4iKTsKIAotICAgICAgICBpZiAoYmxvY2stPmlzRW50cnlCbG9jaygpKSB7Ci0g
ICAgICAgICAgICBkYXRhTG9nRigiRW50cnkgYmxvY2sgJXBcbiIsIGJsb2NrKTsKKyAgICAgICAg
aWYgKGJsb2NrLmlzRW50cnlCbG9jaygpKSB7CisgICAgICAgICAgICBkYXRhTG9nRigiRW50cnkg
YmxvY2sgJXBcbiIsICZibG9jayk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQot
ICAgICAgICBpZiAoYmxvY2stPmlzRXhpdEJsb2NrKCkpIHsKLSAgICAgICAgICAgIGRhdGFMb2dG
KCJFeGl0IGJsb2NrOiAlcFxuIiwgYmxvY2spOworICAgICAgICBpZiAoYmxvY2suaXNFeGl0Qmxv
Y2soKSkgeworICAgICAgICAgICAgZGF0YUxvZ0YoIkV4aXQgYmxvY2s6ICVwXG4iLCAmYmxvY2sp
OwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBieXRlY29kZU9mZnNldCA9IGJsb2NrLT5sZWFkZXJPZmZzZXQoKTsgYnl0ZWNvZGVPZmZzZXQg
PCBibG9jay0+bGVhZGVyT2Zmc2V0KCkgKyBibG9jay0+dG90YWxMZW5ndGgoKTspIHsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBieXRlY29kZU9mZnNldCA9IGJsb2NrLmxlYWRlck9mZnNldCgpOyBi
eXRlY29kZU9mZnNldCA8IGJsb2NrLmxlYWRlck9mZnNldCgpICsgYmxvY2sudG90YWxMZW5ndGgo
KTspIHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8gY3VycmVudEluc3RydWN0aW9uID0gaW5zdHJ1
Y3Rpb25zLmF0KGJ5dGVjb2RlT2Zmc2V0KTsKIAogICAgICAgICAgICAgZGF0YUxvZ0YoIkxpdmUg
dmFyaWFibGVzOiIpOwpAQCAtMTk1LDcgKzE5Niw3IEBAIHZvaWQgQnl0ZWNvZGVMaXZlbmVzc0Fu
YWx5c2lzOjpkdW1wUmVzdWx0cyhDb2RlQmxvY2sqIGNvZGVCbG9jaykKICAgICAgICAgfQogCiAg
ICAgICAgIGRhdGFMb2dGKCJMaXZlIHZhcmlhYmxlczoiKTsKLSAgICAgICAgRmFzdEJpdFZlY3Rv
ciBsaXZlQWZ0ZXIgPSBibG9jay0+b3V0KCk7CisgICAgICAgIEZhc3RCaXRWZWN0b3IgbGl2ZUFm
dGVyID0gYmxvY2sub3V0KCk7CiAgICAgICAgIGR1bXBCaXRWZWN0b3IobGl2ZUFmdGVyKTsKICAg
ICAgICAgZGF0YUxvZ0YoIlxuIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNpcy5oIGIvU291cmNlL0phdmFT
Y3JpcHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNpcy5oCmluZGV4IDNlNWVk
YzBhNjhhZTQ0ZGY2NTE1Y2RiZmQ0YjQyN2VmNjllZWYxODAuLmIzZWY4NTg0YzVjMTZhOWE3MjU5
NjNkNWViNzgxNTc5MjViM2FlN2EgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9CeXRlY29kZUxpdmVuZXNzQW5hbHlzaXMuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzLmgKQEAgLTY0LDEwICs2NCwx
MCBAQCBjbGFzcyBCeXRlY29kZUxpdmVuZXNzUHJvcGFnYXRpb24gewogICAgIHN0YXRpYyB2b2lk
IHN0ZXBPdmVySW5zdHJ1Y3Rpb24oQ29kZUJsb2NrVHlwZSosIGNvbnN0IEluc3RydWN0aW9uU3Ry
ZWFtJiwgQnl0ZWNvZGVHcmFwaCYsIEJ5dGVjb2RlSW5kZXgsIEZhc3RCaXRWZWN0b3ImIG91dCk7
CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2RlQmxvY2tUeXBlLCB0eXBlbmFtZSBJbnN0cnVj
dGlvbnM+Ci0gICAgc3RhdGljIGJvb2wgY29tcHV0ZUxvY2FsTGl2ZW5lc3NGb3JCeXRlY29kZUlu
ZGV4KENvZGVCbG9ja1R5cGUqLCBjb25zdCBJbnN0cnVjdGlvbnMmLCBCeXRlY29kZUdyYXBoJiwg
Qnl0ZWNvZGVCYXNpY0Jsb2NrKiwgQnl0ZWNvZGVJbmRleCwgRmFzdEJpdFZlY3RvciYgcmVzdWx0
KTsKKyAgICBzdGF0aWMgYm9vbCBjb21wdXRlTG9jYWxMaXZlbmVzc0ZvckJ5dGVjb2RlSW5kZXgo
Q29kZUJsb2NrVHlwZSosIGNvbnN0IEluc3RydWN0aW9ucyYsIEJ5dGVjb2RlR3JhcGgmLCBCeXRl
Y29kZUJhc2ljQmxvY2smLCBCeXRlY29kZUluZGV4LCBGYXN0Qml0VmVjdG9yJiByZXN1bHQpOwog
CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29kZUJsb2NrVHlwZSwgdHlwZW5hbWUgSW5zdHJ1Y3Rp
b25zPgotICAgIHN0YXRpYyBib29sIGNvbXB1dGVMb2NhbExpdmVuZXNzRm9yQmxvY2soQ29kZUJs
b2NrVHlwZSosIGNvbnN0IEluc3RydWN0aW9ucyYsIEJ5dGVjb2RlR3JhcGgmLCBCeXRlY29kZUJh
c2ljQmxvY2sqKTsKKyAgICBzdGF0aWMgYm9vbCBjb21wdXRlTG9jYWxMaXZlbmVzc0ZvckJsb2Nr
KENvZGVCbG9ja1R5cGUqLCBjb25zdCBJbnN0cnVjdGlvbnMmLCBCeXRlY29kZUdyYXBoJiwgQnl0
ZWNvZGVCYXNpY0Jsb2NrJik7CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2RlQmxvY2tUeXBl
LCB0eXBlbmFtZSBJbnN0cnVjdGlvbnM+CiAgICAgc3RhdGljIEZhc3RCaXRWZWN0b3IgZ2V0TGl2
ZW5lc3NJbmZvQXRCeXRlY29kZUluZGV4KENvZGVCbG9ja1R5cGUqLCBjb25zdCBJbnN0cnVjdGlv
bnMmLCBCeXRlY29kZUdyYXBoJiwgQnl0ZWNvZGVJbmRleCk7CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzSW5saW5lcy5o
IGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0J5dGVjb2RlTGl2ZW5lc3NBbmFseXNp
c0lubGluZXMuaAppbmRleCBkZTZjYThkYzkxMDliNzg5NjdmMTA1NTAwOWRhMzBlODk5ODQ4Mjgy
Li45YzU0YjQzZGRjMzlhNDJlYmRhZmM3N2ExY2E3MjAyMjg1MmUwNjhlIDEwMDY0NAotLS0gYS9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQnl0ZWNvZGVMaXZlbmVzc0FuYWx5c2lzSW5s
aW5lcy5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9CeXRlY29kZUxpdmVu
ZXNzQW5hbHlzaXNJbmxpbmVzLmgKQEAgLTEzNSwyOSArMTM1LDMxIEBAIGlubGluZSB2b2lkIEJ5
dGVjb2RlTGl2ZW5lc3NQcm9wYWdhdGlvbjo6c3RlcE92ZXJJbnN0cnVjdGlvbihDb2RlQmxvY2tU
eXBlKiBjb2RlCiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENvZGVCbG9ja1R5cGUsIHR5cGVuYW1l
IEluc3RydWN0aW9ucz4KLWlubGluZSBib29sIEJ5dGVjb2RlTGl2ZW5lc3NQcm9wYWdhdGlvbjo6
Y29tcHV0ZUxvY2FsTGl2ZW5lc3NGb3JCeXRlY29kZUluZGV4KENvZGVCbG9ja1R5cGUqIGNvZGVC
bG9jaywgY29uc3QgSW5zdHJ1Y3Rpb25zJiBpbnN0cnVjdGlvbnMsIEJ5dGVjb2RlR3JhcGgmIGdy
YXBoLCBCeXRlY29kZUJhc2ljQmxvY2sqIGJsb2NrLCBCeXRlY29kZUluZGV4IHRhcmdldEluZGV4
LCBGYXN0Qml0VmVjdG9yJiByZXN1bHQpCitpbmxpbmUgYm9vbCBCeXRlY29kZUxpdmVuZXNzUHJv
cGFnYXRpb246OmNvbXB1dGVMb2NhbExpdmVuZXNzRm9yQnl0ZWNvZGVJbmRleChDb2RlQmxvY2tU
eXBlKiBjb2RlQmxvY2ssIGNvbnN0IEluc3RydWN0aW9ucyYgaW5zdHJ1Y3Rpb25zLCBCeXRlY29k
ZUdyYXBoJiBncmFwaCwgQnl0ZWNvZGVCYXNpY0Jsb2NrJiBibG9jaywgQnl0ZWNvZGVJbmRleCB0
YXJnZXRJbmRleCwgRmFzdEJpdFZlY3RvciYgcmVzdWx0KQogewotICAgIEFTU0VSVCghYmxvY2st
PmlzRXhpdEJsb2NrKCkpOwotICAgIEFTU0VSVCghYmxvY2stPmlzRW50cnlCbG9jaygpKTsKKyAg
ICBBU1NFUlQoIWJsb2NrLmlzRXhpdEJsb2NrKCkpOworICAgIEFTU0VSVCghYmxvY2suaXNFbnRy
eUJsb2NrKCkpOwogCi0gICAgRmFzdEJpdFZlY3RvciBvdXQgPSBibG9jay0+b3V0KCk7CisgICAg
RmFzdEJpdFZlY3RvciBvdXQgPSBibG9jay5vdXQoKTsKIAotICAgIGZvciAoaW50IGkgPSBibG9j
ay0+b2Zmc2V0cygpLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIHVuc2lnbmVk
IGJ5dGVjb2RlT2Zmc2V0ID0gYmxvY2stPm9mZnNldHMoKVtpXTsKLSAgICAgICAgaWYgKHRhcmdl
dEluZGV4Lm9mZnNldCgpID4gYnl0ZWNvZGVPZmZzZXQpCisgICAgdW5zaWduZWQgY3Vyc29yID0g
YmxvY2sudG90YWxMZW5ndGgoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBibG9jay5kZWx0YSgp
LnNpemUoKTsgaS0tOykgeworICAgICAgICBjdXJzb3IgLT0gYmxvY2suZGVsdGEoKVtpXTsKKyAg
ICAgICAgQnl0ZWNvZGVJbmRleCBieXRlY29kZUluZGV4ID0gQnl0ZWNvZGVJbmRleChibG9jay5s
ZWFkZXJPZmZzZXQoKSArIGN1cnNvcik7CisgICAgICAgIGlmICh0YXJnZXRJbmRleC5vZmZzZXQo
KSA+IGJ5dGVjb2RlSW5kZXgub2Zmc2V0KCkpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
c3RlcE92ZXJJbnN0cnVjdGlvbihjb2RlQmxvY2ssIGluc3RydWN0aW9ucywgZ3JhcGgsIEJ5dGVj
b2RlSW5kZXgoYnl0ZWNvZGVPZmZzZXQpLCBvdXQpOworICAgICAgICBzdGVwT3Zlckluc3RydWN0
aW9uKGNvZGVCbG9jaywgaW5zdHJ1Y3Rpb25zLCBncmFwaCwgYnl0ZWNvZGVJbmRleCwgb3V0KTsK
ICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0LnNldEFuZENoZWNrKG91dCk7CiB9CiAKIHRlbXBs
YXRlPHR5cGVuYW1lIENvZGVCbG9ja1R5cGUsIHR5cGVuYW1lIEluc3RydWN0aW9ucz4KLWlubGlu
ZSBib29sIEJ5dGVjb2RlTGl2ZW5lc3NQcm9wYWdhdGlvbjo6Y29tcHV0ZUxvY2FsTGl2ZW5lc3NG
b3JCbG9jayhDb2RlQmxvY2tUeXBlKiBjb2RlQmxvY2ssIGNvbnN0IEluc3RydWN0aW9ucyYgaW5z
dHJ1Y3Rpb25zLCBCeXRlY29kZUdyYXBoJiBncmFwaCwgQnl0ZWNvZGVCYXNpY0Jsb2NrKiBibG9j
aykKK2lubGluZSBib29sIEJ5dGVjb2RlTGl2ZW5lc3NQcm9wYWdhdGlvbjo6Y29tcHV0ZUxvY2Fs
TGl2ZW5lc3NGb3JCbG9jayhDb2RlQmxvY2tUeXBlKiBjb2RlQmxvY2ssIGNvbnN0IEluc3RydWN0
aW9ucyYgaW5zdHJ1Y3Rpb25zLCBCeXRlY29kZUdyYXBoJiBncmFwaCwgQnl0ZWNvZGVCYXNpY0Js
b2NrJiBibG9jaykKIHsKLSAgICBpZiAoYmxvY2stPmlzRXhpdEJsb2NrKCkgfHwgYmxvY2stPmlz
RW50cnlCbG9jaygpKQorICAgIGlmIChibG9jay5pc0V4aXRCbG9jaygpIHx8IGJsb2NrLmlzRW50
cnlCbG9jaygpKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGNvbXB1dGVMb2Nh
bExpdmVuZXNzRm9yQnl0ZWNvZGVJbmRleChjb2RlQmxvY2ssIGluc3RydWN0aW9ucywgZ3JhcGgs
IGJsb2NrLCBCeXRlY29kZUluZGV4KGJsb2NrLT5sZWFkZXJPZmZzZXQoKSksIGJsb2NrLT5pbigp
KTsKKyAgICByZXR1cm4gY29tcHV0ZUxvY2FsTGl2ZW5lc3NGb3JCeXRlY29kZUluZGV4KGNvZGVC
bG9jaywgaW5zdHJ1Y3Rpb25zLCBncmFwaCwgYmxvY2ssIEJ5dGVjb2RlSW5kZXgoYmxvY2subGVh
ZGVyT2Zmc2V0KCkpLCBibG9jay5pbigpKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgQ29kZUJs
b2NrVHlwZSwgdHlwZW5hbWUgSW5zdHJ1Y3Rpb25zPgpAQCAtMTY5LDcgKzE3MSw3IEBAIGlubGlu
ZSBGYXN0Qml0VmVjdG9yIEJ5dGVjb2RlTGl2ZW5lc3NQcm9wYWdhdGlvbjo6Z2V0TGl2ZW5lc3NJ
bmZvQXRCeXRlY29kZUluZGV4CiAgICAgQVNTRVJUKCFibG9jay0+aXNFeGl0QmxvY2soKSk7CiAg
ICAgRmFzdEJpdFZlY3RvciBvdXQ7CiAgICAgb3V0LnJlc2l6ZShibG9jay0+b3V0KCkubnVtQml0
cygpKTsKLSAgICBjb21wdXRlTG9jYWxMaXZlbmVzc0ZvckJ5dGVjb2RlSW5kZXgoY29kZUJsb2Nr
LCBpbnN0cnVjdGlvbnMsIGdyYXBoLCBibG9jaywgYnl0ZWNvZGVJbmRleCwgb3V0KTsKKyAgICBj
b21wdXRlTG9jYWxMaXZlbmVzc0ZvckJ5dGVjb2RlSW5kZXgoY29kZUJsb2NrLCBpbnN0cnVjdGlv
bnMsIGdyYXBoLCAqYmxvY2ssIGJ5dGVjb2RlSW5kZXgsIG91dCk7CiAgICAgcmV0dXJuIG91dDsK
IH0KIApAQCAtMTc3LDI3ICsxNzksMjkgQEAgdGVtcGxhdGU8dHlwZW5hbWUgQ29kZUJsb2NrVHlw
ZSwgdHlwZW5hbWUgSW5zdHJ1Y3Rpb25zPgogaW5saW5lIHZvaWQgQnl0ZWNvZGVMaXZlbmVzc1By
b3BhZ2F0aW9uOjpydW5MaXZlbmVzc0ZpeHBvaW50KENvZGVCbG9ja1R5cGUqIGNvZGVCbG9jaywg
Y29uc3QgSW5zdHJ1Y3Rpb25zJiBpbnN0cnVjdGlvbnMsIEJ5dGVjb2RlR3JhcGgmIGdyYXBoKQog
ewogICAgIHVuc2lnbmVkIG51bWJlck9mVmFyaWFibGVzID0gY29kZUJsb2NrLT5udW1DYWxsZWVM
b2NhbHMoKTsKLSAgICBmb3IgKEJ5dGVjb2RlQmFzaWNCbG9jayogYmxvY2sgOiBncmFwaCkgewot
ICAgICAgICBibG9jay0+aW4oKS5yZXNpemUobnVtYmVyT2ZWYXJpYWJsZXMpOwotICAgICAgICBi
bG9jay0+b3V0KCkucmVzaXplKG51bWJlck9mVmFyaWFibGVzKTsKLSAgICAgICAgYmxvY2stPmlu
KCkuY2xlYXJBbGwoKTsKLSAgICAgICAgYmxvY2stPm91dCgpLmNsZWFyQWxsKCk7CisgICAgZm9y
IChCeXRlY29kZUJhc2ljQmxvY2smIGJsb2NrIDogZ3JhcGgpIHsKKyAgICAgICAgYmxvY2suaW4o
KS5yZXNpemUobnVtYmVyT2ZWYXJpYWJsZXMpOworICAgICAgICBibG9jay5vdXQoKS5yZXNpemUo
bnVtYmVyT2ZWYXJpYWJsZXMpOworICAgICAgICBibG9jay5pbigpLmNsZWFyQWxsKCk7CisgICAg
ICAgIGJsb2NrLm91dCgpLmNsZWFyQWxsKCk7CiAgICAgfQogCiAgICAgYm9vbCBjaGFuZ2VkOwot
ICAgIEJ5dGVjb2RlQmFzaWNCbG9jayogbGFzdEJsb2NrID0gZ3JhcGgubGFzdCgpOwotICAgIGxh
c3RCbG9jay0+aW4oKS5jbGVhckFsbCgpOwotICAgIGxhc3RCbG9jay0+b3V0KCkuY2xlYXJBbGwo
KTsKKyAgICBCeXRlY29kZUJhc2ljQmxvY2smIGxhc3RCbG9jayA9IGdyYXBoLmxhc3QoKTsKKyAg
ICBsYXN0QmxvY2suaW4oKS5jbGVhckFsbCgpOworICAgIGxhc3RCbG9jay5vdXQoKS5jbGVhckFs
bCgpOwogICAgIEZhc3RCaXRWZWN0b3IgbmV3T3V0OwotICAgIG5ld091dC5yZXNpemUobGFzdEJs
b2NrLT5vdXQoKS5udW1CaXRzKCkpOworICAgIG5ld091dC5yZXNpemUobGFzdEJsb2NrLm91dCgp
Lm51bUJpdHMoKSk7CiAgICAgZG8gewogICAgICAgICBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAg
IGZvciAoc3RkOjp1bmlxdWVfcHRyPEJ5dGVjb2RlQmFzaWNCbG9jaz4mIGJsb2NrIDogZ3JhcGgu
YmFzaWNCbG9ja3NJblJldmVyc2VPcmRlcigpKSB7CisgICAgICAgIGZvciAoQnl0ZWNvZGVCYXNp
Y0Jsb2NrJiBibG9jayA6IGdyYXBoLmJhc2ljQmxvY2tzSW5SZXZlcnNlT3JkZXIoKSkgewogICAg
ICAgICAgICAgbmV3T3V0LmNsZWFyQWxsKCk7Ci0gICAgICAgICAgICBmb3IgKEJ5dGVjb2RlQmFz
aWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkKLSAgICAgICAgICAgICAg
ICBuZXdPdXQgfD0gc3VjY2Vzc29yLT5pbigpOwotICAgICAgICAgICAgYmxvY2stPm91dCgpID0g
bmV3T3V0OwotICAgICAgICAgICAgY2hhbmdlZCB8PSBjb21wdXRlTG9jYWxMaXZlbmVzc0ZvckJs
b2NrKGNvZGVCbG9jaywgaW5zdHJ1Y3Rpb25zLCBncmFwaCwgYmxvY2suZ2V0KCkpOworICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBibG9ja0luZGV4IDogYmxvY2suc3VjY2Vzc29ycygpKSB7Cisg
ICAgICAgICAgICAgICAgQnl0ZWNvZGVCYXNpY0Jsb2NrJiBzdWNjZXNzb3IgPSBncmFwaFtibG9j
a0luZGV4XTsKKyAgICAgICAgICAgICAgICBuZXdPdXQgfD0gc3VjY2Vzc29yLmluKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBibG9jay5vdXQoKSA9IG5ld091dDsKKyAgICAgICAgICAg
IGNoYW5nZWQgfD0gY29tcHV0ZUxvY2FsTGl2ZW5lc3NGb3JCbG9jayhjb2RlQmxvY2ssIGluc3Ry
dWN0aW9ucywgZ3JhcGgsIGJsb2NrKTsKICAgICAgICAgfQogICAgIH0gd2hpbGUgKGNoYW5nZWQp
OwogfQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0luc3RydWN0
aW9uU3RyZWFtLmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvSW5zdHJ1Y3Rpb25T
dHJlYW0uaAppbmRleCAxOTY2ZmZhMjBmMjU4M2EzZGFlZjk1ODk4NTVmMzYwMTg1OTE4NjM3Li44
YjYwMTdiOWU4MjdhMTEzN2RmM2M3ZmNjMGM0ZDljMjZhNjBjMTcxIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvSW5zdHJ1Y3Rpb25TdHJlYW0uaAorKysgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvSW5zdHJ1Y3Rpb25TdHJlYW0uaApAQCAtMTExLDcg
KzExMSw5IEBAIGNsYXNzIEluc3RydWN0aW9uU3RyZWFtIHsKICAgICBwdWJsaWM6CiAgICAgICAg
IFJlZiBmcmVlemUoKSBjb25zdCAgeyByZXR1cm4gUmVmIHsgbV9pbnN0cnVjdGlvbnMsIG1faW5k
ZXggfTsgfQogICAgICAgICBpbmxpbmUgSW5zdHJ1Y3Rpb24qIG9wZXJhdG9yLT4oKSB7IHJldHVy
biB1bndyYXAoKTsgfQorICAgICAgICBpbmxpbmUgY29uc3QgSW5zdHJ1Y3Rpb24qIG9wZXJhdG9y
LT4oKSBjb25zdCB7IHJldHVybiB1bndyYXAoKTsgfQogICAgICAgICBpbmxpbmUgSW5zdHJ1Y3Rp
b24qIHB0cigpIHsgcmV0dXJuIHVud3JhcCgpOyB9CisgICAgICAgIGlubGluZSBjb25zdCBJbnN0
cnVjdGlvbiogcHRyKCkgY29uc3QgeyByZXR1cm4gdW53cmFwKCk7IH0KICAgICAgICAgaW5saW5l
IG9wZXJhdG9yIFJlZigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBSZWYgeyBtX2lu
c3RydWN0aW9ucywgbV9pbmRleCB9OwpAQCAtMTE5LDYgKzEyMSw3IEBAIGNsYXNzIEluc3RydWN0
aW9uU3RyZWFtIHsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIGlubGluZSBJbnN0cnVjdGlvbiog
dW53cmFwKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbnN0cnVjdGlvbio+KCZtX2luc3Ry
dWN0aW9uc1ttX2luZGV4XSk7IH0KKyAgICAgICAgaW5saW5lIGNvbnN0IEluc3RydWN0aW9uKiB1
bndyYXAoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEluc3RydWN0aW9u
Kj4oJm1faW5zdHJ1Y3Rpb25zW21faW5kZXhdKTsgfQogICAgIH07CiAKIHByaXZhdGU6CmRpZmYg
LS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvT3Bjb2RlLmggYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvT3Bjb2RlLmgKaW5kZXggYzAyYTZjNmY2YzZhYzcwNDEy
YmY3ZGU5NzRhZjhlNTZhZTM5NjM5Zi4uMTNhOTkzOWY1NDhmZGQ5ZGE0YzBmYWI3N2JkYmM5Yzkz
NTBkMjUxNCAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL09wY29k
ZS5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9PcGNvZGUuaApAQCAtMzYs
NiArMzYsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8d3RmL0Fzc2VydGlv
bnMuaD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCiBuYW1lc3BhY2UgSlNDIHsKIApA
QCAtNTMsNyArNTQsNiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICApCiAKIAotY29uc3QgaW50IG1h
eE9wY29kZUxlbmd0aCA9IDQwOwogI2lmIEVOQUJMRShDX0xPT1ApCiBjb25zdCBpbnQgbnVtT3Bj
b2RlSURzID0gTlVNQkVSX09GX0JZVEVDT0RFX0lEUyArIE5VTUJFUl9PRl9DTE9PUF9CWVRFQ09E
RV9IRUxQRVJfSURTICsgTlVNQkVSX09GX0JZVEVDT0RFX0hFTFBFUl9JRFM7CiAjZWxzZQpAQCAt
ODgsNiArODgsMTMgQEAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHdhc21PcGNvZGVMZW5ndGhzW107
CiAgICAgRk9SX0VBQ0hfV0FTTV9JRChPUENPREVfSURfTEVOR1RIUyk7CiAjdW5kZWYgT1BDT0RF
X0lEX0xFTkdUSFMKIAorI2RlZmluZSBDQUxDVUxBVEVfTUFYX0xFTkdUSChpZCwgbGVuZ3RoKSBs
ZW5ndGgsCitzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIG1heEpTT3Bjb2RlTGVuZ3RoID0gLyog
T3Bjb2RlICovIDEgKyAvKiBXaWRlMzIgT3Bjb2RlICovIDEgKyAvKiBPcGVyYW5kcyAqLyAoTUFY
X0xFTkdUSF9PRl9CWVRFQ09ERV9JRFMgLSAxKSAqIDQ7CitzdGF0aWMgY29uc3RleHByIHVuc2ln
bmVkIG1heFdhc21PcGNvZGVMZW5ndGggPSAvKiBPcGNvZGUgKi8gMSArIC8qIFdpZGUzMiBPcGNv
ZGUgKi8gMSArIC8qIE9wZXJhbmRzICovIChNQVhfTEVOR1RIX09GX1dBU01fSURTIC0gMSkgKiA0
OworI3VuZGVmIENBTENVTEFURV9NQVhfTEVOR1RICitzdGF0aWMgY29uc3RleHByIHVuc2lnbmVk
IG1heE9wY29kZUxlbmd0aCA9IHN0ZDo6bWF4KG1heEpTT3Bjb2RlTGVuZ3RoLCBtYXhXYXNtT3Bj
b2RlTGVuZ3RoKTsKK3N0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgYml0V2lkdGhGb3JNYXhPcGNv
ZGVMZW5ndGggPSBXVEY6OmdldE1TQlNldENvbnN0ZXhwcihtYXhPcGNvZGVMZW5ndGgpICsgMTsK
KwogI2RlZmluZSBGT1JfRUFDSF9PUENPREVfV0lUSF9WQUxVRV9QUk9GSUxFKG1hY3JvKSBcCiAg
ICAgbWFjcm8oT3BDYWxsVmFyYXJncykgXAogICAgIG1hY3JvKE9wVGFpbENhbGxWYXJhcmdzKSBc
CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvZ2VuZXJhdG9yL1NlY3Rpb24ucmIg
Yi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvZ2VuZXJhdG9yL1NlY3Rpb24ucmIKaW5kZXggNjY4NTVi
YTY1MDA4MGU0YzIzY2MwZWJlYzEwZTc5NDljZGU3NjhiOS4uOWI1ZWU5MDk2ZWU3MWIxYjBkM2Vk
N2Y3Y2QxOGRiMDZmY2IzNWZjZiAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2dl
bmVyYXRvci9TZWN0aW9uLnJiCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9nZW5lcmF0b3Iv
U2VjdGlvbi5yYgpAQCAtNjksNiArNjksNyBAQCBkZWYgaGVhZGVyX2hlbHBlcnMobnVtX29wY29k
ZXMpCiAgICAgICAgICAgb3V0IDw8ICJcbiIKIAogICAgICAgICAgIG91dC53cml0ZSgiI2RlZmlu
ZSBOVU1CRVJfT0ZfI3tjb25maWdbOm1hY3JvX25hbWVfY29tcG9uZW50XX1fSURTICN7b3Bjb2Rl
cy5sZW5ndGh9XG4iKQorICAgICAgICAgIG91dC53cml0ZSgiI2RlZmluZSBNQVhfTEVOR1RIX09G
XyN7Y29uZmlnWzptYWNyb19uYW1lX2NvbXBvbmVudF19X0lEUyAjeyhvcGNvZGVzLm1heCB7fGEs
IGJ8IGEubGVuZ3RoIDw9PiBiLmxlbmd0aCB9KS5sZW5ndGh9XG4iKQogICAgICAgZW5kCiAKICAg
ICAgIGlmIGNvbmZpZ1s6ZW1pdF9pbl9zdHJ1Y3RzX2ZpbGVdCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaml0L0pJVC5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJ
VC5jcHAKaW5kZXggZTQyNDhmMjIyM2EzMDk0MTZhNzg4ZWU3OTkyMjRlZDViMjFiOGY0Ni4uMTMz
ZDU0NzVmMmQ5YmU4YzBhOTE3NzhmMjZkYjQwNTBmNTRhYjMyMiAxMDA2NDQKLS0tIGEvU291cmNl
L0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
aXQvSklULmNwcApAQCAtMjE1LDcgKzIxNSw4IEBAIHZvaWQgSklUOjpwcml2YXRlQ29tcGlsZU1h
aW5QYXNzKCkKIAogICAgICAgICAgICAgd2hpbGUgKEJ5dGVjb2RlQmFzaWNCbG9jayogYmxvY2sg
PSB3b3JrbGlzdC5wb3AoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0Qnl0ZWNvZGVJbmRleCA9
IEJ5dGVjb2RlSW5kZXgoc3RkOjptaW4oc3RhcnRCeXRlY29kZUluZGV4Lm9mZnNldCgpLCBibG9j
ay0+bGVhZGVyT2Zmc2V0KCkpKTsKLSAgICAgICAgICAgICAgICB3b3JrbGlzdC5wdXNoQWxsKGJs
b2NrLT5zdWNjZXNzb3JzKCkpOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgc3VjY2Vz
c29ySW5kZXggOiBibG9jay0+c3VjY2Vzc29ycygpKQorICAgICAgICAgICAgICAgICAgICB3b3Jr
bGlzdC5wdXNoKCZncmFwaFtzdWNjZXNzb3JJbmRleF0pOwogCiAgICAgICAgICAgICAgICAgLy8g
QWxzbyBhZGQgY2F0Y2ggYmxvY2tzIGZvciBieXRlY29kZXMgdGhhdCB0aHJvdy4KICAgICAgICAg
ICAgICAgICBpZiAobV9jb2RlQmxvY2stPm51bWJlck9mRXhjZXB0aW9uSGFuZGxlcnMoKSkgewpk
aWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2xsaW50L0xMSW50RGF0YS5jcHAgYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvbGxpbnQvTExJbnREYXRhLmNwcAppbmRleCAzOWE1NDEyYjY5
MWUwMjJjYWYwMjNkODBiZTU2NTczMWExNjhlOTBjLi4xMWQ3ZTJmZDQxNjBiMDNiNWViMDdiZWVi
M2ZkNTkwY2FmZWM2YmRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvbGxpbnQv
TExJbnREYXRhLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvbGxpbnQvTExJbnREYXRh
LmNwcApAQCAtODEsNyArODEsNyBAQCB2b2lkIGluaXRpYWxpemUoKQogICAgIH0KIAogICAgIEFT
U0VSVChsbGludF90aHJvd19mcm9tX3Nsb3dfcGF0aF90cmFtcG9saW5lIDwgVUlOVDhfTUFYKTsK
LSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heE9wY29kZUxlbmd0aCArIDE7ICsraSkgeworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXhPcGNvZGVMZW5ndGggKyAxOyArK2kpIHsKICAg
ICAgICAgRGF0YTo6c19leGNlcHRpb25JbnN0cnVjdGlvbnNbaV0gPSBsbGludF90aHJvd19mcm9t
X3Nsb3dfcGF0aF90cmFtcG9saW5lOwogICAgICAgICBEYXRhOjpzX3dhc21FeGNlcHRpb25JbnN0
cnVjdGlvbnNbaV0gPSB3YXNtX3Rocm93X2Zyb21fc2xvd19wYXRoX3RyYW1wb2xpbmU7CiAgICAg
fQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2xsaW50L0xvd0xldmVsSW50ZXJw
cmV0ZXIuY3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2xsaW50L0xvd0xldmVsSW50ZXJwcmV0
ZXIuY3BwCmluZGV4IDQwOWJhNDk2NjkwZGUyYmNlNjZjNjViMDE1ODM5NGM3MWMwZmU3NjQuLmY4
YWZjN2EwNzBkNzM1MzgxM2E5ZmIzM2UyZmYyMzUyYzY5ZWJhNzYgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9sbGludC9Mb3dMZXZlbEludGVycHJldGVyLmNwcAorKysgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvbGxpbnQvTG93TGV2ZWxJbnRlcnByZXRlci5jcHAKQEAgLTI4MCw3
ICsyODAsNyBAQCBKU1ZhbHVlIENMb29wOjpleGVjdXRlKE9wY29kZUlEIGVudHJ5T3Bjb2RlSUQs
IHZvaWQqIGV4ZWN1dGFibGVBZGRyZXNzLCBWTSogdm0sCiAgICAgICAgIC8vIGluaXRpYWxpemVk
IHRoZSBvcGNvZGVNYXAgYWJvdmUuIFRoaXMgaXMgYmVjYXVzZSBnZXRDb2RlUHRyKCkKICAgICAg
ICAgLy8gY2FuIGRlcGVuZCBvbiB0aGUgb3Bjb2RlTWFwLgogICAgICAgICB1aW50OF90KiBleGNl
cHRpb25JbnN0cnVjdGlvbnMgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihMTEludDo6ZXhj
ZXB0aW9uSW5zdHJ1Y3Rpb25zKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heE9w
Y29kZUxlbmd0aCArIDE7ICsraSkKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1h
eE9wY29kZUxlbmd0aCArIDE7ICsraSkKICAgICAgICAgICAgIGV4Y2VwdGlvbkluc3RydWN0aW9u
c1tpXSA9IGxsaW50X3Rocm93X2Zyb21fc2xvd19wYXRoX3RyYW1wb2xpbmU7CiAKICAgICAgICAg
cmV0dXJuIEpTVmFsdWUoKTsK
</data>
<flag name="review"
          id="404919"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>