<?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>150457</bug_id>
          
          <creation_ts>2015-10-22 11:13:41 -0700</creation_ts>
          <short_desc>Air should allocate registers</short_desc>
          <delta_ts>2016-10-16 14:41:19 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>150456</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Benjamin Poulain">benjamin</assigned_to>
          <cc>benjamin</cc>
    
    <cc>mark.lam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1135745</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-10-22 11:13:41 -0700</bug_when>
    <thetext>Instead of spilling everything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1141024</commentid>
    <comment_count>1</comment_count>
      <attachid>265257</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-11-10 18:33:13 -0800</bug_when>
    <thetext>Created attachment 265257
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1141027</commentid>
    <comment_count>2</comment_count>
      <attachid>265257</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-11-10 18:45:58 -0800</bug_when>
    <thetext>Comment on attachment 265257
Patch

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

&gt; Source/JavaScriptCore/b3/air/AirInstInlines.h:63
&gt; -                arg = Arg::stack(stackSlot);
&gt; +                arg = Arg::stack(stackSlot, arg.offset());

Oops.

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:51
&gt; +        bool isMove = inst.opcode == Move || inst.opcode == Move32;

We shouldn&apos;t coalesce Move32&apos;s, since they zero-extend.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1141057</commentid>
    <comment_count>3</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-11-10 21:10:39 -0800</bug_when>
    <thetext>Committed r192292: &lt;http://trac.webkit.org/changeset/192292&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1240787</commentid>
    <comment_count>4</comment_count>
      <attachid>265257</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-10-16 13:48:22 -0700</bug_when>
    <thetext>Comment on attachment 265257
Patch

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

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:323
&gt; +            if (!degree)
&gt; +                continue;

Oh man!  This finally turned into a bug, I think!  A spill tmp from the previous iteration may have no degree: imagine a tmp that is live everywhere and interferes with everyone, but has one use like:

Move %ourTmp, %someOtherTmp

Where there are no other tmps live.  After spill conversion, this may look like:

Move (ourSpill), %newTmp
Move %newTmp, %someOtherTmp

Of course, we&apos;d rather not get this kind of spill code but it&apos;s totally possible because we now have a bunch of random conditions under which we won&apos;t slap the spill address directly into the Move.

After this happens, assuming that the only thing live was %someOtherTmp, we will have zero degree for %newTmp because the Move is coalescable and does not contribute to interference.

Then, we might coalesce %someOtherTmp with %newTmp.  Once this happens, if we make the %newTmp be the master, we&apos;re in deep trouble because %newTmp is not on any worklist due to these two lines of code!

Do you agree that these two lines can be removed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1240791</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-10-16 14:41:19 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Comment on attachment 265257 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=265257&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:323
&gt; &gt; +            if (!degree)
&gt; &gt; +                continue;
&gt; 
&gt; Oh man!  This finally turned into a bug, I think!  A spill tmp from the
&gt; previous iteration may have no degree: imagine a tmp that is live everywhere
&gt; and interferes with everyone, but has one use like:
&gt; 
&gt; Move %ourTmp, %someOtherTmp
&gt; 
&gt; Where there are no other tmps live.  After spill conversion, this may look
&gt; like:
&gt; 
&gt; Move (ourSpill), %newTmp
&gt; Move %newTmp, %someOtherTmp
&gt; 
&gt; Of course, we&apos;d rather not get this kind of spill code but it&apos;s totally
&gt; possible because we now have a bunch of random conditions under which we
&gt; won&apos;t slap the spill address directly into the Move.
&gt; 
&gt; After this happens, assuming that the only thing live was %someOtherTmp, we
&gt; will have zero degree for %newTmp because the Move is coalescable and does
&gt; not contribute to interference.
&gt; 
&gt; Then, we might coalesce %someOtherTmp with %newTmp.  Once this happens, if
&gt; we make the %newTmp be the master, we&apos;re in deep trouble because %newTmp is
&gt; not on any worklist due to these two lines of code!
&gt; 
&gt; Do you agree that these two lines can be removed?

https://bugs.webkit.org/show_bug.cgi?id=163509</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>265257</attachid>
            <date>2015-11-10 18:33:13 -0800</date>
            <delta_ts>2015-11-10 18:45:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-150457-20151110183309.patch</filename>
            <type>text/plain</type>
            <size>50251</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTkyMjcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBi
