<?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>167431</bug_id>
          
          <creation_ts>2017-01-25 13:54:01 -0800</creation_ts>
          <short_desc>jsc.cpp should have the $.agent stuff for testing SAB</short_desc>
          <delta_ts>2017-01-25 18:36:42 -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>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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1269948</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-01-25 13:54:01 -0800</bug_when>
    <thetext>Patch forthcoming</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1269949</commentid>
    <comment_count>1</comment_count>
      <attachid>299737</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-01-25 13:55:02 -0800</bug_when>
    <thetext>Created attachment 299737
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270010</commentid>
    <comment_count>2</comment_count>
      <attachid>299758</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-01-25 16:06:31 -0800</bug_when>
    <thetext>Created attachment 299758
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270011</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-01-25 16:08:00 -0800</bug_when>
    <thetext>Attachment 299758 did not pass style-queue:


ERROR: Source/JavaScriptCore/jsc.cpp:2488:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270039</commentid>
    <comment_count>4</comment_count>
      <attachid>299758</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-01-25 16:50:23 -0800</bug_when>
    <thetext>Comment on attachment 299758
the patch

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

r=me

&gt; Source/JavaScriptCore/jsc.cpp:2348
&gt; +    if (isOnList())

Why would this not be true?

&gt; Source/JavaScriptCore/jsc.cpp:2396
&gt; +    for (Worker* worker = m_workers.begin(); worker != m_workers.end(); worker = worker-&gt;next())
&gt; +        func(locker, *worker);

Should we ignore Worker::currentWorker()?

&gt; Source/JavaScriptCore/jsc.cpp:2478
&gt; +    Lock didStartLock;
&gt; +    Condition didStartCondition;
&gt; +    bool didStart = false;

Nit: Why not just do this using a single lock that starts off locked and is unlocked once runJSC calls the lambda?
Then the code below could just do:
didStartLock.lock().

&gt; Source/JavaScriptCore/jsc.cpp:2559
&gt; +        sleep(Seconds::fromMilliseconds(exec-&gt;argument(0).toNumber(exec)));

Might want to exception check toNumber?

&gt; Source/JavaScriptCore/jsc.cpp:2579
&gt; +            nativeBuffer-&gt;transferTo(contents); // &quot;transferTo&quot; means &quot;share&quot; if the buffer is shared.

What if it&apos;s not a SAB? Will we just give our contents to the first worker on the list? What if it&apos;s ourself?

&gt; Source/JavaScriptCore/jsc.cpp:2581
&gt; +            worker.send(locker, message);

the name of the send function kind of confuses me because I always read it as &quot;the worker will send something to something else&quot;, but really, I think it should be read as, the currentWorker() is sending something to all the individual workers. Not sure I have better ideas for a name, but maybe you do? Maybe it&apos;s just me who reads it this way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270071</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-01-25 17:47:24 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Comment on attachment 299758 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=299758&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/JavaScriptCore/jsc.cpp:2348
&gt; &gt; +    if (isOnList())
&gt; 
&gt; Why would this not be true?

I changed it to assert that it&apos;s true.

&gt; 
&gt; &gt; Source/JavaScriptCore/jsc.cpp:2396
&gt; &gt; +    for (Worker* worker = m_workers.begin(); worker != m_workers.end(); worker = worker-&gt;next())
&gt; &gt; +        func(locker, *worker);
&gt; 
&gt; Should we ignore Worker::currentWorker()?

Makes sense. I made it ignore &amp;Worker::current().

&gt; 
&gt; &gt; Source/JavaScriptCore/jsc.cpp:2478
&gt; &gt; +    Lock didStartLock;
&gt; &gt; +    Condition didStartCondition;
&gt; &gt; +    bool didStart = false;
&gt; 
&gt; Nit: Why not just do this using a single lock that starts off locked and is
&gt; unlocked once runJSC calls the lambda?
&gt; Then the code below could just do:
&gt; didStartLock.lock().

Not sure what you&apos;re suggesting. Seems like you mean that we lock the lock before starting the thread and unlock the lock inside the thread.

Note that in the literature, the &quot;lock&quot; and &quot;mutex&quot; ADTs are thought to have this rule: &quot;unlock() must be called from the same thread that called lock()&quot;. If you want a thing that&apos;s like a lock but unlock() can be called from a different thread, then you want a &quot;binary semaphore&quot;. I&apos;ve also heard this called a latch, and Win32 calls it an auto-reset event. If you really want, I could use the BinarySemaphore class in WTF. I have a habit of just using Lock+Condition because I enjoy the uniformity of using it everywhere.

It so happens that our lock implementation probably works when unlock() is called from a different thread than lock(), but this isn&apos;t something we should rely on, because:

- Someone attempting alternate implementations of Lock could reasonably assume that unlock() is always called from the same thread as lock().

- Several lock implementations that I think we want to consider using in WebKit rely on the lock/unlock symmetry. Lock implementations that automatically provide deadlock diagnostics rely on this. Lock implementations that automatically resolve priority inversion rely on this.

&gt; 
&gt; &gt; Source/JavaScriptCore/jsc.cpp:2559
&gt; &gt; +        sleep(Seconds::fromMilliseconds(exec-&gt;argument(0).toNumber(exec)));
&gt; 
&gt; Might want to exception check toNumber?

Oh, lol. Fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/jsc.cpp:2579
&gt; &gt; +            nativeBuffer-&gt;transferTo(contents); // &quot;transferTo&quot; means &quot;share&quot; if the buffer is shared.
&gt; 
&gt; What if it&apos;s not a SAB? Will we just give our contents to the first worker
&gt; on the list? What if it&apos;s ourself?

This code is guarded by:

    if (!jsBuffer || !jsBuffer-&gt;isShared())
        return JSValue::encode(throwException(exec, scope, createError(exec, ASCIILiteral(&quot;Expected SharedArrayBuffer&quot;))));

&gt; 
&gt; &gt; Source/JavaScriptCore/jsc.cpp:2581
&gt; &gt; +            worker.send(locker, message);
&gt; 
&gt; the name of the send function kind of confuses me because I always read it
&gt; as &quot;the worker will send something to something else&quot;, but really, I think
&gt; it should be read as, the currentWorker() is sending something to all the
&gt; individual workers. Not sure I have better ideas for a name, but maybe you
&gt; do? Maybe it&apos;s just me who reads it this way.

I changed Worker::send() and Worker::receive() to Worker::enqueue() and Worker::dequeue().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270076</commentid>
    <comment_count>6</comment_count>
      <attachid>299758</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-01-25 18:04:52 -0800</bug_when>
    <thetext>Comment on attachment 299758
the patch

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

&gt;&gt;&gt; Source/JavaScriptCore/jsc.cpp:2478
&gt;&gt;&gt; +    bool didStart = false;
&gt;&gt; 
&gt;&gt; Nit: Why not just do this using a single lock that starts off locked and is unlocked once runJSC calls the lambda?
&gt;&gt; Then the code below could just do:
&gt;&gt; didStartLock.lock().
&gt; 
&gt; Not sure what you&apos;re suggesting. Seems like you mean that we lock the lock before starting the thread and unlock the lock inside the thread.
&gt; 
&gt; Note that in the literature, the &quot;lock&quot; and &quot;mutex&quot; ADTs are thought to have this rule: &quot;unlock() must be called from the same thread that called lock()&quot;. If you want a thing that&apos;s like a lock but unlock() can be called from a different thread, then you want a &quot;binary semaphore&quot;. I&apos;ve also heard this called a latch, and Win32 calls it an auto-reset event. If you really want, I could use the BinarySemaphore class in WTF. I have a habit of just using Lock+Condition because I enjoy the uniformity of using it everywhere.
&gt; 
&gt; It so happens that our lock implementation probably works when unlock() is called from a different thread than lock(), but this isn&apos;t something we should rely on, because:
&gt; 
&gt; - Someone attempting alternate implementations of Lock could reasonably assume that unlock() is always called from the same thread as lock().
&gt; 
&gt; - Several lock implementations that I think we want to consider using in WebKit rely on the lock/unlock symmetry. Lock implementations that automatically provide deadlock diagnostics rely on this. Lock implementations that automatically resolve priority inversion rely on this.

Yeah I thought about this before posting my comment, but thought to post it anyways. I agree we should stick with the code you have now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270085</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-01-25 18:36:13 -0800</bug_when>
    <thetext>Landed in https://trac.webkit.org/changeset/211194</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1270086</commentid>
    <comment_count>8</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-01-25 18:36:42 -0800</bug_when>
    <thetext>&lt;rdar://problem/30201008&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>299737</attachid>
            <date>2017-01-25 13:55:02 -0800</date>
            <delta_ts>2017-01-25 16:06:31 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>19432</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjExMTYyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ0IEBA