ZWVjMTBlNDIwZTg2MDIzMmE1NDI0ZTg0YTg3NWIxZjg0M2U2MDE3Li4zNTMzNDZhNmI2MTkwNDlh
NTcwZDgzMGFmYTAxMzE0ODNhYWJjNWU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw3NSBAQAorMjAxNS0xMS0xMCAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KKworICAgICAgICBBaXIgc2hvdWxkIGFsbG9jYXRlIHJlZ2lzdGVycworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUwNDU3CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBpcyBhIGRpcmVjdCBp
bXBsZW1lbnRhdGlvbiBvZiB0aGUgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29hbGVzY2luZyBhbGxvY2F0
b3IuCisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
OgorICAgICAgICAqIGIzL2Fpci9BaXJHZW5lcmF0ZS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpB
aXI6OmdlbmVyYXRlKToKKyAgICAgICAgKiBiMy9haXIvQWlySW5zdElubGluZXMuaDoKKyAgICAg
ICAgKiBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6TW92ZUluc3RIZWxwZXI8QXJnOjpHUD46Om1heUJlQ29hbGVz
Y2FibGUpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpNb3ZlSW5zdEhlbHBlcjxBcmc6OkZQPjo6
bWF5QmVDb2FsZXNjYWJsZSk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkFic29sdXRlVG1wSGVs
cGVyPEFyZzo6R1A+OjphYnNvbHV0ZUluZGV4KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6QWJz
b2x1dGVUbXBIZWxwZXI8QXJnOjpHUD46OnRtcEZyb21BYnNvbHV0ZUluZGV4KToKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6QWJzb2x1dGVUbXBIZWxwZXI8QXJnOjpGUD46OmFic29sdXRlSW5kZXgp
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpBYnNvbHV0ZVRtcEhlbHBlcjxBcmc6OkZQPjo6dG1w
RnJvbUFic29sdXRlSW5kZXgpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0
b3IpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0Fs
bG9jYXRvcjo6YnVpbGQpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZ0FsbG9jYXRvcjo6YWxsb2NhdGUpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6Z2V0QWxpYXMpOgorICAgICAgICAo
SlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6c3BpbGxl
ZFRtcCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
QWxsb2NhdG9yOjphbGxvY2F0ZWRSZWcpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6dG1wQXJyYXlTaXplKToKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I6OmluaXRpYWxp
emVEZWdyZWVzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmdBbGxvY2F0b3I6OmFkZEVkZ2VzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I6OmFkZEVkZ2UpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6bWFrZVdvcmtMaXN0
KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxv
Y2F0b3I6OnNpbXBsaWZ5KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3Rl
ckNvYWxlc2NpbmdBbGxvY2F0b3I6OmZvckVhY2hBZGphY2VudCk6CisgICAgICAgIChKU0M6OkIz
OjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9yOjpoYXNCZWVuU2ltcGxp
ZmllZCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
QWxsb2NhdG9yOjpkZWNyZW1lbnREZWdyZWUpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVy
YXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6Zm9yRWFjaE5vZGVNb3Zlcyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9yOjpp
c01vdmVSZWxhdGVkKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmdBbGxvY2F0b3I6OmVuYWJsZU1vdmVzT25WYWx1ZSk6CisgICAgICAgIChKU0M6OkIz
OjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9yOjplbmFibGVNb3Zlc09u
VmFsdWVBbmRBZGphY2VudHMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6Y29hbGVzY2UpOgorICAgICAgICAoSlNDOjpCMzo6QWly
OjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6Y2FuQmVTYWZlbHlDb2FsZXNj
ZWQpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0Fs
bG9jYXRvcjo6cHJlY29sb3JlZENvYWxlc2NpbmdIZXVyaXN0aWMpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6Y29uc2VydmF0aXZl
SGV1cmlzdGljKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmdBbGxvY2F0b3I6OmFkZFdvcmtMaXN0KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I6OmNvbWJpbmUpOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6ZnJlZXplKToK
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0
b3I6OmZyZWV6ZU1vdmVzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3Rl
ckNvYWxlc2NpbmdBbGxvY2F0b3I6OnNlbGVjdFNwaWxsKToKKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I6OmFzc2lnbkNvbG9ycyk6Cisg
ICAgICAgIChKU0M6OkIzOjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9y
OjpkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Okl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9yOjpkdW1wV29ya0xpc3RzKToKKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I6Oklu
dGVyZmVyZW5jZUVkZ2U6OkludGVyZmVyZW5jZUVkZ2UpOgorICAgICAgICAoSlNDOjpCMzo6QWly
OjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjo6SW50ZXJmZXJlbmNlRWRnZTo6
Zmlyc3QpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Z0FsbG9jYXRvcjo6SW50ZXJmZXJlbmNlRWRnZTo6c2Vjb25kKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I6OkludGVyZmVyZW5jZUVk
Z2U6Om9wZXJhdG9yPT0pOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZ0FsbG9jYXRvcjo6SW50ZXJmZXJlbmNlRWRnZTo6aXNIYXNoVGFibGVEZWxldGVk
VmFsdWUpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Z0FsbG9jYXRvcjo6SW50ZXJmZXJlbmNlRWRnZTo6aGFzaCk6CisgICAgICAgIChKU0M6OkIzOjpB
aXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9yOjpJbnRlcmZlcmVuY2VFZGdl
SGFzaDo6aGFzaCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Okl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nQWxsb2NhdG9yOjpJbnRlcmZlcmVuY2VFZGdlSGFzaDo6ZXF1YWwpOgorICAgICAgICAo
SlNDOjpCMzo6QWlyOjppc1VzZWxlc3NNb3ZlSW5zdCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6
OmFzc2lnblJlZ2lzdGVyVG9UbXBJblByb2dyYW0pOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjph
ZGRTcGlsbEFuZEZpbGxUb1Byb2dyYW0pOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjppdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZSk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Oml0ZXJh
dGVkUmVnaXN0ZXJDb2FsZXNjaW5nKToKKyAgICAgICAgKiBiMy9haXIvQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaDogQWRkZWQuCisgICAgICAgICogYjMvYWlyL0FpclRtcC5oOgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpUbXA6OmludGVybmFsVmFsdWUpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpUbXA6OnRtcEZvckludGVybmFsVmFsdWUpOgorICAgICAgICAqIGIzL3Rlc3RiMy5j
cHA6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0U3BpbGxHUCk6CisgICAgICAgIChKU0M6OkIzOjpy
dW4pOgorCiAyMDE1LTExLTEwICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgog
CiAgICAgICAgIFg4Nl82NCBzdXBwb3J0IGZvciBjb21wYXJlRG91YmxlKERvdWJsZUNvbmRpdGlv
biwgRlBSZWdpc3RlcklEIGxlZnQsIEZQUmVnaXN0ZXJJRCByaWdodCwgUmVnaXN0ZXJJRCBkZXN0
KQpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCBiZDI4YjNlYzJhZTRhZTQ5NDM4YWM0
MmEzZTg0NjIzYzZiY2I5MDJjLi5kNGUzNTM5ODY5YjBhNTJiMjdkY2JmNjlmM2I4YjJjODZmNGQ3
NTczIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNj
cmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMTA3NCw2ICsxMDc0LDggQEAK
IAkJMUFDRjczNzcxNzFDQTZGQjAwQzlCQjFFIC8qIFdlYWsuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFDRjczNzYxNzFDQTZGQjAwQzlCQjFFIC8q
IFdlYWsuY3BwICovOyB9OwogCQkyNjAwQjVBNjE1MkJBQUE3MDA5MUVFNUYgLyogSlNTdHJpbmdK
b2luZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MjYwMEI1QTQxNTJCQUFBNzAwOTFFRTVGIC8qIEpTU3RyaW5nSm9pbmVyLmNwcCAqLzsgfTsKIAkJ
MjYwMEI1QTcxNTJCQUFBNzAwOTFFRTVGIC8qIEpTU3RyaW5nSm9pbmVyLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjAwQjVBNTE1MkJBQUE3MDA5MUVF
NUYgLyogSlNTdHJpbmdKb2luZXIuaCAqLzsgfTsKKwkJMjY3MThCQTQxQkU5OUY3ODAwNTIwMTdC
IC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2NzE4QkEyMUJFOTlGNzgwMDUyMDE3QiAvKiBB
aXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgKi87IH07CisJCTI2NzE4QkE1MUJFOTlG
NzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjY3MThCQTMxQkU5OUY3ODAwNTIw
MTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmggKi87IH07CiAJCTJBMDVBQkQ1
MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkEwNUFCRDMxOTYxREYyNDAw
MzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51bWVyYXRvci5jcHAgKi87IH07CiAJCTJBMDVBQkQ2
MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJBMDVBQkQ0MTk2MURGMjQwMDM0
MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuaCAqLzsgfTsKIAkJMkExMTEyNDUxOTJG
Q0U3OTAwNUVFMThEIC8qIEN1c3RvbUdldHRlclNldHRlci5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyQTExMTI0MzE5MkZDRTc5MDA1RUUxOEQgLyog
Q3VzdG9tR2V0dGVyU2V0dGVyLmNwcCAqLzsgfTsKQEAgLTMwODEsNiArMzA4Myw4IEBACiAJCTI2
MDBCNUE0MTUyQkFBQTcwMDkxRUU1RiAvKiBKU1N0cmluZ0pvaW5lci5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1N0cmluZ0pvaW5lci5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTI2MDBCNUE1MTUyQkFBQTcwMDkxRUU1RiAvKiBKU1N0cmluZ0pv
aW5lci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU1N0cmluZ0pvaW5lci5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjQwOTFGQTFCRTJGRDQxMDA2ODREQjIg
LyogQWlyT3Bjb2RlLm9wY29kZXMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQWlyT3Bjb2RlLm9wY29kZXM7IHBhdGggPSBiMy9h
aXIvQWlyT3Bjb2RlLm9wY29kZXM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTI2NzE4
QkEyMUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBBaXJJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZy5jcHA7IHBhdGggPSBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Np
bmcuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyNjcxOEJBMzFCRTk5Rjc4MDA1
MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBuYW1lID0gQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDsgcGF0aCA9
IGIzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkyQTA1QUJEMzE5NjFERjI0MDAzNDE3NTAgLyogSlNQcm9wZXJ0eU5hbWVF
bnVtZXJhdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTUHJv
cGVydHlOYW1lRW51bWVyYXRvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTJB
MDVBQkQ0MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNQcm9wZXJ0eU5hbWVFbnVtZXJhdG9yLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTJBMTExMjQzMTkyRkNFNzkwMDVFRTE4RCAv
KiBDdXN0b21HZXR0ZXJTZXR0ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gQ3VzdG9tR2V0dGVyU2V0dGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
QEAgLTQ1NjAsNiArNDU2NCw4IEBACiAJCQkJMEZFQzg1NUExQkRBQ0RDNzAwODBGRjc0IC8qIEFp
ckluc3QuY3BwICovLAogCQkJCTBGRUM4NTVCMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJJbnN0Lmgg
Ki8sCiAJCQkJMEZFQzg1NUMxQkRBQ0RDNzAwODBGRjc0IC8qIEFpckluc3RJbmxpbmVzLmggKi8s
CisJCQkJMjY3MThCQTIxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmNwcCAqLywKKwkJCQkyNjcxOEJBMzFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCAqLywKIAkJCQkwRkVDODU1RDFCREFDREM3MDA4MEZGNzQg
LyogQWlyTGl2ZW5lc3MuaCAqLywKIAkJCQkyNjQwOTFGQTFCRTJGRDQxMDA2ODREQjIgLyogQWly
T3Bjb2RlLm9wY29kZXMgKi8sCiAJCQkJMEZFQzg1NUUxQkRBQ0RDNzAwODBGRjc0IC8qIEFpclBo
YXNlU2NvcGUuY3BwICovLApAQCAtNjY0NSw2ICs2NjUxLDcgQEAKIAkJCQkwRkVDODUxOTFCREFD
REFDMDA4MEZGNzQgLyogQjNHZW5lcmF0ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZFQzg1MUEx
QkRBQ0RBQzAwODBGRjc0IC8qIEIzR2VuZXJpY0ZyZXF1ZW50ZWRCbG9jay5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJMEZFQzg1QzMxQkUxNjdBMDAwODBGRjc0IC8qIEIzSGVhcFJhbmdlLmggaW4gSGVh
ZGVycyAqLywKKwkJCQkyNjcxOEJBNTFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRUM4NTFCMUJEQUNEQUMwMDgw
RkY3NCAvKiBCM0luZGV4TWFwLmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkVDODUxQzFCREFDREFD
MDA4MEZGNzQgLyogQjNJbmRleFNldC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZFQzg1QkExQkUx
NDYyRjAwODBGRjc0IC8qIEIzSW5zZXJ0aW9uU2V0LmggaW4gSGVhZGVycyAqLywKQEAgLTg5MDEs
NiArODkwOCw3IEBACiAJCQkJN0IwMjQ3NTYxQjg2ODJFMTAwNTQyNDQwIC8qIFdBU01GdW5jdGlv
blBhcnNlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3QjM5Rjc2RDFCNjJERTJFMDAzNjBGQjQg
LyogV0FTTU1vZHVsZVBhcnNlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3QjM5Rjc3MjFCNjM1
NzREMDAzNjBGQjQgLyogV0FTTVJlYWRlci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkyNjcxOEJB
NDFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJRkVEOTRGMkUxNzFFM0UyMzAwQkU3N0E0IC8qIFdhdGNoZG9nLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTBGOTE5RDI1MTU4NTNDRTAwMDRBNEU3RCAvKiBXYXRjaHBv
aW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBQ0Y3Mzc3MTcxQ0E2RkIwMEM5QkIxRSAvKiBX
ZWFrLmNwcCBpbiBTb3VyY2VzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJHZW5lcmF0ZS5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckdlbmVyYXRlLmNwcAppbmRleCBiYTg2MmMyZTMyMDM3MGZlZTI5MTdhMmM0Mzc3YTJmZWU2ZWJl
MTA3Li5lZGI4OWIxNGRhYmQyOWNlYzNiMTVmNjk2OTMwZGI5NzVkZmI4ZWExIDEwMDY0NAotLS0g
YS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVyYXRlLmNwcAorKysgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVyYXRlLmNwcApAQCAtMzMsNiArMzMsNyBA
QAogI2luY2x1ZGUgIkFpckVsaW1pbmF0ZURlYWRDb2RlLmgiCiAjaW5jbHVkZSAiQWlyR2VuZXJh
dGlvbkNvbnRleHQuaCIKICNpbmNsdWRlICJBaXJIYW5kbGVDYWxsZWVTYXZlcy5oIgorI2luY2x1
ZGUgIkFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgiCiAjaW5jbHVkZSAiQWlyUmVwb3J0
VXNlZFJlZ2lzdGVycy5oIgogI2luY2x1ZGUgIkFpclNpbXBsaWZ5Q0ZHLmgiCiAjaW5jbHVkZSAi
QWlyU3BpbGxFdmVyeXRoaW5nLmgiCkBAIC02OCw4ICs2OSw3IEBAIHZvaWQgZ2VuZXJhdGUoQ29k
ZSYgY29kZSwgQ0NhbGxIZWxwZXJzJiBqaXQpCiAKICAgICAvLyBUaGlzIGlzIHdoZXJlIHdlIHdv
dWxkIGhhdmUgYSByZWFsIHJlZ2lzdGVyIGFsbG9jYXRvci4gVGhlbiwgd2UgY291bGQgdXNlIHNw
aWxsRXZlcnl0aGluZygpCiAgICAgLy8gaW4gcGxhY2Ugb2YgdGhlIHJlZ2lzdGVyIGFsbG9jYXRv
ciBvbmx5IGZvciB0ZXN0aW5nLgotICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTUwNDU3Ci0gICAgc3BpbGxFdmVyeXRoaW5nKGNvZGUpOworICAg
IGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKGNvZGUpOwogCiAgICAgLy8gUHJpb3IgdG8gdGhp
cyBwb2ludCB0aGUgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIGlzIGltcGxpY2l0LiBUaGlzIG1ha2Vz
IGl0IGV4cGxpY2l0LiBJdCBhbHNvCiAgICAgLy8gZG9lcyB0aGluZ3MgbGlrZSBpZGVudGlmeSB3
aGljaCBjYWxsZWUtc2F2ZXMgd2UncmUgdXNpbmcgYW5kIHNhdmVzIHRoZW0uCmRpZmYgLS1naXQg
YS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmggYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckluc3RJbmxpbmVzLmgKaW5kZXggOTE3ZjY0Y2ZiZTUx
YzMwZjUyYTk1MTgzYjk2Y2I1YTg5ZDMxY2RhMi4uNzI5Mzc5MWViZDljOWY4NWI3ZDI5YzVkNzIw
Zjk1ZjM0MDBiY2RiZCAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJJbnN0SW5saW5lcy5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySW5z
dElubGluZXMuaApAQCAtNjAsNyArNjAsNyBAQCB0ZW1wbGF0ZTw+IHN0cnVjdCBGb3JFYWNoPFN0
YWNrU2xvdCo+IHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAg
IFN0YWNrU2xvdCogc3RhY2tTbG90ID0gYXJnLnN0YWNrU2xvdCgpOwogICAgICAgICAgICAgICAg
IGZ1bmN0b3Ioc3RhY2tTbG90LCByb2xlLCB0eXBlKTsKLSAgICAgICAgICAgICAgICBhcmcgPSBB
cmc6OnN0YWNrKHN0YWNrU2xvdCk7CisgICAgICAgICAgICAgICAgYXJnID0gQXJnOjpzdGFjayhz
dGFja1Nsb3QsIGFyZy5vZmZzZXQoKSk7CiAgICAgICAgICAgICB9KTsKICAgICB9CiB9OwpkaWZm
IC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZy5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yZjE0YmJkZmQ4MDQyMTYwNTEwYmIz
YzAyNmI5NTc0YWYyYTMzODU2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAKQEAgLTAsMCArMSw5
NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmcu
aCIKKworI2lmIEVOQUJMRShCM19KSVQpCisKKyNpbmNsdWRlICJBaXJDb2RlLmgiCisjaW5jbHVk
ZSAiQWlySW5zZXJ0aW9uU2V0LmgiCisjaW5jbHVkZSAiQWlySW5zdElubGluZXMuaCIKKyNpbmNs
dWRlICJBaXJMaXZlbmVzcy5oIgorI2luY2x1ZGUgIkFpclBoYXNlU2NvcGUuaCIKKyNpbmNsdWRl
ICJBaXJSZWdpc3RlclByaW9yaXR5LmgiCisjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+CisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworc3RhdGlj
IGJvb2wgZGVidWcgPSBmYWxzZTsKK3N0YXRpYyBib29sIHRyYWNlRGVidWcgPSBmYWxzZTsKKwor
dGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CitzdHJ1Y3QgTW92ZUluc3RIZWxwZXI7CisKK3RlbXBs
YXRlPD4KK3N0cnVjdCBNb3ZlSW5zdEhlbHBlcjxBcmc6OkdQPiB7CisgICAgc3RhdGljIGJvb2wg
bWF5QmVDb2FsZXNjYWJsZShjb25zdCBJbnN0JiBpbnN0KQorICAgIHsKKyAgICAgICAgYm9vbCBp
c01vdmUgPSBpbnN0Lm9wY29kZSA9PSBNb3ZlIHx8IGluc3Qub3Bjb2RlID09IE1vdmUzMjsKKyAg
ICAgICAgaWYgKCFpc01vdmUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
QVNTRVJUX1dJVEhfTUVTU0FHRShpbnN0LmFyZ3Muc2l6ZSgpID09IDIsICJXZSBhc3N1bWUgY29h
bGVjYWJsZSBtb3ZlcyBvbmx5IGhhdmUgdHdvIGFyZ3VtZW50cyBpbiBhIGZldyBwbGFjZXMuIik7
CisgICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMF0uaXNUeXBlKEFyZzo6R1ApKTsKKyAgICAgICAg
QVNTRVJUKGluc3QuYXJnc1sxXS5pc1R5cGUoQXJnOjpHUCkpOworCisgICAgICAgIHJldHVybiBp
bnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKTsKKyAgICB9Cit9Owor
Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgTW92ZUluc3RIZWxwZXI8QXJnOjpGUD4geworICAgIHN0YXRp
YyBib29sIG1heUJlQ29hbGVzY2FibGUoY29uc3QgSW5zdCYgaW5zdCkKKyAgICB7CisgICAgICAg
IGlmIChpbnN0Lm9wY29kZSAhPSBNb3ZlRG91YmxlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5zdC5hcmdzLnNpemUoKSA9PSAyLCAi
V2UgYXNzdW1lIGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZlIHR3byBhcmd1bWVudHMgaW4gYSBm
ZXcgcGxhY2VzLiIpOworICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzBdLmlzVHlwZShBcmc6OkZQ
KSk7CisgICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMV0uaXNUeXBlKEFyZzo6RlApKTsKKworICAg
ICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgaW5zdC5hcmdzWzFdLmlzVG1wKCk7
CisgICAgfQorfTsKKworCisvLyBUaGUgc3BlZWQgb2YgdGhlIGFsb2NhdG9yIGRlcGVuZHMgZGly
ZWN0bHkgb24gaG93IGZhc3Qgd2UgY2FuIHF1ZXJ5IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0
aCBhIFRtcAorLy8gYW5kL29yIGl0cyBvd25lcnNoaXAgdG8gYSBzZXQuCisvLworLy8gSGFzaFNl
dC9IYXNoTWFwIG9wZXJhdGlvbnMgYXJlIG92ZXJseSBleHBlbnNpdmUgZm9yIHRoYXQuCisvLwor
Ly8gSW5zdGVhZCBvZiBhIEhhc2ggc3RydWN0dXJlLCBUbXAgYXJlIGluZGV4ZWQgZGlyZWN0bHkg
YnkgdmFsdWUgaW4gQXJyYXlzLiBUaGUgaW50ZXJuYWwgaW50ZWdlciBpcyB1c2VkIGFzIHRoZSBp
bmRleAorLy8gdG8gcmVmZXJlbmNlIHRoZW0gcXVpY2tseS4gSW4gc29tZSBzZXRzLCB3ZSBkbyBu
b3QgY2FyZSBhYm91dCB0aGUgY29sb3JlZCByZWdzLCB3ZSBzdGlsbCBhbGxvY2F0ZSB0aGUgbWVt
b3J5IGZvciB0aGVtCisvLyBhbmQganVzdCBkbyBub3QgdXNlIGl0LgordGVtcGxhdGU8QXJnOjpU
eXBlIHR5cGU+CitzdHJ1Y3QgQWJzb2x1dGVUbXBIZWxwZXI7CisKK3RlbXBsYXRlPD4KK3N0cnVj
dCBBYnNvbHV0ZVRtcEhlbHBlcjxBcmc6OkdQPiB7CisgICAgc3RhdGljIHVuc2lnbmVkIGFic29s
dXRlSW5kZXgoY29uc3QgVG1wJiB0bXApCisgICAgeworICAgICAgICBBU1NFUlQodG1wLmlzR1Ao
KSk7CisgICAgICAgIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KHRtcC5pbnRlcm5hbFZhbHVlKCkp
ID4gMCk7CisgICAgICAgIHJldHVybiB0bXAuaW50ZXJuYWxWYWx1ZSgpOworICAgIH0KKworICAg
IHN0YXRpYyB1bnNpZ25lZCBhYnNvbHV0ZUluZGV4KHVuc2lnbmVkIHRtcEluZGV4KQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGFic29sdXRlSW5kZXgoVG1wOjpncFRtcEZvckluZGV4KHRtcEluZGV4
KSk7CisgICAgfQorCisgICAgc3RhdGljIFRtcCB0bXBGcm9tQWJzb2x1dGVJbmRleCh1bnNpZ25l
ZCB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBUbXA6OnRtcEZvckludGVybmFsVmFs
dWUodG1wSW5kZXgpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBBYnNvbHV0ZVRt
cEhlbHBlcjxBcmc6OkZQPiB7CisgICAgc3RhdGljIHVuc2lnbmVkIGFic29sdXRlSW5kZXgoY29u
c3QgVG1wJiB0bXApCisgICAgeworICAgICAgICBBU1NFUlQodG1wLmlzRlAoKSk7CisgICAgICAg
IEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KHRtcC5pbnRlcm5hbFZhbHVlKCkpIDwgMCk7CisgICAg
ICAgIHJldHVybiAtdG1wLmludGVybmFsVmFsdWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdW5z
aWduZWQgYWJzb2x1dGVJbmRleCh1bnNpZ25lZCB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBhYnNvbHV0ZUluZGV4KFRtcDo6ZnBUbXBGb3JJbmRleCh0bXBJbmRleCkpOworICAgIH0K
KworICAgIHN0YXRpYyBUbXAgdG1wRnJvbUFic29sdXRlSW5kZXgodW5zaWduZWQgdG1wSW5kZXgp
CisgICAgeworICAgICAgICByZXR1cm4gVG1wOjp0bXBGb3JJbnRlcm5hbFZhbHVlKC10bXBJbmRl
eCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CitzdHJ1Y3QgQmFuazsK
KwordGVtcGxhdGU8Pgorc3RydWN0IEJhbms8QXJnOjpHUD4geworICAgIHR5cGVkZWYgR1BSSW5m
byBJbmZvOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEJhbms8QXJnOjpGUD4geworICAgIHR5
cGVkZWYgRlBSSW5mbyBJbmZvOworfTsKKwordGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CitjbGFz
cyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvciB7CitwdWJsaWM6CisgICAgSXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3IoQ29kZSYgY29kZSkKKyAgICB7CisgICAg
ICAgIGluaXRpYWxpemVEZWdyZWVzKGNvZGUpOworCisgICAgICAgIHVuc2lnbmVkIHRtcEFycmF5
U2l6ZSA9IHRoaXMtPnRtcEFycmF5U2l6ZShjb2RlKTsKKyAgICAgICAgbV9hZGphY2VuY3lMaXN0
LnJlc2l6ZSh0bXBBcnJheVNpemUpOworICAgICAgICBtX21vdmVMaXN0LnJlc2l6ZSh0bXBBcnJh
eVNpemUpOworICAgICAgICBtX2NvYWxlc2NlZFRtcHMucmVzaXplKHRtcEFycmF5U2l6ZSk7Cisg
ICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJyYXlTaXplKTsKKyAgICB9
CisKKyAgICB2b2lkIGJ1aWxkKEluc3QmIGluc3QsIGNvbnN0IExpdmVuZXNzPFRtcD46OkxvY2Fs
Q2FsYyYgbG9jYWxDYWxjKQorICAgIHsKKyAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMgaW50ZXJm
ZXJlIHdpdGggZWFjaG90aGVyLgorICAgICAgICBpbnN0LmZvckVhY2hUbXAoWyZdIChUbXAmIGFy
ZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlKSB7CisgICAgICAgICAgICBpZiAo
YXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAg
aWYgKEFyZzo6aXNEZWYocm9sZSkpIHsKKyAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hUbXAo
WyZdIChUbXAmIG90aGVyQXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlKSB7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNEZWYocm9sZSkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGFyZywgb3RoZXJBcmcpOworICAgICAgICAg
ICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAoTW92
ZUluc3RIZWxwZXI8dHlwZT46Om1heUJlQ29hbGVzY2FibGUoaW5zdCkpIHsKKyAgICAgICAgICAg
IGZvciAoY29uc3QgQXJnJiBhcmcgOiBpbnN0LmFyZ3MpIHsKKyAgICAgICAgICAgICAgICBIYXNo
U2V0PEluc3QqPiYgbGlzdCA9IG1fbW92ZUxpc3RbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgoYXJnLnRtcCgpKV07CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoJmluc3Qp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLmFkZCgmaW5zdCk7
CisKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoZSBVc2UoKSBvZiB0aGlzIG1vdmUg
dG8gaW50ZXJmZXJlIHdpdGggdGhlIERlZigpLCBldmVuIGlmIGl0IGlzIGxpdmUKKyAgICAgICAg
ICAgIC8vIGFmdGVyIHRoZSBNb3ZlLiBJZiB3ZSB3ZXJlIHRvIGFkZCB0aGUgaW50ZXJmZXJlbmNl
IGVkZ2UsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8KKyAgICAgICAgICAgIC8vIGNvYWxlc2Nl
IHRoZSBNb3ZlIGV2ZW4gaWYgdGhlIHR3byBUbXAgbmV2ZXIgaW50ZXJmZXJlIGFueXdoZXJlLgor
ICAgICAgICAgICAgVG1wIGRlZlRtcDsKKyAgICAgICAgICAgIFRtcCB1c2VUbXA7CisgICAgICAg
ICAgICBpbnN0LmZvckVhY2hUbXAoWyZkZWZUbXAsICZ1c2VUbXBdIChUbXAmIGFyZ1RtcCwgQXJn
OjpSb2xlIHJvbGUsIEFyZzo6VHlwZSkgeworICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzRGVm
KHJvbGUpKQorICAgICAgICAgICAgICAgICAgICBkZWZUbXAgPSBhcmdUbXA7CisgICAgICAgICAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChBcmc6OmlzVXNlKHJvbGUp
KTsKKyAgICAgICAgICAgICAgICAgICAgdXNlVG1wID0gYXJnVG1wOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQVNTRVJUKGRlZlRtcCk7CisgICAgICAg
ICAgICBBU1NFUlQodXNlVG1wKTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVU
bXAgOiBsb2NhbENhbGMubGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpdmVUbXAgIT0g
dXNlVG1wICYmIGxpdmVUbXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKQorICAgICAgICAg
ICAgICAgICAgICBhZGRFZGdlKGRlZlRtcCwgbGl2ZVRtcCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgYWRkRWRnZXMoaW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7
CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZSgpCisgICAgeworICAgICAgICBtYWtlV29ya0xp
c3QoKTsKKworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVu
Y2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICBkYXRhTG9nKCJJbml0
aWFsIHdvcmsgbGlzdFxuIik7CisgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZp
bGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIkJlZm9yZSBHcmFwaCBzaW1wbGlmaWNh
dGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpk
YXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtX3NpbXBsaWZ5
V29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHNpbXBsaWZ5KCk7CisgICAgICAg
ICAgICBlbHNlIGlmICghbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAg
ICBjb2FsZXNjZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fZnJlZXplV29ya2xpc3QuaXNF
bXB0eSgpKQorICAgICAgICAgICAgICAgIGZyZWV6ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAo
IW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2VsZWN0U3BpbGwo
KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRh
TG9nKCJBZnRlciBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAg
ICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSB3aGlsZSAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fd29ya2xp
c3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3Nw
aWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKKworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9
CisKKyAgICBUbXAgZ2V0QWxpYXMoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAgICAgIFRtcCBh
bGlhcyA9IHRtcDsKKyAgICAgICAgd2hpbGUgKFRtcCBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRt
cHNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYWxpYXMpXSkKKyAgICAg
ICAgICAgIGFsaWFzID0gbmV4dEFsaWFzOworICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgfQor
CisgICAgY29uc3QgSGFzaFNldDxUbXA+JiBzcGlsbGVkVG1wKCkgY29uc3QgeyByZXR1cm4gbV9z
cGlsbGVkVG1wOyB9CisgICAgUmVnIGFsbG9jYXRlZFJlZyhUbXAgdG1wKSBjb25zdAorICAgIHsK
KyAgICAgICAgQVNTRVJUKCF0bXAuaXNSZWcoKSk7CisgICAgICAgIEFTU0VSVChtX2NvbG9yZWRU
bXAuc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUKHRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpH
UCkpOworCisgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBIZWxwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAgICAgIGlmICghcmVnKSB7CisgICAgICAg
ICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgVG1wcyB0aGF0IGludGVyZmVyZS4gQSBUbXAgdGhh
dCBuZXZlciBpbnRlcmZlcmUgd2l0aCBhbnl0aGluZworICAgICAgICAgICAgLy8gY2FuIHRha2Ug
YW55IHJlZ2lzdGVyLgorICAgICAgICAgICAgcmVnID0gcmVnc0luUHJpb3JpdHlPcmRlcih0eXBl
KS5maXJzdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWc7CisgICAgfQorCitwcml2
YXRlOgorICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNpemUoQ29kZSYgY29kZSkKKyAgICB7
CisgICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51bVRtcHModHlwZSk7CisgICAgICAg
IHJldHVybiBBYnNvbHV0ZVRtcEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsK
KyAgICB9CisKKyAgICB2b2lkIGluaXRpYWxpemVEZWdyZWVzKENvZGUmIGNvZGUpCisgICAgewor
ICAgICAgICB1bnNpZ25lZCB0bXBBcnJheVNpemUgPSB0aGlzLT50bXBBcnJheVNpemUoY29kZSk7
CisgICAgICAgIG1fZGVncmVlcy5yZXNpemUodG1wQXJyYXlTaXplKTsKKworICAgICAgICAvLyBB
bGwgcHJlY29sb3JlZCByZWdpc3RlcnMgaGF2ZSAgYW4gImluZmluaXRlIiBkZWdyZWUuCisgICAg
ICAgIHVuc2lnbmVkIGZpcnN0Tm9uUmVnSW5kZXggPSBBYnNvbHV0ZVRtcEhlbHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleCgwKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0
Tm9uUmVnSW5kZXg7ICsraSkKKyAgICAgICAgICAgIG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICBiemVybyhtX2RlZ3JlZXMuZGF0
YSgpICsgZmlyc3ROb25SZWdJbmRleCwgKHRtcEFycmF5U2l6ZSAtIGZpcnN0Tm9uUmVnSW5kZXgp
ICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorCisgICAgdm9pZCBhZGRFZGdlcyhJbnN0JiBp
bnN0LCBjb25zdCBIYXNoU2V0PFRtcD4mIGxpdmVUbXApCisgICAgeworICAgICAgICAvLyBBbGwg
dGhlIERlZigpcyBpbnRlcmZlcmUgd2l0aCBldmVydGhpbmcgbGl2ZS4KKyAgICAgICAgaW5zdC5m
b3JFYWNoVG1wKFsmXSAoVG1wJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlw
ZSkgeworICAgICAgICAgICAgaWYgKGFyZ1R5cGUgPT0gdHlwZSAmJiBBcmc6OmlzRGVmKHJvbGUp
KSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsaXZlVG1wKSB7
CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBBcmc6
OkdQKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAg
IHZvaWQgYWRkRWRnZShjb25zdCBUbXAmIGEsIGNvbnN0IFRtcCYgYikKKyAgICB7CisgICAgICAg
IGlmIChhID09IGIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKG1faW50ZXJm
ZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkpIHsKKyAg
ICAgICAgICAgIGlmICghYS5pc1JlZygpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2Fk
amFjZW5jeUxpc3RbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSldLmNv
bnRhaW5zKGIpKTsKKyAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbQWJzb2x1dGVUbXBI
ZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSldLmFwcGVuZChiKTsKKyAgICAgICAgICAgICAg
ICBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSldKys7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYi5pc1JlZygpKSB7CisgICAgICAg
ICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46
OmFic29sdXRlSW5kZXgoYildLmNvbnRhaW5zKGEpKTsKKyAgICAgICAgICAgICAgICBtX2FkamFj
ZW5jeUxpc3RbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYildLmFwcGVu
ZChhKTsKKyAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46
OmFic29sdXRlSW5kZXgoYildKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICB2b2lkIG1ha2VXb3JrTGlzdCgpCisgICAgeworICAgICAgICB1bnNpZ25lZCBmaXJzdE5v
blJlZ0luZGV4ID0gQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoMCk7Cisg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tp
XTsKKyAgICAgICAgICAgIGlmICghZGVncmVlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OnRtcEZyb21B
YnNvbHV0ZUluZGV4KGkpOworCisgICAgICAgICAgICBpZiAoZGVncmVlID49IEJhbms8dHlwZT46
OkluZm86Om51bWJlck9mUmVnaXN0ZXJzKQorICAgICAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlz
dC5hZGQodG1wKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W0Fic29sdXRlVG1w
SGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldLmlzRW1wdHkoKSkKKyAgICAgICAgICAg
ICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZCh0bXApOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHZvaWQgc2ltcGxpZnkoKQorICAgIHsKKyAgICAgICAgVG1wIGxhc3QgPSBtX3Np
bXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKKworICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3Rh
Y2suY29udGFpbnMobGFzdCkpOworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0YWNrLmdl
dChBYnNvbHV0ZVRtcEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsYXN0KSkpOworICAgICAg
ICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0KTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2su
cXVpY2tTZXQoQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGFzdCkpOwor
CisgICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0LCBbdGhpc10oVG1wIGFkamFjZW50VG1wKSB7
CisgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXApOworICAgICAgICB9KTsK
KyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICB2b2lkIGZvckVh
Y2hBZGphY2VudChUbXAgdG1wLCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZv
ciAoVG1wIGFkamFjZW50VG1wIDogbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wSGVscGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKSB7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1w
bGlmaWVkKGFkamFjZW50VG1wKSkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihhZGphY2VudFRt
cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGhhc0JlZW5TaW1wbGlmaWVkKFRtcCB0
bXApCisgICAgeworICAgICAgICByZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVpY2tHZXQoQWJz
b2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSkgfHwgISFtX2NvYWxlc2Nl
ZFRtcHNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAg
fQorCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoVG1wIHRtcCkKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX2RlZ3JlZXNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1w
KV0pOworCisgICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1tBYnNvbHV0ZVRt
cEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXS0tOworICAgICAgICBpZiAob2xkRGVn
cmVlID09IEJhbms8dHlwZT46OkluZm86Om51bWJlck9mUmVnaXN0ZXJzKSB7CisgICAgICAgICAg
ICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wKTsKKyAgICAgICAgICAgIG1fc3Bp
bGxXb3JrbGlzdC5yZW1vdmUodG1wKTsKKyAgICAgICAgICAgIGlmIChpc01vdmVSZWxhdGVkKHRt
cCkpCisgICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wKTsKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcCk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KKyAg
ICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoVG1wIHRtcCwgRnVuY3Rpb24gZnVuY3Rpb24pCisgICAg
eworICAgICAgICBmb3IgKEluc3QqIGluc3QgOiBtX21vdmVMaXN0W0Fic29sdXRlVG1wSGVscGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVN
b3Zlcy5jb250YWlucyhpbnN0KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMoaW5zdCkpCisg
ICAgICAgICAgICAgICAgZnVuY3Rpb24oKmluc3QpOworICAgICAgICB9CisgICAgfQorCisgICAg
Ym9vbCBpc01vdmVSZWxhdGVkKFRtcCB0bXApCisgICAgeworICAgICAgICBmb3IgKEluc3QqIGlu
c3QgOiBtX21vdmVMaXN0W0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRt
cCldKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5jb250YWlucyhpbnN0KSB8fCBt
X3dvcmtsaXN0TW92ZXMuY29udGFpbnMoaW5zdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQg
ZW5hYmxlTW92ZXNPblZhbHVlKFRtcCB0bXApCisgICAgeworICAgICAgICBmb3IgKEluc3QqIGlu
c3QgOiBtX21vdmVMaXN0W0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRt
cCldKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5yZW1vdmUoaW5zdCkpCisgICAg
ICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLmFkZChpbnN0KTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKFRtcCB0bXApCisgICAg
eworICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wKTsKKworICAgICAgICBmb3JFYWNoQWRq
YWNlbnQodG1wLCBbdGhpc10gKFRtcCBhZGphY2VudFRtcCkgeworICAgICAgICAgICAgZW5hYmxl
TW92ZXNPblZhbHVlKGFkamFjZW50VG1wKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9p
ZCBjb2FsZXNjZSgpCisgICAgeworICAgICAgICBJbnN0KiBtb3ZlSW5zdCA9IG1fd29ya2xpc3RN
b3Zlcy50YWtlTGFzdCgpOworICAgICAgICBBU1NFUlQobW92ZUluc3QtPmFyZ3Muc2l6ZSgpID09
IDIpOworCisgICAgICAgIFRtcCB1ID0gbW92ZUluc3QtPmFyZ3NbMF0udG1wKCk7CisgICAgICAg
IHUgPSBnZXRBbGlhcyh1KTsKKyAgICAgICAgVG1wIHYgPSBtb3ZlSW5zdC0+YXJnc1sxXS50bXAo
KTsKKyAgICAgICAgdiA9IGdldEFsaWFzKHYpOworCisgICAgICAgIGlmICh2LmlzUmVnKCkpCisg
ICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7CisKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisg
ICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nICIsICptb3ZlSW5zdCwgIiB1ID0gIiwgdSwg
IiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikgeworICAgICAgICAgICAg
YWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAgICB9IGVsc2UgaWYgKHYu
aXNSZWcoKSB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2Uo
dSwgdikpKSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKKyAgICAgICAgICAgIGFkZFdv
cmtMaXN0KHYpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGNhbkJl
U2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7CisgICAgICAgICAgICBjb21iaW5lKHUsIHYpOworICAg
ICAgICAgICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5hZGQobW92ZUluc3QpOworCisg
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAg
RmFpbGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOworICAgICAgICB9
CisgICAgfQorCisgICAgYm9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChUbXAgdSwgVG1wIHYpCisg
ICAgeworICAgICAgICBBU1NFUlQoIXYuaXNSZWcoKSk7CisgICAgICAgIGlmICh1LmlzUmVnKCkp
CisgICAgICAgICAgICByZXR1cm4gcHJlY29sb3JlZENvYWxlc2NpbmdIZXVyaXN0aWModSwgdik7
CisgICAgICAgIHJldHVybiBjb25zZXJ2YXRpdmVIZXVyaXN0aWModSwgdik7CisgICAgfQorCisg
ICAgYm9vbCBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyhUbXAgdSwgVG1wIHYpCisgICAg
eworICAgICAgICBBU1NFUlQodS5pc1JlZygpKTsKKyAgICAgICAgQVNTRVJUKCF2LmlzUmVnKCkp
OworCisgICAgICAgIC8vIElmIGFueSBhZGphY2VudCBvZiB0aGUgbm9uLWNvbG9yZWQgbm9kZSBp
cyBub3QgYW4gYWRqYWNlbnQgb2YgdGhlIGNvbG9yZWQgbm9kZSBBTkQgaGFzIGEgZGVncmVlID49
IEsKKyAgICAgICAgLy8gdGhlcmUgaXMgYSByaXNrIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGhh
dmUgdGhlIHNhbWUgY29sb3IgYXMgb3VyIHByZWNvbG9yZWQgbm9kZS4gSWYgd2UgY29hbGVzY2Ug
c3VjaAorICAgICAgICAvLyBtb3ZlLCB3ZSBtYXkgY3JlYXRlIGFuIHVuY29sb3JhYmxlIGdyYXBo
LgorICAgICAgICBhdXRvIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRt
cEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh2KV07CisgICAgICAgIGZvciAoVG1wIGFkamFj
ZW50VG1wIDogYWRqYWNlbnRzT2ZWKSB7CisgICAgICAgICAgICBpZiAoIWFkamFjZW50VG1wLmlz
UmVnKCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXAp
CisgICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW0Fic29sdXRlVG1wSGVscGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KGFkamFjZW50VG1wKV0gPj0gQmFuazx0eXBlPjo6SW5mbzo6bnVtYmVyT2ZS
ZWdpc3RlcnMKKyAgICAgICAgICAgICAgICAmJiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlu
cyhJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wKSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGJvb2wgY29uc2VydmF0aXZlSGV1cmlzdGljKFRtcCB1LCBUbXAgdikKKyAgICB7CisgICAgICAg
IC8vIFRoaXMgaXMgdXNpbmcgdGhlIEJyaWdncycgY29uc2VydmF0aXZlIGNvYWxlc2NpbmcgcnVs
ZToKKyAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBjb21iaW5lZCBhZGphY2VudCBub2RlIHdp
dGggYSBkZWdyZWUgPj0gSyBpcyBsZXNzIHRoYW4gSywKKyAgICAgICAgLy8gaXQgaXMgc2FmZSB0
byBjb21iaW5lIHRoZSB0d28gbm9kZXMuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBrbm93IHRoYXQg
aWYgdGhlIGdyYXBoCisgICAgICAgIC8vIGlzIGNvbG9yYWJsZSwgd2UgaGF2ZSBmZXdlciB0aGFu
IEsgYWRqYWNlbnRzIHdpdGggaGlnaCBvcmRlciBhbmQgdGhlcmUgaXMgYSBjb2xvcgorICAgICAg
ICAvLyBmb3IgdGhlIGN1cnJlbnQgbm9kZS4KKyAgICAgICAgQVNTRVJUKHUgIT0gdik7CisgICAg
ICAgIEFTU0VSVCghdS5pc1JlZygpKTsKKyAgICAgICAgQVNTRVJUKCF2LmlzUmVnKCkpOworCisg
ICAgICAgIGF1dG8gYWRqYWNlbnRzT2ZVID0gbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wSGVs
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHUpXTsKKyAgICAgICAgYXV0byBhZGphY2VudHNPZlYg
PSBtX2FkamFjZW5jeUxpc3RbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
dildOworCisgICAgICAgIGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsgYWRqYWNlbnRzT2ZWLnNp
emUoKSA8IEJhbms8dHlwZT46OkluZm86Om51bWJlck9mUmVnaXN0ZXJzKSB7CisgICAgICAgICAg
ICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0
aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4K
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgSGFzaFNldDxU
bXA+IGhpZ2hPcmRlckFkamFjZW50czsKKworICAgICAgICBmb3IgKFRtcCBhZGphY2VudFRtcCA6
IGFkamFjZW50c09mVSkgeworICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wICE9IHYpOwor
ICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wICE9IHUpOworICAgICAgICAgICAgaWYgKCFo
YXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcCkgJiYgbV9kZWdyZWVzW0Fic29sdXRlVG1wSGVs
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFkamFjZW50VG1wKV0gPj0gQmFuazx0eXBlPjo6SW5m
bzo6bnVtYmVyT2ZSZWdpc3RlcnMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9
IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXApOworICAgICAgICAgICAgICAgIGlm
IChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IEJh
bms8dHlwZT46OkluZm86Om51bWJlck9mUmVnaXN0ZXJzKQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChUbXAg
YWRqYWNlbnRUbXAgOiBhZGphY2VudHNPZlYpIHsKKyAgICAgICAgICAgIEFTU0VSVChhZGphY2Vu
dFRtcCAhPSB1KTsKKyAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcCAhPSB2KTsKKyAgICAg
ICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXApICYmIG1fZGVncmVlc1tB
YnNvbHV0ZVRtcEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhZGphY2VudFRtcCldID49IEJh
bms8dHlwZT46OkluZm86Om51bWJlck9mUmVnaXN0ZXJzKSB7CisgICAgICAgICAgICAgICAgYXV0
byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wKTsKKyAgICAg
ICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRz
LnNpemUoKSA+PSBCYW5rPHR5cGU+OjpJbmZvOjpudW1iZXJPZlJlZ2lzdGVycykKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPCBCYW5rPHR5cGU+OjpJbmZv
OjpudW1iZXJPZlJlZ2lzdGVycyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IHZvaWQgYWRkV29ya0xpc3QoVG1wIHRtcCkKKyAgICB7CisgICAgICAgIGlmICghdG1wLmlzUmVn
KCkgJiYgbV9kZWdyZWVzW0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRt
cCldIDwgQmFuazx0eXBlPjo6SW5mbzo6bnVtYmVyT2ZSZWdpc3RlcnMgJiYgIWlzTW92ZVJlbGF0
ZWQodG1wKSkgeworICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wKTsKKyAg
ICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHZvaWQgY29tYmluZShUbXAgdSwgVG1wIHYpCisgICAgeworICAgICAgICBpZiAo
IW1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHYpKQorICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0
LnJlbW92ZSh2KTsKKworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1tBYnNvbHV0ZVRt
cEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh2KV0pOworICAgICAgICBtX2NvYWxlc2NlZFRt
cHNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodildID0gdTsKKworICAg
ICAgICBIYXNoU2V0PEluc3QqPiYgdk1vdmVzID0gbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcEhlbHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleCh2KV07CisgICAgICAgIG1fbW92ZUxpc3RbQWJzb2x1dGVU
bXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodSldLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1v
dmVzLmVuZCgpKTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChUbXAg
YWRqYWNlbnRUbXApIHsKKyAgICAgICAgICAgIGFkZEVkZ2UoYWRqYWNlbnRUbXAsIHUpOworICAg
ICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wKTsKKyAgICAgICAgfSk7CisKKyAg
ICAgICAgaWYgKG1fZGVncmVlc1tBYnNvbHV0ZVRtcEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRl
eCh1KV0gPj0gQmFuazx0eXBlPjo6SW5mbzo6bnVtYmVyT2ZSZWdpc3RlcnMgJiYgbV9mcmVlemVX
b3JrbGlzdC5yZW1vdmUodSkpCisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QuYWRkKHUpOwor
ICAgIH0KKworICAgIHZvaWQgZnJlZXplKCkKKyAgICB7CisgICAgICAgIFRtcCB2aWN0aW0gPSBt
X2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFw
cGVuZCh2aWN0aW0pOworICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW0pOworICAgIH0KKworICAg
IHZvaWQgZnJlZXplTW92ZXMoVG1wIHRtcCkKKyAgICB7CisgICAgICAgIGZvckVhY2hOb2RlTW92
ZXModG1wLCBbdGhpcywgdG1wXSAoSW5zdCYgaW5zdCkgeworICAgICAgICAgICAgaWYgKCFtX2Fj
dGl2ZU1vdmVzLnJlbW92ZSgmaW5zdCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVz
LnJlbW92ZSgmaW5zdCk7CisKKyAgICAgICAgICAgIFRtcCBvdGhlclRtcCA9IGluc3QuYXJnc1sw
XS50bXAoKSAhPSB0bXAgPyBpbnN0LmFyZ3NbMF0udG1wKCkgOiBpbnN0LmFyZ3NbMV0udG1wKCk7
CisgICAgICAgICAgICBpZiAobV9kZWdyZWVzW0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KG90aGVyVG1wKV0gPCBCYW5rPHR5cGU+OjpJbmZvOjpudW1iZXJPZlJlZ2lzdGVy
cyAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcCkpIHsKKyAgICAgICAgICAgICAgICBtX2ZyZWV6
ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcCk7CisgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdv
cmtsaXN0LmFwcGVuZChvdGhlclRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAg
IH0KKworICAgIHZvaWQgc2VsZWN0U3BpbGwoKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IHdl
IHNob3VsZCBzZWxlY3QgYSBnb29kIGNhbmRpZGF0ZSBiYXNlZCBvbiBhbGwgdGhlIGluZm9ybWF0
aW9uIHdlIGhhdmUuCisgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbmV2ZXIgc2VsZWN0IGEg
c3BpbGxlZCB0bXAgYXMgd2Ugd291bGQgbmV2ZXIgY29udmVyZ2UuCisKKyAgICAgICAgYXV0byBp
dGVyYXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOworCisgICAgICAgIGF1dG8gdmljdGlt
SXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgdW5zaWduZWQgbWF4RGVncmVlID0gbV9kZWdy
ZWVzW0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KCppdGVyYXRvcildOwor
CisgICAgICAgICsraXRlcmF0b3I7CisgICAgICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3BpbGxX
b3JrbGlzdC5lbmQoKTsgKytpdGVyYXRvcikgeworICAgICAgICAgICAgdW5zaWduZWQgdG1wRGVn
cmVlID0gbV9kZWdyZWVzW0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KCpp
dGVyYXRvcildOworICAgICAgICAgICAgaWYgKHRtcERlZ3JlZSA+IG1heERlZ3JlZSkgeworICAg
ICAgICAgICAgICAgIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgICAgICAgICAg
bWF4RGVncmVlID0gdG1wRGVncmVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgVG1wIHZpY3RpbVRtcCA9ICp2aWN0aW1JdGVyYXRvcjsKKyAgICAgICAgbV9zcGlsbFdvcmts
aXN0LnJlbW92ZSh2aWN0aW1JdGVyYXRvcik7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5h
cHBlbmQodmljdGltVG1wKTsKKyAgICAgICAgZnJlZXplTW92ZXModmljdGltVG1wKTsKKyAgICB9
CisKKyAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAgICAgICBBU1NFUlQobV9zaW1w
bGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMu
aXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsK
KyAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOworCisgICAgICAgIC8v
IFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCisgICAgICAgIG1faW50ZXJmZXJl
bmNlRWRnZXMuY2xlYXIoKTsKKyAgICAgICAgbV9kZWdyZWVzLmNsZWFyKCk7CisgICAgICAgIG1f
bW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisgICAg
ICAgIG1fYWN0aXZlTW92ZXMuY2xlYXIoKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmNs
ZWFyKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5jbGVhcigpOworICAgICAgICBtX2ZyZWV6
ZVdvcmtsaXN0LmNsZWFyKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24g
dGhlIHN0YWNrLgorICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fYWRqYWNlbmN5TGlzdC5z
aXplKCkpOworICAgICAgICBjb25zdCBhdXRvJiByZWdpc3RlcnNJblByaW9yaXR5T3JkZXIgPSBy
ZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpOworCisgICAgICAgIHdoaWxlICghbV9zZWxlY3RTdGFj
ay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFRtcCB0bXAgPSBtX3NlbGVjdFN0YWNrLnRha2VM
YXN0KCk7CisgICAgICAgICAgICBBU1NFUlQoIXRtcC5pc1JlZygpKTsKKyAgICAgICAgICAgIEFT
U0VSVCghbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCldKTsKKworICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVyczsKKyAg
ICAgICAgICAgIGZvciAoVG1wIGFkamFjZW50VG1wIDogbV9hZGphY2VuY3lMaXN0W0Fic29sdXRl
VG1wSGVscGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKSB7CisgICAgICAgICAgICAgICAg
VG1wIGFsaWFzVG1wID0gZ2V0QWxpYXMoYWRqYWNlbnRUbXApOworICAgICAgICAgICAgICAgIGlm
IChhbGlhc1RtcC5pc1JlZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yZWRSZWdpc3Rl
cnMuc2V0KGFsaWFzVG1wLnJlZygpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUmVnIHJlZyA9IG1fY29sb3JlZFRt
cFtBYnNvbHV0ZVRtcEhlbHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhbGlhc1RtcCldOworICAg
ICAgICAgICAgICAgIGlmIChyZWcpCisgICAgICAgICAgICAgICAgICAgIGNvbG9yZWRSZWdpc3Rl
cnMuc2V0KHJlZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgY29sb3JBc3Np
Z25lZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogcmVnaXN0ZXJzSW5Qcmlv
cml0eU9yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVnaXN0ZXJzLmdldChy
ZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY29sb3JlZFRtcFtBYnNvbHV0ZVRtcEhlbHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSA9IHJlZzsKKyAgICAgICAgICAgICAgICAgICAg
Y29sb3JBc3NpZ25lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjb2xvckFzc2ln
bmVkKQorICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcC5hZGQodG1wKTsKKyAgICAgICAgfQor
ICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKCFtX3NwaWxsZWRU
bXAuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7CisgICAgfQor
CisjcHJhZ21hIG1hcmsgLSBEZWJ1Z2dpbmcgaGVscGVycy4KKworICAgIHZvaWQgZHVtcEludGVy
ZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAgIG91dC5w
cmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOworCisgICAgICAgIEhhc2hTZXQ8
VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRn
ZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJl
bmNlcy5hZGQoZWRnZS5maXJzdCgpKTsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNl
cy5hZGQoZWRnZS5zZWNvbmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IGF1
dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJmZXJlbmNlcykKKyAgICAgICAgICAgIG91dC5wcmludCgi
ICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiICgiLCBtX2Rl
Z3JlZXNbQWJzb2x1dGVUbXBIZWxwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0sICIpXCJd
O1xuIik7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZlcmVuY2VF
ZGdlcykKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVkZ2UuZmlyc3QoKS5pbnRlcm5h
bFZhbHVlKCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKS5pbnRlcm5hbFZhbHVlKCksICI7XG4iKTsK
KyAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBXb3JrTGlz
dHMoUHJpbnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludCgiU2ltcGxpZnkg
d29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAoVG1wIHRtcCA6IG1fc2ltcGxpZnlXb3JrbGlz
dCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcCwgIlxuIik7CisgICAgICAgIG91
dC5wcmludCgiTW92ZXMgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAoSW5zdCogaW5zdCA6
IG1fd29ya2xpc3RNb3ZlcykKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsICppbnN0LCAi
XG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJGcmVlemUgd29yayBsaXN0OlxuIik7CisgICAgICAg
IGZvciAoVG1wIHRtcCA6IG1fZnJlZXplV29ya2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCB0bXAsICJcbiIpOworICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpc
biIpOworICAgICAgICBmb3IgKFRtcCB0bXAgOiBtX3NwaWxsV29ya2xpc3QpCisgICAgICAgICAg
ICBvdXQucHJpbnQoIiAgICAiLCB0bXAsICJcbiIpOworICAgIH0KKworI3ByYWdtYSBtYXJrIC0K
KworICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVkLiBBbiBlZGdlIGJl
dHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCisgICAgLy8gYnkgdGhlIGNvbmNhdGVu
YXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2VyIFRt
cC4KKyAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIElu
dGVyZmVyZW5jZUVkZ2UoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBJbnRlcmZl
cmVuY2VFZGdlKFRtcCBhLCBUbXAgYikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKGEu
aW50ZXJuYWxWYWx1ZSgpKTsKKyAgICAgICAgICAgIEFTU0VSVChiLmludGVybmFsVmFsdWUoKSk7
CisgICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZl
ciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERvaW5nIHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRo
ZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdpc3RlcnMuIik7CisKKyAgICAgICAgICAgIHVuc2ln
bmVkIGFJbnRlcm5hbCA9IGEuaW50ZXJuYWxWYWx1ZSgpOworICAgICAgICAgICAgdW5zaWduZWQg
YkludGVybmFsID0gYi5pbnRlcm5hbFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYkludGVybmFs
IDwgYUludGVybmFsKQorICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChhSW50ZXJuYWwsIGJJbnRl
cm5hbCk7CisgICAgICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGFJbnRl
cm5hbCkgPDwgMzIgfCBiSW50ZXJuYWw7CisgICAgICAgIH0KKworICAgICAgICBJbnRlcmZlcmVu
Y2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlVHlwZSkKKyAgICAgICAgICAgIDogbV92
YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpCisgICAgICAgIHsKKyAg
ICAgICAgfQorCisgICAgICAgIFRtcCBmaXJzdCgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAg
ICAgIHJldHVybiBUbXA6OnRtcEZvckludGVybmFsVmFsdWUobV92YWx1ZSA+PiAzMik7CisgICAg
ICAgIH0KKworICAgICAgICBUbXAgc2Vjb25kKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAg
ICAgcmV0dXJuIFRtcDo6dG1wRm9ySW50ZXJuYWxWYWx1ZShtX3ZhbHVlICYgMHhmZmZmZmZmZik7
CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZXJmZXJlbmNl
RWRnZSBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUg
PT0gb3RoZXIubV92YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaXNIYXNoVGFibGVE
ZWxldGVkVmFsdWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKnRoaXMg
PT0gSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZSk7CisgICAgICAg
IH0KKworICAgICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAg
ICAgcmV0dXJuIFdURjo6SW50SGFzaDx1aW50NjRfdD46Omhhc2gobV92YWx1ZSk7CisgICAgICAg
IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHVpbnQ2NF90IG1fdmFsdWUgeyAwIH07CisgICAg
fTsKKworICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7CisgICAgICAgIHN0YXRpYyB1
bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGtleSkgeyByZXR1cm4ga2V5Lmhh
c2goKTsgfQorICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBJbnRlcmZlcmVuY2VFZGdl
JiBhLCBjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBiKSB7IHJldHVybiBhID09IGI7IH0KKyAgICAg
ICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVl
OworICAgIH07CisgICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJlbmNl
RWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7CisKKyAgICAvLyBUaGUgaW50ZXJmZXJl
bmNlIGdyYXBoLgorICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRn
ZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOwor
ICAgIFZlY3RvcjxWZWN0b3I8VG1wLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVu
c2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7CisgICAgVmVjdG9yPHVuc2lnbmVk
LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOworCisgICAgLy8gTGlzdCBvZiBl
dmVyeSBtb3ZlIGluc3RydWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIFRtcC4KKyAgICBWZWN0b3I8
SGFzaFNldDxJbnN0Kj4+IG1fbW92ZUxpc3Q7CisKKyAgICAvLyBDb2xvcnMuCisgICAgVmVjdG9y
PFJlZywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3JlZFRtcDsKKyAgICBIYXNoU2V0
PFRtcD4gbV9zcGlsbGVkVG1wOworCisgICAgLy8gVmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGNvYWxl
c2NlZCB3aXRoIGFuIG90aGVyIHZhbHVlLgorICAgIFZlY3RvcjxUbXA+IG1fY29hbGVzY2VkVG1w
czsKKworICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBhbmQg
cmVhZHkgZm9yIGNvbG9yaW5nLgorICAgIEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsKKyAg
ICBWZWN0b3I8VG1wPiBtX3NlbGVjdFN0YWNrOworCisgICAgLy8gV29yayBsaXN0cy4KKyAgICAv
LyBTZXQgb2YgIm1vdmUiIGVuYWJsZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCisgICAgTGlz
dEhhc2hTZXQ8SW5zdCo+IG1fd29ya2xpc3RNb3ZlczsKKyAgICAvLyBTZXQgb2YgIm1vdmUiIG5v
dCB5ZXQgcmVhZHkgZm9yIGNvYWxlc2NpbmcuCisgICAgSGFzaFNldDxJbnN0Kj4gbV9hY3RpdmVN
b3ZlczsKKyAgICAvLyBMb3ctZGVncmVlLCBub24tTW92ZSByZWxhdGVkLgorICAgIFZlY3RvcjxU
bXA+IG1fc2ltcGxpZnlXb3JrbGlzdDsKKyAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCisgICAgSGFz
aFNldDxUbXA+IG1fc3BpbGxXb3JrbGlzdDsKKyAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJlbGF0
ZWQuCisgICAgSGFzaFNldDxUbXA+IG1fZnJlZXplV29ya2xpc3Q7Cit9OworCit0ZW1wbGF0ZTxB
cmc6OlR5cGUgdHlwZT4KK3N0YXRpYyBib29sIGlzVXNlbGVzc01vdmVJbnN0KGNvbnN0IEluc3Qm
IGluc3QpCit7CisgICAgcmV0dXJuIE1vdmVJbnN0SGVscGVyPHR5cGU+OjptYXlCZUNvYWxlc2Nh
YmxlKGluc3QpICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1wKCk7Cit9
CisKK3RlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorc3RhdGljIHZvaWQgYXNzaWduUmVnaXN0ZXJU
b1RtcEluUHJvZ3JhbShDb2RlJiBjb2RlLCBjb25zdCBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Z0FsbG9jYXRvcjx0eXBlPiYgYWxsb2NhdG9yKQoreworICAgIGZvciAoQmFzaWNCbG9jayogYmxv
Y2sgOiBjb2RlKSB7CisgICAgICAgIC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVnaXN0ZXIuCisgICAg
ICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUo
KTsgKytpbnN0SW5kZXgpIHsKKyAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5z
dEluZGV4KTsKKyAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcEZhc3QoWyZdIChUbXAmIHRtcCkg
eworICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCB0bXAuaXNHUCgpID09ICh0eXBl
ICE9IEFyZzo6R1ApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAg
ICAgICBUbXAgYWxpYXNUbXAgPSBhbGxvY2F0b3IuZ2V0QWxpYXModG1wKTsKKyAgICAgICAgICAg
ICAgICBUbXAgYXNzaWduZWRUbXA7CisgICAgICAgICAgICAgICAgaWYgKGFsaWFzVG1wLmlzUmVn
KCkpCisgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKGFsaWFzVG1wLnJlZygp
KTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byByZWcg
PSBhbGxvY2F0b3IuYWxsb2NhdGVkUmVnKGFsaWFzVG1wKTsKKyAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKHJlZyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKHJlZyk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFTU0VSVChhc3NpZ25lZFRtcC5p
c1JlZygpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBhc3NpZ25lZFRtcDsKKyAgICAgICAgICAg
IH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgdXNlbGVzcyBtb3Zl
cyB3ZSBjcmVhdGVkIGluIHRoaXMgYmxvY2suCisgICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92
ZUFsbE1hdGNoaW5nKGlzVXNlbGVzc01vdmVJbnN0PHR5cGU+KTsKKyAgICB9Cit9CisKK3RlbXBs
YXRlPEFyZzo6VHlwZSB0eXBlPgorc3RhdGljIHZvaWQgYWRkU3BpbGxBbmRGaWxsVG9Qcm9ncmFt
KENvZGUmIGNvZGUsIGNvbnN0IEhhc2hTZXQ8VG1wPiYgc3BpbGxlZFRtcCkKK3sKKyAgICAvLyBB
bGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNoIHNwaWxsZWQgdmFsdWUuCisgICAgSGFzaE1hcDxU
bXAsIFN0YWNrU2xvdCo+IHN0YWNrU2xvdHM7CisgICAgZm9yIChUbXAgdG1wIDogc3BpbGxlZFRt
cCkgeworICAgICAgICBib29sIGlzTmV3VG1wID0gc3RhY2tTbG90cy5hZGQodG1wLCBjb2RlLmFk
ZFN0YWNrU2xvdCg4LCBTdGFja1Nsb3RLaW5kOjpBbm9ueW1vdXMpKS5pc05ld0VudHJ5OworICAg
ICAgICBBU1NFUlRfVU5VU0VEKGlzTmV3VG1wLCBpc05ld1RtcCk7CisgICAgfQorCisgICAgLy8g
UmV3cml0ZSB0aGUgcHJvZ3JhbSB0byBnZXQgcmlkIG9mIHRoZSBzcGlsbGVkIFRtcC4KKyAgICBJ
bnNlcnRpb25TZXQgaW5zZXJ0aW9uU2V0KGNvZGUpOworICAgIGZvciAoQmFzaWNCbG9jayogYmxv
Y2sgOiBjb2RlKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdElu
ZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKKyAgICAgICAgICAgIEluc3QmIGlu
c3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKKworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlcGxh
Y2UgdGhlIHJlZ2lzdGVyIHVzZSBieSBtZW1vcnkgdXNlIHdoZW4gcG9zc2libGUuCisgICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgICAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaV07CisgICAgICAgICAgICAgICAg
aWYgKGFyZy5pc1RtcCgpICYmIGFyZy50eXBlKCkgPT0gdHlwZSAmJiAhYXJnLmlzUmVnKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgYXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmlu
ZChhcmcudG1wKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tTbG90RW50cnkgPT0g
c3RhY2tTbG90cy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgICAgICAgICAgICAgIGlmIChpbnN0LmFkbWl0c1N0YWNrKGkpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIGV2
ZXJ5IG90aGVyIGNhc2UsIGFkZCBMb2FkL1N0b3JlIGFzIG5lZWRlZC4KKyAgICAgICAgICAgIGlu
c3QuZm9yRWFjaFRtcChbJl0gKFRtcCYgdG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFy
Z1R5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgYXJnVHlwZSAhPSB0
eXBlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBhdXRv
IHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKHRtcCk7CisgICAgICAgICAgICAgICAg
aWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIEFyZyBhcmcgPSBBcmc6OnN0YWNrKHN0YWNr
U2xvdEVudHJ5LT52YWx1ZSk7CisgICAgICAgICAgICAgICAgT3Bjb2RlIG1vdmUgPSB0eXBlID09
IEFyZzo6R1AgPyBNb3ZlIDogTW92ZURvdWJsZTsKKworICAgICAgICAgICAgICAgIGlmIChBcmc6
OmlzVXNlKHJvbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIFRtcCBuZXdUbXAgPSBjb2RlLm5l
d1RtcCh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChpbnN0
SW5kZXgsIG1vdmUsIGluc3Qub3JpZ2luLCBhcmcsIG5ld1RtcCk7CisgICAgICAgICAgICAgICAg
ICAgIHRtcCA9IG5ld1RtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYg
KEFyZzo6aXNEZWYocm9sZSkpCisgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNl
cnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4sIHRtcCwgYXJnKTsKKyAgICAgICAg
ICAgIH0pOworICAgICAgICB9CisgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKGJsb2NrKTsK
KyAgICB9Cit9CisKK3RlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorc3RhdGljIHZvaWQgaXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGUoQ29kZSYgY29kZSkKK3sKKyAgICB3aGlsZSAodHJ1
ZSkgeworICAgICAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjx0eXBlPiBh
bGxvY2F0b3IoY29kZSk7CisgICAgICAgIExpdmVuZXNzPFRtcD4gbGl2ZW5lc3MoY29kZSk7Cisg
ICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBjb2RlKSB7CisgICAgICAgICAgICBMaXZl
bmVzczxUbXA+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CisgICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0t
OykgeworICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsK
KyAgICAgICAgICAgICAgICBhbGxvY2F0b3IuYnVpbGQoaW5zdCwgbG9jYWxDYWxjKTsKKyAgICAg
ICAgICAgICAgICBsb2NhbENhbGMuZXhlY3V0ZShpbnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIGFsbG9jYXRvci5hbGxvY2F0ZSgpOworICAgICAgICBpZiAoYWxsb2Nh
dG9yLnNwaWxsZWRUbXAoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFzc2lnblJlZ2lzdGVy
VG9UbXBJblByb2dyYW0oY29kZSwgYWxsb2NhdG9yKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgICAgICBhZGRTcGlsbEFuZEZpbGxUb1Byb2dyYW08dHlwZT4oY29kZSwgYWxs
b2NhdG9yLnNwaWxsZWRUbXAoKSk7CisgICAgfQorfQorCit2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nKENvZGUmIGNvZGUpCit7CisgICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUs
ICJpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOworCisgICAgYm9vbCBncElzQ29sb3JlZCA9
IGZhbHNlOworICAgIGJvb2wgZnBJc0NvbG9yZWQgPSBmYWxzZTsKKworICAgIC8vIEZpcnN0IHdl
IHJ1biBib3RoIGFsbG9jYXRvciB0b2dldGhlciBhcyBsb25nIGFzIHRoZXkgYm90aCBzcGlsbC4K
KyAgICB3aGlsZSAoIWdwSXNDb2xvcmVkICYmICFmcElzQ29sb3JlZCkgeworICAgICAgICBJdGVy
YXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjxBcmc6OkdQPiBncEFsbG9jYXRvcihjb2Rl
KTsKKyAgICAgICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I8QXJnOjpGUD4g
ZnBBbGxvY2F0b3IoY29kZSk7CisKKyAgICAgICAgLy8gTGl2ZW5lc3MgQW5hbHlzaXMgY2FuIGJl
IHByb2hpYml0aXZlbHkgZXhwZW5zaXZlLiBJdCBpcyBzaGFyZWQKKyAgICAgICAgLy8gYmV0d2Vl
biB0aGUgdHdvIGFsbG9jYXRvcnMgdG8gYXZvaWQgZG9pbmcgaXQgdHdpY2UuCisgICAgICAgIExp
dmVuZXNzPFRtcD4gbGl2ZW5lc3MoY29kZSk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxv
Y2sgOiBjb2RlKSB7CisgICAgICAgICAgICBMaXZlbmVzczxUbXA+OjpMb2NhbENhbGMgbG9jYWxD
YWxjKGxpdmVuZXNzLCBibG9jayk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRl
eCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0tOykgeworICAgICAgICAgICAgICAgIEluc3Qm
IGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKKworICAgICAgICAgICAgICAgIGdwQWxsb2Nh
dG9yLmJ1aWxkKGluc3QsIGxvY2FsQ2FsYyk7CisgICAgICAgICAgICAgICAgZnBBbGxvY2F0b3Iu
YnVpbGQoaW5zdCwgbG9jYWxDYWxjKTsKKworICAgICAgICAgICAgICAgIGxvY2FsQ2FsYy5leGVj
dXRlKGluc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ3BBbGxvY2F0
b3IuYWxsb2NhdGUoKTsKKyAgICAgICAgaWYgKGdwQWxsb2NhdG9yLnNwaWxsZWRUbXAoKS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgIGFzc2lnblJlZ2lzdGVyVG9UbXBJblByb2dyYW0oY29kZSwg
Z3BBbGxvY2F0b3IpOworICAgICAgICAgICAgZ3BJc0NvbG9yZWQgPSB0cnVlOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIGFkZFNwaWxsQW5kRmlsbFRvUHJvZ3JhbTxBcmc6OkdQPihjb2Rl
LCBncEFsbG9jYXRvci5zcGlsbGVkVG1wKCkpOworCisgICAgICAgIGZwQWxsb2NhdG9yLmFsbG9j
YXRlKCk7CisgICAgICAgIGlmIChmcEFsbG9jYXRvci5zcGlsbGVkVG1wKCkuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBhc3NpZ25SZWdpc3RlclRvVG1wSW5Qcm9ncmFtKGNvZGUsIGZwQWxsb2Nh
dG9yKTsKKyAgICAgICAgICAgIGZwSXNDb2xvcmVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICBhZGRTcGlsbEFuZEZpbGxUb1Byb2dyYW08QXJnOjpGUD4oY29kZSwgZnBBbGxv
Y2F0b3Iuc3BpbGxlZFRtcCgpKTsKKyAgICB9OworCisgICAgaWYgKCFncElzQ29sb3JlZCkKKyAg
ICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oY29kZSk7Cisg
ICAgaWYgKCFmcElzQ29sb3JlZCkKKyAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdP
blR5cGU8QXJnOjpGUD4oY29kZSk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmggYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uZmJlZWMxNjc1OGEyNDFkNTVkZWFjZjcxODk0YTcyZWJjMGRjMDMwZQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVz
Y2luZ19oCisjZGVmaW5lIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nX2gKKworI2lmIEVO
QUJMRShCM19KSVQpCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2Ug
QWlyIHsKKworY2xhc3MgQ29kZTsKKworLy8gVGhpcyBpcyBhIHJlZ2lzdGVyIGFsbG9jYXRpb24g
cGhhc2UgYmFzZWQgb24gQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29hbGVzY2lu
ZworLy8gaHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9jcy9hY2FkZW1pYy9jbGFzcy8xNTc0NS1z
MDcvd3d3L3BhcGVycy9nZW9yZ2UucGRmCit2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
KENvZGUmKTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8g
RU5BQkxFKEIzX0pJVCkKKworI2VuZGlmIC8vIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
X2gKKwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXAuaCBi
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wLmgKaW5kZXggMGQwMWVmZTU1MjMy
Mzc3ZTI0ZmQ0ZDEyMmE1MjRjNjg1NTc1NjYzNy4uYjBkMTU4ZDNkNzI5YTczYjYzMmE3YTYzNWFi
MzY1MDBiOTQ5NGUxNiAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJUbXAuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclRtcC5oCkBAIC0x
NzIsNyArMTcyLDE2IEBAIHB1YmxpYzoKICAgICB7CiAgICAgICAgIHJldHVybiBXVEY6OkludEhh
c2g8aW50Pjo6aGFzaChtX3ZhbHVlKTsKICAgICB9Ci0gICAgCisKKyAgICB1bnNpZ25lZCBpbnRl
cm5hbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1fdmFsdWUp
OyB9CisKKyAgICBzdGF0aWMgVG1wIHRtcEZvckludGVybmFsVmFsdWUodW5zaWduZWQgaW5kZXgp
CisgICAgeworICAgICAgICBUbXAgcmVzdWx0OworICAgICAgICByZXN1bHQubV92YWx1ZSA9IHN0
YXRpY19jYXN0PGludD4oaW5kZXgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwog
cHJpdmF0ZToKICAgICBzdGF0aWMgaW50IGVuY29kZUdQKHVuc2lnbmVkIGluZGV4KQogICAgIHsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy90ZXN0YjMuY3BwIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAKaW5kZXggZmZjZDUzMWQyYmJjM2RjMzljOGJh
YTIzNTY5YWQxZTJiMzFjNjZkMi4uMzMxOTJkNWU3YWE3Y2NiYzY1Y2ZkMTFkNjY1YjMzZjhlYWQz
NjU0YiAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAKKysr
IGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAKQEAgLTE4MDgsNiArMTgwOCwy
OSBAQCB2b2lkIHRlc3RMb2FkKEIzOjpPcGNvZGUgb3Bjb2RlLCBpbnQzMl90IHZhbHVlKQogICAg
IH0KIH0KIAordm9pZCB0ZXN0U3BpbGxHUCgpCit7CisgICAgUHJvY2VkdXJlIHByb2M7CisgICAg
QmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsKKworICAgIFZlY3RvcjxWYWx1ZSo+
IHNvdXJjZXM7CisgICAgc291cmNlcy5hcHBlbmQocm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVn
VmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApKTsKKyAgICBzb3Vy
Y2VzLmFwcGVuZChyb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2lu
KCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IDMwOyArK2kpIHsKKyAgICAgICAgc291cmNlcy5hcHBlbmQoCisgICAgICAgICAgICByb290
LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEFkZCwgT3JpZ2luKCksIHNvdXJjZXNbc291cmNlcy5z
aXplKCkgLSAxXSwgc291cmNlc1tzb3VyY2VzLnNpemUoKSAtIDJdKQorICAgICAgICApOworICAg
IH0KKworICAgIFZhbHVlKiB0b3RhbCA9IHJvb3QtPmFwcGVuZE5ldzxDb25zdDY0VmFsdWU+KHBy
b2MsIE9yaWdpbigpLCAwKTsKKyAgICBmb3IgKFZhbHVlKiB2YWx1ZSA6IHNvdXJjZXMpCisgICAg
ICAgIHRvdGFsID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBBZGQsIE9yaWdpbigpLCB0
b3RhbCwgdmFsdWUpOworCisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4ocHJvYywg
UmV0dXJuLCBPcmlnaW4oKSwgdG90YWwpOworICAgIGNvbXBpbGVBbmRSdW48aW50Pihwcm9jLCAx
LCAyKTsKK30KKwogdm9pZCB0ZXN0QnJhbmNoKCkKIHsKICAgICBQcm9jZWR1cmUgcHJvYzsKQEAg
LTMzMDIsNiArMzMyNSw4IEBAIHZvaWQgcnVuKGNvbnN0IGNoYXIqIGZpbHRlcikKICAgICBSVU4o
dGVzdExvYWQ8dWludDE2X3Q+KExvYWQxNlosIDEwMDAwMDAwMDApKTsKICAgICBSVU4odGVzdExv
YWQ8dWludDE2X3Q+KExvYWQxNlosIC0xMDAwMDAwMDAwKSk7CiAKKyAgICBSVU4odGVzdFNwaWxs
R1AoKSk7CisKICAgICBSVU4odGVzdENhbGxTaW1wbGUoMSwgMikpOwogICAgIFJVTih0ZXN0Q2Fs
bEZ1bmN0aW9uV2l0aEhlbGxhQXJndW1lbnRzKCkpOwogCg==
</data>
<flag name="review"
          id="290319"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>