CisyMDE3LTAxLTI1ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
anNjLmNwcCBzaG91bGQgaGF2ZSB0aGUgJC5hZ2VudCBzdHVmZiBmb3IgdGVzdGluZyBTQUIKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NzQzMQorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAgICAgVGhp
cyBhZGRzIHNvbWUgc3R1ZmYgdGhhdCB0aGUgU0FCIGJyYW5jaCBvZiB0ZXN0MjYyIG5lZWRzLgor
CisgICAgICAgICoganNjLmNwcDoKKyAgICAgICAgKE1lc3NhZ2U6OnJlbGVhc2VDb250ZW50cyk6
CisgICAgICAgIChNZXNzYWdlOjppbmRleCk6CisgICAgICAgIChHbG9iYWxPYmplY3Q6OmZpbmlz
aENyZWF0aW9uKToKKyAgICAgICAgKEdsb2JhbE9iamVjdDo6YWRkRnVuY3Rpb24pOgorICAgICAg
ICAoTWVzc2FnZTo6TWVzc2FnZSk6CisgICAgICAgIChNZXNzYWdlOjp+TWVzc2FnZSk6CisgICAg
ICAgIChXb3JrZXI6Oldvcmtlcik6CisgICAgICAgIChXb3JrZXI6On5Xb3JrZXIpOgorICAgICAg
ICAoV29ya2VyOjpzZW5kKToKKyAgICAgICAgKFdvcmtlcjo6cmVjZWl2ZSk6CisgICAgICAgIChX
b3JrZXI6OmN1cnJlbnQpOgorICAgICAgICAoV29ya2VyOjpjdXJyZW50V29ya2VyKToKKyAgICAg
ICAgKFdvcmtlcnM6OldvcmtlcnMpOgorICAgICAgICAoV29ya2Vyczo6fldvcmtlcnMpOgorICAg
ICAgICAoV29ya2Vyczo6YnJvYWRjYXN0KToKKyAgICAgICAgKFdvcmtlcnM6OnJlcG9ydCk6Cisg
ICAgICAgIChXb3JrZXJzOjp0cnlHZXRSZXBvcnQpOgorICAgICAgICAoV29ya2Vyczo6c2luZ2xl
dG9uKToKKyAgICAgICAgKGZ1bmN0aW9uRG9sbGFyQ3JlYXRlUmVhbG0pOgorICAgICAgICAoZnVu
Y3Rpb25Eb2xsYXJEZXRhY2hBcnJheUJ1ZmZlcik6CisgICAgICAgIChmdW5jdGlvbkRvbGxhckV2
YWxTY3JpcHQpOgorICAgICAgICAoZnVuY3Rpb25Eb2xsYXJBZ2VudFN0YXJ0KToKKyAgICAgICAg
KGZ1bmN0aW9uRG9sbGFyQWdlbnRSZWNlaXZlQnJvYWRjYXN0KToKKyAgICAgICAgKGZ1bmN0aW9u
RG9sbGFyQWdlbnRSZXBvcnQpOgorICAgICAgICAoZnVuY3Rpb25Eb2xsYXJBZ2VudFNsZWVwKToK
KyAgICAgICAgKGZ1bmN0aW9uRG9sbGFyQWdlbnRCcm9hZGNhc3QpOgorICAgICAgICAoZnVuY3Rp
b25Eb2xsYXJBZ2VudEdldFJlcG9ydCk6CisgICAgICAgIChydW5KU0MpOgorICAgICAgICAoanNj
bWFpbik6CisgICAgICAgICogcnVudGltZS9KU0FycmF5QnVmZmVyLmg6CisKIDIwMTctMDEtMjUg
IFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgY29sbGVjdE1hdGNo
aW5nRWxlbWVudHNJbkZsYXRUcmVlIHNob3VsZCBub3QgZmluZCBlbGVtZW50cyBpbnNpZGUgYW4g
dXNlciBhZ2VudCBzaGFkb3cgdHJlZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2pzYy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2pzYy5jcHAJKHJldmlzaW9u
IDIxMTEyOCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qc2MuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC05MDgsNiArOTA4LDY0IEBAIHZvaWQgRWxlbWVudDo6ZmluaXNoQ3JlYXRpb24oVk0mIHZt
LCBSb28KIAogc3RhdGljIGJvb2wgZmlsbEJ1ZmZlcldpdGhDb250ZW50c09mRmlsZShjb25zdCBT
dHJpbmcmIGZpbGVOYW1lLCBWZWN0b3I8Y2hhcj4mIGJ1ZmZlcik7CiAKK2NsYXNzIENvbW1hbmRM
aW5lOworY2xhc3MgV29ya2VyczsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KK2ludCBydW5K
U0MoQ29tbWFuZExpbmUsIGNvbnN0IEZ1bmMmKTsKKworY2xhc3MgTWVzc2FnZSA6IHB1YmxpYyBU
aHJlYWRTYWZlUmVmQ291bnRlZDxNZXNzYWdlPiB7CitwdWJsaWM6CisgICAgTWVzc2FnZShBcnJh
eUJ1ZmZlckNvbnRlbnRzJiYsIGludDMyX3QpOworICAgIH5NZXNzYWdlKCk7CisgICAgCisgICAg
QXJyYXlCdWZmZXJDb250ZW50cyYmIHJlbGVhc2VDb250ZW50cygpIHsgcmV0dXJuIFdURk1vdmUo
bV9jb250ZW50cyk7IH0KKyAgICBpbnQzMl90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRl
eDsgfQorCitwcml2YXRlOgorICAgIEFycmF5QnVmZmVyQ29udGVudHMgbV9jb250ZW50czsKKyAg
ICBpbnQzMl90IG1faW5kZXggeyAwIH07Cit9OworCitjbGFzcyBXb3JrZXIgOiBwdWJsaWMgQmFz
aWNSYXdTZW50aW5lbE5vZGU8V29ya2VyPiB7CitwdWJsaWM6CisgICAgV29ya2VyKFdvcmtlcnMm
KTsKKyAgICB+V29ya2VyKCk7CisgICAgCisgICAgdm9pZCBzZW5kKGNvbnN0IEFic3RyYWN0TG9j
a2VyJiwgUmVmUHRyPE1lc3NhZ2U+KTsKKyAgICBSZWZQdHI8TWVzc2FnZT4gcmVjZWl2ZSgpOwor
ICAgIAorICAgIHN0YXRpYyBXb3JrZXImIGN1cnJlbnQoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0
aWMgVGhyZWFkU3BlY2lmaWM8V29ya2VyKj4mIGN1cnJlbnRXb3JrZXIoKTsKKworICAgIFdvcmtl
cnMmIG1fd29ya2VyczsKKyAgICBEZXF1ZTxSZWZQdHI8TWVzc2FnZT4+IG1fbWVzc2FnZXM7Cit9
OworCitjbGFzcyBXb3JrZXJzIHsKK3B1YmxpYzoKKyAgICBXb3JrZXJzKCk7CisgICAgfldvcmtl
cnMoKTsKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgorICAgIHZvaWQgYnJvYWRj
YXN0KGNvbnN0IEZ1bmMmKTsKKyAgICAKKyAgICB2b2lkIHJlcG9ydChTdHJpbmcpOworICAgIFN0
cmluZyB0cnlHZXRSZXBvcnQoKTsKKyAgICAKKyAgICBzdGF0aWMgV29ya2VycyYgc2luZ2xldG9u
KCk7CisgICAgCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBXb3JrZXI7CisgICAgCisgICAg
TG9jayBtX2xvY2s7CisgICAgQ29uZGl0aW9uIG1fY29uZGl0aW9uOworICAgIFNlbnRpbmVsTGlu
a2VkTGlzdDxXb3JrZXIsIEJhc2ljUmF3U2VudGluZWxOb2RlPFdvcmtlcj4+IG1fd29ya2VyczsK
KyAgICBEZXF1ZTxTdHJpbmc+IG1fcmVwb3J0czsKK307CisKIHN0YXRpYyBFbmNvZGVkSlNWYWx1
ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uQ3JlYXRlUHJveHkoRXhlY1N0YXRlKik7CiBzdGF0aWMg
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkNyZWF0ZVJ1bnRpbWVBcnJheShF
eGVjU3RhdGUqKTsKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9u
Q3JlYXRlSW1wdXJlR2V0dGVyKEV4ZWNTdGF0ZSopOwpAQCAtMTAxMiw2ICsxMDcwLDE1IEBAIHN0
YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmMKIHN0YXRpYyBFbmNvZGVkSlNW
YWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uSXNSb3BlKEV4ZWNTdGF0ZSopOwogc3RhdGljIEVu
Y29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25DYWxsZXJTb3VyY2VPcmlnaW4oRXhl
Y1N0YXRlKik7CiBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkds
b2JhbE9iamVjdEZvck9iamVjdChFeGVjU3RhdGUqKTsKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQ3JlYXRlUmVhbG0oRXhlY1N0YXRlKik7CitzdGF0
aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkRvbGxhckRldGFjaEFycmF5
QnVmZmVyKEV4ZWNTdGF0ZSopOworc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
ZnVuY3Rpb25Eb2xsYXJFdmFsU2NyaXB0KEV4ZWNTdGF0ZSopOworc3RhdGljIEVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJBZ2VudFN0YXJ0KEV4ZWNTdGF0ZSopOwor
c3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJBZ2VudFJl
Y2VpdmVCcm9hZGNhc3QoRXhlY1N0YXRlKik7CitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hP
U1RfQ0FMTCBmdW5jdGlvbkRvbGxhckFnZW50UmVwb3J0KEV4ZWNTdGF0ZSopOworc3RhdGljIEVu
Y29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJBZ2VudFNsZWVwKEV4ZWNT
dGF0ZSopOworc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xs
YXJBZ2VudEJyb2FkY2FzdChFeGVjU3RhdGUqKTsKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0Nf
SE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQWdlbnRHZXRSZXBvcnQoRXhlY1N0YXRlKik7CiAKIHN0
cnVjdCBTY3JpcHQgewogICAgIGVudW0gY2xhc3MgU3RyaWN0TW9kZSB7CkBAIC0xMjY2LDEyICsx
MzMzLDQwIEBAIHByb3RlY3RlZDoKICAgICAgICAgfQogCiAgICAgICAgIHB1dERpcmVjdCh2bSwg
SWRlbnRpZmllcjo6ZnJvbVN0cmluZyhnbG9iYWxFeGVjKCksICJjb25zb2xlIiksIGpzVW5kZWZp
bmVkKCkpOworICAgICAgICAKKyAgICAgICAgU3RydWN0dXJlKiBwbGFpbk9iamVjdFN0cnVjdHVy
ZSA9IEpTRmluYWxPYmplY3Q6OmNyZWF0ZVN0cnVjdHVyZSh2bSwgdGhpcywgb2JqZWN0UHJvdG90
eXBlKCksIDApOworICAgICAgICAKKyAgICAgICAgSlNPYmplY3QqIGRvbGxhciA9IEpTRmluYWxP
YmplY3Q6OmNyZWF0ZSh2bSwgcGxhaW5PYmplY3RTdHJ1Y3R1cmUpOworICAgICAgICBwdXREaXJl
Y3Qodm0sIElkZW50aWZpZXI6OmZyb21TdHJpbmcoZ2xvYmFsRXhlYygpLCAiJCIpLCBkb2xsYXIp
OworICAgICAgICAKKyAgICAgICAgYWRkRnVuY3Rpb24odm0sIGRvbGxhciwgImNyZWF0ZVJlYWxt
IiwgZnVuY3Rpb25Eb2xsYXJDcmVhdGVSZWFsbSwgMCk7CisgICAgICAgIGFkZEZ1bmN0aW9uKHZt
LCBkb2xsYXIsICJkZXRhY2hBcnJheUJ1ZmZlciIsIGZ1bmN0aW9uRG9sbGFyRGV0YWNoQXJyYXlC
dWZmZXIsIDEpOworICAgICAgICBhZGRGdW5jdGlvbih2bSwgZG9sbGFyLCAiZXZhbFNjcmlwdCIs
IGZ1bmN0aW9uRG9sbGFyRXZhbFNjcmlwdCwgMSk7CisgICAgICAgIAorICAgICAgICBkb2xsYXIt
PnB1dERpcmVjdCh2bSwgSWRlbnRpZmllcjo6ZnJvbVN0cmluZyhnbG9iYWxFeGVjKCksICJnbG9i
YWwiKSwgdGhpcyk7CisgICAgICAgIAorICAgICAgICBKU09iamVjdCogYWdlbnQgPSBKU0ZpbmFs
T2JqZWN0OjpjcmVhdGUodm0sIHBsYWluT2JqZWN0U3RydWN0dXJlKTsKKyAgICAgICAgZG9sbGFy
LT5wdXREaXJlY3Qodm0sIElkZW50aWZpZXI6OmZyb21TdHJpbmcoZ2xvYmFsRXhlYygpLCAiYWdl
bnQiKSwgYWdlbnQpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRlc3QyNjIgSU5URVJQUkVU
SU5HLm1kIGRvY3VtZW50IHNheXMgdGhhdCBzb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUganVz
dCBpbiB0aGUgbWFpbgorICAgICAgICAvLyB0aHJlYWQgYW5kIHNvbWUgYXJlIGluIHRoZSBvdGhl
ciB0aHJlYWRzLiBXZSBqdXN0IHB1dCB0aGVtIGluIGFsbCB0aHJlYWRzLgorICAgICAgICBhZGRG
dW5jdGlvbih2bSwgYWdlbnQsICJzdGFydCIsIGZ1bmN0aW9uRG9sbGFyQWdlbnRTdGFydCwgMSk7
CisgICAgICAgIGFkZEZ1bmN0aW9uKHZtLCBhZ2VudCwgInJlY2VpdmVCcm9hZGNhc3QiLCBmdW5j
dGlvbkRvbGxhckFnZW50UmVjZWl2ZUJyb2FkY2FzdCwgMSk7CisgICAgICAgIGFkZEZ1bmN0aW9u
KHZtLCBhZ2VudCwgInJlcG9ydCIsIGZ1bmN0aW9uRG9sbGFyQWdlbnRSZXBvcnQsIDEpOworICAg
ICAgICBhZGRGdW5jdGlvbih2bSwgYWdlbnQsICJzbGVlcCIsIGZ1bmN0aW9uRG9sbGFyQWdlbnRT
bGVlcCwgMSk7CisgICAgICAgIGFkZEZ1bmN0aW9uKHZtLCBhZ2VudCwgImJyb2FkY2FzdCIsIGZ1
bmN0aW9uRG9sbGFyQWdlbnRCcm9hZGNhc3QsIDEpOworICAgICAgICBhZGRGdW5jdGlvbih2bSwg
YWdlbnQsICJnZXRSZXBvcnQiLCBmdW5jdGlvbkRvbGxhckFnZW50R2V0UmVwb3J0LCAxKTsKKyAg
ICB9CisgICAgCisgICAgdm9pZCBhZGRGdW5jdGlvbihWTSYgdm0sIEpTT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IGNoYXIqIG5hbWUsIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCB1bnNpZ25lZCBhcmd1
bWVudHMpCisgICAgeworICAgICAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBJZGVudGlmaWVy
Ojpmcm9tU3RyaW5nKCZ2bSwgbmFtZSk7CisgICAgICAgIG9iamVjdC0+cHV0RGlyZWN0KHZtLCBp
ZGVudGlmaWVyLCBKU0Z1bmN0aW9uOjpjcmVhdGUodm0sIHRoaXMsIGFyZ3VtZW50cywgaWRlbnRp
Zmllci5zdHJpbmcoKSwgZnVuY3Rpb24pKTsKICAgICB9CiAKICAgICB2b2lkIGFkZEZ1bmN0aW9u
KFZNJiB2bSwgY29uc3QgY2hhciogbmFtZSwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIHVuc2ln
bmVkIGFyZ3VtZW50cykKICAgICB7Ci0gICAgICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IElk
ZW50aWZpZXI6OmZyb21TdHJpbmcoJnZtLCBuYW1lKTsKLSAgICAgICAgcHV0RGlyZWN0KHZtLCBp
ZGVudGlmaWVyLCBKU0Z1bmN0aW9uOjpjcmVhdGUodm0sIHRoaXMsIGFyZ3VtZW50cywgaWRlbnRp
Zmllci5zdHJpbmcoKSwgZnVuY3Rpb24pKTsKKyAgICAgICAgYWRkRnVuY3Rpb24odm0sIHRoaXMs
IG5hbWUsIGZ1bmN0aW9uLCBhcmd1bWVudHMpOwogICAgIH0KICAgICAKICAgICB2b2lkIGFkZENv
bnN0cnVjdGFibGVGdW5jdGlvbihWTSYgdm0sIGNvbnN0IGNoYXIqIG5hbWUsIE5hdGl2ZUZ1bmN0
aW9uIGZ1bmN0aW9uLCB1bnNpZ25lZCBhcmd1bWVudHMpCkBAIC0yMjIxLDYgKzIzMTYsMjY1IEBA
IEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25OdW0KICAgICByZXR1cm4gSlNW
YWx1ZTo6ZW5jb2RlKG51bWJlck9mREZHQ29tcGlsZXMoZXhlYykpOwogfQogCitNZXNzYWdlOjpN
ZXNzYWdlKEFycmF5QnVmZmVyQ29udGVudHMmJiBjb250ZW50cywgaW50MzJfdCBpbmRleCkKKyAg
ICA6IG1fY29udGVudHMoV1RGTW92ZShjb250ZW50cykpCisgICAgLCBtX2luZGV4KGluZGV4KQor
eworfQorCitNZXNzYWdlOjp+TWVzc2FnZSgpCit7Cit9CisKK1dvcmtlcjo6V29ya2VyKFdvcmtl
cnMmIHdvcmtlcnMpCisgICAgOiBtX3dvcmtlcnMod29ya2VycykKK3sKKyAgICBhdXRvIGxvY2tl
ciA9IGhvbGRMb2NrKG1fd29ya2Vycy5tX2xvY2spOworICAgIG1fd29ya2Vycy5tX3dvcmtlcnMu
YXBwZW5kKHRoaXMpOworICAgIAorICAgICpjdXJyZW50V29ya2VyKCkgPSB0aGlzOworfQorCitX
b3JrZXI6On5Xb3JrZXIoKQoreworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV93b3JrZXJz
Lm1fbG9jayk7CisgICAgaWYgKGlzT25MaXN0KCkpCisgICAgICAgIHJlbW92ZSgpOworfQorCit2
b2lkIFdvcmtlcjo6c2VuZChjb25zdCBBYnN0cmFjdExvY2tlciYsIFJlZlB0cjxNZXNzYWdlPiBt
ZXNzYWdlKQoreworICAgIG1fbWVzc2FnZXMuYXBwZW5kKG1lc3NhZ2UpOworfQorCitSZWZQdHI8
TWVzc2FnZT4gV29ya2VyOjpyZWNlaXZlKCkKK3sKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2Nr
KG1fd29ya2Vycy5tX2xvY2spOworICAgIHdoaWxlIChtX21lc3NhZ2VzLmlzRW1wdHkoKSkKKyAg
ICAgICAgbV93b3JrZXJzLm1fY29uZGl0aW9uLndhaXQobV93b3JrZXJzLm1fbG9jayk7CisgICAg
cmV0dXJuIG1fbWVzc2FnZXMudGFrZUZpcnN0KCk7Cit9CisKK1dvcmtlciYgV29ya2VyOjpjdXJy
ZW50KCkKK3sKKyAgICByZXR1cm4gKipjdXJyZW50V29ya2VyKCk7Cit9CisKK1RocmVhZFNwZWNp
ZmljPFdvcmtlcio+JiBXb3JrZXI6OmN1cnJlbnRXb3JrZXIoKQoreworICAgIHN0YXRpYyBUaHJl
YWRTcGVjaWZpYzxXb3JrZXIqPiogcmVzdWx0OworICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBm
bGFnOworICAgIHN0ZDo6Y2FsbF9vbmNlKAorICAgICAgICBmbGFnLAorICAgICAgICBbXSAoKSB7
CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGhyZWFkU3BlY2lmaWM8V29ya2VyKj4oKTsKKyAg
ICAgICAgfSk7CisgICAgcmV0dXJuICpyZXN1bHQ7Cit9CisKK1dvcmtlcnM6OldvcmtlcnMoKQor
eworfQorCitXb3JrZXJzOjp+V29ya2VycygpCit7CisgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRG
T1JNKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+Cit2b2lkIFdvcmtlcnM6OmJyb2Fk
Y2FzdChjb25zdCBGdW5jJiBmdW5jKQoreworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9s
b2NrKTsKKyAgICBmb3IgKFdvcmtlciogd29ya2VyID0gbV93b3JrZXJzLmJlZ2luKCk7IHdvcmtl
ciAhPSBtX3dvcmtlcnMuZW5kKCk7IHdvcmtlciA9IHdvcmtlci0+bmV4dCgpKQorICAgICAgICBm
dW5jKGxvY2tlciwgKndvcmtlcik7CisgICAgbV9jb25kaXRpb24ubm90aWZ5QWxsKCk7Cit9CisK
K3ZvaWQgV29ya2Vyczo6cmVwb3J0KFN0cmluZyBzdHJpbmcpCit7CisgICAgYXV0byBsb2NrZXIg
PSBob2xkTG9jayhtX2xvY2spOworICAgIG1fcmVwb3J0cy5hcHBlbmQoc3RyaW5nLmlzb2xhdGVk
Q29weSgpKTsKKyAgICBtX2NvbmRpdGlvbi5ub3RpZnlBbGwoKTsKK30KKworU3RyaW5nIFdvcmtl
cnM6OnRyeUdldFJlcG9ydCgpCit7CisgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2sp
OworICAgIGlmIChtX3JlcG9ydHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CisgICAgcmV0dXJuIG1fcmVwb3J0cy50YWtlRmlyc3QoKTsKK30KKworV29ya2VycyYgV29ya2Vy
czo6c2luZ2xldG9uKCkKK3sKKyAgICBzdGF0aWMgV29ya2VycyogcmVzdWx0OworICAgIHN0YXRp
YyBzdGQ6Om9uY2VfZmxhZyBmbGFnOworICAgIHN0ZDo6Y2FsbF9vbmNlKAorICAgICAgICBmbGFn
LAorICAgICAgICBbXSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgV29ya2VycygpOworICAg
ICAgICB9KTsKKyAgICByZXR1cm4gKnJlc3VsdDsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hP
U1RfQ0FMTCBmdW5jdGlvbkRvbGxhckNyZWF0ZVJlYWxtKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAg
ICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIEdsb2JhbE9iamVjdCogcmVzdWx0ID0gR2xvYmFs
T2JqZWN0OjpjcmVhdGUodm0sIEdsb2JhbE9iamVjdDo6Y3JlYXRlU3RydWN0dXJlKHZtLCBqc051
bGwoKSksIFZlY3RvcjxTdHJpbmc+KCkpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocmVz
dWx0LT5nZXREaXJlY3Qodm0sIElkZW50aWZpZXI6OmZyb21TdHJpbmcoZXhlYywgIiQiKSkpOwor
fQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyRGV0YWNoQXJy
YXlCdWZmZXIoRXhlY1N0YXRlKiBleGVjKQoreworICAgIHJldHVybiBmdW5jdGlvblRyYW5zZmVy
QXJyYXlCdWZmZXIoZXhlYyk7Cit9CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVu
Y3Rpb25Eb2xsYXJFdmFsU2NyaXB0KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBWTSYgdm0gPSBl
eGVjLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKwor
ICAgIFN0cmluZyBzb3VyY2VDb2RlID0gZXhlYy0+YXJndW1lbnQoMCkudG9XVEZTdHJpbmcoZXhl
Yyk7CisgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgZW5jb2RlZEpTVmFsdWUoKSk7Cisg
ICAgCisgICAgR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBqc0R5bmFtaWNDYXN0PEdsb2Jh
bE9iamVjdCo+KAorICAgICAgICBleGVjLT50aGlzVmFsdWUoKS5nZXQoZXhlYywgSWRlbnRpZmll
cjo6ZnJvbVN0cmluZyhleGVjLCAiZ2xvYmFsIikpKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBUSU9O
KHNjb3BlLCBlbmNvZGVkSlNWYWx1ZSgpKTsKKyAgICBpZiAoIWdsb2JhbE9iamVjdCkKKyAgICAg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3Jl
YXRlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJFeHBlY3RlZCBnbG9iYWwgdG8gcG9pbnQgdG8g
YSBnbG9iYWwgb2JqZWN0IikpKSk7CisgICAgCisgICAgTmFrZWRQdHI8RXhjZXB0aW9uPiBldmFs
dWF0aW9uRXhjZXB0aW9uOworICAgIEpTVmFsdWUgcmVzdWx0ID0gZXZhbHVhdGUoZ2xvYmFsT2Jq
ZWN0LT5nbG9iYWxFeGVjKCksIG1ha2VTb3VyY2Uoc291cmNlQ29kZSwgZXhlYy0+Y2FsbGVyU291
cmNlT3JpZ2luKCkpLCBKU1ZhbHVlKCksIGV2YWx1YXRpb25FeGNlcHRpb24pOworICAgIGlmIChl
dmFsdWF0aW9uRXhjZXB0aW9uKQorICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwg
ZXZhbHVhdGlvbkV4Y2VwdGlvbik7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShyZXN1bHQp
OworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQWdlbnRT
dGFydChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICBh
dXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CisKKyAgICBTdHJpbmcgc291cmNl
Q29kZSA9IGV4ZWMtPmFyZ3VtZW50KDApLnRvV1RGU3RyaW5nKGV4ZWMpLmlzb2xhdGVkQ29weSgp
OworICAgIFJFVFVSTl9JRl9FWENFUFRJT04oc2NvcGUsIGVuY29kZWRKU1ZhbHVlKCkpOworICAg
IAorICAgIExvY2sgZGlkU3RhcnRMb2NrOworICAgIENvbmRpdGlvbiBkaWRTdGFydENvbmRpdGlv
bjsKKyAgICBib29sIGRpZFN0YXJ0ID0gZmFsc2U7CisgICAgCisgICAgVGhyZWFkSWRlbnRpZmll
ciB0aHJlYWQgPSBjcmVhdGVUaHJlYWQoCisgICAgICAgICJKU0MgQWdlbnQiLAorICAgICAgICBb
c291cmNlQ29kZSwgJmRpZFN0YXJ0TG9jaywgJmRpZFN0YXJ0Q29uZGl0aW9uLCAmZGlkU3RhcnRd
ICgpIHsKKyAgICAgICAgICAgIENvbW1hbmRMaW5lIGNvbW1hbmRMaW5lKDAsIG51bGxwdHIpOwor
ICAgICAgICAgICAgcnVuSlNDKAorICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLAorICAgICAg
ICAgICAgICAgIFsmXSAoVk0mIHZtLCBHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCkgeworICAg
ICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIHRocmVhZCB0aGF0IHN0YXJ0ZWQgdXMgdGhh
dCB3ZSBoYXZlIHJlZ2lzdGVyZWQgYSB3b3JrZXIuCisgICAgICAgICAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soZGlkU3RhcnRMb2Nr
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGRpZFN0YXJ0Q29uZGl0aW9uLm5vdGlmeU9uZSgpOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBhdXRv
IHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBOYWtlZFB0cjxFeGNlcHRpb24+IGV2YWx1YXRpb25FeGNlcHRp
b247CisgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlKGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhl
YygpLCBtYWtlU291cmNlKHNvdXJjZUNvZGUsIFNvdXJjZU9yaWdpbihBU0NJSUxpdGVyYWwoIndv
cmtlciIpKSksIEpTVmFsdWUoKSwgZXZhbHVhdGlvbkV4Y2VwdGlvbik7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChldmFsdWF0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICB0aHJvd0V4Y2VwdGlvbihnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgc2NvcGUsIGV2YWx1
YXRpb25FeGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICBkZXRhY2hUaHJlYWQodGhyZWFk
KTsKKyAgICAKKyAgICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soZGlkU3RhcnRM
b2NrKTsKKyAgICAgICAgd2hpbGUgKCFkaWRTdGFydCkKKyAgICAgICAgICAgIGRpZFN0YXJ0Q29u
ZGl0aW9uLndhaXQoZGlkU3RhcnRMb2NrKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEpTVmFs
dWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBmdW5jdGlvbkRvbGxhckFnZW50UmVjZWl2ZUJyb2FkY2FzdChFeGVjU3RhdGUqIGV4ZWMp
Cit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9U
SFJPV19TQ09QRSh2bSk7CisKKyAgICBKU1ZhbHVlIGNhbGxiYWNrID0gZXhlYy0+YXJndW1lbnQo
MCk7CisgICAgQ2FsbERhdGEgY2FsbERhdGE7CisgICAgQ2FsbFR5cGUgY2FsbFR5cGUgPSBnZXRD
YWxsRGF0YShjYWxsYmFjaywgY2FsbERhdGEpOworICAgIGlmIChjYWxsVHlwZSA9PSBDYWxsVHlw
ZTo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihl
eGVjLCBzY29wZSwgY3JlYXRlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJFeHBlY3RlZCBjYWxs
YmFjayIpKSkpOworICAgIAorICAgIFJlZlB0cjxNZXNzYWdlPiBtZXNzYWdlID0gV29ya2VyOjpj
dXJyZW50KCkucmVjZWl2ZSgpOworICAgIAorICAgIFJlZlB0cjxBcnJheUJ1ZmZlcj4gbmF0aXZl
QnVmZmVyID0gQXJyYXlCdWZmZXI6OmNyZWF0ZShtZXNzYWdlLT5yZWxlYXNlQ29udGVudHMoKSk7
CisgICAgSlNBcnJheUJ1ZmZlcioganNCdWZmZXIgPSBKU0FycmF5QnVmZmVyOjpjcmVhdGUodm0s
IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKS0+YXJyYXlCdWZmZXJTdHJ1Y3R1cmUobmF0aXZl
QnVmZmVyLT5zaGFyaW5nTW9kZSgpKSwgbmF0aXZlQnVmZmVyKTsKKyAgICAKKyAgICBNYXJrZWRB
cmd1bWVudEJ1ZmZlciBhcmdzOworICAgIGFyZ3MuYXBwZW5kKGpzQnVmZmVyKTsKKyAgICBhcmdz
LmFwcGVuZChqc051bWJlcihtZXNzYWdlLT5pbmRleCgpKSk7CisgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShjYWxsKGV4ZWMsIGNhbGxiYWNrLCBjYWxsVHlwZSwgY2FsbERhdGEsIGpzTnVsbCgp
LCBhcmdzKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xs
YXJBZ2VudFJlcG9ydChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0o
KTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CisKKyAgICBTdHJp
bmcgcmVwb3J0ID0gZXhlYy0+YXJndW1lbnQoMCkudG9XVEZTdHJpbmcoZXhlYyk7CisgICAgUkVU
VVJOX0lGX0VYQ0VQVElPTihzY29wZSwgZW5jb2RlZEpTVmFsdWUoKSk7CisgICAgCisgICAgV29y
a2Vyczo6c2luZ2xldG9uKCkucmVwb3J0KHJlcG9ydCk7CisgICAgCisgICAgcmV0dXJuIEpTVmFs
dWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBmdW5jdGlvbkRvbGxhckFnZW50U2xlZXAoRXhlY1N0YXRlKiBleGVjKQoreworICAgIGlm
IChleGVjLT5hcmd1bWVudENvdW50KCkgPj0gMSkKKyAgICAgICAgc2xlZXAoU2Vjb25kczo6ZnJv
bU1pbGxpc2Vjb25kcyhleGVjLT5hcmd1bWVudCgwKS50b051bWJlcihleGVjKSkpOworICAgIHJl
dHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJBZ2VudEJyb2FkY2FzdChFeGVjU3RhdGUqIGV4
ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFS
RV9USFJPV19TQ09QRSh2bSk7CisKKyAgICBKU0FycmF5QnVmZmVyKiBqc0J1ZmZlciA9IGpzRHlu
YW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlcio+KGV4ZWMtPmFyZ3VtZW50KDApKTsKKyAgICBpZiAoIWpz
QnVmZmVyIHx8ICFqc0J1ZmZlci0+aXNTaGFyZWQoKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3JlYXRlRXJyb3IoZXhlYywgQVND
SUlMaXRlcmFsKCJFeHBlY3RlZCBTaGFyZWRBcnJheUJ1ZmZlciIpKSkpOworICAgIAorICAgIGlu
dDMyX3QgaW5kZXggPSBleGVjLT5hcmd1bWVudCgxKS50b0ludDMyKGV4ZWMpOworICAgIFJFVFVS
Tl9JRl9FWENFUFRJT04oc2NvcGUsIGVuY29kZWRKU1ZhbHVlKCkpOworICAgIAorICAgIFdvcmtl
cnM6OnNpbmdsZXRvbigpLmJyb2FkY2FzdCgKKyAgICAgICAgWyZdIChjb25zdCBBYnN0cmFjdExv
Y2tlciYgbG9ja2VyLCBXb3JrZXImIHdvcmtlcikgeworICAgICAgICAgICAgQXJyYXlCdWZmZXIq
IG5hdGl2ZUJ1ZmZlciA9IGpzQnVmZmVyLT5pbXBsKCk7CisgICAgICAgICAgICBBcnJheUJ1ZmZl
ckNvbnRlbnRzIGNvbnRlbnRzOworICAgICAgICAgICAgbmF0aXZlQnVmZmVyLT50cmFuc2ZlclRv
KGNvbnRlbnRzKTsgLy8gInRyYW5zZmVyVG8iIG1lYW5zICJzaGFyZSIgaWYgdGhlIGJ1ZmZlciBp
cyBzaGFyZWQuCisgICAgICAgICAgICBSZWZQdHI8TWVzc2FnZT4gbWVzc2FnZSA9IGFkb3B0UmVm
KG5ldyBNZXNzYWdlKFdURk1vdmUoY29udGVudHMpLCBpbmRleCkpOworICAgICAgICAgICAgd29y
a2VyLnNlbmQobG9ja2VyLCBtZXNzYWdlKTsKKyAgICAgICAgfSk7CisgICAgCisgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlND
X0hPU1RfQ0FMTCBmdW5jdGlvbkRvbGxhckFnZW50R2V0UmVwb3J0KEV4ZWNTdGF0ZSogZXhlYykK
K3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworCisgICAgU3RyaW5nIHN0cmluZyA9IFdvcmtl
cnM6OnNpbmdsZXRvbigpLnRyeUdldFJlcG9ydCgpOworICAgIGlmICghc3RyaW5nKQorICAgICAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzTnVsbCgpKTsKKyAgICAKKyAgICByZXR1cm4gSlNW
YWx1ZTo6ZW5jb2RlKGpzU3RyaW5nKCZ2bSwgc3RyaW5nKSk7Cit9CisKIHRlbXBsYXRlPHR5cGVu
YW1lIFZhbHVlVHlwZT4KIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2Z1bmRhbWVu
dGFsPFZhbHVlVHlwZT46OnZhbHVlPjo6dHlwZSBhZGRPcHRpb24oVk0mLCBKU09iamVjdCosIElk
ZW50aWZpZXIsIFZhbHVlVHlwZSkgeyB9CiAKQEAgLTMyNDEsMjkgKzM1OTUsMzIgQEAgdm9pZCBD
b21tYW5kTGluZTo6cGFyc2VBcmd1bWVudHMoaW50IGFyZwogICAgICAgICBqc2NFeGl0KEVYSVRf
U1VDQ0VTUyk7CiB9CiAKLS8vIFdlIG1ha2UgdGhpcyBmdW5jdGlvbiBubyBpbmxpbmUgc28gdGhh
dCBnbG9iYWxPYmplY3Qgd29uJ3QgYmUgb24gdGhlIHN0YWNrIGlmIHdlIGRvIGEgR0MgaW4ganNj
bWFpbi4KLXN0YXRpYyBpbnQgTkVWRVJfSU5MSU5FIHJ1bkpTQyhWTSogdm0sIENvbW1hbmRMaW5l
IG9wdGlvbnMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgoraW50IHJ1bkpTQyhDb21tYW5kTGlu
ZSBvcHRpb25zLCBjb25zdCBGdW5jJiBmdW5jKQogewotICAgIEpTTG9ja0hvbGRlciBsb2NrZXIo
dm0pOworICAgIFdvcmtlciB3b3JrZXIoV29ya2Vyczo6c2luZ2xldG9uKCkpOworICAgIAorICAg
IFZNJiB2bSA9IFZNOjpjcmVhdGUoTGFyZ2VIZWFwKS5sZWFrUmVmKCk7CisgICAgSlNMb2NrSG9s
ZGVyIGxvY2tlcigmdm0pOwogCiAgICAgaW50IHJlc3VsdDsKLSAgICBpZiAob3B0aW9ucy5tX3By
b2ZpbGUgJiYgIXZtLT5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpCi0gICAgICAgIHZtLT5tX3BlckJ5
dGVjb2RlUHJvZmlsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPFByb2ZpbGVyOjpEYXRhYmFzZT4oKnZt
KTsKKyAgICBpZiAob3B0aW9ucy5tX3Byb2ZpbGUgJiYgIXZtLm1fcGVyQnl0ZWNvZGVQcm9maWxl
cikKKyAgICAgICAgdm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxQ
cm9maWxlcjo6RGF0YWJhc2U+KHZtKTsKIAotICAgIEdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
ID0gR2xvYmFsT2JqZWN0OjpjcmVhdGUoKnZtLCBHbG9iYWxPYmplY3Q6OmNyZWF0ZVN0cnVjdHVy
ZSgqdm0sIGpzTnVsbCgpKSwgb3B0aW9ucy5tX2FyZ3VtZW50cyk7CisgICAgR2xvYmFsT2JqZWN0
KiBnbG9iYWxPYmplY3QgPSBHbG9iYWxPYmplY3Q6OmNyZWF0ZSh2bSwgR2xvYmFsT2JqZWN0Ojpj
cmVhdGVTdHJ1Y3R1cmUodm0sIGpzTnVsbCgpKSwgb3B0aW9ucy5tX2FyZ3VtZW50cyk7CiAgICAg
Z2xvYmFsT2JqZWN0LT5zZXRSZW1vdGVEZWJ1Z2dpbmdFbmFibGVkKG9wdGlvbnMubV9lbmFibGVS
ZW1vdGVEZWJ1Z2dpbmcpOwotICAgIGJvb2wgc3VjY2VzcyA9IHJ1bldpdGhTY3JpcHRzKGdsb2Jh
bE9iamVjdCwgb3B0aW9ucy5tX3NjcmlwdHMsIG9wdGlvbnMubV91bmNhdWdodEV4Y2VwdGlvbk5h
bWUsIG9wdGlvbnMubV9hbHdheXNEdW1wVW5jYXVnaHRFeGNlcHRpb24sIG9wdGlvbnMubV9kdW1w
LCBvcHRpb25zLm1fbW9kdWxlKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmdW5jKHZtLCBnbG9iYWxP
YmplY3QpOwogICAgIGlmIChvcHRpb25zLm1faW50ZXJhY3RpdmUgJiYgc3VjY2VzcykKICAgICAg
ICAgcnVuSW50ZXJhY3RpdmUoZ2xvYmFsT2JqZWN0KTsKIAotICAgIHZtLT5kcmFpbk1pY3JvdGFz
a3MoKTsKKyAgICB2bS5kcmFpbk1pY3JvdGFza3MoKTsKICAgICByZXN1bHQgPSBzdWNjZXNzICYm
ICh0ZXN0MjYyQXN5bmNUZXN0ID09IHRlc3QyNjJBc3luY1Bhc3NlZCkgPyAwIDogMzsKIAogICAg
IGlmIChvcHRpb25zLm1fZXhpdENvZGUpCiAgICAgICAgIHByaW50ZigianNjIGV4aXRpbmcgJWRc
biIsIHJlc3VsdCk7CiAKICAgICBpZiAob3B0aW9ucy5tX3Byb2ZpbGUpIHsKLSAgICAgICAgaWYg
KCF2bS0+bV9wZXJCeXRlY29kZVByb2ZpbGVyLT5zYXZlKG9wdGlvbnMubV9wcm9maWxlck91dHB1
dC51dGY4KCkuZGF0YSgpKSkKKyAgICAgICAgaWYgKCF2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIt
PnNhdmUob3B0aW9ucy5tX3Byb2ZpbGVyT3V0cHV0LnV0ZjgoKS5kYXRhKCkpKQogICAgICAgICAg
ICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgc2F2ZSBwcm9maWxlciBvdXRwdXQuXG4iKTsK
ICAgICB9CiAKQEAgLTMyODgsNiArMzY0NSwyMiBAQCBzdGF0aWMgaW50IE5FVkVSX0lOTElORSBy
dW5KU0MoVk0qIHZtLCBDCiAgICAgICAgIHByaW50ZigiJTQwczogJS4zbGYgbXNcbiIsIGtleS5k
YXRhKCksIGNvbXBpbGVUaW1lU3RhdHMuZ2V0KGtleSkpOwogI2VuZGlmCiAKKyAgICBpZiAoT3B0
aW9uczo6Z2NBdEVuZCgpKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gaG9sZCB0aGUgQVBJIGxv
Y2sgdG8gZG8gYSBHQy4KKyAgICAgICAgSlNMb2NrSG9sZGVyIGxvY2tlcigmdm0pOworICAgICAg
ICB2bS5oZWFwLmNvbGxlY3RBbGxHYXJiYWdlKCk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMu
bV9kdW1wU2FtcGxpbmdQcm9maWxlckRhdGEpIHsKKyNpZiBFTkFCTEUoU0FNUExJTkdfUFJPRklM
RVIpCisgICAgICAgIEpTTG9ja0hvbGRlciBsb2NrZXIoJnZtKTsKKyAgICAgICAgdm0uc2FtcGxp
bmdQcm9maWxlcigpLT5yZXBvcnRUb3BGdW5jdGlvbnMoKTsKKyAgICAgICAgdm0uc2FtcGxpbmdQ
cm9maWxlcigpLT5yZXBvcnRUb3BCeXRlY29kZXMoKTsKKyNlbHNlCisgICAgICAgIGRhdGFMb2co
IlNhbXBsaW5nIHByb2ZpbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoaXMgcGxhdGZvcm1cbiIpOwor
I2VuZGlmCisgICAgfQorCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzMwNSwyNSArMzY3
OCwxMiBAQCBpbnQganNjbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiAgICAgSlNDOjppbml0
aWFsaXplVGhyZWFkaW5nKCk7CiAgICAgc3RhcnRUaW1lb3V0VGhyZWFkSWZOZWVkZWQoKTsKIAot
ICAgIFZNKiB2bSA9ICZWTTo6Y3JlYXRlKExhcmdlSGVhcCkubGVha1JlZigpOwogICAgIGludCBy
ZXN1bHQ7Ci0gICAgcmVzdWx0ID0gcnVuSlNDKHZtLCBvcHRpb25zKTsKLQotICAgIGlmIChPcHRp
b25zOjpnY0F0RW5kKCkpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBob2xkIHRoZSBBUEkgbG9j
ayB0byBkbyBhIEdDLgotICAgICAgICBKU0xvY2tIb2xkZXIgbG9ja2VyKHZtKTsKLSAgICAgICAg
dm0tPmhlYXAuY29sbGVjdEFsbEdhcmJhZ2UoKTsKLSAgICB9Ci0KLSAgICBpZiAob3B0aW9ucy5t
X2R1bXBTYW1wbGluZ1Byb2ZpbGVyRGF0YSkgewotI2lmIEVOQUJMRShTQU1QTElOR19QUk9GSUxF
UikKLSAgICAgICAgSlNMb2NrSG9sZGVyIGxvY2tlcih2bSk7Ci0gICAgICAgIHZtLT5zYW1wbGlu
Z1Byb2ZpbGVyKCktPnJlcG9ydFRvcEZ1bmN0aW9ucygpOwotICAgICAgICB2bS0+c2FtcGxpbmdQ
cm9maWxlcigpLT5yZXBvcnRUb3BCeXRlY29kZXMoKTsKLSNlbHNlCi0gICAgICAgIGRhdGFMb2co
IlNhbXBsaW5nIHByb2ZpbGVyIGlzIG5vdCBlbmFibGVkIG9uIHRoaXMgcGxhdGZvcm1cbiIpOwot
I2VuZGlmCi0gICAgfQorICAgIHJlc3VsdCA9IHJ1bkpTQygKKyAgICAgICAgb3B0aW9ucywKKyAg
ICAgICAgWyZdIChWTSYsIEdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KSB7CisgICAgICAgICAg
ICByZXR1cm4gcnVuV2l0aFNjcmlwdHMoZ2xvYmFsT2JqZWN0LCBvcHRpb25zLm1fc2NyaXB0cywg
b3B0aW9ucy5tX3VuY2F1Z2h0RXhjZXB0aW9uTmFtZSwgb3B0aW9ucy5tX2Fsd2F5c0R1bXBVbmNh
dWdodEV4Y2VwdGlvbiwgb3B0aW9ucy5tX2R1bXAsIG9wdGlvbnMubV9tb2R1bGUpOworICAgICAg
ICB9KTsKIAogICAgIHByaW50U3VwZXJTYW1wbGVyU3RhdGUoKTsKIApJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheUJ1ZmZlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQXJyYXlCdWZmZXIuaAkocmV2aXNpb24gMjExMTI4
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheUJ1ZmZlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Nyw3ICs0Nyw3IEBAIHB1YmxpYzoKICAgICAKICAgICBzdGF0aWMgU3Ry
dWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUgcHJv
dG90eXBlKTsKIAotICAgIGJvb2wgaXNTaGFyZWQoKSBjb25zdDsKKyAgICBKU19FWFBPUlRfUFJJ
VkFURSBib29sIGlzU2hhcmVkKCkgY29uc3Q7CiAgICAgQXJyYXlCdWZmZXJTaGFyaW5nTW9kZSBz
aGFyaW5nTW9kZSgpIGNvbnN0OwogICAgIAogICAgIERFQ0xBUkVfRVhQT1JUX0lORk87Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>299758</attachid>
            <date>2017-01-25 16:06:31 -0800</date>
            <delta_ts>2017-01-25 16:50:23 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>28634</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMTExNzUpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE5IEBACisyMDE3LTAxLTI1ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5j
b20+CisKKyAgICAgICAganNjLmNwcCBzaG91bGQgaGF2ZSB0aGUgJC5hZ2VudCBzdHVmZiBmb3Ig
dGVzdGluZyBTQUIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE2NzQzMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAg
ICAKKyAgICAgICAgQWRkIGEgdmVyeSBiYXNpYyB0ZXN0IG9mIEF0b21pY3MgdXNpbmcgJC5hZ2Vu
dC4gVGhpcyBpcyBiYXNlZCBvbgorICAgICAgICBMYXlvdXRUZXN0cy93b3JrZXJzL3NhYi9zaW1w
bGUuaHRtbC4KKworICAgICAgICAqIHN0cmVzcy9sYXJzLXNhYi13b3JrZXJzLmpzOiBBZGRlZC4K
KyAgICAgICAgKHN0YXJ0V29ya2VyKToKKyAgICAgICAgKHJlc291cmNlcyk6CisgICAgICAgICh3
YWtlKToKKyAgICAgICAgKGVsc2UpOgorCiAyMDE3LTAxLTI0ICBGaWxpcCBQaXpsbyAgPGZwaXps
b0BhcHBsZS5jb20+CiAKICAgICAgICAgQXRvbWljcy5zdG9yZSBzaG91bGQgcmV0dXJuIHRoZSBp
bnQtY29udmVydGVkIHZhbHVlIGFjY29yZGluZyB0byB0b0ludGVnZXIKSW5kZXg6IEpTVGVzdHMv
c3RyZXNzL2xhcnMtc2FiLXdvcmtlcnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy9zdHJlc3Mv
bGFycy1zYWItd29ya2Vycy5qcwkobm9uZXhpc3RlbnQpCisrKyBKU1Rlc3RzL3N0cmVzcy9sYXJz
LXNhYi13b3JrZXJzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI3IEBACisvL0AgZGVm
YXVsdFJ1bk5vaXN5VGVzdAorCit2YXIgc2FiID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDEwMCAq
IDQpOworCit2YXIgbWVtb3J5ID0gbmV3IEludDMyQXJyYXkoc2FiKTsKKwordmFyIG51bVdvcmtl
cnMgPSAwOworZnVuY3Rpb24gc3RhcnRXb3JrZXIoY29kZSkKK3sKKyAgICBwcmludCgiU3RhcnRp
bmcgd29ya2VyISIpOworICAgIAorICAgIG51bVdvcmtlcnMrKzsKKyAgICAkLmFnZW50LnN0YXJ0
KGNvZGUpOworfQorCityZXNvdXJjZXMgPSBgCitmdW5jdGlvbiB3YWl0KG1lbW9yeSwgaW5kZXgs
IHdhaXRDb25kaXRpb24sIHdha2VDb25kaXRpb24pCit7CisgICAgd2hpbGUgKG1lbW9yeVtpbmRl
eF0gPT0gd2FpdENvbmRpdGlvbikgeworICAgICAgICB2YXIgcmVzdWx0ID0gQXRvbWljcy53YWl0
KG1lbW9yeSwgaW5kZXgsIHdhaXRDb25kaXRpb24pOworICAgICAgICBzd2l0Y2ggKHJlc3VsdCkg
eworICAgICAgICBjYXNlICJub3QtZXF1YWwiOgorICAgICAgICBjYXNlICJvayI6CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICQuYWdlbnQucmVwb3J0
KCJFcnJvcjogYmFkIHJlc3VsdCBmcm9tIHdhaXQ6ICIgKyByZXN1bHQpOworICAgICAgICAgICAg
JC5hZ2VudC5yZXBvcnQoImVycm9yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICB2YXIgdmFsdWUgPSBtZW1vcnlbaW5kZXhdOworICAgICAgICBpZiAodmFsdWUgIT0g
d2FrZUNvbmRpdGlvbikgeworICAgICAgICAgICAgJC5hZ2VudC5yZXBvcnQoIkVycm9yOiB3YWl0
IHJldHVybmVkIG5vdC1lcXVhbCBidXQgdGhlIG1lbW9yeSBoYXMgYSBiYWQgdmFsdWU6ICIgKyB2
YWx1ZSk7CisgICAgICAgICAgICAkLmFnZW50LnJlcG9ydCgiZXJyb3IiKTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICB2YXIgdmFsdWUgPSBtZW1vcnlbaW5kZXhdOworICAgIGlmICh2YWx1ZSAhPSB3
YWtlQ29uZGl0aW9uKSB7CisgICAgICAgICQuYWdlbnQucmVwb3J0KCJFcnJvcjogZG9uZSB3YWl0
aW5nIGJ1dCB0aGUgbWVtb3J5IGhhcyBhIGJhZCB2YWx1ZTogIiArIHZhbHVlKTsKKyAgICAgICAg
JC5hZ2VudC5yZXBvcnQoImVycm9yIik7CisgICAgfQorfQorCitmdW5jdGlvbiB3YWtlKG1lbW9y
eSwgaW5kZXgpCit7CisgICAgdmFyIHJlc3VsdCA9IEF0b21pY3Mud2FrZShtZW1vcnksIGluZGV4
LCAxKTsKKyAgICBpZiAocmVzdWx0ICE9IDAgJiYgcmVzdWx0ICE9IDEpIHsKKyAgICAgICAgJC5h
Z2VudC5yZXBvcnQoIkVycm9yOiBiYWQgcmVzdWx0IGZyb20gd2FrZTogIiArIHJlc3VsdCk7Cisg
ICAgICAgICQuYWdlbnQucmVwb3J0KCJlcnJvciIpOworICAgIH0KK30KK2A7CisKK3N0YXJ0V29y
a2VyKAorICAgIHJlc291cmNlcyArIGAKKyAgICAkLmFnZW50LnJlY2VpdmVCcm9hZGNhc3Qoc2Fi
ID0+IHsKKyAgICAgICAgdmFyIG1lbW9yeSA9IG5ldyBJbnQzMkFycmF5KHNhYik7CisgICAgICAg
IHZhciBkaWRTdGFydElkeCA9IDA7CisgICAgICAgIHZhciBzaG91bGRHb0lkeCA9IDE7CisgICAg
ICAgIHZhciBkaWRFbmRJZHggPSAyOworICAgICAgICAKKyAgICAgICAgJC5hZ2VudC5yZXBvcnQo
IjE6IFN0YXJ0ZWQhIik7CisgICAgICAgICQuYWdlbnQucmVwb3J0KCIxOiBNZW1vcnk6ICIgKyBt
ZW1vcnkpOworICAgICAgICAKKyAgICAgICAgd2FpdChtZW1vcnksIGRpZFN0YXJ0SWR4LCAwLCAx
KTsKKyAgICAgICAgCisgICAgICAgICQuYWdlbnQucmVwb3J0KCIxOiBJdCBzdGFydGVkISIpOwor
ICAgICAgICAKKyAgICAgICAgbWVtb3J5W3Nob3VsZEdvSWR4XSA9IDE7CisgICAgICAgIHdha2Uo
bWVtb3J5LCBzaG91bGRHb0lkeCk7CisgICAgICAgIAorICAgICAgICB3YWl0KG1lbW9yeSwgZGlk
RW5kSWR4LCAwLCAxKTsKKyAgICAgICAgCisgICAgICAgICQuYWdlbnQucmVwb3J0KCIxOiBBbGwg
ZG9uZSEiKTsKKyAgICAgICAgJC5hZ2VudC5yZXBvcnQoIjE6IE1lbW9yeTogIiArIG1lbW9yeSk7
CisgICAgICAgICQuYWdlbnQucmVwb3J0KCJkb25lIik7CisgICAgfSk7CisgICAgYCk7CisKK3N0
YXJ0V29ya2VyKAorICAgIHJlc291cmNlcyArIGAKKyAgICAkLmFnZW50LnJlY2VpdmVCcm9hZGNh
c3Qoc2FiID0+IHsKKyAgICAgICAgdmFyIG1lbW9yeSA9IG5ldyBJbnQzMkFycmF5KHNhYik7Cisg
ICAgICAgIHZhciBkaWRTdGFydElkeCA9IDA7CisgICAgICAgIHZhciBzaG91bGRHb0lkeCA9IDE7
CisgICAgICAgIHZhciBkaWRFbmRJZHggPSAyOworICAgICAgICAKKyAgICAgICAgJC5hZ2VudC5y
ZXBvcnQoIjI6IFN0YXJ0ZWQhIik7CisgICAgICAgICQuYWdlbnQucmVwb3J0KCIyOiBNZW1vcnk6
ICIgKyBtZW1vcnkpOworICAgICAgICAKKyAgICAgICAgQXRvbWljcy5zdG9yZShtZW1vcnksIGRp
ZFN0YXJ0SWR4LCAxKTsKKyAgICAgICAgd2FrZShtZW1vcnksIGRpZFN0YXJ0SWR4KTsKKyAgICAg
ICAgCisgICAgICAgIHdhaXQobWVtb3J5LCBzaG91bGRHb0lkeCwgMCwgMSk7CisgICAgICAgIAor
ICAgICAgICBBdG9taWNzLnN0b3JlKG1lbW9yeSwgZGlkRW5kSWR4LCAxKTsKKyAgICAgICAgd2Fr
ZShtZW1vcnksIGRpZEVuZElkeCwgMSk7CisgICAgICAgIAorICAgICAgICAkLmFnZW50LnJlcG9y
dCgiMjogTWVtb3J5OiAiICsgbWVtb3J5KTsKKyAgICAgICAgJC5hZ2VudC5yZXBvcnQoImRvbmUi
KTsKKyAgICB9KTsKKyAgICBgKTsKKworJC5hZ2VudC5icm9hZGNhc3Qoc2FiKTsKKworZm9yICg7
OykgeworICAgIHZhciByZXBvcnQgPSB3YWl0Rm9yUmVwb3J0KCk7CisgICAgaWYgKHJlcG9ydCA9
PSAiZG9uZSIpIHsKKyAgICAgICAgaWYgKCEtLW51bVdvcmtlcnMpIHsKKyAgICAgICAgICAgIHBy
aW50KCJBbGwgd29ya2VycyBkb25lISIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgaWYgKHJlcG9ydCA9PSAiZXJyb3IiKSB7CisgICAgICAgIHByaW50KCJUZXN0
IGZhaWxlZCEiKTsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUZXN0IGZhaWxlZC4iKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgcHJpbnQoInJlcG9ydDogIiArIHJlcG9ydCk7Cit9CisKK2ZvciAo
dmFyIGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgaWYgKG1lbW9yeVtpXSAhPSAxKQorICAgICAg
ICB0aHJvdyAiRXJyb3I6IEJhZCB2YWx1ZSBhdCBtZW1vcnlbIiArIGkgKyAiXTogIiArIG1lbW9y
eVtpXTsKK30KK2ZvciAodmFyIGkgPSAzOyBpIDwgbWVtb3J5Lmxlbmd0aDsgKytpKSB7CisgICAg
aWYgKG1lbW9yeVtpXSAhPSAwKQorICAgICAgICB0aHJvdyAiRXJyb3I6IEJhZCB2YWx1ZSBhdCBt
ZW1vcnlbIiArIGkgKyAiXTogIiArIG1lbW9yeVtpXTsKK30KK3ByaW50KCJUZXN0IHBhc3NlZCEi
KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjExMTYyKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ5
IEBACisyMDE3LTAxLTI1ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAg
ICAganNjLmNwcCBzaG91bGQgaGF2ZSB0aGUgJC5hZ2VudCBzdHVmZiBmb3IgdGVzdGluZyBTQUIK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NzQzMQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAgICAg
VGhpcyBhZGRzIHNvbWUgc3R1ZmYgdGhhdCB0aGUgU0FCIGJyYW5jaCBvZiB0ZXN0MjYyIG5lZWRz
LiBOb25lIG9mIHRoaXMgaXMgZXhwb3NlZCBleGNlcHQgZm9yIG91cgorICAgICAgICBvd24gdGVz
dHMgYW5kIHRoZSBTQUIgYnJhbmNoIG9mIHRlc3QyNjIuCisKKyAgICAgICAgKiBqc2MuY3BwOgor
ICAgICAgICAoTWVzc2FnZTo6cmVsZWFzZUNvbnRlbnRzKToKKyAgICAgICAgKE1lc3NhZ2U6Omlu
ZGV4KToKKyAgICAgICAgKEdsb2JhbE9iamVjdDo6ZmluaXNoQ3JlYXRpb24pOgorICAgICAgICAo
R2xvYmFsT2JqZWN0OjphZGRGdW5jdGlvbik6CisgICAgICAgIChNZXNzYWdlOjpNZXNzYWdlKToK
KyAgICAgICAgKE1lc3NhZ2U6On5NZXNzYWdlKToKKyAgICAgICAgKFdvcmtlcjo6V29ya2VyKToK
KyAgICAgICAgKFdvcmtlcjo6fldvcmtlcik6CisgICAgICAgIChXb3JrZXI6OnNlbmQpOgorICAg
ICAgICAoV29ya2VyOjpyZWNlaXZlKToKKyAgICAgICAgKFdvcmtlcjo6Y3VycmVudCk6CisgICAg
ICAgIChXb3JrZXI6OmN1cnJlbnRXb3JrZXIpOgorICAgICAgICAoV29ya2Vyczo6V29ya2Vycyk6
CisgICAgICAgIChXb3JrZXJzOjp+V29ya2Vycyk6CisgICAgICAgIChXb3JrZXJzOjpicm9hZGNh
c3QpOgorICAgICAgICAoV29ya2Vyczo6cmVwb3J0KToKKyAgICAgICAgKFdvcmtlcnM6OnRyeUdl
dFJlcG9ydCk6CisgICAgICAgIChXb3JrZXJzOjpnZXRSZXBvcnQpOgorICAgICAgICAoV29ya2Vy
czo6c2luZ2xldG9uKToKKyAgICAgICAgKGZ1bmN0aW9uRG9sbGFyQ3JlYXRlUmVhbG0pOgorICAg
ICAgICAoZnVuY3Rpb25Eb2xsYXJEZXRhY2hBcnJheUJ1ZmZlcik6CisgICAgICAgIChmdW5jdGlv
bkRvbGxhckV2YWxTY3JpcHQpOgorICAgICAgICAoZnVuY3Rpb25Eb2xsYXJBZ2VudFN0YXJ0KToK
KyAgICAgICAgKGZ1bmN0aW9uRG9sbGFyQWdlbnRSZWNlaXZlQnJvYWRjYXN0KToKKyAgICAgICAg
KGZ1bmN0aW9uRG9sbGFyQWdlbnRSZXBvcnQpOgorICAgICAgICAoZnVuY3Rpb25Eb2xsYXJBZ2Vu
dFNsZWVwKToKKyAgICAgICAgKGZ1bmN0aW9uRG9sbGFyQWdlbnRCcm9hZGNhc3QpOgorICAgICAg
ICAoZnVuY3Rpb25Eb2xsYXJBZ2VudEdldFJlcG9ydCk6CisgICAgICAgIChmdW5jdGlvbldhaXRG
b3JSZXBvcnQpOgorICAgICAgICAoY2hlY2tFeGNlcHRpb24pOgorICAgICAgICAocnVuV2l0aFNj
cmlwdHMpOgorICAgICAgICAocnVuSlNDKToKKyAgICAgICAgKGpzY21haW4pOgorICAgICAgICAq
IHJ1bnRpbWUvSlNBcnJheUJ1ZmZlci5oOgorCiAyMDE3LTAxLTI1ICBSeW9zdWtlIE5pd2EgIDxy
bml3YUB3ZWJraXQub3JnPgogCiAgICAgICAgIGNvbGxlY3RNYXRjaGluZ0VsZW1lbnRzSW5GbGF0
VHJlZSBzaG91bGQgbm90IGZpbmQgZWxlbWVudHMgaW5zaWRlIGFuIHVzZXIgYWdlbnQgc2hhZG93
IHRyZWUKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qc2MuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qc2MuY3BwCShyZXZpc2lvbiAyMTExMjgpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvanNjLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMsNyBA
QAogI2luY2x1ZGUgIlBhcnNlckVycm9yLmgiCiAjaW5jbHVkZSAiUHJvZmlsZXJEYXRhYmFzZS5o
IgogI2luY2x1ZGUgIlByb3RvQ2FsbEZyYW1lLmgiCisjaW5jbHVkZSAiUmVsZWFzZUhlYXBBY2Nl
c3NTY29wZS5oIgogI2luY2x1ZGUgIlNhbXBsaW5nUHJvZmlsZXIuaCIKICNpbmNsdWRlICJTaGFk
b3dDaGlja2VuLmgiCiAjaW5jbHVkZSAiU3RhY2tWaXNpdG9yLmgiCkBAIC05MDgsNiArOTA5LDY3
IEBAIHZvaWQgRWxlbWVudDo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBSb28KIAogc3RhdGljIGJv
b2wgZmlsbEJ1ZmZlcldpdGhDb250ZW50c09mRmlsZShjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBW
ZWN0b3I8Y2hhcj4mIGJ1ZmZlcik7CiAKK2NsYXNzIENvbW1hbmRMaW5lOworY2xhc3MgR2xvYmFs
T2JqZWN0OworY2xhc3MgV29ya2VyczsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KK2ludCBy
dW5KU0MoQ29tbWFuZExpbmUsIGNvbnN0IEZ1bmMmKTsKK3N0YXRpYyB2b2lkIGNoZWNrRXhjZXB0
aW9uKEdsb2JhbE9iamVjdCosIGJvb2wgaXNMYXN0RmlsZSwgYm9vbCBoYXNFeGNlcHRpb24sIEpT
VmFsdWUsIGNvbnN0IFN0cmluZyYgdW5jYXVnaHRFeGNlcHRpb25OYW1lLCBib29sIGFsd2F5c0R1
bXBVbmNhdWdodEV4Y2VwdGlvbiwgYm9vbCBkdW1wLCBib29sJiBzdWNjZXNzKTsKKworY2xhc3Mg
TWVzc2FnZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxNZXNzYWdlPiB7CitwdWJsaWM6
CisgICAgTWVzc2FnZShBcnJheUJ1ZmZlckNvbnRlbnRzJiYsIGludDMyX3QpOworICAgIH5NZXNz
YWdlKCk7CisgICAgCisgICAgQXJyYXlCdWZmZXJDb250ZW50cyYmIHJlbGVhc2VDb250ZW50cygp
IHsgcmV0dXJuIFdURk1vdmUobV9jb250ZW50cyk7IH0KKyAgICBpbnQzMl90IGluZGV4KCkgY29u
c3QgeyByZXR1cm4gbV9pbmRleDsgfQorCitwcml2YXRlOgorICAgIEFycmF5QnVmZmVyQ29udGVu
dHMgbV9jb250ZW50czsKKyAgICBpbnQzMl90IG1faW5kZXggeyAwIH07Cit9OworCitjbGFzcyBX
b3JrZXIgOiBwdWJsaWMgQmFzaWNSYXdTZW50aW5lbE5vZGU8V29ya2VyPiB7CitwdWJsaWM6Cisg
ICAgV29ya2VyKFdvcmtlcnMmKTsKKyAgICB+V29ya2VyKCk7CisgICAgCisgICAgdm9pZCBzZW5k
KGNvbnN0IEFic3RyYWN0TG9ja2VyJiwgUmVmUHRyPE1lc3NhZ2U+KTsKKyAgICBSZWZQdHI8TWVz
c2FnZT4gcmVjZWl2ZSgpOworICAgIAorICAgIHN0YXRpYyBXb3JrZXImIGN1cnJlbnQoKTsKKwor
cHJpdmF0ZToKKyAgICBzdGF0aWMgVGhyZWFkU3BlY2lmaWM8V29ya2VyKj4mIGN1cnJlbnRXb3Jr
ZXIoKTsKKworICAgIFdvcmtlcnMmIG1fd29ya2VyczsKKyAgICBEZXF1ZTxSZWZQdHI8TWVzc2Fn
ZT4+IG1fbWVzc2FnZXM7Cit9OworCitjbGFzcyBXb3JrZXJzIHsKK3B1YmxpYzoKKyAgICBXb3Jr
ZXJzKCk7CisgICAgfldvcmtlcnMoKTsKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
PgorICAgIHZvaWQgYnJvYWRjYXN0KGNvbnN0IEZ1bmMmKTsKKyAgICAKKyAgICB2b2lkIHJlcG9y
dChTdHJpbmcpOworICAgIFN0cmluZyB0cnlHZXRSZXBvcnQoKTsKKyAgICBTdHJpbmcgZ2V0UmVw
b3J0KCk7CisgICAgCisgICAgc3RhdGljIFdvcmtlcnMmIHNpbmdsZXRvbigpOworICAgIAorcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV29ya2VyOworICAgIAorICAgIExvY2sgbV9sb2NrOwor
ICAgIENvbmRpdGlvbiBtX2NvbmRpdGlvbjsKKyAgICBTZW50aW5lbExpbmtlZExpc3Q8V29ya2Vy
LCBCYXNpY1Jhd1NlbnRpbmVsTm9kZTxXb3JrZXI+PiBtX3dvcmtlcnM7CisgICAgRGVxdWU8U3Ry
aW5nPiBtX3JlcG9ydHM7Cit9OworCiBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FM
TCBmdW5jdGlvbkNyZWF0ZVByb3h5KEV4ZWNTdGF0ZSopOwogc3RhdGljIEVuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25DcmVhdGVSdW50aW1lQXJyYXkoRXhlY1N0YXRlKik7CiBz
dGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkNyZWF0ZUltcHVyZUdl
dHRlcihFeGVjU3RhdGUqKTsKQEAgLTEwMTIsNiArMTA3NCwxNiBAQCBzdGF0aWMgRW5jb2RlZEpT
VmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jCiBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBmdW5jdGlvbklzUm9wZShFeGVjU3RhdGUqKTsKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIGZ1bmN0aW9uQ2FsbGVyU291cmNlT3JpZ2luKEV4ZWNTdGF0ZSopOwogc3Rh
dGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25HbG9iYWxPYmplY3RGb3JP
YmplY3QoRXhlY1N0YXRlKik7CitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBm
dW5jdGlvbkRvbGxhckNyZWF0ZVJlYWxtKEV4ZWNTdGF0ZSopOworc3RhdGljIEVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJEZXRhY2hBcnJheUJ1ZmZlcihFeGVjU3Rh
dGUqKTsKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFy
RXZhbFNjcmlwdChFeGVjU3RhdGUqKTsKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIGZ1bmN0aW9uRG9sbGFyQWdlbnRTdGFydChFeGVjU3RhdGUqKTsKK3N0YXRpYyBFbmNvZGVk
SlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQWdlbnRSZWNlaXZlQnJvYWRjYXN0
KEV4ZWNTdGF0ZSopOworc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rp
b25Eb2xsYXJBZ2VudFJlcG9ydChFeGVjU3RhdGUqKTsKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQWdlbnRTbGVlcChFeGVjU3RhdGUqKTsKK3N0YXRp
YyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQWdlbnRCcm9hZGNh
c3QoRXhlY1N0YXRlKik7CitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5j
dGlvbkRvbGxhckFnZW50R2V0UmVwb3J0KEV4ZWNTdGF0ZSopOworc3RhdGljIEVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25XYWl0Rm9yUmVwb3J0KEV4ZWNTdGF0ZSopOwogCiBz
dHJ1Y3QgU2NyaXB0IHsKICAgICBlbnVtIGNsYXNzIFN0cmljdE1vZGUgewpAQCAtMTI2NiwxMiAr
MTMzOCw0MiBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIH0KIAogICAgICAgICBwdXREaXJlY3Qodm0s
IElkZW50aWZpZXI6OmZyb21TdHJpbmcoZ2xvYmFsRXhlYygpLCAiY29uc29sZSIpLCBqc1VuZGVm
aW5lZCgpKTsKKyAgICAgICAgCisgICAgICAgIFN0cnVjdHVyZSogcGxhaW5PYmplY3RTdHJ1Y3R1
cmUgPSBKU0ZpbmFsT2JqZWN0OjpjcmVhdGVTdHJ1Y3R1cmUodm0sIHRoaXMsIG9iamVjdFByb3Rv
dHlwZSgpLCAwKTsKKyAgICAgICAgCisgICAgICAgIEpTT2JqZWN0KiBkb2xsYXIgPSBKU0ZpbmFs
T2JqZWN0OjpjcmVhdGUodm0sIHBsYWluT2JqZWN0U3RydWN0dXJlKTsKKyAgICAgICAgcHV0RGly
ZWN0KHZtLCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKGdsb2JhbEV4ZWMoKSwgIiQiKSwgZG9sbGFy
KTsKKyAgICAgICAgCisgICAgICAgIGFkZEZ1bmN0aW9uKHZtLCBkb2xsYXIsICJjcmVhdGVSZWFs
bSIsIGZ1bmN0aW9uRG9sbGFyQ3JlYXRlUmVhbG0sIDApOworICAgICAgICBhZGRGdW5jdGlvbih2
bSwgZG9sbGFyLCAiZGV0YWNoQXJyYXlCdWZmZXIiLCBmdW5jdGlvbkRvbGxhckRldGFjaEFycmF5
QnVmZmVyLCAxKTsKKyAgICAgICAgYWRkRnVuY3Rpb24odm0sIGRvbGxhciwgImV2YWxTY3JpcHQi
LCBmdW5jdGlvbkRvbGxhckV2YWxTY3JpcHQsIDEpOworICAgICAgICAKKyAgICAgICAgZG9sbGFy
LT5wdXREaXJlY3Qodm0sIElkZW50aWZpZXI6OmZyb21TdHJpbmcoZ2xvYmFsRXhlYygpLCAiZ2xv
YmFsIiksIHRoaXMpOworICAgICAgICAKKyAgICAgICAgSlNPYmplY3QqIGFnZW50ID0gSlNGaW5h
bE9iamVjdDo6Y3JlYXRlKHZtLCBwbGFpbk9iamVjdFN0cnVjdHVyZSk7CisgICAgICAgIGRvbGxh
ci0+cHV0RGlyZWN0KHZtLCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKGdsb2JhbEV4ZWMoKSwgImFn
ZW50IiksIGFnZW50KTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSB0ZXN0MjYyIElOVEVSUFJF
VElORy5tZCBkb2N1bWVudCBzYXlzIHRoYXQgc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGp1
c3QgaW4gdGhlIG1haW4KKyAgICAgICAgLy8gdGhyZWFkIGFuZCBzb21lIGFyZSBpbiB0aGUgb3Ro
ZXIgdGhyZWFkcy4gV2UganVzdCBwdXQgdGhlbSBpbiBhbGwgdGhyZWFkcy4KKyAgICAgICAgYWRk
RnVuY3Rpb24odm0sIGFnZW50LCAic3RhcnQiLCBmdW5jdGlvbkRvbGxhckFnZW50U3RhcnQsIDEp
OworICAgICAgICBhZGRGdW5jdGlvbih2bSwgYWdlbnQsICJyZWNlaXZlQnJvYWRjYXN0IiwgZnVu
Y3Rpb25Eb2xsYXJBZ2VudFJlY2VpdmVCcm9hZGNhc3QsIDEpOworICAgICAgICBhZGRGdW5jdGlv
bih2bSwgYWdlbnQsICJyZXBvcnQiLCBmdW5jdGlvbkRvbGxhckFnZW50UmVwb3J0LCAxKTsKKyAg
ICAgICAgYWRkRnVuY3Rpb24odm0sIGFnZW50LCAic2xlZXAiLCBmdW5jdGlvbkRvbGxhckFnZW50
U2xlZXAsIDEpOworICAgICAgICBhZGRGdW5jdGlvbih2bSwgYWdlbnQsICJicm9hZGNhc3QiLCBm
dW5jdGlvbkRvbGxhckFnZW50QnJvYWRjYXN0LCAxKTsKKyAgICAgICAgYWRkRnVuY3Rpb24odm0s
IGFnZW50LCAiZ2V0UmVwb3J0IiwgZnVuY3Rpb25Eb2xsYXJBZ2VudEdldFJlcG9ydCwgMCk7Cisg
ICAgICAgIAorICAgICAgICBhZGRGdW5jdGlvbih2bSwgIndhaXRGb3JSZXBvcnQiLCBmdW5jdGlv
bldhaXRGb3JSZXBvcnQsIDApOworICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEZ1bmN0aW9uKFZN
JiB2bSwgSlNPYmplY3QqIG9iamVjdCwgY29uc3QgY2hhciogbmFtZSwgTmF0aXZlRnVuY3Rpb24g
ZnVuY3Rpb24sIHVuc2lnbmVkIGFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIElkZW50aWZpZXIg
aWRlbnRpZmllciA9IElkZW50aWZpZXI6OmZyb21TdHJpbmcoJnZtLCBuYW1lKTsKKyAgICAgICAg
b2JqZWN0LT5wdXREaXJlY3Qodm0sIGlkZW50aWZpZXIsIEpTRnVuY3Rpb246OmNyZWF0ZSh2bSwg
dGhpcywgYXJndW1lbnRzLCBpZGVudGlmaWVyLnN0cmluZygpLCBmdW5jdGlvbikpOwogICAgIH0K
IAogICAgIHZvaWQgYWRkRnVuY3Rpb24oVk0mIHZtLCBjb25zdCBjaGFyKiBuYW1lLCBOYXRpdmVG
dW5jdGlvbiBmdW5jdGlvbiwgdW5zaWduZWQgYXJndW1lbnRzKQogICAgIHsKLSAgICAgICAgSWRl
bnRpZmllciBpZGVudGlmaWVyID0gSWRlbnRpZmllcjo6ZnJvbVN0cmluZygmdm0sIG5hbWUpOwot
ICAgICAgICBwdXREaXJlY3Qodm0sIGlkZW50aWZpZXIsIEpTRnVuY3Rpb246OmNyZWF0ZSh2bSwg
dGhpcywgYXJndW1lbnRzLCBpZGVudGlmaWVyLnN0cmluZygpLCBmdW5jdGlvbikpOworICAgICAg
ICBhZGRGdW5jdGlvbih2bSwgdGhpcywgbmFtZSwgZnVuY3Rpb24sIGFyZ3VtZW50cyk7CiAgICAg
fQogICAgIAogICAgIHZvaWQgYWRkQ29uc3RydWN0YWJsZUZ1bmN0aW9uKFZNJiB2bSwgY29uc3Qg
Y2hhciogbmFtZSwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIHVuc2lnbmVkIGFyZ3VtZW50cykK
QEAgLTIyMjEsNiArMjMyMywyOTMgQEAgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5j
dGlvbk51bQogICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUobnVtYmVyT2ZERkdDb21waWxlcyhl
eGVjKSk7CiB9CiAKK01lc3NhZ2U6Ok1lc3NhZ2UoQXJyYXlCdWZmZXJDb250ZW50cyYmIGNvbnRl
bnRzLCBpbnQzMl90IGluZGV4KQorICAgIDogbV9jb250ZW50cyhXVEZNb3ZlKGNvbnRlbnRzKSkK
KyAgICAsIG1faW5kZXgoaW5kZXgpCit7Cit9CisKK01lc3NhZ2U6On5NZXNzYWdlKCkKK3sKK30K
KworV29ya2VyOjpXb3JrZXIoV29ya2VycyYgd29ya2VycykKKyAgICA6IG1fd29ya2Vycyh3b3Jr
ZXJzKQoreworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV93b3JrZXJzLm1fbG9jayk7Cisg
ICAgbV93b3JrZXJzLm1fd29ya2Vycy5hcHBlbmQodGhpcyk7CisgICAgCisgICAgKmN1cnJlbnRX
b3JrZXIoKSA9IHRoaXM7Cit9CisKK1dvcmtlcjo6fldvcmtlcigpCit7CisgICAgYXV0byBsb2Nr
ZXIgPSBob2xkTG9jayhtX3dvcmtlcnMubV9sb2NrKTsKKyAgICBpZiAoaXNPbkxpc3QoKSkKKyAg
ICAgICAgcmVtb3ZlKCk7Cit9CisKK3ZvaWQgV29ya2VyOjpzZW5kKGNvbnN0IEFic3RyYWN0TG9j
a2VyJiwgUmVmUHRyPE1lc3NhZ2U+IG1lc3NhZ2UpCit7CisgICAgbV9tZXNzYWdlcy5hcHBlbmQo
bWVzc2FnZSk7Cit9CisKK1JlZlB0cjxNZXNzYWdlPiBXb3JrZXI6OnJlY2VpdmUoKQoreworICAg
IGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV93b3JrZXJzLm1fbG9jayk7CisgICAgd2hpbGUgKG1f
bWVzc2FnZXMuaXNFbXB0eSgpKQorICAgICAgICBtX3dvcmtlcnMubV9jb25kaXRpb24ud2FpdCht
X3dvcmtlcnMubV9sb2NrKTsKKyAgICByZXR1cm4gbV9tZXNzYWdlcy50YWtlRmlyc3QoKTsKK30K
KworV29ya2VyJiBXb3JrZXI6OmN1cnJlbnQoKQoreworICAgIHJldHVybiAqKmN1cnJlbnRXb3Jr
ZXIoKTsKK30KKworVGhyZWFkU3BlY2lmaWM8V29ya2VyKj4mIFdvcmtlcjo6Y3VycmVudFdvcmtl
cigpCit7CisgICAgc3RhdGljIFRocmVhZFNwZWNpZmljPFdvcmtlcio+KiByZXN1bHQ7CisgICAg
c3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWc7CisgICAgc3RkOjpjYWxsX29uY2UoCisgICAgICAg
IGZsYWcsCisgICAgICAgIFtdICgpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUaHJlYWRT
cGVjaWZpYzxXb3JrZXIqPigpOworICAgICAgICB9KTsKKyAgICByZXR1cm4gKnJlc3VsdDsKK30K
KworV29ya2Vyczo6V29ya2VycygpCit7Cit9CisKK1dvcmtlcnM6On5Xb3JrZXJzKCkKK3sKKyAg
ICBVTlJFQUNIQUJMRV9GT1JfUExBVEZPUk0oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVu
Yz4KK3ZvaWQgV29ya2Vyczo6YnJvYWRjYXN0KGNvbnN0IEZ1bmMmIGZ1bmMpCit7CisgICAgYXV0
byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAgIGZvciAoV29ya2VyKiB3b3JrZXIgPSBt
X3dvcmtlcnMuYmVnaW4oKTsgd29ya2VyICE9IG1fd29ya2Vycy5lbmQoKTsgd29ya2VyID0gd29y
a2VyLT5uZXh0KCkpCisgICAgICAgIGZ1bmMobG9ja2VyLCAqd29ya2VyKTsKKyAgICBtX2NvbmRp
dGlvbi5ub3RpZnlBbGwoKTsKK30KKwordm9pZCBXb3JrZXJzOjpyZXBvcnQoU3RyaW5nIHN0cmlu
ZykKK3sKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgbV9yZXBvcnRz
LmFwcGVuZChzdHJpbmcuaXNvbGF0ZWRDb3B5KCkpOworICAgIG1fY29uZGl0aW9uLm5vdGlmeUFs
bCgpOworfQorCitTdHJpbmcgV29ya2Vyczo6dHJ5R2V0UmVwb3J0KCkKK3sKKyAgICBhdXRvIGxv
Y2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgaWYgKG1fcmVwb3J0cy5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICByZXR1cm4gbV9yZXBvcnRzLnRha2VGaXJzdCgp
OworfQorCitTdHJpbmcgV29ya2Vyczo6Z2V0UmVwb3J0KCkKK3sKKyAgICBhdXRvIGxvY2tlciA9
IGhvbGRMb2NrKG1fbG9jayk7CisgICAgd2hpbGUgKG1fcmVwb3J0cy5pc0VtcHR5KCkpCisgICAg
ICAgIG1fY29uZGl0aW9uLndhaXQobV9sb2NrKTsKKyAgICByZXR1cm4gbV9yZXBvcnRzLnRha2VG
aXJzdCgpOworfQorCitXb3JrZXJzJiBXb3JrZXJzOjpzaW5nbGV0b24oKQoreworICAgIHN0YXRp
YyBXb3JrZXJzKiByZXN1bHQ7CisgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWc7CisgICAg
c3RkOjpjYWxsX29uY2UoCisgICAgICAgIGZsYWcsCisgICAgICAgIFtdIHsKKyAgICAgICAgICAg
IHJlc3VsdCA9IG5ldyBXb3JrZXJzKCk7CisgICAgICAgIH0pOworICAgIHJldHVybiAqcmVzdWx0
OworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uRG9sbGFyQ3JlYXRl
UmVhbG0oRXhlY1N0YXRlKiBleGVjKQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAg
R2xvYmFsT2JqZWN0KiByZXN1bHQgPSBHbG9iYWxPYmplY3Q6OmNyZWF0ZSh2bSwgR2xvYmFsT2Jq
ZWN0OjpjcmVhdGVTdHJ1Y3R1cmUodm0sIGpzTnVsbCgpKSwgVmVjdG9yPFN0cmluZz4oKSk7Cisg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShyZXN1bHQtPmdldERpcmVjdCh2bSwgSWRlbnRpZmll
cjo6ZnJvbVN0cmluZyhleGVjLCAiJCIpKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgZnVuY3Rpb25Eb2xsYXJEZXRhY2hBcnJheUJ1ZmZlcihFeGVjU3RhdGUqIGV4ZWMpCit7
CisgICAgcmV0dXJuIGZ1bmN0aW9uVHJhbnNmZXJBcnJheUJ1ZmZlcihleGVjKTsKK30KKworRW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkRvbGxhckV2YWxTY3JpcHQoRXhlY1N0
YXRlKiBleGVjKQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBzY29wZSA9
IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOworCisgICAgU3RyaW5nIHNvdXJjZUNvZGUgPSBleGVj
LT5hcmd1bWVudCgwKS50b1dURlN0cmluZyhleGVjKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBUSU9O
KHNjb3BlLCBlbmNvZGVkSlNWYWx1ZSgpKTsKKyAgICAKKyAgICBHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCA9IGpzRHluYW1pY0Nhc3Q8R2xvYmFsT2JqZWN0Kj4oCisgICAgICAgIGV4ZWMtPnRo
aXNWYWx1ZSgpLmdldChleGVjLCBJZGVudGlmaWVyOjpmcm9tU3RyaW5nKGV4ZWMsICJnbG9iYWwi
KSkpOworICAgIFJFVFVSTl9JRl9FWENFUFRJT04oc2NvcGUsIGVuY29kZWRKU1ZhbHVlKCkpOwor
ICAgIGlmICghZ2xvYmFsT2JqZWN0KQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRo
cm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBjcmVhdGVFcnJvcihleGVjLCBBU0NJSUxpdGVyYWwo
IkV4cGVjdGVkIGdsb2JhbCB0byBwb2ludCB0byBhIGdsb2JhbCBvYmplY3QiKSkpKTsKKyAgICAK
KyAgICBOYWtlZFB0cjxFeGNlcHRpb24+IGV2YWx1YXRpb25FeGNlcHRpb247CisgICAgSlNWYWx1
ZSByZXN1bHQgPSBldmFsdWF0ZShnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgbWFrZVNvdXJj
ZShzb3VyY2VDb2RlLCBleGVjLT5jYWxsZXJTb3VyY2VPcmlnaW4oKSksIEpTVmFsdWUoKSwgZXZh
bHVhdGlvbkV4Y2VwdGlvbik7CisgICAgaWYgKGV2YWx1YXRpb25FeGNlcHRpb24pCisgICAgICAg
IHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBldmFsdWF0aW9uRXhjZXB0aW9uKTsKKyAgICBy
ZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHJlc3VsdCk7Cit9CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19I
T1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJBZ2VudFN0YXJ0KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAg
ICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1ND
T1BFKHZtKTsKKworICAgIFN0cmluZyBzb3VyY2VDb2RlID0gZXhlYy0+YXJndW1lbnQoMCkudG9X
VEZTdHJpbmcoZXhlYykuaXNvbGF0ZWRDb3B5KCk7CisgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihz
Y29wZSwgZW5jb2RlZEpTVmFsdWUoKSk7CisgICAgCisgICAgTG9jayBkaWRTdGFydExvY2s7Cisg
ICAgQ29uZGl0aW9uIGRpZFN0YXJ0Q29uZGl0aW9uOworICAgIGJvb2wgZGlkU3RhcnQgPSBmYWxz
ZTsKKyAgICAKKyAgICBUaHJlYWRJZGVudGlmaWVyIHRocmVhZCA9IGNyZWF0ZVRocmVhZCgKKyAg
ICAgICAgIkpTQyBBZ2VudCIsCisgICAgICAgIFtzb3VyY2VDb2RlLCAmZGlkU3RhcnRMb2NrLCAm
ZGlkU3RhcnRDb25kaXRpb24sICZkaWRTdGFydF0gKCkgeworICAgICAgICAgICAgQ29tbWFuZExp
bmUgY29tbWFuZExpbmUoMCwgbnVsbHB0cik7CisgICAgICAgICAgICBydW5KU0MoCisgICAgICAg
ICAgICAgICAgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgWyZdIChWTSYsIEdsb2JhbE9i
amVjdCogZ2xvYmFsT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUg
dGhyZWFkIHRoYXQgc3RhcnRlZCB1cyB0aGF0IHdlIGhhdmUgcmVnaXN0ZXJlZCBhIHdvcmtlci4K
KyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBsb2Nr
ZXIgPSBob2xkTG9jayhkaWRTdGFydExvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgZGlk
U3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGlkU3RhcnRDb25kaXRpb24u
bm90aWZ5T25lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgICAgIE5ha2VkUHRyPEV4Y2VwdGlvbj4gZXZhbHVhdGlvbkV4Y2Vw
dGlvbjsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgSlNWYWx1ZSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9
IGV2YWx1YXRlKGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpLCBtYWtlU291cmNlKHNvdXJjZUNv
ZGUsIFNvdXJjZU9yaWdpbihBU0NJSUxpdGVyYWwoIndvcmtlciIpKSksIEpTVmFsdWUoKSwgZXZh
bHVhdGlvbkV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChldmFsdWF0aW9uRXhj
ZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGlvbkV4Y2Vw
dGlvbi0+dmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oZ2xvYmFs
T2JqZWN0LCB0cnVlLCBldmFsdWF0aW9uRXhjZXB0aW9uLCByZXN1bHQsIFN0cmluZygpLCBmYWxz
ZSwgZmFsc2UsIHN1Y2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCisg
ICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICByZXR1
cm4gc3VjY2VzczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgZGV0YWNo
VGhyZWFkKHRocmVhZCk7CisgICAgCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRM
b2NrKGRpZFN0YXJ0TG9jayk7CisgICAgICAgIHdoaWxlICghZGlkU3RhcnQpCisgICAgICAgICAg
ICBkaWRTdGFydENvbmRpdGlvbi53YWl0KGRpZFN0YXJ0TG9jayk7CisgICAgfQorICAgIAorICAg
IHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Cit9CisKK0VuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25Eb2xsYXJBZ2VudFJlY2VpdmVCcm9hZGNhc3QoRXhl
Y1N0YXRlKiBleGVjKQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBzY29w
ZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOworCisgICAgSlNWYWx1ZSBjYWxsYmFjayA9IGV4
ZWMtPmFyZ3VtZW50KDApOworICAgIENhbGxEYXRhIGNhbGxEYXRhOworICAgIENhbGxUeXBlIGNh
bGxUeXBlID0gZ2V0Q2FsbERhdGEoY2FsbGJhY2ssIGNhbGxEYXRhKTsKKyAgICBpZiAoY2FsbFR5
cGUgPT0gQ2FsbFR5cGU6Ok5vbmUpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhy
b3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZUVycm9yKGV4ZWMsIEFTQ0lJTGl0ZXJhbCgi
RXhwZWN0ZWQgY2FsbGJhY2siKSkpKTsKKyAgICAKKyAgICBSZWZQdHI8TWVzc2FnZT4gbWVzc2Fn
ZTsKKyAgICB7CisgICAgICAgIFJlbGVhc2VIZWFwQWNjZXNzU2NvcGUgcmVsZWFzZUFjY2Vzcyh2
bS5oZWFwKTsKKyAgICAgICAgbWVzc2FnZSA9IFdvcmtlcjo6Y3VycmVudCgpLnJlY2VpdmUoKTsK
KyAgICB9CisgICAgCisgICAgUmVmUHRyPEFycmF5QnVmZmVyPiBuYXRpdmVCdWZmZXIgPSBBcnJh
eUJ1ZmZlcjo6Y3JlYXRlKG1lc3NhZ2UtPnJlbGVhc2VDb250ZW50cygpKTsKKyAgICBKU0FycmF5
QnVmZmVyKiBqc0J1ZmZlciA9IEpTQXJyYXlCdWZmZXI6OmNyZWF0ZSh2bSwgZXhlYy0+bGV4aWNh
bEdsb2JhbE9iamVjdCgpLT5hcnJheUJ1ZmZlclN0cnVjdHVyZShuYXRpdmVCdWZmZXItPnNoYXJp
bmdNb2RlKCkpLCBuYXRpdmVCdWZmZXIpOworICAgIAorICAgIE1hcmtlZEFyZ3VtZW50QnVmZmVy
IGFyZ3M7CisgICAgYXJncy5hcHBlbmQoanNCdWZmZXIpOworICAgIGFyZ3MuYXBwZW5kKGpzTnVt
YmVyKG1lc3NhZ2UtPmluZGV4KCkpKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGNhbGwo
ZXhlYywgY2FsbGJhY2ssIGNhbGxUeXBlLCBjYWxsRGF0YSwganNOdWxsKCksIGFyZ3MpKTsKK30K
KworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkRvbGxhckFnZW50UmVwb3J0
KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8g
c2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKworICAgIFN0cmluZyByZXBvcnQgPSBl
eGVjLT5hcmd1bWVudCgwKS50b1dURlN0cmluZyhleGVjKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBU
SU9OKHNjb3BlLCBlbmNvZGVkSlNWYWx1ZSgpKTsKKyAgICAKKyAgICBXb3JrZXJzOjpzaW5nbGV0
b24oKS5yZXBvcnQocmVwb3J0KTsKKyAgICAKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpz
VW5kZWZpbmVkKCkpOworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9u
RG9sbGFyQWdlbnRTbGVlcChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgaWYgKGV4ZWMtPmFyZ3Vt
ZW50Q291bnQoKSA+PSAxKQorICAgICAgICBzbGVlcChTZWNvbmRzOjpmcm9tTWlsbGlzZWNvbmRz
KGV4ZWMtPmFyZ3VtZW50KDApLnRvTnVtYmVyKGV4ZWMpKSk7CisgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FM
TCBmdW5jdGlvbkRvbGxhckFnZW50QnJvYWRjYXN0KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBW
TSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BF
KHZtKTsKKworICAgIEpTQXJyYXlCdWZmZXIqIGpzQnVmZmVyID0ganNEeW5hbWljQ2FzdDxKU0Fy
cmF5QnVmZmVyKj4oZXhlYy0+YXJndW1lbnQoMCkpOworICAgIGlmICghanNCdWZmZXIgfHwgIWpz
QnVmZmVyLT5pc1NoYXJlZCgpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93
RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBjcmVhdGVFcnJvcihleGVjLCBBU0NJSUxpdGVyYWwoIkV4
cGVjdGVkIFNoYXJlZEFycmF5QnVmZmVyIikpKSk7CisgICAgCisgICAgaW50MzJfdCBpbmRleCA9
IGV4ZWMtPmFyZ3VtZW50KDEpLnRvSW50MzIoZXhlYyk7CisgICAgUkVUVVJOX0lGX0VYQ0VQVElP
TihzY29wZSwgZW5jb2RlZEpTVmFsdWUoKSk7CisgICAgCisgICAgV29ya2Vyczo6c2luZ2xldG9u
KCkuYnJvYWRjYXN0KAorICAgICAgICBbJl0gKGNvbnN0IEFic3RyYWN0TG9ja2VyJiBsb2NrZXIs
IFdvcmtlciYgd29ya2VyKSB7CisgICAgICAgICAgICBBcnJheUJ1ZmZlciogbmF0aXZlQnVmZmVy
ID0ganNCdWZmZXItPmltcGwoKTsKKyAgICAgICAgICAgIEFycmF5QnVmZmVyQ29udGVudHMgY29u
dGVudHM7CisgICAgICAgICAgICBuYXRpdmVCdWZmZXItPnRyYW5zZmVyVG8oY29udGVudHMpOyAv
LyAidHJhbnNmZXJUbyIgbWVhbnMgInNoYXJlIiBpZiB0aGUgYnVmZmVyIGlzIHNoYXJlZC4KKyAg
ICAgICAgICAgIFJlZlB0cjxNZXNzYWdlPiBtZXNzYWdlID0gYWRvcHRSZWYobmV3IE1lc3NhZ2Uo
V1RGTW92ZShjb250ZW50cyksIGluZGV4KSk7CisgICAgICAgICAgICB3b3JrZXIuc2VuZChsb2Nr
ZXIsIG1lc3NhZ2UpOworICAgICAgICB9KTsKKyAgICAKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5j
b2RlKGpzVW5kZWZpbmVkKCkpOworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1
bmN0aW9uRG9sbGFyQWdlbnRHZXRSZXBvcnQoRXhlY1N0YXRlKiBleGVjKQoreworICAgIFZNJiB2
bSA9IGV4ZWMtPnZtKCk7CisKKyAgICBTdHJpbmcgc3RyaW5nID0gV29ya2Vyczo6c2luZ2xldG9u
KCkudHJ5R2V0UmVwb3J0KCk7CisgICAgaWYgKCFzdHJpbmcpCisgICAgICAgIHJldHVybiBKU1Zh
bHVlOjplbmNvZGUoanNOdWxsKCkpOworICAgIAorICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
anNTdHJpbmcoJnZtLCBzdHJpbmcpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FM
TCBmdW5jdGlvbldhaXRGb3JSZXBvcnQoRXhlY1N0YXRlKiBleGVjKQoreworICAgIFZNJiB2bSA9
IGV4ZWMtPnZtKCk7CisKKyAgICBTdHJpbmcgc3RyaW5nOworICAgIHsKKyAgICAgICAgUmVsZWFz
ZUhlYXBBY2Nlc3NTY29wZSByZWxlYXNlQWNjZXNzKHZtLmhlYXApOworICAgICAgICBzdHJpbmcg
PSBXb3JrZXJzOjpzaW5nbGV0b24oKS5nZXRSZXBvcnQoKTsKKyAgICB9CisgICAgaWYgKCFzdHJp
bmcpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNOdWxsKCkpOworICAgIAorICAg
IHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNTdHJpbmcoJnZtLCBzdHJpbmcpKTsKK30KKwogdGVt
cGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPgogdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6
aXNfZnVuZGFtZW50YWw8VmFsdWVUeXBlPjo6dmFsdWU+Ojp0eXBlIGFkZE9wdGlvbihWTSYsIEpT
T2JqZWN0KiwgSWRlbnRpZmllciwgVmFsdWVUeXBlKSB7IH0KIApAQCAtMjkwNCw2ICszMjkzLDE5
IEBAIHN0YXRpYyBib29sIGNoZWNrVW5jYXVnaHRFeGNlcHRpb24oVk0mIHYKICAgICByZXR1cm4g
ZmFsc2U7CiB9CiAKK3N0YXRpYyB2b2lkIGNoZWNrRXhjZXB0aW9uKEdsb2JhbE9iamVjdCogZ2xv
YmFsT2JqZWN0LCBib29sIGlzTGFzdEZpbGUsIGJvb2wgaGFzRXhjZXB0aW9uLCBKU1ZhbHVlIHZh
bHVlLCBjb25zdCBTdHJpbmcmIHVuY2F1Z2h0RXhjZXB0aW9uTmFtZSwgYm9vbCBhbHdheXNEdW1w
VW5jYXVnaHRFeGNlcHRpb24sIGJvb2wgZHVtcCwgYm9vbCYgc3VjY2VzcykKK3sKKyAgICBWTSYg
dm0gPSBnbG9iYWxPYmplY3QtPnZtKCk7CisgICAgaWYgKCF1bmNhdWdodEV4Y2VwdGlvbk5hbWUg
fHwgIWlzTGFzdEZpbGUpIHsKKyAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgIWhhc0V4Y2Vw
dGlvbjsKKyAgICAgICAgaWYgKGR1bXAgJiYgIWhhc0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHBy
aW50ZigiRW5kOiAlc1xuIiwgdmFsdWUudG9XVEZTdHJpbmcoZ2xvYmFsT2JqZWN0LT5nbG9iYWxF
eGVjKCkpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBpZiAoaGFzRXhjZXB0aW9uKQorICAgICAg
ICAgICAgZHVtcEV4Y2VwdGlvbihnbG9iYWxPYmplY3QsIHZhbHVlKTsKKyAgICB9IGVsc2UKKyAg
ICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgY2hlY2tVbmNhdWdodEV4Y2VwdGlvbih2bSwgZ2xv
YmFsT2JqZWN0LCAoaGFzRXhjZXB0aW9uKSA/IHZhbHVlIDogSlNWYWx1ZSgpLCB1bmNhdWdodEV4
Y2VwdGlvbk5hbWUsIGFsd2F5c0R1bXBVbmNhdWdodEV4Y2VwdGlvbik7Cit9CisKIHN0YXRpYyBi
b29sIHJ1bldpdGhTY3JpcHRzKEdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBjb25zdCBWZWN0
b3I8U2NyaXB0PiYgc2NyaXB0cywgY29uc3QgU3RyaW5nJiB1bmNhdWdodEV4Y2VwdGlvbk5hbWUs
IGJvb2wgYWx3YXlzRHVtcFVuY2F1Z2h0RXhjZXB0aW9uLCBib29sIGR1bXAsIGJvb2wgbW9kdWxl
KQogewogICAgIFN0cmluZyBmaWxlTmFtZTsKQEAgLTI5MTYsMTcgKzMzMTgsNiBAQCBzdGF0aWMg
Ym9vbCBydW5XaXRoU2NyaXB0cyhHbG9iYWxPYmplY3QqCiAgICAgYXV0byBzY29wZSA9IERFQ0xB
UkVfQ0FUQ0hfU0NPUEUodm0pOwogICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAKLSAgICBhdXRv
IGNoZWNrRXhjZXB0aW9uID0gWyZdIChib29sIGlzTGFzdEZpbGUsIGJvb2wgaGFzRXhjZXB0aW9u
LCBKU1ZhbHVlIHZhbHVlKSB7Ci0gICAgICAgIGlmICghdW5jYXVnaHRFeGNlcHRpb25OYW1lIHx8
ICFpc0xhc3RGaWxlKSB7Ci0gICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiAhaGFzRXhj
ZXB0aW9uOwotICAgICAgICAgICAgaWYgKGR1bXAgJiYgIWhhc0V4Y2VwdGlvbikKLSAgICAgICAg
ICAgICAgICBwcmludGYoIkVuZDogJXNcbiIsIHZhbHVlLnRvV1RGU3RyaW5nKGdsb2JhbE9iamVj
dC0+Z2xvYmFsRXhlYygpKS51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgICAgIGlmIChoYXNFeGNl
cHRpb24pCi0gICAgICAgICAgICAgICAgZHVtcEV4Y2VwdGlvbihnbG9iYWxPYmplY3QsIHZhbHVl
KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBjaGVj
a1VuY2F1Z2h0RXhjZXB0aW9uKHZtLCBnbG9iYWxPYmplY3QsIChoYXNFeGNlcHRpb24pID8gdmFs
dWUgOiBKU1ZhbHVlKCksIHVuY2F1Z2h0RXhjZXB0aW9uTmFtZSwgYWx3YXlzRHVtcFVuY2F1Z2h0
RXhjZXB0aW9uKTsKLSAgICB9OwotCiAjaWYgRU5BQkxFKFNBTVBMSU5HX0ZMQUdTKQogICAgIFNh
bXBsaW5nRmxhZ3M6OnN0YXJ0KCk7CiAjZW5kaWYKQEAgLTI5NTksMTIgKzMzNTAsMTIgQEAgc3Rh
dGljIGJvb2wgcnVuV2l0aFNjcmlwdHMoR2xvYmFsT2JqZWN0KgogICAgICAgICAgICAgc2NvcGUu
Y2xlYXJFeGNlcHRpb24oKTsKIAogICAgICAgICAgICAgSlNGdW5jdGlvbiogZnVsZmlsbEhhbmRs
ZXIgPSBKU05hdGl2ZVN0ZEZ1bmN0aW9uOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgMSwgU3Ry
aW5nKCksIFsmLCBpc0xhc3RGaWxlXShFeGVjU3RhdGUqIGV4ZWMpIHsKLSAgICAgICAgICAgICAg
ICBjaGVja0V4Y2VwdGlvbihpc0xhc3RGaWxlLCBmYWxzZSwgZXhlYy0+YXJndW1lbnQoMCkpOwor
ICAgICAgICAgICAgICAgIGNoZWNrRXhjZXB0aW9uKGdsb2JhbE9iamVjdCwgaXNMYXN0RmlsZSwg
ZmFsc2UsIGV4ZWMtPmFyZ3VtZW50KDApLCB1bmNhdWdodEV4Y2VwdGlvbk5hbWUsIGFsd2F5c0R1
bXBVbmNhdWdodEV4Y2VwdGlvbiwgZHVtcCwgc3VjY2Vzcyk7CiAgICAgICAgICAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKICAgICAgICAgICAgIH0pOwogCiAg
ICAgICAgICAgICBKU0Z1bmN0aW9uKiByZWplY3RIYW5kbGVyID0gSlNOYXRpdmVTdGRGdW5jdGlv
bjo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIDEsIFN0cmluZygpLCBbJiwgaXNMYXN0RmlsZV0o
RXhlY1N0YXRlKiBleGVjKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oaXNMYXN0
RmlsZSwgdHJ1ZSwgZXhlYy0+YXJndW1lbnQoMCkpOworICAgICAgICAgICAgICAgIGNoZWNrRXhj
ZXB0aW9uKGdsb2JhbE9iamVjdCwgaXNMYXN0RmlsZSwgdHJ1ZSwgZXhlYy0+YXJndW1lbnQoMCks
IHVuY2F1Z2h0RXhjZXB0aW9uTmFtZSwgYWx3YXlzRHVtcFVuY2F1Z2h0RXhjZXB0aW9uLCBkdW1w
LCBzdWNjZXNzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5k
ZWZpbmVkKCkpOwogICAgICAgICAgICAgfSk7CiAKQEAgLTI5NzYsNyArMzM2Nyw3IEBAIHN0YXRp
YyBib29sIHJ1bldpdGhTY3JpcHRzKEdsb2JhbE9iamVjdCoKICAgICAgICAgICAgIEFTU0VSVCgh
c2NvcGUuZXhjZXB0aW9uKCkpOwogICAgICAgICAgICAgaWYgKGV2YWx1YXRpb25FeGNlcHRpb24p
CiAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBldmFsdWF0aW9uRXhjZXB0aW9uLT52YWx1
ZSgpOwotICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oaXNMYXN0RmlsZSwgZXZhbHVhdGlvbkV4
Y2VwdGlvbiwgcmV0dXJuVmFsdWUpOworICAgICAgICAgICAgY2hlY2tFeGNlcHRpb24oZ2xvYmFs
T2JqZWN0LCBpc0xhc3RGaWxlLCBldmFsdWF0aW9uRXhjZXB0aW9uLCByZXR1cm5WYWx1ZSwgdW5j
YXVnaHRFeGNlcHRpb25OYW1lLCBhbHdheXNEdW1wVW5jYXVnaHRFeGNlcHRpb24sIGR1bXAsIHN1
Y2Nlc3MpOwogICAgICAgICB9CiAKICAgICAgICAgc2NyaXB0QnVmZmVyLmNsZWFyKCk7CkBAIC0z
MjQxLDI5ICszNjMyLDMyIEBAIHZvaWQgQ29tbWFuZExpbmU6OnBhcnNlQXJndW1lbnRzKGludCBh
cmcKICAgICAgICAganNjRXhpdChFWElUX1NVQ0NFU1MpOwogfQogCi0vLyBXZSBtYWtlIHRoaXMg
ZnVuY3Rpb24gbm8gaW5saW5lIHNvIHRoYXQgZ2xvYmFsT2JqZWN0IHdvbid0IGJlIG9uIHRoZSBz
dGFjayBpZiB3ZSBkbyBhIEdDIGluIGpzY21haW4uCi1zdGF0aWMgaW50IE5FVkVSX0lOTElORSBy
dW5KU0MoVk0qIHZtLCBDb21tYW5kTGluZSBvcHRpb25zKQordGVtcGxhdGU8dHlwZW5hbWUgRnVu
Yz4KK2ludCBydW5KU0MoQ29tbWFuZExpbmUgb3B0aW9ucywgY29uc3QgRnVuYyYgZnVuYykKIHsK
LSAgICBKU0xvY2tIb2xkZXIgbG9ja2VyKHZtKTsKKyAgICBXb3JrZXIgd29ya2VyKFdvcmtlcnM6
OnNpbmdsZXRvbigpKTsKKyAgICAKKyAgICBWTSYgdm0gPSBWTTo6Y3JlYXRlKExhcmdlSGVhcCku
bGVha1JlZigpOworICAgIEpTTG9ja0hvbGRlciBsb2NrZXIoJnZtKTsKIAogICAgIGludCByZXN1
bHQ7Ci0gICAgaWYgKG9wdGlvbnMubV9wcm9maWxlICYmICF2bS0+bV9wZXJCeXRlY29kZVByb2Zp
bGVyKQotICAgICAgICB2bS0+bV9wZXJCeXRlY29kZVByb2ZpbGVyID0gc3RkOjptYWtlX3VuaXF1
ZTxQcm9maWxlcjo6RGF0YWJhc2U+KCp2bSk7CisgICAgaWYgKG9wdGlvbnMubV9wcm9maWxlICYm
ICF2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpCisgICAgICAgIHZtLm1fcGVyQnl0ZWNvZGVQcm9m
aWxlciA9IHN0ZDo6bWFrZV91bmlxdWU8UHJvZmlsZXI6OkRhdGFiYXNlPih2bSk7CiAKLSAgICBH
bG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IEdsb2JhbE9iamVjdDo6Y3JlYXRlKCp2bSwgR2xv
YmFsT2JqZWN0OjpjcmVhdGVTdHJ1Y3R1cmUoKnZtLCBqc051bGwoKSksIG9wdGlvbnMubV9hcmd1
bWVudHMpOworICAgIEdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gR2xvYmFsT2JqZWN0Ojpj
cmVhdGUodm0sIEdsb2JhbE9iamVjdDo6Y3JlYXRlU3RydWN0dXJlKHZtLCBqc051bGwoKSksIG9w
dGlvbnMubV9hcmd1bWVudHMpOwogICAgIGdsb2JhbE9iamVjdC0+c2V0UmVtb3RlRGVidWdnaW5n
RW5hYmxlZChvcHRpb25zLm1fZW5hYmxlUmVtb3RlRGVidWdnaW5nKTsKLSAgICBib29sIHN1Y2Nl
c3MgPSBydW5XaXRoU2NyaXB0cyhnbG9iYWxPYmplY3QsIG9wdGlvbnMubV9zY3JpcHRzLCBvcHRp
b25zLm1fdW5jYXVnaHRFeGNlcHRpb25OYW1lLCBvcHRpb25zLm1fYWx3YXlzRHVtcFVuY2F1Z2h0
RXhjZXB0aW9uLCBvcHRpb25zLm1fZHVtcCwgb3B0aW9ucy5tX21vZHVsZSk7CisgICAgYm9vbCBz
dWNjZXNzID0gZnVuYyh2bSwgZ2xvYmFsT2JqZWN0KTsKICAgICBpZiAob3B0aW9ucy5tX2ludGVy
YWN0aXZlICYmIHN1Y2Nlc3MpCiAgICAgICAgIHJ1bkludGVyYWN0aXZlKGdsb2JhbE9iamVjdCk7
CiAKLSAgICB2bS0+ZHJhaW5NaWNyb3Rhc2tzKCk7CisgICAgdm0uZHJhaW5NaWNyb3Rhc2tzKCk7
CiAgICAgcmVzdWx0ID0gc3VjY2VzcyAmJiAodGVzdDI2MkFzeW5jVGVzdCA9PSB0ZXN0MjYyQXN5
bmNQYXNzZWQpID8gMCA6IDM7CiAKICAgICBpZiAob3B0aW9ucy5tX2V4aXRDb2RlKQogICAgICAg
ICBwcmludGYoImpzYyBleGl0aW5nICVkXG4iLCByZXN1bHQpOwogCiAgICAgaWYgKG9wdGlvbnMu
bV9wcm9maWxlKSB7Ci0gICAgICAgIGlmICghdm0tPm1fcGVyQnl0ZWNvZGVQcm9maWxlci0+c2F2
ZShvcHRpb25zLm1fcHJvZmlsZXJPdXRwdXQudXRmOCgpLmRhdGEoKSkpCisgICAgICAgIGlmICgh
dm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyLT5zYXZlKG9wdGlvbnMubV9wcm9maWxlck91dHB1dC51
dGY4KCkuZGF0YSgpKSkKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHNh
dmUgcHJvZmlsZXIgb3V0cHV0LlxuIik7CiAgICAgfQogCkBAIC0zMjg4LDYgKzM2ODIsMjIgQEAg
c3RhdGljIGludCBORVZFUl9JTkxJTkUgcnVuSlNDKFZNKiB2bSwgQwogICAgICAgICBwcmludGYo
IiU0MHM6ICUuM2xmIG1zXG4iLCBrZXkuZGF0YSgpLCBjb21waWxlVGltZVN0YXRzLmdldChrZXkp
KTsKICNlbmRpZgogCisgICAgaWYgKE9wdGlvbnM6OmdjQXRFbmQoKSkgeworICAgICAgICAvLyBX
ZSBuZWVkIHRvIGhvbGQgdGhlIEFQSSBsb2NrIHRvIGRvIGEgR0MuCisgICAgICAgIEpTTG9ja0hv
bGRlciBsb2NrZXIoJnZtKTsKKyAgICAgICAgdm0uaGVhcC5jb2xsZWN0QWxsR2FyYmFnZSgpOwor
ICAgIH0KKworICAgIGlmIChvcHRpb25zLm1fZHVtcFNhbXBsaW5nUHJvZmlsZXJEYXRhKSB7Cisj
aWYgRU5BQkxFKFNBTVBMSU5HX1BST0ZJTEVSKQorICAgICAgICBKU0xvY2tIb2xkZXIgbG9ja2Vy
KCZ2bSk7CisgICAgICAgIHZtLnNhbXBsaW5nUHJvZmlsZXIoKS0+cmVwb3J0VG9wRnVuY3Rpb25z
KCk7CisgICAgICAgIHZtLnNhbXBsaW5nUHJvZmlsZXIoKS0+cmVwb3J0VG9wQnl0ZWNvZGVzKCk7
CisjZWxzZQorICAgICAgICBkYXRhTG9nKCJTYW1wbGluZyBwcm9maWxlciBpcyBub3QgZW5hYmxl
ZCBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorICAgIH0KKwogICAgIHJldHVybiByZXN1
bHQ7CiB9CiAKQEAgLTMzMDUsMjUgKzM3MTUsMTIgQEAgaW50IGpzY21haW4oaW50IGFyZ2MsIGNo
YXIqKiBhcmd2KQogICAgIEpTQzo6aW5pdGlhbGl6ZVRocmVhZGluZygpOwogICAgIHN0YXJ0VGlt
ZW91dFRocmVhZElmTmVlZGVkKCk7CiAKLSAgICBWTSogdm0gPSAmVk06OmNyZWF0ZShMYXJnZUhl
YXApLmxlYWtSZWYoKTsKICAgICBpbnQgcmVzdWx0OwotICAgIHJlc3VsdCA9IHJ1bkpTQyh2bSwg
b3B0aW9ucyk7Ci0KLSAgICBpZiAoT3B0aW9uczo6Z2NBdEVuZCgpKSB7Ci0gICAgICAgIC8vIFdl
IG5lZWQgdG8gaG9sZCB0aGUgQVBJIGxvY2sgdG8gZG8gYSBHQy4KLSAgICAgICAgSlNMb2NrSG9s
ZGVyIGxvY2tlcih2bSk7Ci0gICAgICAgIHZtLT5oZWFwLmNvbGxlY3RBbGxHYXJiYWdlKCk7Ci0g
ICAgfQotCi0gICAgaWYgKG9wdGlvbnMubV9kdW1wU2FtcGxpbmdQcm9maWxlckRhdGEpIHsKLSNp
ZiBFTkFCTEUoU0FNUExJTkdfUFJPRklMRVIpCi0gICAgICAgIEpTTG9ja0hvbGRlciBsb2NrZXIo
dm0pOwotICAgICAgICB2bS0+c2FtcGxpbmdQcm9maWxlcigpLT5yZXBvcnRUb3BGdW5jdGlvbnMo
KTsKLSAgICAgICAgdm0tPnNhbXBsaW5nUHJvZmlsZXIoKS0+cmVwb3J0VG9wQnl0ZWNvZGVzKCk7
Ci0jZWxzZQotICAgICAgICBkYXRhTG9nKCJTYW1wbGluZyBwcm9maWxlciBpcyBub3QgZW5hYmxl
ZCBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKLSNlbmRpZgotICAgIH0KKyAgICByZXN1bHQgPSBydW5K
U0MoCisgICAgICAgIG9wdGlvbnMsCisgICAgICAgIFsmXSAoVk0mLCBHbG9iYWxPYmplY3QqIGds
b2JhbE9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIHJ1bldpdGhTY3JpcHRzKGdsb2JhbE9i
amVjdCwgb3B0aW9ucy5tX3NjcmlwdHMsIG9wdGlvbnMubV91bmNhdWdodEV4Y2VwdGlvbk5hbWUs
IG9wdGlvbnMubV9hbHdheXNEdW1wVW5jYXVnaHRFeGNlcHRpb24sIG9wdGlvbnMubV9kdW1wLCBv
cHRpb25zLm1fbW9kdWxlKTsKKyAgICAgICAgfSk7CiAKICAgICBwcmludFN1cGVyU2FtcGxlclN0
YXRlKCk7CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQXJyYXlCdWZm
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0FycmF5
QnVmZmVyLmgJKHJldmlzaW9uIDIxMTEyOCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTQXJyYXlCdWZmZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBAQCBwdWJs
aWM6CiAgICAgCiAgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiwgSlNH
bG9iYWxPYmplY3QqLCBKU1ZhbHVlIHByb3RvdHlwZSk7CiAKLSAgICBib29sIGlzU2hhcmVkKCkg
Y29uc3Q7CisgICAgSlNfRVhQT1JUX1BSSVZBVEUgYm9vbCBpc1NoYXJlZCgpIGNvbnN0OwogICAg
IEFycmF5QnVmZmVyU2hhcmluZ01vZGUgc2hhcmluZ01vZGUoKSBjb25zdDsKICAgICAKICAgICBE
RUNMQVJFX0VYUE9SVF9JTkZPOwo=
</data>
<flag name="review"
          id="321689"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
      

    </bug>

</bugzilla>