<?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>36921</bug_id>
          
          <creation_ts>2010-03-31 19:06:49 -0700</creation_ts>
          <short_desc>Split RenderBlock::layoutInlineChildren into smaller functions</short_desc>
          <delta_ts>2022-10-03 14:42:20 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>CONFIGURATION CHANGED</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>
          <dependson>37114</dependson>
    
    <dependson>60052</dependson>
    
    <dependson>60080</dependson>
          <blocked>57779</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="James Robinson">jamesr</reporter>
          <assigned_to name="James Robinson">jamesr</assigned_to>
          <cc>abarth</cc>
    
    <cc>ahmad.saleem792</cc>
    
    <cc>ap</cc>
    
    <cc>eric</cc>
    
    <cc>hyatt</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>rniwa</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>206891</commentid>
    <comment_count>0</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-03-31 19:06:49 -0700</bug_when>
    <thetext>Split RenderBlock::layoutInlineChildren into smaller functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206892</commentid>
    <comment_count>1</comment_count>
      <attachid>52237</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-03-31 19:08:39 -0700</bug_when>
    <thetext>Created attachment 52237
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206896</commentid>
    <comment_count>2</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-03-31 19:10:59 -0700</bug_when>
    <thetext>Hopefully this is slightly more readable and easy to edit.  I&apos;ve been careful not to change any logic, just moved code into new functions, added comments, and renamed a few variables that were confusingly named.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206899</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-31 19:14:29 -0700</bug_when>
    <thetext>Attachment 52237 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/rendering/RenderBlockLineLayout.cpp:817:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/rendering/RenderBlockLineLayout.cpp:867:  One space before end of line comments  [whitespace/comments] [5]
Total errors found: 2 in 3 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>207394</commentid>
    <comment_count>4</comment_count>
      <attachid>52237</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-04-01 14:04:51 -0700</bug_when>
    <thetext>Comment on attachment 52237
Patch

Good idea.

&gt; +    struct FloatWithRect {

Since all the helper functions are member functions, I don&apos;t see why we need to make the FloatWithRect struct public. Maybe this is left over from an earlier version of the patch?

&gt; +    bool layoutReplacedElements(bool relayoutChildren, bool fullLayout, Vector&lt;FloatWithRect&gt;&amp; floats);

We don&apos;t need the argument name &quot;floats&quot; here.

&gt; +    RootInlineBox* createLineBoxesForResolver(const InlineBidiResolver&amp; resolver, const InlineIterator&amp; currentPosition,
&gt; +                                              bool firstLine, bool previousLineBrokeCleanly, BidiRun* trailingSpaceRun);

We don&apos;t line up subsequent lines with the &quot;(&quot; from the first line in WebKit. We don&apos;t need the argument name &quot;resolver&quot; here and it&apos;s arguably we don&apos;t need the name &quot;currentPosition&quot; either.

And for the actual function definition I also think that &quot;currentPosition&quot; is possibly a too-long name. I suggest just &quot;position&quot;, which although ambiguous is shorter and probably clearer despite the ambiguity.

&gt; +    void layoutRunsAndFloats(bool fullLayout, Vector&lt;FloatWithRect&gt;&amp; floats, int&amp; repaintTop, int&amp; repaintBottom);

We don&apos;t need the argument name &quot;floats&quot; here.

&gt; +bool RenderBlock::layoutReplacedElements(bool relayoutChildren, bool fullLayout, Vector&lt;FloatWithRect&gt;&amp; floats)

May want to consider marking this &quot;used in only one place&quot; function inline. Same with others. In some cases that results in smaller code size and slightly better performance.

&gt; +    RenderObject* o = bidiFirst(this, 0, false);
&gt; +    while (o) {

It&apos;s good that you just moved the code and kept the changes to a minimum. Two things I would change in this code in the future would be using a word instead of the letter &quot;o&quot; and use a for loop instead of a while loop.

&gt; +        lineBox = constructLine(resolver.runCount(), resolver.firstRun(), resolver.lastRun(), firstLine,
&gt; +                                !currentPosition.obj, currentPosition.obj &amp;&amp; !currentPosition.pos ? currentPosition.obj : 0);

We don&apos;t line up second lines under the &quot;(&quot; like this in WebKit code. If the length of the line bothers you than I suggest we use local variables for some of these expressions.

One such expression would be &quot;currentPosition.obj &amp;&amp; !currentPosition.pos ? currentPosition.obj : 0&quot;. And I don&apos;t see why that needs &quot;currentPosition.obj &amp;&amp;&quot; in it at all.

&gt; +    size_t floatCount = floats.size();
&gt; +    // Floats that did not have layout did not repaint when we laid them out. They would have
&gt; +    // painted by now if they had moved, but if they stayed at (0, 0), they still need to be
&gt; +    // painted.
&gt; +    for (size_t i = 0; i &lt; floatCount; ++i) {

Not new, but it&apos;s quite change that this comment is tucked in between the floatCount line and the for line. I would move the comment up one line.

Since this is a refactoring patch, I&apos;m going to say review- due to the fact that it needlessly makes FloatWithRect public.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207400</commentid>
    <comment_count>5</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-01 14:14:48 -0700</bug_when>
    <thetext>Yes, making FloatWithRect public was from an earlier revision and not intentional.  Thank you for reviewing, I&apos;ll upload an updated patch shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207545</commentid>
    <comment_count>6</comment_count>
      <attachid>52357</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-01 17:44:32 -0700</bug_when>
    <thetext>Created attachment 52357
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207550</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-01 17:46:49 -0700</bug_when>
    <thetext>Attachment 52357 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/rendering/RenderBlockLineLayout.cpp:817:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 1 in 3 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>207552</commentid>
    <comment_count>8</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-01 17:47:52 -0700</bug_when>
    <thetext>I experimented with adding the &apos;inline&apos; keyword to each of the called functions, but gcc still refused to inline any of them at -O3 citing &quot;--param max-inline-insns-single limit reached&quot; meaning it thought the function body was too large to consider inlining.  I can add the keyword back if you think it might help on other platforms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>208134</commentid>
    <comment_count>9</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-02 16:21:56 -0700</bug_when>
    <thetext>Committed r57030: &lt;http://trac.webkit.org/changeset/57030&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>208721</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-05 14:53:03 -0700</bug_when>
    <thetext>Rollout landed in r57096.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>208722</commentid>
    <comment_count>11</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-05 14:55:52 -0700</bug_when>
    <thetext>This regressed fast/repaint/line-flow-with-floats-9 in pixel mode.  Reverted at
http://trac.webkit.org/changeset/57096, will update the patch once I figure out
how I broke stuff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209483</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-06 23:46:53 -0700</bug_when>
    <thetext>Attachment 52357 was posted by a committer and has review+, assigning to James Robinson for commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226643</commentid>
    <comment_count>13</comment_count>
      <attachid>52357</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-05-17 00:35:21 -0700</bug_when>
    <thetext>Comment on attachment 52357
Patch

Marking r- since this was reverted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397228</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-03 11:41:12 -0700</bug_when>
    <thetext>I&apos;m re-writing James&apos; patch in smaller pieces.  I&apos;ll attach patches to dependent bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397368</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-03 14:04:09 -0700</bug_when>
    <thetext>Well, I found the cause of the regression, James.  See bug 60052</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397953</commentid>
    <comment_count>16</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-04 09:05:58 -0700</bug_when>
    <thetext>Is this bug now fixed given that layoutInlineChildren has been broken down into smaller pieces?
http://trac.webkit.org/browser/trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp#L1103</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1902700</commentid>
    <comment_count>17</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2022-10-02 01:30:17 -0700</bug_when>
    <thetext>(In reply to Ryosuke Niwa from comment #16)
&gt; Is this bug now fixed given that layoutInlineChildren has been broken down
&gt; into smaller pieces?
&gt; http://trac.webkit.org/browser/trunk/Source/WebCore/rendering/
&gt; RenderBlockLineLayout.cpp#L1103

Is this required anymore because as mentioned by Ryosuke, this refactoring / simplification happened already? Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1902932</commentid>
    <comment_count>18</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2022-10-03 14:42:20 -0700</bug_when>
    <thetext>We&apos;ve been asking each other about whether this refactoring is done for 10+ years, I think it&apos;s time to stop.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52237</attachid>
            <date>2010-03-31 19:08:39 -0700</date>
            <delta_ts>2010-04-01 17:44:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-36921-20100331190835.patch</filename>
            <type>text/plain</type>
            <size>39315</size>
            <attacher name="James Robinson">jamesr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MDk2ZWUzOC4uNGJlMDVkYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyOSBAQAorMjAxMC0wMy0zMSAgSmFtZXMgUm9iaW5z
b24gIDxqYW1lc3JAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFNwbGl0cyBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lIGludG8g
c21hbGxlciBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTM2OTIxCisKKyAgICAgICAgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxk
cmVuIGlzIDM1MSBsaW5lcyBsb25nIGFuZCB2ZXJ5IGRpZmZpY3VsdAorICAgICAgICB0byBjb21w
cmVoZW5kIG9yIGVkaXQgc2FmZWx5LiBUaGlzIHBhdGNoIHNwbGl0cyBpdCB1cCBpbnRvIGEgZmV3
CisgICAgICAgIHNsaWdodGx5IHNtYWxsZXIgZnVuY3Rpb25zLiAgTW9zdCBvZiB0aGUgY29kZSBp
cyBub3cgaW4gdGhlIDI0MSBsaW5lCisgICAgICAgIGxheW91dFJ1bnNBbmRGbG9hdHMoKSB3aGlj
aCBpcyBhIHNsaWdodCBpbXByb3ZlbWVudC4KKworICAgICAgICBQZXJmIG5ldXRyYWwgb24gdGhl
IHBhZ2UgY3ljbGVycy4gIFRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IGZ1bmN0aW9uCisgICAg
ICAgIGNhbGxzIGludG8gdGhlIGhvdHRlc3QgbGF5b3V0IHBhdGhzIGluc2lkZSBsYXlvdXRSdW5z
QW5kRmxvYXRzIGFuZAorICAgICAgICBmaW5kTmV4dExpbmVCcmVhay4KKworICAgICAgICBObyBj
aGFuZ2UgaW4gYmVoYXZpb3IsIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9jay5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkZsb2F0V2l0aFJl
Y3Q6OkZsb2F0V2l0aFJlY3QpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVM
YXlvdXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxheW91dFJlcGxhY2Vk
RWxlbWVudHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hl
c0ZvclJlc29sdmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpsYXlvdXRSdW5z
QW5kRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVD
aGlsZHJlbik6CisKIDIwMTAtMDMtMjUgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrLmggYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5o
CmluZGV4IDE4NGY5ODMuLmNiMWU1MmYgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmgKKysrIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaApAQCAtMTQx
LDYgKzE0MSwyMCBAQCBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVj
dChpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCosIElubGluZUJpZGlSZXNvbHZlciYp
OyAgICAKICAgICBzdGF0aWMgYm9vbCByZXF1aXJlc0xpbmVCb3goY29uc3QgSW5saW5lSXRlcmF0
b3ImLCBib29sIGlzTGluZUVtcHR5ID0gdHJ1ZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkgPSB0cnVlKTsKIAorCisgICAgc3RydWN0IEZsb2F0V2l0aFJlY3QgeworICAgICAgICBGbG9h
dFdpdGhSZWN0KFJlbmRlckJveCogZikKKyAgICAgICAgICAgIDogb2JqZWN0KGYpCisgICAgICAg
ICAgICAsIHJlY3QoSW50UmVjdChmLT54KCkgLSBmLT5tYXJnaW5MZWZ0KCksIGYtPnkoKSAtIGYt
Pm1hcmdpblRvcCgpLCBmLT53aWR0aCgpICsgZi0+bWFyZ2luTGVmdCgpICsgZi0+bWFyZ2luUmln
aHQoKSwgZi0+aGVpZ2h0KCkgKyBmLT5tYXJnaW5Ub3AoKSArIGYtPm1hcmdpbkJvdHRvbSgpKSkK
KyAgICAgICAgICAgICwgZXZlckhhZExheW91dChmLT5tX2V2ZXJIYWRMYXlvdXQpCisgICAgICAg
IHsKKyAgICAgICAgfQorCisgICAgICAgIFJlbmRlckJveCogb2JqZWN0OworICAgICAgICBJbnRS
ZWN0IHJlY3Q7CisgICAgICAgIGJvb2wgZXZlckhhZExheW91dDsKKyAgICB9OworCiBwcm90ZWN0
ZWQ6CiAgICAgdm9pZCBtb3ZlQ2hpbGRUbyhSZW5kZXJPYmplY3QqIHRvLCBSZW5kZXJPYmplY3RD
aGlsZExpc3QqIHRvQ2hpbGRMaXN0LCBSZW5kZXJPYmplY3QqIGNoaWxkKTsKICAgICB2b2lkIG1v
dmVDaGlsZFRvKFJlbmRlck9iamVjdCogdG8sIFJlbmRlck9iamVjdENoaWxkTGlzdCogdG9DaGls
ZExpc3QsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlck9iamVjdCogY2hpbGQpOwpA
QCAtMjM1LDE5ICsyNDksNiBAQCBwcml2YXRlOgogICAgIC8vIENhbGxlZCB0byBsYXkgb3V0IHRo
ZSBsZWdlbmQgZm9yIGEgZmllbGRzZXQuCiAgICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91
dExlZ2VuZChib29sIC8qcmVsYXlvdXRDaGlsZHJlbiovKSB7IHJldHVybiAwOyB9CiAKLSAgICBz
dHJ1Y3QgRmxvYXRXaXRoUmVjdCB7Ci0gICAgICAgIEZsb2F0V2l0aFJlY3QoUmVuZGVyQm94KiBm
KQotICAgICAgICAgICAgOiBvYmplY3QoZikKLSAgICAgICAgICAgICwgcmVjdChJbnRSZWN0KGYt
PngoKSAtIGYtPm1hcmdpbkxlZnQoKSwgZi0+eSgpIC0gZi0+bWFyZ2luVG9wKCksIGYtPndpZHRo
KCkgKyBmLT5tYXJnaW5MZWZ0KCkgKyBmLT5tYXJnaW5SaWdodCgpLCBmLT5oZWlnaHQoKSArIGYt
Pm1hcmdpblRvcCgpICsgZi0+bWFyZ2luQm90dG9tKCkpKQotICAgICAgICAgICAgLCBldmVySGFk
TGF5b3V0KGYtPm1fZXZlckhhZExheW91dCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAg
ICAgUmVuZGVyQm94KiBvYmplY3Q7Ci0gICAgICAgIEludFJlY3QgcmVjdDsKLSAgICAgICAgYm9v
bCBldmVySGFkTGF5b3V0OwotICAgIH07Ci0KICAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9u
cycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgogICAg
IHZvaWQgYmlkaVJlb3JkZXJMaW5lKElubGluZUJpZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBlbmQsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICBSb290SW5s
aW5lQm94KiBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKGJvb2wmIGZpcnN0TGluZSwgYm9vbCYgZnVs
bExheW91dCwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LApAQCAtNDgzLDYgKzQ4NCwx
MiBAQCBwcml2YXRlOgogICAgIHZvaWQgc2V0Q29sbGFwc2VkQm90dG9tTWFyZ2luKGNvbnN0IE1h
cmdpbkluZm8mKTsKICAgICAvLyBFbmQgaGVscGVyIGZ1bmN0aW9ucyBhbmQgc3RydWN0cyB1c2Vk
IGJ5IGxheW91dEJsb2NrQ2hpbGRyZW4uCiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBs
YXlvdXRJbmxpbmVDaGlsZHJlbigpCisgICAgYm9vbCBsYXlvdXRSZXBsYWNlZEVsZW1lbnRzKGJv
b2wgcmVsYXlvdXRDaGlsZHJlbiwgYm9vbCBmdWxsTGF5b3V0LCBWZWN0b3I8RmxvYXRXaXRoUmVj
dD4mIGZsb2F0cyk7CisgICAgUm9vdElubGluZUJveCogY3JlYXRlTGluZUJveGVzRm9yUmVzb2x2
ZXIoY29uc3QgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGN1cnJlbnRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBib29sIGZpcnN0TGluZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHks
IEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4pOworICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0
cyhib29sIGZ1bGxMYXlvdXQsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzLCBpbnQmIHJl
cGFpbnRUb3AsIGludCYgcmVwYWludEJvdHRvbSk7CisKICAgICB0eXBlZGVmIExpc3RIYXNoU2V0
PFJlbmRlckJveCo+Ojpjb25zdF9pdGVyYXRvciBJdGVyYXRvcjsKICAgICBEZXByZWNhdGVkUHRy
TGlzdDxGbG9hdGluZ09iamVjdD4qIG1fZmxvYXRpbmdPYmplY3RzOwogICAgIExpc3RIYXNoU2V0
PFJlbmRlckJveCo+KiBtX3Bvc2l0aW9uZWRPYmplY3RzOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCBiL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrTGluZUxheW91dC5jcHAKaW5kZXggNmU4OTA2MC4uYjliYTg1ZSAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAorKysgYi9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCkBAIC01MTQsMzQ2ICs1MTQs
MzY5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0NvbGxhcHNpYmxlU3BhY2UoVUNoYXIgY2hhcmFj
dGVyLCBSZW5kZXJUZXh0KiByZW5kZXJlcikKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQg
UmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwg
aW50JiByZXBhaW50VG9wLCBpbnQmIHJlcGFpbnRCb3R0b20pCisvLyBUaGlzIGlzIGEgaGVscGVy
IGZvciBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4uICBJdCBpdGVyYXRlcyB0aHJv
dWdoIGEgUmVuZGVyQmxvY2sncyBpbmxpbmUgY2hpbGRyZW4KKy8vIGluIGJpZGkgb3JkZXIgYW5k
OgorLy8gIC0gY2FsbHMgbGF5b3V0SWZOZWVkZWQoKSBvbiBhbGwgcmVwbGFjZWQgY2hpbGRyZW4K
Ky8vICAtIGFzc2VtYmxlcyBhIGxpc3Qgb2YgZmxvYXRzIAorLy8gIC0gYWRkcyBhbGwgcG9zaXRp
b25lZCBjaGlsZHJlbiB0byB0aGVpciBjb250YWluaW5nIGJsb2NrJ3MgcG9zaXRpb25lZCBvYmpl
Y3Qgc2V0CisvLyAgLSBkaXJ0aWVzIGxpbmUgYm94ZXMgb24gaW5saW5lIGNoaWxkcmVuIGlmIGZ1
bGxMYXlvdXQgaXMgc2V0Citib29sIFJlbmRlckJsb2NrOjpsYXlvdXRSZXBsYWNlZEVsZW1lbnRz
KGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgYm9vbCBmdWxsTGF5b3V0LCBWZWN0b3I8RmxvYXRXaXRo
UmVjdD4mIGZsb2F0cykKIHsKLSAgICBib29sIHVzZVJlcGFpbnRCb3VuZHMgPSBmYWxzZTsKLSAg
ICAKLSAgICBtX292ZXJmbG93LmNsZWFyKCk7CisgICAgYm9vbCBlbmRPZklubGluZSA9IGZhbHNl
OworICAgIGJvb2wgaGFzSW5saW5lQ2hpbGQgPSBmYWxzZTsKKyAgICBSZW5kZXJPYmplY3QqIG8g
PSBiaWRpRmlyc3QodGhpcywgMCwgZmFsc2UpOworICAgIHdoaWxlIChvKSB7CisgICAgICAgIGlm
IChvLT5pc1JlcGxhY2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgp
KSB7CisgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KG8pOworICAgICAg
ICAgICAgCisgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53
aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQor
ICAgICAgICAgICAgICAgIG8tPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgcmVsYXlvdXRDaGlsZHJlbiBpcyBzZXQg
YW5kIHdlIGhhdmUgcGVyY2VudGFnZSBwYWRkaW5nLCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0
ZSB0aGUgY2hpbGQncyBwcmVmIHdpZHRocy4KKyAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxk
cmVuICYmIChvLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxl
KCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKKyAgICAgICAgICAgICAgICBvLT5zZXRQ
cmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOwogICAgICAgICAKLSAgICBzZXRIZWlnaHQoYm9y
ZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgp
ICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOworICAgICAg
ICAgICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQorICAgICAgICAgICAgICAgIG8tPmNvbnRhaW5p
bmdCbG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0KGJveCk7CisgICAgICAgICAgICBlbHNl
IHsKKyAgICAgICAgICAgICAgICBpZiAoby0+aXNGbG9hdGluZygpKQorICAgICAgICAgICAgICAg
ICAgICBmbG9hdHMuYXBwZW5kKFJlbmRlckJsb2NrOjpGbG9hdFdpdGhSZWN0KGJveCkpOworICAg
ICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bGxMYXlvdXQgfHwgby0+bmVlZHNMYXlvdXQoKSkgLy8g
UmVwbGFjZWQgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCb3gobyktPmRp
cnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOworCisgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZO
ZWVkZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSB8
fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7CisgICAgICAgICAgICBo
YXNJbmxpbmVDaGlsZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoZnVsbExheW91dCB8fCBvLT5z
ZWxmTmVlZHNMYXlvdXQoKSkKKyAgICAgICAgICAgICAgICBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRl
cmVyKG8sIGZ1bGxMYXlvdXQpOworICAgICAgICAgICAgby0+c2V0TmVlZHNMYXlvdXQoZmFsc2Up
OworICAgICAgICAgICAgaWYgKCFvLT5pc1RleHQoKSkKKyAgICAgICAgICAgICAgICB0b1JlbmRl
cklubGluZShvKS0+aW52YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24oKTsgLy8gRklYTUU6IFNob3Vs
ZCBkbyBiZXR0ZXIgaGVyZSBhbmQgbm90IGFsd2F5cyBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcuCisg
ICAgICAgIH0KKyAgICAgICAgbyA9IGJpZGlOZXh0KHRoaXMsIG8sIDAsIGZhbHNlLCAmZW5kT2ZJ
bmxpbmUpOworICAgIH0KKyAgICByZXR1cm4gaGFzSW5saW5lQ2hpbGQ7Cit9CiAKLSAgICAvLyBG
aWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCi0gICAgLy8g
RklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKLSAgICBib29sIGZ1bGxMYXlvdXQgPSAh
Zmlyc3RMaW5lQm94KCkgfHwgc2VsZk5lZWRzTGF5b3V0KCkgfHwgcmVsYXlvdXRDaGlsZHJlbjsK
LSAgICBpZiAoZnVsbExheW91dCkKLSAgICAgICAgbGluZUJveGVzKCktPmRlbGV0ZUxpbmVCb3hl
cyhyZW5kZXJBcmVuYSgpKTsKKy8vIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyBsaW5lIGJveGVz
IGZvciBhbGwgb2YgdGhlIHRleHQgcnVucyBpbiB0aGUgcmVzb2x2ZXIgYW5kIGNvbXB1dGVzIHRo
ZWlyIHBvc2l0aW9uLgorUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hl
c0ZvclJlc29sdmVyKGNvbnN0IElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBjdXJyZW50UG9zaXRpb24sIGJvb2wgZmlyc3RMaW5lLCBib29sIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1bikKK3sKKyAgICBS
b290SW5saW5lQm94KiBsaW5lQm94ID0gMDsKKyAgICBpZiAocmVzb2x2ZXIucnVuQ291bnQoKSkg
eworICAgICAgICBsaW5lQm94ID0gY29uc3RydWN0TGluZShyZXNvbHZlci5ydW5Db3VudCgpLCBy
ZXNvbHZlci5maXJzdFJ1bigpLCByZXNvbHZlci5sYXN0UnVuKCksIGZpcnN0TGluZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIWN1cnJlbnRQb3NpdGlvbi5vYmosIGN1cnJlbnRQ
b3NpdGlvbi5vYmogJiYgIWN1cnJlbnRQb3NpdGlvbi5wb3MgPyBjdXJyZW50UG9zaXRpb24ub2Jq
IDogMCk7CisgICAgICAgIGlmIChsaW5lQm94KSB7CisgICAgICAgICAgICBsaW5lQm94LT5zZXRF
bmRzV2l0aEJyZWFrKHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAKLSAgICAvLyBUZXh0IHRy
dW5jYXRpb24gb25seSBraWNrcyBpbiBpZiB5b3VyIG92ZXJmbG93IGlzbid0IHZpc2libGUgYW5k
IHlvdXIgdGV4dC1vdmVyZmxvdy1tb2RlIGlzbid0Ci0gICAgLy8gY2xpcC4KLSAgICAvLyBGSVhN
RTogQ1NTMyBzYXlzIHRoYXQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY2xpcHBlZCBtdXN0IGFsc28g
a25vdyBob3cgdG8gdHJ1bmNhdGUuICBUaGlzIGlzIGluc2FuZWx5Ci0gICAgLy8gZGlmZmljdWx0
IHRvIGZpZ3VyZSBvdXQgKGVzcGVjaWFsbHkgaW4gdGhlIG1pZGRsZSBvZiBkb2luZyBsYXlvdXQp
LCBhbmQgaXMgcmVhbGx5IGFuIGVzb3RlcmljIHBpbGUgb2Ygbm9uc2Vuc2UKLSAgICAvLyBhbnl3
YXksIHNvIHdlIHdvbid0IHdvcnJ5IGFib3V0IGZvbGxvd2luZyB0aGUgZHJhZnQgaGVyZS4KLSAg
ICBib29sIGhhc1RleHRPdmVyZmxvdyA9IHN0eWxlKCktPnRleHRPdmVyZmxvdygpICYmIGhhc092
ZXJmbG93Q2xpcCgpOworICAgICAgICAgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIg
dGV4dCBydW5zIGhvcml6b250YWxseS4KKyAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsUG9z
aXRpb25zRm9yTGluZShsaW5lQm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0UnVuKCksIHRy
YWlsaW5nU3BhY2VSdW4sIGN1cnJlbnRQb3NpdGlvbi5hdEVuZCgpKTsKIAotICAgIC8vIFdhbGsg
YWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlmIHRoZXkg
ZXhpc3QuCi0gICAgaWYgKGhhc1RleHRPdmVyZmxvdykKLSAgICAgICAgIGRlbGV0ZUVsbGlwc2lz
TGluZUJveGVzKCk7CisgICAgICAgICAgICAvLyBOb3cgcG9zaXRpb24gb3VyIHRleHQgcnVucyB2
ZXJ0aWNhbGx5LgorICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZShs
aW5lQm94LCByZXNvbHZlci5maXJzdFJ1bigpKTsKIAotICAgIGlmIChmaXJzdENoaWxkKCkpIHsK
LSAgICAgICAgLy8gbGF5b3V0IHJlcGxhY2VkIGVsZW1lbnRzCi0gICAgICAgIGJvb2wgZW5kT2ZJ
bmxpbmUgPSBmYWxzZTsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBvID0gYmlkaUZpcnN0KHRoaXMs
IDAsIGZhbHNlKTsKLSAgICAgICAgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+IGZsb2F0czsKLSAgICAg
ICAgYm9vbCBoYXNJbmxpbmVDaGlsZCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAobykgewotICAg
ICAgICAgICAgaWYgKG8tPmlzUmVwbGFjZWQoKSB8fCBvLT5pc0Zsb2F0aW5nKCkgfHwgby0+aXNQ
b3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVy
Qm94KG8pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENo
aWxkcmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+
aGVpZ2h0KCkuaXNQZXJjZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIG8tPnNldENoaWxkTmVl
ZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdl
IHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lk
dGhzLgotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgp
LT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgp
LmlzUGVyY2VudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5
KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChvLT5pc1Bv
c2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgby0+Y29udGFpbmluZ0Jsb2NrKCktPmlu
c2VydFBvc2l0aW9uZWRPYmplY3QoYm94KTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKG8tPmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGZsb2F0cy5hcHBlbmQoRmxvYXRXaXRoUmVjdChib3gpKTsKLSAgICAgICAgICAgICAgICAg
ICAgZWxzZSBpZiAoZnVsbExheW91dCB8fCBvLT5uZWVkc0xheW91dCgpKSAvLyBSZXBsYWNlZCBl
bGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCb3gobyktPmRpcnR5TGlu
ZUJveGVzKGZ1bGxMYXlvdXQpOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICAvLyBTcGVj
aWFsIFNWRyB0ZXh0IGxheW91dCBjb2RlCisgICAgICAgICAgICBsaW5lQm94LT5jb21wdXRlUGVy
Q2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKTsKKyNlbmRpZgogCi0gICAgICAgICAgICAgICAg
ICAgIG8tPmxheW91dElmTmVlZGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fSBlbHNlIGlmIChvLT5pc1RleHQoKSB8fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJ
bmxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgaGFzSW5saW5lQ2hpbGQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgIGlmIChmdWxsTGF5b3V0IHx8IG8tPnNlbGZOZWVkc0xheW91dCgpKQotICAgICAg
ICAgICAgICAgICAgICBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRlcmVyKG8sIGZ1bGxMYXlvdXQpOwot
ICAgICAgICAgICAgICAgIG8tPnNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLSAgICAgICAgICAgICAg
ICBpZiAoIW8tPmlzVGV4dCgpKQotICAgICAgICAgICAgICAgICAgICB0b1JlbmRlcklubGluZShv
KS0+aW52YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24oKTsgLy8gRklYTUU6IFNob3VsZCBkbyBiZXR0
ZXIgaGVyZSBhbmQgbm90IGFsd2F5cyBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcuCi0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBvID0gYmlkaU5leHQodGhpcywgbywgMCwgZmFsc2UsICZlbmRPZklu
bGluZSk7CisjaWYgUExBVEZPUk0oTUFDKQorICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IGFjdHMg
YXMgYW4gb3ZlcmZsb3cgaW5mbGF0aW9uLgorICAgICAgICAgICAgaWYgKHN0eWxlKCktPmhpZ2hs
aWdodCgpICE9IG51bGxBdG9tKQorICAgICAgICAgICAgICAgIGxpbmVCb3gtPmFkZEhpZ2hsaWdo
dE92ZXJmbG93KCk7CisjZW5kaWYKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyBXZSB3
YW50IHRvIHNraXAgYWhlYWQgdG8gdGhlIGZpcnN0IGRpcnR5IGxpbmUKLSAgICAgICAgSW5saW5l
QmlkaVJlc29sdmVyIHJlc29sdmVyOwotICAgICAgICB1bnNpZ25lZCBmbG9hdEluZGV4OwotICAg
ICAgICBib29sIGZpcnN0TGluZSA9IHRydWU7Ci0gICAgICAgIGJvb2wgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5ID0gdHJ1ZTsKLSAgICAgICAgUm9vdElubGluZUJveCogc3RhcnRMaW5lID0gZGV0
ZXJtaW5lU3RhcnRQb3NpdGlvbihmaXJzdExpbmUsIGZ1bGxMYXlvdXQsIHByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSwgcmVzb2x2ZXIsIGZsb2F0cywgZmxvYXRJbmRleCk7Ci0KLSAgICAgICAgaWYg
KGZ1bGxMYXlvdXQgJiYgaGFzSW5saW5lQ2hpbGQgJiYgIXNlbGZOZWVkc0xheW91dCgpKSB7Ci0g
ICAgICAgICAgICBzZXROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7ICAvLyBNYXJrIG91cnNlbHZl
cyBhcyBuZWVkaW5nIGEgZnVsbCBsYXlvdXQuIFRoaXMgd2F5IHdlJ2xsIHJlcGFpbnQgbGlrZQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3VwcG9z
ZWQgdG8uCi0gICAgICAgICAgICBSZW5kZXJWaWV3KiB2ID0gdmlldygpOwotICAgICAgICAgICAg
aWYgKHYgJiYgIXYtPmRvaW5nRnVsbFJlcGFpbnQoKSAmJiBoYXNMYXllcigpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gQmVjYXVzZSB3ZSB3YWl0ZWQgdW50aWwgd2Ugd2VyZSBhbHJlYWR5IGluc2lk
ZSBsYXlvdXQgdG8gZGlzY292ZXIKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBibG9jayBy
ZWFsbHkgbmVlZGVkIGEgZnVsbCBsYXlvdXQsIHdlIG1pc3NlZCBvdXIgY2hhbmNlIHRvIHJlcGFp
bnQgdGhlIGxheWVyCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGxheW91dCBzdGFydGVkLiAg
THVja2lseSB0aGUgbGF5ZXIgaGFzIGNhY2hlZCB0aGUgcmVwYWludCByZWN0IGZvciBpdHMgb3Jp
Z2luYWwKLSAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQgc2l6ZSwgYW5kIHNvIHdlIGNh
biB1c2UgdGhhdCB0byBtYWtlIGEgcmVwYWludCBoYXBwZW4gbm93LgotICAgICAgICAgICAgICAg
IHJlcGFpbnRVc2luZ0NvbnRhaW5lcihjb250YWluZXJGb3JSZXBhaW50KCksIGxheWVyKCktPnJl
cGFpbnRSZWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgcmV0dXJuIGxpbmVC
b3g7Cit9CiAKLSAgICAgICAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdCA9IG1fZmxvYXRpbmdP
YmplY3RzID8gbV9mbG9hdGluZ09iamVjdHMtPmxhc3QoKSA6IDA7Cit2b2lkIFJlbmRlckJsb2Nr
OjpsYXlvdXRSdW5zQW5kRmxvYXRzKGJvb2wgZnVsbExheW91dCwgVmVjdG9yPEZsb2F0V2l0aFJl
Y3Q+JiBmbG9hdHMsIGludCYgcmVwYWludFRvcCwgaW50JiByZXBhaW50Qm90dG9tKQoreworICAg
IC8vIFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3QgZGlydHkgbGluZQorICAgIElu
bGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKKyAgICB1bnNpZ25lZCBmbG9hdEluZGV4OworICAg
IGJvb2wgZmlyc3RMaW5lID0gdHJ1ZTsKKyAgICBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5s
eSA9IHRydWU7CisgICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CisgICAgCisgICAg
Um9vdElubGluZUJveCogc3RhcnRMaW5lID0gZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihmaXJzdExp
bmUsIGZ1bGxMYXlvdXQsIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgcmVzb2x2ZXIsIGZsb2F0
cywgZmxvYXRJbmRleCk7CiAKLSAgICAgICAgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2lu
dFN0YXRlID0gcmVzb2x2ZXIubWlkcG9pbnRTdGF0ZSgpOworICAgIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXQgPSBtX2Zsb2F0aW5nT2JqZWN0cyA/IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0KCkg
OiAwOwogCi0gICAgICAgIC8vIFdlIGFsc28gZmluZCB0aGUgZmlyc3QgY2xlYW4gbGluZSBhbmQg
ZXh0cmFjdCB0aGVzZSBsaW5lcy4gIFdlIHdpbGwgYWRkIHRoZW0gYmFjawotICAgICAgICAvLyBp
ZiB3ZSBkZXRlcm1pbmUgdGhhdCB3ZSdyZSBhYmxlIHRvIHN5bmNocm9uaXplIGFmdGVyIGhhbmRs
aW5nIGFsbCBvdXIgZGlydHkgbGluZXMuCi0gICAgICAgIElubGluZUl0ZXJhdG9yIGNsZWFuTGlu
ZVN0YXJ0OwotICAgICAgICBCaWRpU3RhdHVzIGNsZWFuTGluZUJpZGlTdGF0dXM7Ci0gICAgICAg
IGludCBlbmRMaW5lWVBvcyA9IDA7Ci0gICAgICAgIFJvb3RJbmxpbmVCb3gqIGVuZExpbmUgPSAo
ZnVsbExheW91dCB8fCAhc3RhcnRMaW5lKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgMCA6IGRldGVybWluZUVuZFBvc2l0aW9uKHN0YXJ0TGluZSwgY2xlYW5MaW5lU3RhcnQs
IGNsZWFuTGluZUJpZGlTdGF0dXMsIGVuZExpbmVZUG9zKTsKKyAgICBMaW5lTWlkcG9pbnRTdGF0
ZSYgbGluZU1pZHBvaW50U3RhdGUgPSByZXNvbHZlci5taWRwb2ludFN0YXRlKCk7CiAKLSAgICAg
ICAgaWYgKHN0YXJ0TGluZSkgewotICAgICAgICAgICAgdXNlUmVwYWludEJvdW5kcyA9IHRydWU7
Ci0gICAgICAgICAgICByZXBhaW50VG9wID0gaGVpZ2h0KCk7Ci0gICAgICAgICAgICByZXBhaW50
Qm90dG9tID0gaGVpZ2h0KCk7Ci0gICAgICAgICAgICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZW5k
ZXJBcmVuYSgpOwotICAgICAgICAgICAgUm9vdElubGluZUJveCogYm94ID0gc3RhcnRMaW5lOwot
ICAgICAgICAgICAgd2hpbGUgKGJveCkgewotICAgICAgICAgICAgICAgIHJlcGFpbnRUb3AgPSBt
aW4ocmVwYWludFRvcCwgYm94LT50b3BWaXNpYmxlT3ZlcmZsb3coKSk7Ci0gICAgICAgICAgICAg
ICAgcmVwYWludEJvdHRvbSA9IG1heChyZXBhaW50Qm90dG9tLCBib3gtPmJvdHRvbVZpc2libGVP
dmVyZmxvdygpKTsKLSAgICAgICAgICAgICAgICBSb290SW5saW5lQm94KiBuZXh0ID0gYm94LT5u
ZXh0Um9vdEJveCgpOwotICAgICAgICAgICAgICAgIGJveC0+ZGVsZXRlTGluZShhcmVuYSk7Ci0g
ICAgICAgICAgICAgICAgYm94ID0gbmV4dDsKLSAgICAgICAgICAgIH0KKyAgICAvLyBXZSBhbHNv
IGZpbmQgdGhlIGZpcnN0IGNsZWFuIGxpbmUgYW5kIGV4dHJhY3QgdGhlc2UgbGluZXMuICBXZSB3
aWxsIGFkZCB0aGVtIGJhY2sKKyAgICAvLyBpZiB3ZSBkZXRlcm1pbmUgdGhhdCB3ZSdyZSBhYmxl
IHRvIHN5bmNocm9uaXplIGFmdGVyIGhhbmRsaW5nIGFsbCBvdXIgZGlydHkgbGluZXMuCisgICAg
SW5saW5lSXRlcmF0b3IgY2xlYW5MaW5lU3RhcnQ7CisgICAgQmlkaVN0YXR1cyBjbGVhbkxpbmVC
aWRpU3RhdHVzOworICAgIGludCBlbmRMaW5lWVBvcyA9IDA7CisgICAgUm9vdElubGluZUJveCog
ZW5kTGluZSA9IChmdWxsTGF5b3V0IHx8ICFzdGFydExpbmUpID8gCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDAgOiBkZXRlcm1pbmVFbmRQb3NpdGlvbihzdGFydExpbmUsIGNsZWFuTGlu
ZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzLCBlbmRMaW5lWVBvcyk7CisKKyAgICBpZiAoc3Rh
cnRMaW5lKSB7CisgICAgICAgIHVzZVJlcGFpbnRCb3VuZHMgPSB0cnVlOworICAgICAgICByZXBh
aW50VG9wID0gaGVpZ2h0KCk7CisgICAgICAgIHJlcGFpbnRCb3R0b20gPSBoZWlnaHQoKTsKKyAg
ICAgICAgUmVuZGVyQXJlbmEqIGFyZW5hID0gcmVuZGVyQXJlbmEoKTsKKyAgICAgICAgUm9vdElu
bGluZUJveCogYm94ID0gc3RhcnRMaW5lOworICAgICAgICB3aGlsZSAoYm94KSB7CisgICAgICAg
ICAgICByZXBhaW50VG9wID0gbWluKHJlcGFpbnRUb3AsIGJveC0+dG9wVmlzaWJsZU92ZXJmbG93
KCkpOworICAgICAgICAgICAgcmVwYWludEJvdHRvbSA9IG1heChyZXBhaW50Qm90dG9tLCBib3gt
PmJvdHRvbVZpc2libGVPdmVyZmxvdygpKTsKKyAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIG5l
eHQgPSBib3gtPm5leHRSb290Qm94KCk7CisgICAgICAgICAgICBib3gtPmRlbGV0ZUxpbmUoYXJl
bmEpOworICAgICAgICAgICAgYm94ID0gbmV4dDsKICAgICAgICAgfQorICAgIH0KIAotICAgICAg
ICBJbmxpbmVJdGVyYXRvciBlbmQgPSByZXNvbHZlci5wb3NpdGlvbigpOwotCi0gICAgICAgIGlm
ICghZnVsbExheW91dCAmJiBsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmVuZHNXaXRo
QnJlYWsoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgbGluZSBiZWZvcmUgdGhlIHN0
YXJ0IGxpbmUgZW5kcyB3aXRoIGEgbGluZSBicmVhayB0aGF0IGNsZWFyIGZsb2F0cywKLSAgICAg
ICAgICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5LgotICAgICAgICAgICAgLy8g
QSBsaW5lIGJyZWFrIGNhbiBiZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHRoZSBsYXN0IG9iamVjdCBv
biBhIGxpbmUsIGRlcGVuZGluZyBvbiBpdHMgZGlyZWN0aW9uLgotICAgICAgICAgICAgaWYgKElu
bGluZUJveCogbGFzdExlYWZDaGlsZCA9IGxhc3RSb290Qm94KCktPmxhc3RMZWFmQ2hpbGQoKSkg
ewotICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9IGxhc3RMZWFmQ2hp
bGQtPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0LT5pc0JSKCkp
Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RPYmplY3QgPSBsYXN0Um9vdEJveCgpLT5maXJzdExl
YWZDaGlsZCgpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0T2JqZWN0LT5p
c0JSKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRUNsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+
c3R5bGUoKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IENOT05F
KQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGluZShjbGVhcik7Ci0gICAgICAgICAgICAg
ICAgfQorICAgIElubGluZUl0ZXJhdG9yIGN1cnJlbnRQb3NpdGlvbiA9IHJlc29sdmVyLnBvc2l0
aW9uKCk7CisKKyAgICBpZiAoIWZ1bGxMYXlvdXQgJiYgbGFzdFJvb3RCb3goKSAmJiBsYXN0Um9v
dEJveCgpLT5lbmRzV2l0aEJyZWFrKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGxhc3QgbGluZSBi
ZWZvcmUgdGhlIHN0YXJ0IGxpbmUgZW5kcyB3aXRoIGEgbGluZSBicmVhayB0aGF0IGNsZWFyIGZs
b2F0cywKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBoZWlnaHQgYWNjb3JkaW5nbHkuCisgICAgICAg
IC8vIEEgbGluZSBicmVhayBjYW4gYmUgZWl0aGVyIHRoZSBmaXJzdCBvciB0aGUgbGFzdCBvYmpl
Y3Qgb24gYSBsaW5lLCBkZXBlbmRpbmcgb24gaXRzIGRpcmVjdGlvbi4KKyAgICAgICAgaWYgKElu
bGluZUJveCogbGFzdExlYWZDaGlsZCA9IGxhc3RSb290Qm94KCktPmxhc3RMZWFmQ2hpbGQoKSkg
eworICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBsYXN0T2JqZWN0ID0gbGFzdExlYWZDaGlsZC0+
cmVuZGVyZXIoKTsKKyAgICAgICAgICAgIGlmICghbGFzdE9iamVjdC0+aXNCUigpKQorICAgICAg
ICAgICAgICAgIGxhc3RPYmplY3QgPSBsYXN0Um9vdEJveCgpLT5maXJzdExlYWZDaGlsZCgpLT5y
ZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKGxhc3RPYmplY3QtPmlzQlIoKSkgeworICAgICAg
ICAgICAgICAgIEVDbGVhciBjbGVhciA9IGxhc3RPYmplY3QtPnN0eWxlKCktPmNsZWFyKCk7Cisg
ICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IENOT05FKQorICAgICAgICAgICAgICAgICAgICBu
ZXdMaW5lKGNsZWFyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KIAotICAgICAg
ICBib29sIGVuZExpbmVNYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgY2hlY2tGb3JFbmRM
aW5lTWF0Y2ggPSBlbmRMaW5lOwotICAgICAgICBib29sIGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RM
aW5lID0gZmFsc2U7CisgICAgYm9vbCBlbmRMaW5lTWF0Y2hlZCA9IGZhbHNlOworICAgIGJvb2wg
Y2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBlbmRMaW5lOworICAgIGJvb2wgY2hlY2tGb3JGbG9hdHNG
cm9tTGFzdExpbmUgPSBmYWxzZTsKIAotICAgICAgICBib29sIGlzTGluZUVtcHR5ID0gdHJ1ZTsK
KyAgICBib29sIGlzTGluZUVtcHR5ID0gdHJ1ZTsKIAotICAgICAgICB3aGlsZSAoIWVuZC5hdEVu
ZCgpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogSXMgdGhpcyBjaGVjayBuZWNlc3NhcnkgYmVm
b3JlIHRoZSBmaXJzdCBpdGVyYXRpb24gb3IgY2FuIGl0IGJlIG1vdmVkIHRvIHRoZSBlbmQ/Ci0g
ICAgICAgICAgICBpZiAoY2hlY2tGb3JFbmRMaW5lTWF0Y2ggJiYgKGVuZExpbmVNYXRjaGVkID0g
bWF0Y2hlZEVuZExpbmUocmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3Rh
dHVzLCBlbmRMaW5lLCBlbmRMaW5lWVBvcywgcmVwYWludEJvdHRvbSwgcmVwYWludFRvcCkpKQot
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgIHdoaWxlICghY3VycmVudFBvc2l0aW9uLmF0RW5k
KCkpIHsKKyAgICAgICAgLy8gRklYTUU6IElzIHRoaXMgY2hlY2sgbmVjZXNzYXJ5IGJlZm9yZSB0
aGUgZmlyc3QgaXRlcmF0aW9uIG9yIGNhbiBpdCBiZSBtb3ZlZCB0byB0aGUgZW5kPworICAgICAg
ICBpZiAoY2hlY2tGb3JFbmRMaW5lTWF0Y2ggJiYgKGVuZExpbmVNYXRjaGVkID0gbWF0Y2hlZEVu
ZExpbmUocmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzLCBlbmRM
aW5lLCBlbmRMaW5lWVBvcywgcmVwYWludEJvdHRvbSwgcmVwYWludFRvcCkpKQorICAgICAgICAg
ICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLnJlc2V0KCk7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIGlzTGluZUVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgRUNsZWFyIGNsZWFyID0gQ05PTkU7Ci0gICAgICAgICAgICBlbmQgPSBmaW5k
TmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5LCAmY2xlYXIpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0
aW9uKCkuYXRFbmQoKSkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsK
LSAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQoZW5k
ICE9IHJlc29sdmVyLnBvc2l0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAoIWlzTGluZUVtcHR5
KSB7Ci0gICAgICAgICAgICAgICAgYmlkaVJlb3JkZXJMaW5lKHJlc29sdmVyLCBlbmQsIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJlc29sdmVyLnBv
c2l0aW9uKCkgPT0gZW5kKTsKLQotICAgICAgICAgICAgICAgIEJpZGlSdW4qIHRyYWlsaW5nU3Bh
Y2VSdW4gPSAwOwotICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
ICYmIHJlc29sdmVyLnJ1bkNvdW50KCkgJiYgcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1bigpLT5t
X29iamVjdC0+c3R5bGUoKS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkKLSAgICAgICAgICAg
ICAgICAgICAgICAgICYmIHJlc29sdmVyLmxvZ2ljYWxseUxhc3RSdW4oKS0+bV9vYmplY3QtPnN0
eWxlKCktPmF1dG9XcmFwKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1
biA9IHJlc29sdmVyLmxvZ2ljYWxseUxhc3RSdW4oKTsKLSAgICAgICAgICAgICAgICAgICAgUmVu
ZGVyT2JqZWN0KiBsYXN0T2JqZWN0ID0gdHJhaWxpbmdTcGFjZVJ1bi0+bV9vYmplY3Q7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChsYXN0T2JqZWN0LT5pc1RleHQoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyVGV4dCogbGFzdFRleHQgPSB0b1JlbmRlclRleHQobGFzdE9iamVj
dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IGxh
c3RUZXh0LT5jaGFyYWN0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RT
cGFjZSA9IHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHdoaWxlIChmaXJzdFNwYWNlID4gdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0U3Bh
Y2UgLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2libGVT
cGFjZShjdXJyZW50LCBsYXN0VGV4dCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3BhY2UtLTsKKyAgICAg
ICAgbGluZU1pZHBvaW50U3RhdGUucmVzZXQoKTsKKyAgICAgICAgCisgICAgICAgIGlzTGluZUVt
cHR5ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIEVDbGVhciBjbGVhciA9IENOT05FOworICAg
ICAgICBjdXJyZW50UG9zaXRpb24gPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RM
aW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAmY2xlYXIpOworICAg
ICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CisgICAgICAgICAgICByZXNv
bHZlci5kZWxldGVSdW5zKCk7CisgICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGlu
ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQo
Y3VycmVudFBvc2l0aW9uICE9IHJlc29sdmVyLnBvc2l0aW9uKCkpOworCisgICAgICAgIGlmICgh
aXNMaW5lRW1wdHkpIHsKKyAgICAgICAgICAgIGJpZGlSZW9yZGVyTGluZShyZXNvbHZlciwgY3Vy
cmVudFBvc2l0aW9uLCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOworICAgICAgICAgICAgQVNT
RVJUKHJlc29sdmVyLnBvc2l0aW9uKCkgPT0gY3VycmVudFBvc2l0aW9uKTsKKworICAgICAgICAg
ICAgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biA9IDA7CisgICAgICAgICAgICBpZiAoIXByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSAmJiByZXNvbHZlci5ydW5Db3VudCgpICYmIHJlc29sdmVyLmxv
Z2ljYWxseUxhc3RSdW4oKS0+bV9vYmplY3QtPnN0eWxlKCktPmJyZWFrT25seUFmdGVyV2hpdGVT
cGFjZSgpCisgICAgICAgICAgICAgICAgICAgICYmIHJlc29sdmVyLmxvZ2ljYWxseUxhc3RSdW4o
KS0+bV9vYmplY3QtPnN0eWxlKCktPmF1dG9XcmFwKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFp
bGluZ1NwYWNlUnVuID0gcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1bigpOworICAgICAgICAgICAg
ICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9IHRyYWlsaW5nU3BhY2VSdW4tPm1fb2JqZWN0
OworICAgICAgICAgICAgICAgIGlmIChsYXN0T2JqZWN0LT5pc1RleHQoKSkgeworICAgICAgICAg
ICAgICAgICAgICBSZW5kZXJUZXh0KiBsYXN0VGV4dCA9IHRvUmVuZGVyVGV4dChsYXN0T2JqZWN0
KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSBsYXN0VGV4
dC0+Y2hhcmFjdGVycygpOworICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RTcGFjZSA9IHRy
YWlsaW5nU3BhY2VSdW4tPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZpcnN0
U3BhY2UgPiB0cmFpbGluZ1NwYWNlUnVuLT5zdGFydCgpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBVQ2hhciBjdXJyZW50ID0gY2hhcmFjdGVyc1tmaXJzdFNwYWNlIC0gMV07CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2libGVTcGFjZShjdXJyZW50LCBsYXN0VGV4
dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgICAgICBmaXJzdFNwYWNlLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGZpcnN0U3BhY2UgPT0gdHJhaWxpbmdTcGFjZVJ1bi0+c3RvcCgpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IDA7CisgICAgICAgICAgICAg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXJl
Y3Rpb24gPSBzdHlsZSgpLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgc2hvdWxkUmVvcmRlciA9IHRyYWlsaW5nU3BhY2VSdW4gIT0gKGRpcmVjdGlvbiA9PSBMVFIg
PyByZXNvbHZlci5sYXN0UnVuKCkgOiByZXNvbHZlci5maXJzdFJ1bigpKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChmaXJzdFNwYWNlICE9IHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWRpQ29udGV4dCogYmFzZUNvbnRleHQg
PSByZXNvbHZlci5jb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUg
KEJpZGlDb250ZXh0KiBwYXJlbnQgPSBiYXNlQ29udGV4dC0+cGFyZW50KCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJhc2VDb250ZXh0ID0gcGFyZW50OworCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgQmlkaVJ1biogbmV3VHJhaWxpbmdSdW4gPSBuZXcgKHJlbmRlckFy
ZW5hKCkpIEJpZGlSdW4oZmlyc3RTcGFjZSwgdHJhaWxpbmdTcGFjZVJ1bi0+bV9zdG9wLCB0cmFp
bGluZ1NwYWNlUnVuLT5tX29iamVjdCwgYmFzZUNvbnRleHQsIE90aGVyTmV1dHJhbCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9zdG9wID0gZmlyc3RT
cGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IExUUikK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIuYWRkUnVuKG5ld1RyYWls
aW5nUnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnByZXBlbmRSdW4obmV3VHJhaWxpbmdSdW4pOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4gPSBuZXdUcmFpbGlu
Z1J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZW9yZGVyID0gZmFsc2U7
CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAo
Zmlyc3RTcGFjZSA9PSB0cmFpbGluZ1NwYWNlUnVuLT5zdG9wKCkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRpcmVj
dGlvbiA9IHN0eWxlKCktPmRpcmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJvb2wgc2hvdWxkUmVvcmRlciA9IHRyYWlsaW5nU3BhY2VSdW4gIT0gKGRpcmVjdGlvbiA9PSBM
VFIgPyByZXNvbHZlci5sYXN0UnVuKCkgOiByZXNvbHZlci5maXJzdFJ1bigpKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTcGFjZSAhPSB0cmFpbGluZ1NwYWNlUnVuLT5z
dGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZGlDb250ZXh0KiBi
YXNlQ29udGV4dCA9IHJlc29sdmVyLmNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgd2hpbGUgKEJpZGlDb250ZXh0KiBwYXJlbnQgPSBiYXNlQ29udGV4dC0+cGFyZW50
KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlQ29udGV4dCA9IHBh
cmVudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWRpUnVuKiBuZXdUcmFp
bGluZ1J1biA9IG5ldyAocmVuZGVyQXJlbmEoKSkgQmlkaVJ1bihmaXJzdFNwYWNlLCB0cmFpbGlu
Z1NwYWNlUnVuLT5tX3N0b3AsIHRyYWlsaW5nU3BhY2VSdW4tPm1fb2JqZWN0LCBiYXNlQ29udGV4
dCwgT3RoZXJOZXV0cmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxp
bmdTcGFjZVJ1bi0+bV9zdG9wID0gZmlyc3RTcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMVFIpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXNvbHZlci5hZGRSdW4obmV3VHJhaWxpbmdSdW4pOwotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXNvbHZlci5wcmVwZW5kUnVuKG5ld1RyYWlsaW5nUnVuKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IG5ld1RyYWlsaW5nUnVuOwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZW9yZGVyID0gZmFsc2U7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChzaG91bGRSZW9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChk
aXJlY3Rpb24gPT0gTFRSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXNvbHZlci5tb3ZlUnVuVG9FbmQodHJhaWxpbmdTcGFjZVJ1bik7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX2xldmVsID0gMDsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlc29sdmVyLm1vdmVSdW5Ub0JlZ2lubmluZyh0cmFpbGluZ1NwYWNl
UnVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VS
dW4tPm1fbGV2ZWwgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUmVvcmRlcikgeworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTFRSKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJlc29sdmVyLm1vdmVSdW5Ub0VuZCh0cmFpbGluZ1NwYWNlUnVuKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9sZXZlbCA9
IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIubW92ZVJ1blRvQmVnaW5uaW5nKHRyYWlsaW5nU3Bh
Y2VSdW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVu
LT5tX2xldmVsID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
ICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgdGhlIHJ1bnMgaGF2ZSBiZWVuIG9yZGVyZWQsIHdl
IGNyZWF0ZSB0aGUgbGluZSBib3hlcy4KLSAgICAgICAgICAgICAgICAvLyBBdCB0aGUgc2FtZSB0
aW1lIHdlIGZpZ3VyZSBvdXQgd2hlcmUgYm9yZGVyL3BhZGRpbmcvbWFyZ2luIHNob3VsZCBiZSBh
cHBsaWVkIGZvcgotICAgICAgICAgICAgICAgIC8vIGlubGluZSBmbG93IGJveGVzLgotCi0gICAg
ICAgICAgICAgICAgUm9vdElubGluZUJveCogbGluZUJveCA9IDA7Ci0gICAgICAgICAgICAgICAg
aWYgKHJlc29sdmVyLnJ1bkNvdW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJveCA9
IGNvbnN0cnVjdExpbmUocmVzb2x2ZXIucnVuQ291bnQoKSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwg
cmVzb2x2ZXIubGFzdFJ1bigpLCBmaXJzdExpbmUsICFlbmQub2JqLCBlbmQub2JqICYmICFlbmQu
cG9zID8gZW5kLm9iaiA6IDApOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJveCkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+c2V0RW5kc1dpdGhCcmVhayhwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2Ug
cG9zaXRpb24gYWxsIG9mIG91ciB0ZXh0IHJ1bnMgaG9yaXpvbnRhbGx5LgotICAgICAgICAgICAg
ICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGZp
cnN0TGluZSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5k
KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgcG9zaXRpb24gb3VyIHRleHQg
cnVucyB2ZXJ0aWNhbGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2Fs
UG9zaXRpb25zRm9yTGluZShsaW5lQm94LCByZXNvbHZlci5maXJzdFJ1bigpKTsKLQotI2lmIEVO
QUJMRShTVkcpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIFNWRyB0ZXh0IGxh
eW91dCBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lQm94LT5jb21wdXRlUGVyQ2hh
cmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKTsKLSNlbmRpZgotCi0jaWYgUExBVEZPUk0oTUFDKQot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IGFjdHMgYXMgYW4gb3ZlcmZsb3cg
aW5mbGF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlKCktPmhpZ2hsaWdo
dCgpICE9IG51bGxBdG9tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPmFk
ZEhpZ2hsaWdodE92ZXJmbG93KCk7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsK
LQotICAgICAgICAgICAgICAgIGlmIChsaW5lQm94KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxp
bmVCb3gtPnNldExpbmVCcmVha0luZm8oZW5kLm9iaiwgZW5kLnBvcywgcmVzb2x2ZXIuc3RhdHVz
KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodXNlUmVwYWludEJvdW5kcykgewotICAgICAg
ICAgICAgICAgICAgICAgICAgcmVwYWludFRvcCA9IG1pbihyZXBhaW50VG9wLCBsaW5lQm94LT50
b3BWaXNpYmxlT3ZlcmZsb3coKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBhaW50Qm90
dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmVCb3gtPmJvdHRvbVZpc2libGVPdmVyZmxvdygp
KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIGZpcnN0TGluZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG5ld0xpbmUoY2xlYXIp
OworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1Nw
YWNlUnVuID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1fZmxvYXRpbmdP
YmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGFzdEZsb2F0
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0
aW5nT2JqZWN0cy0+bGFzdCgpOyBmICE9IGxhc3RGbG9hdDsgZiA9IG1fZmxvYXRpbmdPYmplY3Rz
LT5wcmV2KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBt
X2Zsb2F0aW5nT2JqZWN0cy0+bmV4dCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAg
ICAgICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+Zmlyc3QoKTsKLSAgICAgICAgICAgICAg
ICBmb3IgKEZsb2F0aW5nT2JqZWN0KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmN1cnJlbnQoKTsg
ZjsgZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
bGFzdFJvb3RCb3goKS0+ZmxvYXRzKCkuYXBwZW5kKGYtPm1fcmVuZGVyZXIpOwotICAgICAgICAg
ICAgICAgICAgICBBU1NFUlQoZi0+bV9yZW5kZXJlciA9PSBmbG9hdHNbZmxvYXRJbmRleF0ub2Jq
ZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBmbG9hdCdzIGdlb21ldHJ5IGhhcyBj
aGFuZ2VkLCBnaXZlIHVwIG9uIHN5bmNpbmcgd2l0aCBjbGVhbiBsaW5lcy4KLSAgICAgICAgICAg
ICAgICAgICAgaWYgKGZsb2F0c1tmbG9hdEluZGV4XS5yZWN0ICE9IEludFJlY3QoZi0+bV9sZWZ0
LCBmLT5tX3RvcCwgZi0+bV93aWR0aCwgZi0+bV9ib3R0b20gLSBmLT5tX3RvcCkpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGZhbHNlOwotICAgICAgICAg
ICAgICAgICAgICBmbG9hdEluZGV4Kys7CisgICAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgcnVu
cyBoYXZlIGJlZW4gb3JkZXJlZCwgd2UgY3JlYXRlIHRoZSBsaW5lIGJveGVzLgorICAgICAgICAg
ICAgUm9vdElubGluZUJveCogbGluZUJveCA9IGNyZWF0ZUxpbmVCb3hlc0ZvclJlc29sdmVyKHJl
c29sdmVyLCBjdXJyZW50UG9zaXRpb24sIGZpcnN0TGluZSwgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5LCB0cmFpbGluZ1NwYWNlUnVuKTsKKyAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMo
KTsKKworICAgICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSBmaWd1cmUgb3V0IHdoZXJl
IGJvcmRlci9wYWRkaW5nL21hcmdpbiBzaG91bGQgYmUgYXBwbGllZCBmb3IKKyAgICAgICAgICAg
IC8vIGlubGluZSBmbG93IGJveGVzLgorICAgICAgICAgICAgaWYgKGxpbmVCb3gpIHsKKyAgICAg
ICAgICAgICAgICBsaW5lQm94LT5zZXRMaW5lQnJlYWtJbmZvKGN1cnJlbnRQb3NpdGlvbi5vYmos
IGN1cnJlbnRQb3NpdGlvbi5wb3MsIHJlc29sdmVyLnN0YXR1cygpKTsKKyAgICAgICAgICAgICAg
ICBpZiAodXNlUmVwYWludEJvdW5kcykgeworICAgICAgICAgICAgICAgICAgICByZXBhaW50VG9w
ID0gbWluKHJlcGFpbnRUb3AsIGxpbmVCb3gtPnRvcFZpc2libGVPdmVyZmxvdygpKTsKKyAgICAg
ICAgICAgICAgICAgICAgcmVwYWludEJvdHRvbSA9IG1heChyZXBhaW50Qm90dG9tLCBsaW5lQm94
LT5ib3R0b21WaXNpYmxlT3ZlcmZsb3coKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIGxhc3RGbG9hdCA9IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0KCk7CiAgICAgICAgICAg
ICB9CiAKLSAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLnJlc2V0KCk7Ci0gICAgICAgICAg
ICByZXNvbHZlci5zZXRQb3NpdGlvbihlbmQpOworICAgICAgICAgICAgZmlyc3RMaW5lID0gZmFs
c2U7CisgICAgICAgICAgICBuZXdMaW5lKGNsZWFyKTsKICAgICAgICAgfQogCi0gICAgICAgIGlm
IChlbmRMaW5lKSB7Ci0gICAgICAgICAgICBpZiAoZW5kTGluZU1hdGNoZWQpIHsKLSAgICAgICAg
ICAgICAgICAvLyBBdHRhY2ggYWxsIHRoZSByZW1haW5pbmcgbGluZXMsIGFuZCB0aGVuIGFkanVz
dCB0aGVpciB5LXBvc2l0aW9ucyBhcyBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaW50IGRlbHRh
ID0gaGVpZ2h0KCkgLSBlbmRMaW5lWVBvczsKLSAgICAgICAgICAgICAgICBmb3IgKFJvb3RJbmxp
bmVCb3gqIGxpbmUgPSBlbmRMaW5lOyBsaW5lOyBsaW5lID0gbGluZS0+bmV4dFJvb3RCb3goKSkg
ewotICAgICAgICAgICAgICAgICAgICBsaW5lLT5hdHRhY2hMaW5lKCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChkZWx0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWludFRvcCA9
IG1pbihyZXBhaW50VG9wLCBsaW5lLT50b3BWaXNpYmxlT3ZlcmZsb3coKSArIG1pbihkZWx0YSwg
MCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWludEJvdHRvbSA9IG1heChyZXBhaW50
Qm90dG9tLCBsaW5lLT5ib3R0b21WaXNpYmxlT3ZlcmZsb3coKSArIG1heChkZWx0YSwgMCkpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgbGluZS0+YWRqdXN0UG9zaXRpb24oMCwgZGVsdGEpOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChWZWN0b3I8UmVu
ZGVyQm94Kj4qIGNsZWFuTGluZUZsb2F0cyA9IGxpbmUtPmZsb2F0c1B0cigpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFu
TGluZUZsb2F0cy0+ZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFZlY3RvcjxS
ZW5kZXJCb3gqPjo6aXRlcmF0b3IgZiA9IGNsZWFuTGluZUZsb2F0cy0+YmVnaW4oKTsgZiAhPSBl
bmQ7ICsrZikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbG9hdFRvcCA9ICgq
ZiktPnkoKSAtICgqZiktPm1hcmdpblRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGluc2VydEZsb2F0aW5nT2JqZWN0KCpmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
ZXRIZWlnaHQoZmxvYXRUb3AgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cG9zaXRpb25OZXdGbG9hdHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRIZWln
aHQobGFzdFJvb3RCb3goKS0+YmxvY2tIZWlnaHQoKSk7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgdGhlIHJlbWFpbmluZyBsaW5lcy4KLSAgICAg
ICAgICAgICAgICBSb290SW5saW5lQm94KiBsaW5lID0gZW5kTGluZTsKLSAgICAgICAgICAgICAg
ICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZW5kZXJBcmVuYSgpOwotICAgICAgICAgICAgICAgIHdo
aWxlIChsaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFpbnRUb3AgPSBtaW4ocmVwYWlu
dFRvcCwgbGluZS0+dG9wVmlzaWJsZU92ZXJmbG93KCkpOwotICAgICAgICAgICAgICAgICAgICBy
ZXBhaW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmUtPmJvdHRvbVZpc2libGVPdmVy
ZmxvdygpKTsKLSAgICAgICAgICAgICAgICAgICAgUm9vdElubGluZUJveCogbmV4dCA9IGxpbmUt
Pm5leHRSb290Qm94KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUtPmRlbGV0ZUxpbmUoYXJl
bmEpOwotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbmV4dDsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3Rz
ICYmIChjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSB8fCBwb3NpdGlvbk5ld0Zsb2F0cygpKSAm
JiBsYXN0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9h
dCBvbiB0aGUgbGFzdCBsaW5lLCBpdCBtaWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cu
Ci0gICAgICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBhZGRpbmcgaW4gdGhl
IGJvdHRvbSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0IHdpbGwKLSAgICAgICAgICAgIC8v
IGluY2x1ZGUgdGhlIHBhZGRpbmcgaW5jb3JyZWN0bHkuIC1kd2gKLSAgICAgICAgICAgIGlmIChj
aGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b21W
aXN1YWxPdmVyZmxvdyA9IGxhc3RSb290Qm94KCktPmJvdHRvbVZpc3VhbE92ZXJmbG93KCk7Ci0g
ICAgICAgICAgICAgICAgaW50IGJvdHRvbUxheW91dE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+
Ym90dG9tTGF5b3V0T3ZlcmZsb3coKTsKLSAgICAgICAgICAgICAgICBUcmFpbGluZ0Zsb2F0c1Jv
b3RJbmxpbmVCb3gqIHRyYWlsaW5nRmxvYXRzTGluZUJveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkg
VHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94KHRoaXMpOwotICAgICAgICAgICAgICAgIG1fbGlu
ZUJveGVzLmFwcGVuZExpbmVCb3godHJhaWxpbmdGbG9hdHNMaW5lQm94KTsKLSAgICAgICAgICAg
ICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldENvbnN0cnVjdGVkKCk7Ci0gICAgICAgICAg
ICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT52ZXJ0aWNhbGx5QWxpZ25Cb3hlcyhoZWlnaHQo
KSk7Ci0gICAgICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRWZXJ0aWNhbE92
ZXJmbG93UG9zaXRpb25zKGhlaWdodCgpLCBib3R0b21MYXlvdXRPdmVyZmxvdywgaGVpZ2h0KCks
IGJvdHRvbVZpc3VhbE92ZXJmbG93LCAwKTsKLSAgICAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0
c0xpbmVCb3gtPnNldEJsb2NrSGVpZ2h0KGhlaWdodCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAg
ICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKICAgICAgICAgICAg
IGlmIChsYXN0RmxvYXQpIHsKICAgICAgICAgICAgICAgICBmb3IgKEZsb2F0aW5nT2JqZWN0KiBm
ID0gbV9mbG9hdGluZ09iamVjdHMtPmxhc3QoKTsgZiAhPSBsYXN0RmxvYXQ7IGYgPSBtX2Zsb2F0
aW5nT2JqZWN0cy0+cHJldigpKSB7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
IG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCk7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAg
ICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+Zmlyc3QoKTsKLSAgICAgICAgICAgIGZvciAoRmxv
YXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+Y3VycmVudCgpOyBmOyBmID0gbV9m
bG9hdGluZ09iamVjdHMtPm5leHQoKSkKKyAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3Qq
IGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+Y3VycmVudCgpOyBmOyBmID0gbV9mbG9hdGluZ09iamVj
dHMtPm5leHQoKSkgewogICAgICAgICAgICAgICAgIGxhc3RSb290Qm94KCktPmZsb2F0cygpLmFw
cGVuZChmLT5tX3JlbmRlcmVyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoZi0+bV9yZW5kZXJl
ciA9PSBmbG9hdHNbZmxvYXRJbmRleF0ub2JqZWN0KTsKKyAgICAgICAgICAgICAgICAvLyBJZiBh
IGZsb2F0J3MgZ2VvbWV0cnkgaGFzIGNoYW5nZWQsIGdpdmUgdXAgb24gc3luY2luZyB3aXRoIGNs
ZWFuIGxpbmVzLgorICAgICAgICAgICAgICAgIGlmIChmbG9hdHNbZmxvYXRJbmRleF0ucmVjdCAh
PSBJbnRSZWN0KGYtPm1fbGVmdCwgZi0+bV90b3AsIGYtPm1fd2lkdGgsIGYtPm1fYm90dG9tIC0g
Zi0+bV90b3ApKQorICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGZh
bHNlOworICAgICAgICAgICAgICAgIGZsb2F0SW5kZXgrKzsKKyAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIGxhc3RGbG9hdCA9IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0KCk7CiAgICAgICAgIH0K
LSAgICAgICAgc2l6ZV90IGZsb2F0Q291bnQgPSBmbG9hdHMuc2l6ZSgpOwotICAgICAgICAvLyBG
bG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVwYWludCB3aGVuIHdlIGxh
aWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQotICAgICAgICAvLyBwYWludGVkIGJ5IG5vdyBp
ZiB0aGV5IGhhZCBtb3ZlZCwgYnV0IGlmIHRoZXkgc3RheWVkIGF0ICgwLCAwKSwgdGhleSBzdGls
bCBuZWVkIHRvIGJlCi0gICAgICAgIC8vIHBhaW50ZWQuCi0gICAgICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgZmxvYXRDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoIWZsb2F0c1tpXS5l
dmVySGFkTGF5b3V0KSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyQm94KiBmID0gZmxvYXRzW2ld
Lm9iamVjdDsKLSAgICAgICAgICAgICAgICBpZiAoIWYtPngoKSAmJiAhZi0+eSgpICYmIGYtPmNo
ZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAgICAgICAgICAgICAgICBmLT5yZXBh
aW50KCk7CisKKyAgICAgICAgbGluZU1pZHBvaW50U3RhdGUucmVzZXQoKTsKKyAgICAgICAgcmVz
b2x2ZXIuc2V0UG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoZW5k
TGluZSkgeworICAgICAgICBpZiAoZW5kTGluZU1hdGNoZWQpIHsKKyAgICAgICAgICAgIC8vIEF0
dGFjaCBhbGwgdGhlIHJlbWFpbmluZyBsaW5lcywgYW5kIHRoZW4gYWRqdXN0IHRoZWlyIHktcG9z
aXRpb25zIGFzIG5lZWRlZC4KKyAgICAgICAgICAgIGludCBkZWx0YSA9IGhlaWdodCgpIC0gZW5k
TGluZVlQb3M7CisgICAgICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBlbmRMaW5l
OyBsaW5lOyBsaW5lID0gbGluZS0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGxp
bmUtPmF0dGFjaExpbmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEpIHsKKyAgICAgICAg
ICAgICAgICAgICAgcmVwYWludFRvcCA9IG1pbihyZXBhaW50VG9wLCBsaW5lLT50b3BWaXNpYmxl
T3ZlcmZsb3coKSArIG1pbihkZWx0YSwgMCkpOworICAgICAgICAgICAgICAgICAgICByZXBhaW50
Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmUtPmJvdHRvbVZpc2libGVPdmVyZmxvdygp
ICsgbWF4KGRlbHRhLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUtPmFkanVzdFBvc2l0
aW9uKDAsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFZl
Y3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRzUHRyKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBlbmQgPSBj
bGVhbkxpbmVGbG9hdHMtPmVuZCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFZlY3RvcjxS
ZW5kZXJCb3gqPjo6aXRlcmF0b3IgZiA9IGNsZWFuTGluZUZsb2F0cy0+YmVnaW4oKTsgZiAhPSBl
bmQ7ICsrZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsb2F0VG9wID0gKCpmKS0+
eSgpIC0gKCpmKS0+bWFyZ2luVG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRG
bG9hdGluZ09iamVjdCgqZik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRIZWlnaHQoZmxv
YXRUb3AgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0
cygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICAgICAgc2V0SGVpZ2h0KGxhc3RSb290Qm94KCktPmJsb2NrSGVpZ2h0KCkp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCB0aGUgcmVtYWlu
aW5nIGxpbmVzLgorICAgICAgICAgICAgUm9vdElubGluZUJveCogbGluZSA9IGVuZExpbmU7Cisg
ICAgICAgICAgICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZW5kZXJBcmVuYSgpOworICAgICAgICAg
ICAgd2hpbGUgKGxpbmUpIHsKKyAgICAgICAgICAgICAgICByZXBhaW50VG9wID0gbWluKHJlcGFp
bnRUb3AsIGxpbmUtPnRvcFZpc2libGVPdmVyZmxvdygpKTsKKyAgICAgICAgICAgICAgICByZXBh
aW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmUtPmJvdHRvbVZpc2libGVPdmVyZmxv
dygpKTsKKyAgICAgICAgICAgICAgICBSb290SW5saW5lQm94KiBuZXh0ID0gbGluZS0+bmV4dFJv
b3RCb3goKTsKKyAgICAgICAgICAgICAgICBsaW5lLT5kZWxldGVMaW5lKGFyZW5hKTsKKyAgICAg
ICAgICAgICAgICBsaW5lID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0K
KyAgICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgKGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5l
IHx8IHBvc2l0aW9uTmV3RmxvYXRzKCkpICYmIGxhc3RSb290Qm94KCkpIHsKKyAgICAgICAgLy8g
SW4gY2FzZSB3ZSBoYXZlIGEgZmxvYXQgb24gdGhlIGxhc3QgbGluZSwgaXQgbWlnaHQgbm90IGJl
IHBvc2l0aW9uZWQgdXAgdG8gbm93LgorICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGJl
Zm9yZSBhZGRpbmcgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0IHdp
bGwKKyAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFkZGluZyBpbmNvcnJlY3RseS4gLWR3aAorICAg
ICAgICBpZiAoY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUpIHsKKyAgICAgICAgICAgIGludCBi
b3R0b21WaXN1YWxPdmVyZmxvdyA9IGxhc3RSb290Qm94KCktPmJvdHRvbVZpc3VhbE92ZXJmbG93
KCk7CisgICAgICAgICAgICBpbnQgYm90dG9tTGF5b3V0T3ZlcmZsb3cgPSBsYXN0Um9vdEJveCgp
LT5ib3R0b21MYXlvdXRPdmVyZmxvdygpOworICAgICAgICAgICAgVHJhaWxpbmdGbG9hdHNSb290
SW5saW5lQm94KiB0cmFpbGluZ0Zsb2F0c0xpbmVCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkpIFRy
YWlsaW5nRmxvYXRzUm9vdElubGluZUJveCh0aGlzKTsKKyAgICAgICAgICAgIG1fbGluZUJveGVz
LmFwcGVuZExpbmVCb3godHJhaWxpbmdGbG9hdHNMaW5lQm94KTsKKyAgICAgICAgICAgIHRyYWls
aW5nRmxvYXRzTGluZUJveC0+c2V0Q29uc3RydWN0ZWQoKTsKKyAgICAgICAgICAgIHRyYWlsaW5n
RmxvYXRzTGluZUJveC0+dmVydGljYWxseUFsaWduQm94ZXMoaGVpZ2h0KCkpOworICAgICAgICAg
ICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRWZXJ0aWNhbE92ZXJmbG93UG9zaXRpb25zKGhl
aWdodCgpLCBib3R0b21MYXlvdXRPdmVyZmxvdywgaGVpZ2h0KCksIGJvdHRvbVZpc3VhbE92ZXJm
bG93LCAwKTsKKyAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0QmxvY2tIZWln
aHQoaGVpZ2h0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0RmxvYXQpIHsKKyAgICAg
ICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bGFzdCgp
OyBmICE9IGxhc3RGbG9hdDsgZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5wcmV2KCkpIHsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCk7CisgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPmZpcnN0KCk7CisgICAgICAg
IGZvciAoRmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+Y3VycmVudCgpOyBm
OyBmID0gbV9mbG9hdGluZ09iamVjdHMtPm5leHQoKSkKKyAgICAgICAgICAgIGxhc3RSb290Qm94
KCktPmZsb2F0cygpLmFwcGVuZChmLT5tX3JlbmRlcmVyKTsKKyAgICAgICAgbGFzdEZsb2F0ID0g
bV9mbG9hdGluZ09iamVjdHMtPmxhc3QoKTsKKyAgICB9CisgICAgc2l6ZV90IGZsb2F0Q291bnQg
PSBmbG9hdHMuc2l6ZSgpOworICAgIC8vIEZsb2F0cyB0aGF0IGRpZCBub3QgaGF2ZSBsYXlvdXQg
ZGlkIG5vdCByZXBhaW50IHdoZW4gd2UgbGFpZCB0aGVtIG91dC4gVGhleSB3b3VsZCBoYXZlCisg
ICAgLy8gcGFpbnRlZCBieSBub3cgaWYgdGhleSBoYWQgbW92ZWQsIGJ1dCBpZiB0aGV5IHN0YXll
ZCBhdCAoMCwgMCksIHRoZXkgc3RpbGwgbmVlZCB0byBiZQorICAgIC8vIHBhaW50ZWQuCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbG9hdENvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKCFm
bG9hdHNbaV0uZXZlckhhZExheW91dCkgeworICAgICAgICAgICAgUmVuZGVyQm94KiBmID0gZmxv
YXRzW2ldLm9iamVjdDsKKyAgICAgICAgICAgIGlmICghZi0+eCgpICYmICFmLT55KCkgJiYgZi0+
Y2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpCisgICAgICAgICAgICAgICAgZi0+cmVwYWlu
dCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihib29sIHJlbGF5b3V0Q2hpbGRyZW4sIGludCYgcmVwYWludFRvcCwgaW50JiBy
ZXBhaW50Qm90dG9tKQoreworICAgIG1fb3ZlcmZsb3cuY2xlYXIoKTsKKyAgICAgICAgCisgICAg
c2V0SGVpZ2h0KGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpKTsKKyAgICBpbnQgdG9BZGQgPSBi
b3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhvcml6b250YWxTY3JvbGxiYXJIZWln
aHQoKTsKKworICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBvdXIgbGlu
ZSBib3hlcy4KKyAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQorICAgIGJv
b2wgZnVsbExheW91dCA9ICFmaXJzdExpbmVCb3goKSB8fCBzZWxmTmVlZHNMYXlvdXQoKSB8fCBy
ZWxheW91dENoaWxkcmVuOworICAgIGlmIChmdWxsTGF5b3V0KQorICAgICAgICBsaW5lQm94ZXMo
KS0+ZGVsZXRlTGluZUJveGVzKHJlbmRlckFyZW5hKCkpOworCisgICAgLy8gVGV4dCB0cnVuY2F0
aW9uIG9ubHkga2lja3MgaW4gaWYgeW91ciBvdmVyZmxvdyBpc24ndCB2aXNpYmxlIGFuZCB5b3Vy
IHRleHQtb3ZlcmZsb3ctbW9kZSBpc24ndAorICAgIC8vIGNsaXAuCisgICAgLy8gRklYTUU6IENT
UzMgc2F5cyB0aGF0IGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNsaXBwZWQgbXVzdCBhbHNvIGtub3cg
aG93IHRvIHRydW5jYXRlLiAgVGhpcyBpcyBpbnNhbmVseQorICAgIC8vIGRpZmZpY3VsdCB0byBm
aWd1cmUgb3V0IChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2YgZG9pbmcgbGF5b3V0KSwgYW5k
IGlzIHJlYWxseSBhbiBlc290ZXJpYyBwaWxlIG9mIG5vbnNlbnNlCisgICAgLy8gYW55d2F5LCBz
byB3ZSB3b24ndCB3b3JyeSBhYm91dCBmb2xsb3dpbmcgdGhlIGRyYWZ0IGhlcmUuCisgICAgYm9v
bCBoYXNUZXh0T3ZlcmZsb3cgPSBzdHlsZSgpLT50ZXh0T3ZlcmZsb3coKSAmJiBoYXNPdmVyZmxv
d0NsaXAoKTsKKworICAgIC8vIFdhbGsgYWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91ciBlbGxp
cHNpcyBsaW5lIGJveGVzIGlmIHRoZXkgZXhpc3QuCisgICAgaWYgKGhhc1RleHRPdmVyZmxvdykK
KyAgICAgICAgIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CisKKyAgICBpZiAoZmlyc3RDaGls
ZCgpKSB7CisgICAgICAgIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiBmbG9hdHM7CisgICAgICAgIGJv
b2wgaGFzSW5saW5lQ2hpbGQgPSBsYXlvdXRSZXBsYWNlZEVsZW1lbnRzKHJlbGF5b3V0Q2hpbGRy
ZW4sIGZ1bGxMYXlvdXQsIGZsb2F0cyk7CisKKyAgICAgICAgaWYgKGZ1bGxMYXlvdXQgJiYgaGFz
SW5saW5lQ2hpbGQgJiYgIXNlbGZOZWVkc0xheW91dCgpKSB7CisgICAgICAgICAgICBzZXROZWVk
c0xheW91dCh0cnVlLCBmYWxzZSk7ICAvLyBNYXJrIG91cnNlbHZlcyBhcyBuZWVkaW5nIGEgZnVs
bCBsYXlvdXQuIFRoaXMgd2F5IHdlJ2xsIHJlcGFpbnQgbGlrZQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3VwcG9zZWQgdG8uCisgICAgICAgICAg
ICBSZW5kZXJWaWV3KiB2ID0gdmlldygpOworICAgICAgICAgICAgaWYgKHYgJiYgIXYtPmRvaW5n
RnVsbFJlcGFpbnQoKSAmJiBoYXNMYXllcigpKSB7CisgICAgICAgICAgICAgICAgLy8gQmVjYXVz
ZSB3ZSB3YWl0ZWQgdW50aWwgd2Ugd2VyZSBhbHJlYWR5IGluc2lkZSBsYXlvdXQgdG8gZGlzY292
ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBibG9jayByZWFsbHkgbmVlZGVkIGEgZnVs
bCBsYXlvdXQsIHdlIG1pc3NlZCBvdXIgY2hhbmNlIHRvIHJlcGFpbnQgdGhlIGxheWVyCisgICAg
ICAgICAgICAgICAgLy8gYmVmb3JlIGxheW91dCBzdGFydGVkLiAgTHVja2lseSB0aGUgbGF5ZXIg
aGFzIGNhY2hlZCB0aGUgcmVwYWludCByZWN0IGZvciBpdHMgb3JpZ2luYWwKKyAgICAgICAgICAg
ICAgICAvLyBwb3NpdGlvbiBhbmQgc2l6ZSwgYW5kIHNvIHdlIGNhbiB1c2UgdGhhdCB0byBtYWtl
IGEgcmVwYWludCBoYXBwZW4gbm93LgorICAgICAgICAgICAgICAgIHJlcGFpbnRVc2luZ0NvbnRh
aW5lcihjb250YWluZXJGb3JSZXBhaW50KCksIGxheWVyKCktPnJlcGFpbnRSZWN0KCkpOwogICAg
ICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgbGF5b3V0UnVuc0FuZEZsb2F0cyhmdWxs
TGF5b3V0LCBmbG9hdHMsIHJlcGFpbnRUb3AsIHJlcGFpbnRCb3R0b20pOwogICAgIH0KIAogICAg
IC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZy4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52357</attachid>
            <date>2010-04-01 17:44:32 -0700</date>
            <delta_ts>2010-06-11 12:36:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-36921-20100401174426.patch</filename>
            <type>text/plain</type>
            <size>37449</size>
            <attacher name="James Robinson">jamesr</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OTkzNmM1My4uYTc4MTk1NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyOSBAQAorMjAxMC0wNC0wMSAgSmFtZXMgUm9iaW5z
b24gIDxqYW1lc3JAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFNwbGl0cyBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lIGludG8g
c21hbGxlciBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTM2OTIxCisKKyAgICAgICAgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxk
cmVuIGlzIDM1MSBsaW5lcyBsb25nIGFuZCB2ZXJ5IGRpZmZpY3VsdAorICAgICAgICB0byBjb21w
cmVoZW5kIG9yIGVkaXQgc2FmZWx5LiBUaGlzIHBhdGNoIHNwbGl0cyBpdCB1cCBpbnRvIGEgZmV3
CisgICAgICAgIHNsaWdodGx5IHNtYWxsZXIgZnVuY3Rpb25zLiAgTW9zdCBvZiB0aGUgY29kZSBp
cyBub3cgaW4gdGhlIDI0MSBsaW5lCisgICAgICAgIGxheW91dFJ1bnNBbmRGbG9hdHMoKSB3aGlj
aCBpcyBhIHNsaWdodCBpbXByb3ZlbWVudC4KKworICAgICAgICBQZXJmIG5ldXRyYWwgb24gdGhl
IHBhZ2UgY3ljbGVycy4gIFRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IGZ1bmN0aW9uCisgICAg
ICAgIGNhbGxzIGludG8gdGhlIGhvdHRlc3QgbGF5b3V0IHBhdGhzIGluc2lkZSBsYXlvdXRSdW5z
QW5kRmxvYXRzIGFuZAorICAgICAgICBmaW5kTmV4dExpbmVCcmVhay4KKworICAgICAgICBObyBj
aGFuZ2UgaW4gYmVoYXZpb3IsIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9jay5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkZsb2F0V2l0aFJl
Y3Q6OkZsb2F0V2l0aFJlY3QpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVM
YXlvdXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxheW91dFJlcGxhY2Vk
RWxlbWVudHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hl
c0ZvclJlc29sdmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpsYXlvdXRSdW5z
QW5kRmxvYXRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVD
aGlsZHJlbik6CisKIDIwMTAtMDQtMDEgIFZpdGFseSBSZXBlc2hrbyAgPHZpdGFseXJAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEZpc2hlci4KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmggYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9jay5oCmluZGV4IDE4NGY5ODMuLmMxNjlkOTAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgKKysrIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2su
aApAQCAtNDgzLDYgKzQ4MywxMSBAQCBwcml2YXRlOgogICAgIHZvaWQgc2V0Q29sbGFwc2VkQm90
dG9tTWFyZ2luKGNvbnN0IE1hcmdpbkluZm8mKTsKICAgICAvLyBFbmQgaGVscGVyIGZ1bmN0aW9u
cyBhbmQgc3RydWN0cyB1c2VkIGJ5IGxheW91dEJsb2NrQ2hpbGRyZW4uCiAKKyAgICAvLyBIZWxw
ZXIgZnVuY3Rpb25zIGZvciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCisgICAgYm9vbCBsYXlvdXRS
ZXBsYWNlZEVsZW1lbnRzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgYm9vbCBmdWxsTGF5b3V0LCBW
ZWN0b3I8RmxvYXRXaXRoUmVjdD4mKTsKKyAgICBSb290SW5saW5lQm94KiBjcmVhdGVMaW5lQm94
ZXNGb3JSZXNvbHZlcihjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVy
YXRvciYgcG9zaXRpb24sIGJvb2wgZmlyc3RMaW5lLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1bik7CisgICAgdm9pZCBsYXlvdXRSdW5zQW5k
RmxvYXRzKGJvb2wgZnVsbExheW91dCwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiwgaW50JiByZXBh
aW50VG9wLCBpbnQmIHJlcGFpbnRCb3R0b20pOworCiAgICAgdHlwZWRlZiBMaXN0SGFzaFNldDxS
ZW5kZXJCb3gqPjo6Y29uc3RfaXRlcmF0b3IgSXRlcmF0b3I7CiAgICAgRGVwcmVjYXRlZFB0ckxp
c3Q8RmxvYXRpbmdPYmplY3Q+KiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBMaXN0SGFzaFNldDxS
ZW5kZXJCb3gqPiogbV9wb3NpdGlvbmVkT2JqZWN0czsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmluZGV4IDZlODkwNjAuLjZiYWRhNzYgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKysrIGIvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcApAQCAtNTE0LDM0NiArNTE0LDM2
OSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3Rl
ciwgUmVuZGVyVGV4dCogcmVuZGVyZXIpCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihib29sIHJlbGF5b3V0Q2hpbGRyZW4sIGlu
dCYgcmVwYWludFRvcCwgaW50JiByZXBhaW50Qm90dG9tKQorLy8gVGhpcyBpcyBhIGhlbHBlciBm
b3IgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuLiAgSXQgaXRlcmF0ZXMgdGhyb3Vn
aCBhIFJlbmRlckJsb2NrJ3MgaW5saW5lIGNoaWxkcmVuCisvLyBpbiBiaWRpIG9yZGVyIGFuZDoK
Ky8vICAtIGNhbGxzIGxheW91dElmTmVlZGVkKCkgb24gYWxsIHJlcGxhY2VkIGNoaWxkcmVuCisv
LyAgLSBhc3NlbWJsZXMgYSBsaXN0IG9mIGZsb2F0cyAKKy8vICAtIGFkZHMgYWxsIHBvc2l0aW9u
ZWQgY2hpbGRyZW4gdG8gdGhlaXIgY29udGFpbmluZyBibG9jaydzIHBvc2l0aW9uZWQgb2JqZWN0
IHNldAorLy8gIC0gZGlydGllcyBsaW5lIGJveGVzIG9uIGlubGluZSBjaGlsZHJlbiBpZiBmdWxs
TGF5b3V0IGlzIHNldAorYm9vbCBSZW5kZXJCbG9jazo6bGF5b3V0UmVwbGFjZWRFbGVtZW50cyhi
b29sIHJlbGF5b3V0Q2hpbGRyZW4sIGJvb2wgZnVsbExheW91dCwgVmVjdG9yPEZsb2F0V2l0aFJl
Y3Q+JiBmbG9hdHMpCiB7Ci0gICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7Ci0gICAg
Ci0gICAgbV9vdmVyZmxvdy5jbGVhcigpOworICAgIGJvb2wgZW5kT2ZJbmxpbmUgPSBmYWxzZTsK
KyAgICBib29sIGhhc0lubGluZUNoaWxkID0gZmFsc2U7CisgICAgLy8gRklYTUU6IFVzZSBhIG1v
cmUgZGVzY3JpcHRpdmUgdmFyaWFibGUgbmFtZSBhbmQgdXNlIGEgZm9yIGxvb3AgaW5zdGVhZCBv
ZiB3aGlsZSBoZXJlLgorICAgIFJlbmRlck9iamVjdCogbyA9IGJpZGlGaXJzdCh0aGlzLCAwLCBm
YWxzZSk7CisgICAgd2hpbGUgKG8pIHsKKyAgICAgICAgaWYgKG8tPmlzUmVwbGFjZWQoKSB8fCBv
LT5pc0Zsb2F0aW5nKCkgfHwgby0+aXNQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgIFJlbmRl
ckJveCogYm94ID0gdG9SZW5kZXJCb3gobyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlm
IChyZWxheW91dENoaWxkcmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCkuaXNQZXJjZW50KCkgfHwg
by0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkpCisgICAgICAgICAgICAgICAgby0+c2V0
Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdl
IHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lk
dGhzLgorICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gJiYgKG8tPnN0eWxlKCktPnBh
ZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQ
ZXJjZW50KCkpKQorICAgICAgICAgICAgICAgIG8tPnNldFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBm
YWxzZSk7CiAgICAgICAgIAotICAgIHNldEhlaWdodChib3JkZXJUb3AoKSArIHBhZGRpbmdUb3Ao
KSk7Ci0gICAgaW50IHRvQWRkID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBo
b3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoby0+aXNQb3NpdGlv
bmVkKCkpCisgICAgICAgICAgICAgICAgby0+Y29udGFpbmluZ0Jsb2NrKCktPmluc2VydFBvc2l0
aW9uZWRPYmplY3QoYm94KTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlm
IChvLT5pc0Zsb2F0aW5nKCkpCisgICAgICAgICAgICAgICAgICAgIGZsb2F0cy5hcHBlbmQoUmVu
ZGVyQmxvY2s6OkZsb2F0V2l0aFJlY3QoYm94KSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAo
ZnVsbExheW91dCB8fCBvLT5uZWVkc0xheW91dCgpKSAvLyBSZXBsYWNlZCBlbGVtZW50cworICAg
ICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91
dCk7CisKKyAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAg
fQorICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1JlbmRlcklubGluZSgp
ICYmICFlbmRPZklubGluZSkpIHsKKyAgICAgICAgICAgIGhhc0lubGluZUNoaWxkID0gdHJ1ZTsK
KyAgICAgICAgICAgIGlmIChmdWxsTGF5b3V0IHx8IG8tPnNlbGZOZWVkc0xheW91dCgpKQorICAg
ICAgICAgICAgICAgIGRpcnR5TGluZUJveGVzRm9yUmVuZGVyZXIobywgZnVsbExheW91dCk7Cisg
ICAgICAgICAgICBvLT5zZXROZWVkc0xheW91dChmYWxzZSk7CisgICAgICAgICAgICBpZiAoIW8t
PmlzVGV4dCgpKQorICAgICAgICAgICAgICAgIHRvUmVuZGVySW5saW5lKG8pLT5pbnZhbGlkYXRl
VmVydGljYWxQb3NpdGlvbigpOyAvLyBGSVhNRTogU2hvdWxkIGRvIGJldHRlciBoZXJlIGFuZCBu
b3QgYWx3YXlzIGludmFsaWRhdGUgZXZlcnl0aGluZy4KKyAgICAgICAgfQorICAgICAgICBvID0g
YmlkaU5leHQodGhpcywgbywgMCwgZmFsc2UsICZlbmRPZklubGluZSk7CisgICAgfQorICAgIHJl
dHVybiBoYXNJbmxpbmVDaGlsZDsKK30KIAotICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxk
IGNsZWFyIG91dCBvdXIgbGluZSBib3hlcy4KLSAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBl
dmVudHVhbGx5IQotICAgIGJvb2wgZnVsbExheW91dCA9ICFmaXJzdExpbmVCb3goKSB8fCBzZWxm
TmVlZHNMYXlvdXQoKSB8fCByZWxheW91dENoaWxkcmVuOwotICAgIGlmIChmdWxsTGF5b3V0KQot
ICAgICAgICBsaW5lQm94ZXMoKS0+ZGVsZXRlTGluZUJveGVzKHJlbmRlckFyZW5hKCkpOworLy8g
VGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIGxpbmUgYm94ZXMgZm9yIGFsbCBvZiB0aGUgdGV4dCBy
dW5zIGluIHRoZSByZXNvbHZlciBhbmQgY29tcHV0ZXMgdGhlaXIgcG9zaXRpb24uCitSb290SW5s
aW5lQm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJveGVzRm9yUmVzb2x2ZXIoY29uc3QgSW5s
aW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgY29uc3QgSW5saW5lSXRlcmF0b3ImIHBvc2l0aW9u
LCBib29sIGZpcnN0TGluZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEJpZGlSdW4q
IHRyYWlsaW5nU3BhY2VSdW4pCit7CisgICAgUm9vdElubGluZUJveCogbGluZUJveCA9IDA7Cisg
ICAgaWYgKHJlc29sdmVyLnJ1bkNvdW50KCkpIHsKKyAgICAgICAgbGluZUJveCA9IGNvbnN0cnVj
dExpbmUocmVzb2x2ZXIucnVuQ291bnQoKSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgcmVzb2x2ZXIu
bGFzdFJ1bigpLCBmaXJzdExpbmUsICFwb3NpdGlvbi5vYmosIHBvc2l0aW9uLm9iaiAmJiAhcG9z
aXRpb24ucG9zID8gcG9zaXRpb24ub2JqIDogMCk7CisgICAgICAgIGlmIChsaW5lQm94KSB7Cisg
ICAgICAgICAgICBsaW5lQm94LT5zZXRFbmRzV2l0aEJyZWFrKHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSk7CiAKLSAgICAvLyBUZXh0IHRydW5jYXRpb24gb25seSBraWNrcyBpbiBpZiB5b3VyIG92
ZXJmbG93IGlzbid0IHZpc2libGUgYW5kIHlvdXIgdGV4dC1vdmVyZmxvdy1tb2RlIGlzbid0Ci0g
ICAgLy8gY2xpcC4KLSAgICAvLyBGSVhNRTogQ1NTMyBzYXlzIHRoYXQgZGVzY2VuZGFudHMgdGhh
dCBhcmUgY2xpcHBlZCBtdXN0IGFsc28ga25vdyBob3cgdG8gdHJ1bmNhdGUuICBUaGlzIGlzIGlu
c2FuZWx5Ci0gICAgLy8gZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgKGVzcGVjaWFsbHkgaW4gdGhl
IG1pZGRsZSBvZiBkb2luZyBsYXlvdXQpLCBhbmQgaXMgcmVhbGx5IGFuIGVzb3RlcmljIHBpbGUg
b2Ygbm9uc2Vuc2UKLSAgICAvLyBhbnl3YXksIHNvIHdlIHdvbid0IHdvcnJ5IGFib3V0IGZvbGxv
d2luZyB0aGUgZHJhZnQgaGVyZS4KLSAgICBib29sIGhhc1RleHRPdmVyZmxvdyA9IHN0eWxlKCkt
PnRleHRPdmVyZmxvdygpICYmIGhhc092ZXJmbG93Q2xpcCgpOworICAgICAgICAgICAgLy8gTm93
IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBydW5zIGhvcml6b250YWxseS4KKyAgICAgICAg
ICAgIGNvbXB1dGVIb3Jpem9udGFsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBmaXJzdExpbmUs
IHJlc29sdmVyLmZpcnN0UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIHBvc2l0aW9uLmF0RW5kKCkp
OwogCi0gICAgLy8gV2FsayBhbGwgdGhlIGxpbmVzIGFuZCBkZWxldGUgb3VyIGVsbGlwc2lzIGxp
bmUgYm94ZXMgaWYgdGhleSBleGlzdC4KLSAgICBpZiAoaGFzVGV4dE92ZXJmbG93KQotICAgICAg
ICAgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKKyAgICAgICAgICAgIC8vIE5vdyBwb3NpdGlv
biBvdXIgdGV4dCBydW5zIHZlcnRpY2FsbHkuCisgICAgICAgICAgICBjb21wdXRlVmVydGljYWxQ
b3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIHJlc29sdmVyLmZpcnN0UnVuKCkpOwogCi0gICAgaWYg
KGZpcnN0Q2hpbGQoKSkgewotICAgICAgICAvLyBsYXlvdXQgcmVwbGFjZWQgZWxlbWVudHMKLSAg
ICAgICAgYm9vbCBlbmRPZklubGluZSA9IGZhbHNlOwotICAgICAgICBSZW5kZXJPYmplY3QqIG8g
PSBiaWRpRmlyc3QodGhpcywgMCwgZmFsc2UpOwotICAgICAgICBWZWN0b3I8RmxvYXRXaXRoUmVj
dD4gZmxvYXRzOwotICAgICAgICBib29sIGhhc0lubGluZUNoaWxkID0gZmFsc2U7Ci0gICAgICAg
IHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBpZiAoby0+aXNSZXBsYWNlZCgpIHx8IG8tPmlzRmxv
YXRpbmcoKSB8fCBvLT5pc1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAgICAgIFJlbmRlckJv
eCogYm94ID0gdG9SZW5kZXJCb3gobyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgby0+c3R5bGUoKS0+d2lkdGgoKS5pc1BlcmNlbnQo
KSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkKLSAgICAgICAgICAgICAgICAg
ICAgby0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHJlbGF5b3V0Q2hpbGRyZW4gaXMgc2V0IGFuZCB3
ZSBoYXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2UgYWxzbyBuZWVkIHRvIGludmFsaWRhdGUgdGhl
IGNoaWxkJ3MgcHJlZiB3aWR0aHMuCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRy
ZW4gJiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUo
KS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQotICAgICAgICAgICAgICAgICAgICBvLT5z
ZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICAgICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQotICAgICAgICAgICAgICAgICAgICBvLT5jb250
YWluaW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChib3gpOwotICAgICAgICAgICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoby0+aXNGbG9hdGluZygpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgZmxvYXRzLmFwcGVuZChGbG9hdFdpdGhSZWN0KGJveCkpOwot
ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0
KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmRl
ckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CisjaWYgRU5BQkxFKFNWRykKKyAg
ICAgICAgICAgIC8vIFNwZWNpYWwgU1ZHIHRleHQgbGF5b3V0IGNvZGUKKyAgICAgICAgICAgIGxp
bmVCb3gtPmNvbXB1dGVQZXJDaGFyYWN0ZXJMYXlvdXRJbmZvcm1hdGlvbigpOworI2VuZGlmCiAK
LSAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1JlbmRlcklu
bGluZSgpICYmICFlbmRPZklubGluZSkpIHsKLSAgICAgICAgICAgICAgICBoYXNJbmxpbmVDaGls
ZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKGZ1bGxMYXlvdXQgfHwgby0+c2VsZk5lZWRz
TGF5b3V0KCkpCi0gICAgICAgICAgICAgICAgICAgIGRpcnR5TGluZUJveGVzRm9yUmVuZGVyZXIo
bywgZnVsbExheW91dCk7Ci0gICAgICAgICAgICAgICAgby0+c2V0TmVlZHNMYXlvdXQoZmFsc2Up
OwotICAgICAgICAgICAgICAgIGlmICghby0+aXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAg
IHRvUmVuZGVySW5saW5lKG8pLT5pbnZhbGlkYXRlVmVydGljYWxQb3NpdGlvbigpOyAvLyBGSVhN
RTogU2hvdWxkIGRvIGJldHRlciBoZXJlIGFuZCBub3QgYWx3YXlzIGludmFsaWRhdGUgZXZlcnl0
aGluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG8gPSBiaWRpTmV4dCh0aGlzLCBvLCAw
LCBmYWxzZSwgJmVuZE9mSW5saW5lKTsKKyNpZiBQTEFURk9STShNQUMpCisgICAgICAgICAgICAv
LyBIaWdobGlnaHQgYWN0cyBhcyBhbiBvdmVyZmxvdyBpbmZsYXRpb24uCisgICAgICAgICAgICBp
ZiAoc3R5bGUoKS0+aGlnaGxpZ2h0KCkgIT0gbnVsbEF0b20pCisgICAgICAgICAgICAgICAgbGlu
ZUJveC0+YWRkSGlnaGxpZ2h0T3ZlcmZsb3coKTsKKyNlbmRpZgogICAgICAgICB9CisgICAgfQog
Ci0gICAgICAgIC8vIFdlIHdhbnQgdG8gc2tpcCBhaGVhZCB0byB0aGUgZmlyc3QgZGlydHkgbGlu
ZQotICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0gICAgICAgIHVuc2lnbmVk
IGZsb2F0SW5kZXg7Ci0gICAgICAgIGJvb2wgZmlyc3RMaW5lID0gdHJ1ZTsKLSAgICAgICAgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVlOwotICAgICAgICBSb290SW5saW5lQm94
KiBzdGFydExpbmUgPSBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKGZpcnN0TGluZSwgZnVsbExheW91
dCwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCByZXNvbHZlciwgZmxvYXRzLCBmbG9hdEluZGV4
KTsKLQotICAgICAgICBpZiAoZnVsbExheW91dCAmJiBoYXNJbmxpbmVDaGlsZCAmJiAhc2VsZk5l
ZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgIHNldE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsg
IC8vIE1hcmsgb3Vyc2VsdmVzIGFzIG5lZWRpbmcgYSBmdWxsIGxheW91dC4gVGhpcyB3YXkgd2Un
bGwgcmVwYWludCBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyB3ZSdyZSBzdXBwb3NlZCB0by4KLSAgICAgICAgICAgIFJlbmRlclZpZXcqIHYgPSB2aWV3
KCk7Ci0gICAgICAgICAgICBpZiAodiAmJiAhdi0+ZG9pbmdGdWxsUmVwYWludCgpICYmIGhhc0xh
eWVyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHdlIHdhaXRlZCB1bnRpbCB3ZSB3
ZXJlIGFscmVhZHkgaW5zaWRlIGxheW91dCB0byBkaXNjb3ZlcgotICAgICAgICAgICAgICAgIC8v
IHRoYXQgdGhlIGJsb2NrIHJlYWxseSBuZWVkZWQgYSBmdWxsIGxheW91dCwgd2UgbWlzc2VkIG91
ciBjaGFuY2UgdG8gcmVwYWludCB0aGUgbGF5ZXIKLSAgICAgICAgICAgICAgICAvLyBiZWZvcmUg
bGF5b3V0IHN0YXJ0ZWQuICBMdWNraWx5IHRoZSBsYXllciBoYXMgY2FjaGVkIHRoZSByZXBhaW50
IHJlY3QgZm9yIGl0cyBvcmlnaW5hbAotICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFuZCBz
aXplLCBhbmQgc28gd2UgY2FuIHVzZSB0aGF0IHRvIG1ha2UgYSByZXBhaW50IGhhcHBlbiBub3cu
Ci0gICAgICAgICAgICAgICAgcmVwYWludFVzaW5nQ29udGFpbmVyKGNvbnRhaW5lckZvclJlcGFp
bnQoKSwgbGF5ZXIoKS0+cmVwYWludFJlY3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
KyAgICByZXR1cm4gbGluZUJveDsKK30KIAotICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZs
b2F0ID0gbV9mbG9hdGluZ09iamVjdHMgPyBtX2Zsb2F0aW5nT2JqZWN0cy0+bGFzdCgpIDogMDsK
K3ZvaWQgUmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHMoYm9vbCBmdWxsTGF5b3V0LCBW
ZWN0b3I8RmxvYXRXaXRoUmVjdD4mIGZsb2F0cywgaW50JiByZXBhaW50VG9wLCBpbnQmIHJlcGFp
bnRCb3R0b20pCit7CisgICAgLy8gV2Ugd2FudCB0byBza2lwIGFoZWFkIHRvIHRoZSBmaXJzdCBk
aXJ0eSBsaW5lCisgICAgSW5saW5lQmlkaVJlc29sdmVyIHJlc29sdmVyOworICAgIHVuc2lnbmVk
IGZsb2F0SW5kZXg7CisgICAgYm9vbCBmaXJzdExpbmUgPSB0cnVlOworICAgIGJvb2wgcHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZTsKKyAgICBib29sIHVzZVJlcGFpbnRCb3VuZHMgPSBm
YWxzZTsKKyAgICAKKyAgICBSb290SW5saW5lQm94KiBzdGFydExpbmUgPSBkZXRlcm1pbmVTdGFy
dFBvc2l0aW9uKGZpcnN0TGluZSwgZnVsbExheW91dCwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
LCByZXNvbHZlciwgZmxvYXRzLCBmbG9hdEluZGV4KTsKIAotICAgICAgICBMaW5lTWlkcG9pbnRT
dGF0ZSYgbGluZU1pZHBvaW50U3RhdGUgPSByZXNvbHZlci5taWRwb2ludFN0YXRlKCk7CisgICAg
RmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdCA9IG1fZmxvYXRpbmdPYmplY3RzID8gbV9mbG9hdGlu
Z09iamVjdHMtPmxhc3QoKSA6IDA7CiAKLSAgICAgICAgLy8gV2UgYWxzbyBmaW5kIHRoZSBmaXJz
dCBjbGVhbiBsaW5lIGFuZCBleHRyYWN0IHRoZXNlIGxpbmVzLiAgV2Ugd2lsbCBhZGQgdGhlbSBi
YWNrCi0gICAgICAgIC8vIGlmIHdlIGRldGVybWluZSB0aGF0IHdlJ3JlIGFibGUgdG8gc3luY2hy
b25pemUgYWZ0ZXIgaGFuZGxpbmcgYWxsIG91ciBkaXJ0eSBsaW5lcy4KLSAgICAgICAgSW5saW5l
SXRlcmF0b3IgY2xlYW5MaW5lU3RhcnQ7Ci0gICAgICAgIEJpZGlTdGF0dXMgY2xlYW5MaW5lQmlk
aVN0YXR1czsKLSAgICAgICAgaW50IGVuZExpbmVZUG9zID0gMDsKLSAgICAgICAgUm9vdElubGlu
ZUJveCogZW5kTGluZSA9IChmdWxsTGF5b3V0IHx8ICFzdGFydExpbmUpID8gCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAwIDogZGV0ZXJtaW5lRW5kUG9zaXRpb24oc3RhcnRMaW5l
LCBjbGVhbkxpbmVTdGFydCwgY2xlYW5MaW5lQmlkaVN0YXR1cywgZW5kTGluZVlQb3MpOworICAg
IExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSA9IHJlc29sdmVyLm1pZHBvaW50
U3RhdGUoKTsKIAotICAgICAgICBpZiAoc3RhcnRMaW5lKSB7Ci0gICAgICAgICAgICB1c2VSZXBh
aW50Qm91bmRzID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlcGFpbnRUb3AgPSBoZWlnaHQoKTsKLSAg
ICAgICAgICAgIHJlcGFpbnRCb3R0b20gPSBoZWlnaHQoKTsKLSAgICAgICAgICAgIFJlbmRlckFy
ZW5hKiBhcmVuYSA9IHJlbmRlckFyZW5hKCk7Ci0gICAgICAgICAgICBSb290SW5saW5lQm94KiBi
b3ggPSBzdGFydExpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoYm94KSB7Ci0gICAgICAgICAgICAg
ICAgcmVwYWludFRvcCA9IG1pbihyZXBhaW50VG9wLCBib3gtPnRvcFZpc2libGVPdmVyZmxvdygp
KTsKLSAgICAgICAgICAgICAgICByZXBhaW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGJv
eC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCkpOwotICAgICAgICAgICAgICAgIFJvb3RJbmxpbmVC
b3gqIG5leHQgPSBib3gtPm5leHRSb290Qm94KCk7Ci0gICAgICAgICAgICAgICAgYm94LT5kZWxl
dGVMaW5lKGFyZW5hKTsKLSAgICAgICAgICAgICAgICBib3ggPSBuZXh0OwotICAgICAgICAgICAg
fQorICAgIC8vIFdlIGFsc28gZmluZCB0aGUgZmlyc3QgY2xlYW4gbGluZSBhbmQgZXh0cmFjdCB0
aGVzZSBsaW5lcy4gIFdlIHdpbGwgYWRkIHRoZW0gYmFjaworICAgIC8vIGlmIHdlIGRldGVybWlu
ZSB0aGF0IHdlJ3JlIGFibGUgdG8gc3luY2hyb25pemUgYWZ0ZXIgaGFuZGxpbmcgYWxsIG91ciBk
aXJ0eSBsaW5lcy4KKyAgICBJbmxpbmVJdGVyYXRvciBjbGVhbkxpbmVTdGFydDsKKyAgICBCaWRp
U3RhdHVzIGNsZWFuTGluZUJpZGlTdGF0dXM7CisgICAgaW50IGVuZExpbmVZUG9zID0gMDsKKyAg
ICBSb290SW5saW5lQm94KiBlbmRMaW5lID0gKGZ1bGxMYXlvdXQgfHwgIXN0YXJ0TGluZSkgPyAK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IGRldGVybWluZUVuZFBvc2l0aW9uKHN0
YXJ0TGluZSwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlTdGF0dXMsIGVuZExpbmVZUG9z
KTsKKworICAgIGlmIChzdGFydExpbmUpIHsKKyAgICAgICAgdXNlUmVwYWludEJvdW5kcyA9IHRy
dWU7CisgICAgICAgIHJlcGFpbnRUb3AgPSBoZWlnaHQoKTsKKyAgICAgICAgcmVwYWludEJvdHRv
bSA9IGhlaWdodCgpOworICAgICAgICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZW5kZXJBcmVuYSgp
OworICAgICAgICBSb290SW5saW5lQm94KiBib3ggPSBzdGFydExpbmU7CisgICAgICAgIHdoaWxl
IChib3gpIHsKKyAgICAgICAgICAgIHJlcGFpbnRUb3AgPSBtaW4ocmVwYWludFRvcCwgYm94LT50
b3BWaXNpYmxlT3ZlcmZsb3coKSk7CisgICAgICAgICAgICByZXBhaW50Qm90dG9tID0gbWF4KHJl
cGFpbnRCb3R0b20sIGJveC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCkpOworICAgICAgICAgICAg
Um9vdElubGluZUJveCogbmV4dCA9IGJveC0+bmV4dFJvb3RCb3goKTsKKyAgICAgICAgICAgIGJv
eC0+ZGVsZXRlTGluZShhcmVuYSk7CisgICAgICAgICAgICBib3ggPSBuZXh0OwogICAgICAgICB9
CisgICAgfQogCi0gICAgICAgIElubGluZUl0ZXJhdG9yIGVuZCA9IHJlc29sdmVyLnBvc2l0aW9u
KCk7Ci0KLSAgICAgICAgaWYgKCFmdWxsTGF5b3V0ICYmIGxhc3RSb290Qm94KCkgJiYgbGFzdFJv
b3RCb3goKS0+ZW5kc1dpdGhCcmVhaygpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBs
aW5lIGJlZm9yZSB0aGUgc3RhcnQgbGluZSBlbmRzIHdpdGggYSBsaW5lIGJyZWFrIHRoYXQgY2xl
YXIgZmxvYXRzLAotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBoZWlnaHQgYWNjb3JkaW5nbHku
Ci0gICAgICAgICAgICAvLyBBIGxpbmUgYnJlYWsgY2FuIGJlIGVpdGhlciB0aGUgZmlyc3Qgb3Ig
dGhlIGxhc3Qgb2JqZWN0IG9uIGEgbGluZSwgZGVwZW5kaW5nIG9uIGl0cyBkaXJlY3Rpb24uCi0g
ICAgICAgICAgICBpZiAoSW5saW5lQm94KiBsYXN0TGVhZkNoaWxkID0gbGFzdFJvb3RCb3goKS0+
bGFzdExlYWZDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBsYXN0T2Jq
ZWN0ID0gbGFzdExlYWZDaGlsZC0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxh
c3RPYmplY3QtPmlzQlIoKSkKLSAgICAgICAgICAgICAgICAgICAgbGFzdE9iamVjdCA9IGxhc3RS
b290Qm94KCktPmZpcnN0TGVhZkNoaWxkKCktPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICAgICAg
aWYgKGxhc3RPYmplY3QtPmlzQlIoKSkgewotICAgICAgICAgICAgICAgICAgICBFQ2xlYXIgY2xl
YXIgPSBsYXN0T2JqZWN0LT5zdHlsZSgpLT5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoY2xlYXIgIT0gQ05PTkUpCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdMaW5lKGNsZWFy
KTsKLSAgICAgICAgICAgICAgICB9CisgICAgSW5saW5lSXRlcmF0b3IgY3VycmVudFBvc2l0aW9u
ID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKKworICAgIGlmICghZnVsbExheW91dCAmJiBsYXN0Um9v
dEJveCgpICYmIGxhc3RSb290Qm94KCktPmVuZHNXaXRoQnJlYWsoKSkgeworICAgICAgICAvLyBJ
ZiB0aGUgbGFzdCBsaW5lIGJlZm9yZSB0aGUgc3RhcnQgbGluZSBlbmRzIHdpdGggYSBsaW5lIGJy
ZWFrIHRoYXQgY2xlYXIgZmxvYXRzLAorICAgICAgICAvLyBhZGp1c3QgdGhlIGhlaWdodCBhY2Nv
cmRpbmdseS4KKyAgICAgICAgLy8gQSBsaW5lIGJyZWFrIGNhbiBiZSBlaXRoZXIgdGhlIGZpcnN0
IG9yIHRoZSBsYXN0IG9iamVjdCBvbiBhIGxpbmUsIGRlcGVuZGluZyBvbiBpdHMgZGlyZWN0aW9u
LgorICAgICAgICBpZiAoSW5saW5lQm94KiBsYXN0TGVhZkNoaWxkID0gbGFzdFJvb3RCb3goKS0+
bGFzdExlYWZDaGlsZCgpKSB7CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGxhc3RPYmplY3Qg
PSBsYXN0TGVhZkNoaWxkLT5yZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0
LT5pc0JSKCkpCisgICAgICAgICAgICAgICAgbGFzdE9iamVjdCA9IGxhc3RSb290Qm94KCktPmZp
cnN0TGVhZkNoaWxkKCktPnJlbmRlcmVyKCk7CisgICAgICAgICAgICBpZiAobGFzdE9iamVjdC0+
aXNCUigpKSB7CisgICAgICAgICAgICAgICAgRUNsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+c3R5
bGUoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xlYXIgIT0gQ05PTkUpCisgICAg
ICAgICAgICAgICAgICAgIG5ld0xpbmUoY2xlYXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9
CisgICAgfQogCi0gICAgICAgIGJvb2wgZW5kTGluZU1hdGNoZWQgPSBmYWxzZTsKLSAgICAgICAg
Ym9vbCBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGVuZExpbmU7Ci0gICAgICAgIGJvb2wgY2hlY2tG
b3JGbG9hdHNGcm9tTGFzdExpbmUgPSBmYWxzZTsKKyAgICBib29sIGVuZExpbmVNYXRjaGVkID0g
ZmFsc2U7CisgICAgYm9vbCBjaGVja0ZvckVuZExpbmVNYXRjaCA9IGVuZExpbmU7CisgICAgYm9v
bCBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IGZhbHNlOwogCi0gICAgICAgIGJvb2wgaXNM
aW5lRW1wdHkgPSB0cnVlOworICAgIGJvb2wgaXNMaW5lRW1wdHkgPSB0cnVlOwogCi0gICAgICAg
IHdoaWxlICghZW5kLmF0RW5kKCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBJcyB0aGlzIGNo
ZWNrIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvciBjYW4gaXQgYmUgbW92
ZWQgdG8gdGhlIGVuZD8KLSAgICAgICAgICAgIGlmIChjaGVja0ZvckVuZExpbmVNYXRjaCAmJiAo
ZW5kTGluZU1hdGNoZWQgPSBtYXRjaGVkRW5kTGluZShyZXNvbHZlciwgY2xlYW5MaW5lU3RhcnQs
IGNsZWFuTGluZUJpZGlTdGF0dXMsIGVuZExpbmUsIGVuZExpbmVZUG9zLCByZXBhaW50Qm90dG9t
LCByZXBhaW50VG9wKSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgd2hpbGUgKCFjdXJy
ZW50UG9zaXRpb24uYXRFbmQoKSkgeworICAgICAgICAvLyBGSVhNRTogSXMgdGhpcyBjaGVjayBu
ZWNlc3NhcnkgYmVmb3JlIHRoZSBmaXJzdCBpdGVyYXRpb24gb3IgY2FuIGl0IGJlIG1vdmVkIHRv
IHRoZSBlbmQ/CisgICAgICAgIGlmIChjaGVja0ZvckVuZExpbmVNYXRjaCAmJiAoZW5kTGluZU1h
dGNoZWQgPSBtYXRjaGVkRW5kTGluZShyZXNvbHZlciwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGlu
ZUJpZGlTdGF0dXMsIGVuZExpbmUsIGVuZExpbmVZUG9zLCByZXBhaW50Qm90dG9tLCByZXBhaW50
VG9wKSkpCisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgbGluZU1pZHBvaW50U3Rh
dGUucmVzZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSB0cnVl
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsKLSAgICAg
ICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGlu
ZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7Ci0gICAgICAgICAgICBp
ZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2
ZXIuZGVsZXRlUnVucygpOwotICAgICAgICAgICAgICAgIGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RM
aW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIEFTU0VSVChlbmQgIT0gcmVzb2x2ZXIucG9zaXRpb24oKSk7Ci0KLSAgICAgICAgICAg
IGlmICghaXNMaW5lRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBiaWRpUmVvcmRlckxpbmUocmVz
b2x2ZXIsIGVuZCwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKLSAgICAgICAgICAgICAgICBB
U1NFUlQocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmQpOwotCi0gICAgICAgICAgICAgICAgQmlk
aVJ1biogdHJhaWxpbmdTcGFjZVJ1biA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkgJiYgcmVzb2x2ZXIucnVuQ291bnQoKSAmJiByZXNvbHZlci5sb2dp
Y2FsbHlMYXN0UnVuKCktPm1fb2JqZWN0LT5zdHlsZSgpLT5icmVha09ubHlBZnRlcldoaXRlU3Bh
Y2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1
bigpLT5tX29iamVjdC0+c3R5bGUoKS0+YXV0b1dyYXAoKSkgewotICAgICAgICAgICAgICAgICAg
ICB0cmFpbGluZ1NwYWNlUnVuID0gcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1bigpOwotICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGxhc3RPYmplY3QgPSB0cmFpbGluZ1NwYWNlUnVu
LT5tX29iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RPYmplY3QtPmlzVGV4dCgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJUZXh0KiBsYXN0VGV4dCA9IHRvUmVu
ZGVyVGV4dChsYXN0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzID0gbGFzdFRleHQtPmNoYXJhY3RlcnMoKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBmaXJzdFNwYWNlID0gdHJhaWxpbmdTcGFjZVJ1bi0+c3RvcCgpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgd2hpbGUgKGZpcnN0U3BhY2UgPiB0cmFpbGluZ1NwYWNlUnVuLT5z
dGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgY3VycmVudCA9IGNo
YXJhY3RlcnNbZmlyc3RTcGFjZSAtIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICghaXNDb2xsYXBzaWJsZVNwYWNlKGN1cnJlbnQsIGxhc3RUZXh0KSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmly
c3RTcGFjZS0tOworICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5yZXNldCgpOworICAgICAgICAK
KyAgICAgICAgaXNMaW5lRW1wdHkgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgRUNsZWFyIGNs
ZWFyID0gQ05PTkU7CisgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGZpbmROZXh0TGluZUJyZWFr
KHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHksICZjbGVhcik7CisgICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkpIHsK
KyAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKKyAgICAgICAgICAgIGNoZWNrRm9y
RmxvYXRzRnJvbUxhc3RMaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIEFTU0VSVChjdXJyZW50UG9zaXRpb24gIT0gcmVzb2x2ZXIucG9zaXRpb24oKSk7
CisKKyAgICAgICAgaWYgKCFpc0xpbmVFbXB0eSkgeworICAgICAgICAgICAgYmlkaVJlb3JkZXJM
aW5lKHJlc29sdmVyLCBjdXJyZW50UG9zaXRpb24sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7
CisgICAgICAgICAgICBBU1NFUlQocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBjdXJyZW50UG9zaXRp
b24pOworCisgICAgICAgICAgICBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuID0gMDsKKyAgICAg
ICAgICAgIGlmICghcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ICYmIHJlc29sdmVyLnJ1bkNvdW50
KCkgJiYgcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1bigpLT5tX29iamVjdC0+c3R5bGUoKS0+YnJl
YWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcmVzb2x2ZXIu
bG9naWNhbGx5TGFzdFJ1bigpLT5tX29iamVjdC0+c3R5bGUoKS0+YXV0b1dyYXAoKSkgeworICAg
ICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4gPSByZXNvbHZlci5sb2dpY2FsbHlMYXN0UnVu
KCk7CisgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBsYXN0T2JqZWN0ID0gdHJhaWxpbmdT
cGFjZVJ1bi0+bV9vYmplY3Q7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RPYmplY3QtPmlzVGV4
dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbmRlclRleHQqIGxhc3RUZXh0ID0gdG9SZW5k
ZXJUZXh0KGxhc3RPYmplY3QpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY2hh
cmFjdGVycyA9IGxhc3RUZXh0LT5jaGFyYWN0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIGlu
dCBmaXJzdFNwYWNlID0gdHJhaWxpbmdTcGFjZVJ1bi0+c3RvcCgpOworICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoZmlyc3RTcGFjZSA+IHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0U3Bh
Y2UgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDb2xsYXBzaWJsZVNwYWNl
KGN1cnJlbnQsIGxhc3RUZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3BhY2UtLTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTcGFjZSA9PSB0cmFpbGluZ1NwYWNl
UnVuLT5zdG9wKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuID0g
MDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBU
ZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiA9IHN0eWxlKCktPmRpcmVjdGlvbigpOworICAgICAgICAg
ICAgICAgICAgICAgICAgYm9vbCBzaG91bGRSZW9yZGVyID0gdHJhaWxpbmdTcGFjZVJ1biAhPSAo
ZGlyZWN0aW9uID09IExUUiA/IHJlc29sdmVyLmxhc3RSdW4oKSA6IHJlc29sdmVyLmZpcnN0UnVu
KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0U3BhY2UgIT0gdHJhaWxpbmdT
cGFjZVJ1bi0+c3RhcnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZGlDb250
ZXh0KiBiYXNlQ29udGV4dCA9IHJlc29sdmVyLmNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3aGlsZSAoQmlkaUNvbnRleHQqIHBhcmVudCA9IGJhc2VDb250ZXh0LT5wYXJl
bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNvbnRleHQgPSBwYXJl
bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWRpUnVuKiBuZXdUcmFpbGluZ1J1
biA9IG5ldyAocmVuZGVyQXJlbmEoKSkgQmlkaVJ1bihmaXJzdFNwYWNlLCB0cmFpbGluZ1NwYWNl
UnVuLT5tX3N0b3AsIHRyYWlsaW5nU3BhY2VSdW4tPm1fb2JqZWN0LCBiYXNlQ29udGV4dCwgT3Ro
ZXJOZXV0cmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVu
LT5tX3N0b3AgPSBmaXJzdFNwYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChk
aXJlY3Rpb24gPT0gTFRSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZl
ci5hZGRSdW4obmV3VHJhaWxpbmdSdW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucHJlcGVuZFJ1bihu
ZXdUcmFpbGluZ1J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFj
ZVJ1biA9IG5ld1RyYWlsaW5nUnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3Vs
ZFJlb3JkZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChmaXJzdFNwYWNlID09IHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKSkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuID0gMDsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRl
eHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRSZW9yZGVyID0gdHJhaWxpbmdTcGFjZVJ1biAh
PSAoZGlyZWN0aW9uID09IExUUiA/IHJlc29sdmVyLmxhc3RSdW4oKSA6IHJlc29sdmVyLmZpcnN0
UnVuKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFNwYWNlICE9IHRy
YWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgQmlkaUNvbnRleHQqIGJhc2VDb250ZXh0ID0gcmVzb2x2ZXIuY29udGV4dCgpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQmlkaUNvbnRleHQqIHBhcmVudCA9IGJh
c2VDb250ZXh0LT5wYXJlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJhc2VDb250ZXh0ID0gcGFyZW50OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEJpZGlSdW4qIG5ld1RyYWlsaW5nUnVuID0gbmV3IChyZW5kZXJBcmVuYSgpKSBCaWRpUnVuKGZp
cnN0U3BhY2UsIHRyYWlsaW5nU3BhY2VSdW4tPm1fc3RvcCwgdHJhaWxpbmdTcGFjZVJ1bi0+bV9v
YmplY3QsIGJhc2VDb250ZXh0LCBPdGhlck5ldXRyYWwpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX3N0b3AgPSBmaXJzdFNwYWNlOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IExUUikKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLmFkZFJ1bihuZXdUcmFpbGluZ1J1
bik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnByZXBlbmRSdW4obmV3VHJhaWxpbmdSdW4p
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuID0gbmV3
VHJhaWxpbmdSdW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlb3Jk
ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlb3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMVFIpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlc29sdmVyLm1vdmVSdW5Ub0VuZCh0cmFpbGluZ1NwYWNlUnVuKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPm1f
bGV2ZWwgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIubW92ZVJ1blRvQmVnaW5u
aW5nKHRyYWlsaW5nU3BhY2VSdW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9sZXZlbCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZW9yZGVyKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMVFIpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIubW92ZVJ1blRvRW5kKHRyYWls
aW5nU3BhY2VSdW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1Nw
YWNlUnVuLT5tX2xldmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5tb3ZlUnVuVG9CZWdp
bm5pbmcodHJhaWxpbmdTcGFjZVJ1bik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRyYWlsaW5nU3BhY2VSdW4tPm1fbGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuID0gMDsKLSAgICAg
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgcnVucyBoYXZl
IGJlZW4gb3JkZXJlZCwgd2UgY3JlYXRlIHRoZSBsaW5lIGJveGVzLgotICAgICAgICAgICAgICAg
IC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UgZmlndXJlIG91dCB3aGVyZSBib3JkZXIvcGFkZGluZy9t
YXJnaW4gc2hvdWxkIGJlIGFwcGxpZWQgZm9yCi0gICAgICAgICAgICAgICAgLy8gaW5saW5lIGZs
b3cgYm94ZXMuCi0KLSAgICAgICAgICAgICAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gMDsK
LSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIucnVuQ291bnQoKSkgewotICAgICAgICAgICAg
ICAgICAgICBsaW5lQm94ID0gY29uc3RydWN0TGluZShyZXNvbHZlci5ydW5Db3VudCgpLCByZXNv
bHZlci5maXJzdFJ1bigpLCByZXNvbHZlci5sYXN0UnVuKCksIGZpcnN0TGluZSwgIWVuZC5vYmos
IGVuZC5vYmogJiYgIWVuZC5wb3MgPyBlbmQub2JqIDogMCk7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChsaW5lQm94KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lQm94LT5zZXRFbmRz
V2l0aEJyZWFrKHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIE5vdyB3ZSBwb3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFs
bHkuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0Zv
ckxpbmUobGluZUJveCwgZmlyc3RMaW5lLCByZXNvbHZlci5maXJzdFJ1bigpLCB0cmFpbGluZ1Nw
YWNlUnVuLCBlbmQuYXRFbmQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBw
b3NpdGlvbiBvdXIgdGV4dCBydW5zIHZlcnRpY2FsbHkuCi0gICAgICAgICAgICAgICAgICAgICAg
ICBjb21wdXRlVmVydGljYWxQb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIHJlc29sdmVyLmZpcnN0
UnVuKCkpOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNw
ZWNpYWwgU1ZHIHRleHQgbGF5b3V0IGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVC
b3gtPmNvbXB1dGVQZXJDaGFyYWN0ZXJMYXlvdXRJbmZvcm1hdGlvbigpOwotI2VuZGlmCi0KLSNp
ZiBQTEFURk9STShNQUMpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIaWdobGlnaHQgYWN0
cyBhcyBhbiBvdmVyZmxvdyBpbmZsYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAo
c3R5bGUoKS0+aGlnaGxpZ2h0KCkgIT0gbnVsbEF0b20pCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbGluZUJveC0+YWRkSGlnaGxpZ2h0T3ZlcmZsb3coKTsKLSNlbmRpZgogICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVzb2x2
ZXIuZGVsZXRlUnVucygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxpbmVCb3gpIHsKLSAgICAg
ICAgICAgICAgICAgICAgbGluZUJveC0+c2V0TGluZUJyZWFrSW5mbyhlbmQub2JqLCBlbmQucG9z
LCByZXNvbHZlci5zdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VSZXBhaW50
Qm91bmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBhaW50VG9wID0gbWluKHJlcGFp
bnRUb3AsIGxpbmVCb3gtPnRvcFZpc2libGVPdmVyZmxvdygpKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZUJveC0+Ym90dG9t
VmlzaWJsZU92ZXJmbG93KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgZmlyc3RMaW5lID0gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgbmV3TGluZShjbGVhcik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAg
ICAgICAgIHRyYWlsaW5nU3BhY2VSdW4gPSAwOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAg
ICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgbGFzdFJvb3RCb3goKSkgewotICAgICAgICAgICAg
ICAgIGlmIChsYXN0RmxvYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChGbG9hdGluZ09i
amVjdCogZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0KCk7IGYgIT0gbGFzdEZsb2F0OyBmID0g
bV9mbG9hdGluZ09iamVjdHMtPnByZXYoKSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCk7Ci0gICAgICAgICAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5maXJzdCgp
OwotICAgICAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+Y3VycmVudCgpOyBmOyBmID0gbV9mbG9hdGluZ09iamVjdHMtPm5leHQoKSkgewotICAg
ICAgICAgICAgICAgICAgICBsYXN0Um9vdEJveCgpLT5mbG9hdHMoKS5hcHBlbmQoZi0+bV9yZW5k
ZXJlcik7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChmLT5tX3JlbmRlcmVyID09IGZsb2F0
c1tmbG9hdEluZGV4XS5vYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGZsb2F0
J3MgZ2VvbWV0cnkgaGFzIGNoYW5nZWQsIGdpdmUgdXAgb24gc3luY2luZyB3aXRoIGNsZWFuIGxp
bmVzLgotICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRzW2Zsb2F0SW5kZXhdLnJlY3QgIT0g
SW50UmVjdChmLT5tX2xlZnQsIGYtPm1fdG9wLCBmLT5tX3dpZHRoLCBmLT5tX2JvdHRvbSAtIGYt
Pm1fdG9wKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRm9yRW5kTGluZU1hdGNoID0g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0SW5kZXgrKzsKKyAgICAgICAgICAgIC8v
IE5vdyB0aGF0IHRoZSBydW5zIGhhdmUgYmVlbiBvcmRlcmVkLCB3ZSBjcmVhdGUgdGhlIGxpbmUg
Ym94ZXMuCisgICAgICAgICAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gY3JlYXRlTGluZUJv
eGVzRm9yUmVzb2x2ZXIocmVzb2x2ZXIsIGN1cnJlbnRQb3NpdGlvbiwgZmlyc3RMaW5lLCBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHksIHRyYWlsaW5nU3BhY2VSdW4pOworICAgICAgICAgICAgcmVz
b2x2ZXIuZGVsZXRlUnVucygpOworCisgICAgICAgICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdl
IGZpZ3VyZSBvdXQgd2hlcmUgYm9yZGVyL3BhZGRpbmcvbWFyZ2luIHNob3VsZCBiZSBhcHBsaWVk
IGZvcgorICAgICAgICAgICAgLy8gaW5saW5lIGZsb3cgYm94ZXMuCisgICAgICAgICAgICBpZiAo
bGluZUJveCkgeworICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldExpbmVCcmVha0luZm8oY3Vy
cmVudFBvc2l0aW9uLm9iaiwgY3VycmVudFBvc2l0aW9uLnBvcywgcmVzb2x2ZXIuc3RhdHVzKCkp
OworICAgICAgICAgICAgICAgIGlmICh1c2VSZXBhaW50Qm91bmRzKSB7CisgICAgICAgICAgICAg
ICAgICAgIHJlcGFpbnRUb3AgPSBtaW4ocmVwYWludFRvcCwgbGluZUJveC0+dG9wVmlzaWJsZU92
ZXJmbG93KCkpOworICAgICAgICAgICAgICAgICAgICByZXBhaW50Qm90dG9tID0gbWF4KHJlcGFp
bnRCb3R0b20sIGxpbmVCb3gtPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKTsKICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdEZsb2F0ID0gbV9mbG9hdGluZ09iamVjdHMtPmxh
c3QoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUucmVz
ZXQoKTsKLSAgICAgICAgICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKGVuZCk7CisgICAgICAgICAg
ICBmaXJzdExpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIG5ld0xpbmUoY2xlYXIpOwogICAgICAg
ICB9CiAKLSAgICAgICAgaWYgKGVuZExpbmUpIHsKLSAgICAgICAgICAgIGlmIChlbmRMaW5lTWF0
Y2hlZCkgewotICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhbGwgdGhlIHJlbWFpbmluZyBsaW5l
cywgYW5kIHRoZW4gYWRqdXN0IHRoZWlyIHktcG9zaXRpb25zIGFzIG5lZWRlZC4KLSAgICAgICAg
ICAgICAgICBpbnQgZGVsdGEgPSBoZWlnaHQoKSAtIGVuZExpbmVZUG9zOwotICAgICAgICAgICAg
ICAgIGZvciAoUm9vdElubGluZUJveCogbGluZSA9IGVuZExpbmU7IGxpbmU7IGxpbmUgPSBsaW5l
LT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUtPmF0dGFjaExpbmUo
KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICByZXBhaW50VG9wID0gbWluKHJlcGFpbnRUb3AsIGxpbmUtPnRvcFZpc2libGVPdmVyZmxv
dygpICsgbWluKGRlbHRhLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBhaW50Qm90
dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmUtPmJvdHRvbVZpc2libGVPdmVyZmxvdygpICsg
bWF4KGRlbHRhLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLT5hZGp1c3RQb3Np
dGlvbigwLCBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgaWYgKFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRz
UHRyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxSZW5kZXJCb3gqPjo6aXRl
cmF0b3IgZW5kID0gY2xlYW5MaW5lRmxvYXRzLT5lbmQoKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciAoVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBmID0gY2xlYW5MaW5lRmxvYXRz
LT5iZWdpbigpOyBmICE9IGVuZDsgKytmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGZsb2F0VG9wID0gKCpmKS0+eSgpIC0gKCpmKS0+bWFyZ2luVG9wKCk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmYpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNldEhlaWdodChmbG9hdFRvcCArIGRlbHRhKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIHNldEhlaWdodChsYXN0Um9vdEJveCgpLT5ibG9ja0hlaWdodCgpKTsKLSAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCB0aGUgcmVtYWlu
aW5nIGxpbmVzLgotICAgICAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBlbmRMaW5l
OwotICAgICAgICAgICAgICAgIFJlbmRlckFyZW5hKiBhcmVuYSA9IHJlbmRlckFyZW5hKCk7Ci0g
ICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwYWlu
dFRvcCA9IG1pbihyZXBhaW50VG9wLCBsaW5lLT50b3BWaXNpYmxlT3ZlcmZsb3coKSk7Ci0gICAg
ICAgICAgICAgICAgICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZS0+
Ym90dG9tVmlzaWJsZU92ZXJmbG93KCkpOwotICAgICAgICAgICAgICAgICAgICBSb290SW5saW5l
Qm94KiBuZXh0ID0gbGluZS0+bmV4dFJvb3RCb3goKTsKLSAgICAgICAgICAgICAgICAgICAgbGlu
ZS0+ZGVsZXRlTGluZShhcmVuYSk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBuZXh0Owot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAo
bV9mbG9hdGluZ09iamVjdHMgJiYgKGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lIHx8IHBvc2l0
aW9uTmV3RmxvYXRzKCkpICYmIGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAgICAgIC8vIEluIGNh
c2Ugd2UgaGF2ZSBhIGZsb2F0IG9uIHRoZSBsYXN0IGxpbmUsIGl0IG1pZ2h0IG5vdCBiZSBwb3Np
dGlvbmVkIHVwIHRvIG5vdy4KLSAgICAgICAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVm
b3JlIGFkZGluZyBpbiB0aGUgYm90dG9tIGJvcmRlci9wYWRkaW5nLCBvciB0aGUgZmxvYXQgd2ls
bAotICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgcGFkZGluZyBpbmNvcnJlY3RseS4gLWR3aAot
ICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lKSB7Ci0gICAgICAgICAg
ICAgICAgaW50IGJvdHRvbVZpc3VhbE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+Ym90dG9tVmlz
dWFsT3ZlcmZsb3coKTsKLSAgICAgICAgICAgICAgICBpbnQgYm90dG9tTGF5b3V0T3ZlcmZsb3cg
PSBsYXN0Um9vdEJveCgpLT5ib3R0b21MYXlvdXRPdmVyZmxvdygpOwotICAgICAgICAgICAgICAg
IFRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveCogdHJhaWxpbmdGbG9hdHNMaW5lQm94ID0gbmV3
IChyZW5kZXJBcmVuYSgpKSBUcmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3godGhpcyk7Ci0gICAg
ICAgICAgICAgICAgbV9saW5lQm94ZXMuYXBwZW5kTGluZUJveCh0cmFpbGluZ0Zsb2F0c0xpbmVC
b3gpOwotICAgICAgICAgICAgICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0Q29uc3RydWN0
ZWQoKTsKLSAgICAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnZlcnRpY2FsbHlB
bGlnbkJveGVzKGhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVC
b3gtPnNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnMoaGVpZ2h0KCksIGJvdHRvbUxheW91dE92
ZXJmbG93LCBoZWlnaHQoKSwgYm90dG9tVmlzdWFsT3ZlcmZsb3csIDApOwotICAgICAgICAgICAg
ICAgIHRyYWlsaW5nRmxvYXRzTGluZUJveC0+c2V0QmxvY2tIZWlnaHQoaGVpZ2h0KCkpOwotICAg
ICAgICAgICAgfQorICAgICAgICBpZiAobV9mbG9hdGluZ09iamVjdHMgJiYgbGFzdFJvb3RCb3go
KSkgewogICAgICAgICAgICAgaWYgKGxhc3RGbG9hdCkgewogICAgICAgICAgICAgICAgIGZvciAo
RmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bGFzdCgpOyBmICE9IGxhc3RG
bG9hdDsgZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5wcmV2KCkpIHsKICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMtPm5leHQoKTsKICAgICAgICAgICAg
IH0gZWxzZQogICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdPYmplY3RzLT5maXJzdCgpOwotICAg
ICAgICAgICAgZm9yIChGbG9hdGluZ09iamVjdCogZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5jdXJy
ZW50KCk7IGY7IGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bmV4dCgpKQorICAgICAgICAgICAgZm9y
IChGbG9hdGluZ09iamVjdCogZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5jdXJyZW50KCk7IGY7IGYg
PSBtX2Zsb2F0aW5nT2JqZWN0cy0+bmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgbGFzdFJvb3RC
b3goKS0+ZmxvYXRzKCkuYXBwZW5kKGYtPm1fcmVuZGVyZXIpOworICAgICAgICAgICAgICAgIEFT
U0VSVChmLT5tX3JlbmRlcmVyID09IGZsb2F0c1tmbG9hdEluZGV4XS5vYmplY3QpOworICAgICAg
ICAgICAgICAgIC8vIElmIGEgZmxvYXQncyBnZW9tZXRyeSBoYXMgY2hhbmdlZCwgZ2l2ZSB1cCBv
biBzeW5jaW5nIHdpdGggY2xlYW4gbGluZXMuCisgICAgICAgICAgICAgICAgaWYgKGZsb2F0c1tm
bG9hdEluZGV4XS5yZWN0ICE9IEludFJlY3QoZi0+bV9sZWZ0LCBmLT5tX3RvcCwgZi0+bV93aWR0
aCwgZi0+bV9ib3R0b20gLSBmLT5tX3RvcCkpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrRm9y
RW5kTGluZU1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmxvYXRJbmRleCsrOworICAg
ICAgICAgICAgfQogICAgICAgICAgICAgbGFzdEZsb2F0ID0gbV9mbG9hdGluZ09iamVjdHMtPmxh
c3QoKTsKICAgICAgICAgfQotICAgICAgICBzaXplX3QgZmxvYXRDb3VudCA9IGZsb2F0cy5zaXpl
KCk7Ci0gICAgICAgIC8vIEZsb2F0cyB0aGF0IGRpZCBub3QgaGF2ZSBsYXlvdXQgZGlkIG5vdCBy
ZXBhaW50IHdoZW4gd2UgbGFpZCB0aGVtIG91dC4gVGhleSB3b3VsZCBoYXZlCi0gICAgICAgIC8v
IHBhaW50ZWQgYnkgbm93IGlmIHRoZXkgaGFkIG1vdmVkLCBidXQgaWYgdGhleSBzdGF5ZWQgYXQg
KDAsIDApLCB0aGV5IHN0aWxsIG5lZWQgdG8gYmUKLSAgICAgICAgLy8gcGFpbnRlZC4KLSAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbG9hdENvdW50OyArK2kpIHsKLSAgICAgICAgICAg
IGlmICghZmxvYXRzW2ldLmV2ZXJIYWRMYXlvdXQpIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJC
b3gqIGYgPSBmbG9hdHNbaV0ub2JqZWN0OwotICAgICAgICAgICAgICAgIGlmICghZi0+eCgpICYm
ICFmLT55KCkgJiYgZi0+Y2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpCi0gICAgICAgICAg
ICAgICAgICAgIGYtPnJlcGFpbnQoKTsKKworICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5yZXNl
dCgpOworICAgICAgICByZXNvbHZlci5zZXRQb3NpdGlvbihjdXJyZW50UG9zaXRpb24pOworICAg
IH0KKworICAgIGlmIChlbmRMaW5lKSB7CisgICAgICAgIGlmIChlbmRMaW5lTWF0Y2hlZCkgewor
ICAgICAgICAgICAgLy8gQXR0YWNoIGFsbCB0aGUgcmVtYWluaW5nIGxpbmVzLCBhbmQgdGhlbiBh
ZGp1c3QgdGhlaXIgeS1wb3NpdGlvbnMgYXMgbmVlZGVkLgorICAgICAgICAgICAgaW50IGRlbHRh
ID0gaGVpZ2h0KCkgLSBlbmRMaW5lWVBvczsKKyAgICAgICAgICAgIGZvciAoUm9vdElubGluZUJv
eCogbGluZSA9IGVuZExpbmU7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKSB7Cisg
ICAgICAgICAgICAgICAgbGluZS0+YXR0YWNoTGluZSgpOworICAgICAgICAgICAgICAgIGlmIChk
ZWx0YSkgeworICAgICAgICAgICAgICAgICAgICByZXBhaW50VG9wID0gbWluKHJlcGFpbnRUb3As
IGxpbmUtPnRvcFZpc2libGVPdmVyZmxvdygpICsgbWluKGRlbHRhLCAwKSk7CisgICAgICAgICAg
ICAgICAgICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZS0+Ym90dG9t
VmlzaWJsZU92ZXJmbG93KCkgKyBtYXgoZGVsdGEsIDApKTsKKyAgICAgICAgICAgICAgICAgICAg
bGluZS0+YWRqdXN0UG9zaXRpb24oMCwgZGVsdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBpZiAoVmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVGbG9hdHMgPSBsaW5l
LT5mbG9hdHNQdHIoKSkgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46
Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZsb2F0cy0+ZW5kKCk7CisgICAgICAgICAgICAgICAg
ICAgIGZvciAoVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBmID0gY2xlYW5MaW5lRmxvYXRz
LT5iZWdpbigpOyBmICE9IGVuZDsgKytmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQg
ZmxvYXRUb3AgPSAoKmYpLT55KCkgLSAoKmYpLT5tYXJnaW5Ub3AoKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGluc2VydEZsb2F0aW5nT2JqZWN0KCpmKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHNldEhlaWdodChmbG9hdFRvcCArIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRIZWlnaHQobGFzdFJvb3RCb3go
KS0+YmxvY2tIZWlnaHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZWxl
dGUgYWxsIHRoZSByZW1haW5pbmcgbGluZXMuCisgICAgICAgICAgICBSb290SW5saW5lQm94KiBs
aW5lID0gZW5kTGluZTsKKyAgICAgICAgICAgIFJlbmRlckFyZW5hKiBhcmVuYSA9IHJlbmRlckFy
ZW5hKCk7CisgICAgICAgICAgICB3aGlsZSAobGluZSkgeworICAgICAgICAgICAgICAgIHJlcGFp
bnRUb3AgPSBtaW4ocmVwYWludFRvcCwgbGluZS0+dG9wVmlzaWJsZU92ZXJmbG93KCkpOworICAg
ICAgICAgICAgICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZS0+Ym90
dG9tVmlzaWJsZU92ZXJmbG93KCkpOworICAgICAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIG5l
eHQgPSBsaW5lLT5uZXh0Um9vdEJveCgpOworICAgICAgICAgICAgICAgIGxpbmUtPmRlbGV0ZUxp
bmUoYXJlbmEpOworICAgICAgICAgICAgICAgIGxpbmUgPSBuZXh0OworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorICAgIGlmIChtX2Zsb2F0aW5nT2JqZWN0cyAmJiAoY2hlY2tGb3JG
bG9hdHNGcm9tTGFzdExpbmUgfHwgcG9zaXRpb25OZXdGbG9hdHMoKSkgJiYgbGFzdFJvb3RCb3go
KSkgeworICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBvbiB0aGUgbGFzdCBsaW5l
LCBpdCBtaWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cuCisgICAgICAgIC8vIFRoaXMg
aGFzIHRvIGJlIGRvbmUgYmVmb3JlIGFkZGluZyBpbiB0aGUgYm90dG9tIGJvcmRlci9wYWRkaW5n
LCBvciB0aGUgZmxvYXQgd2lsbAorICAgICAgICAvLyBpbmNsdWRlIHRoZSBwYWRkaW5nIGluY29y
cmVjdGx5LiAtZHdoCisgICAgICAgIGlmIChjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSkgewor
ICAgICAgICAgICAgaW50IGJvdHRvbVZpc3VhbE92ZXJmbG93ID0gbGFzdFJvb3RCb3goKS0+Ym90
dG9tVmlzdWFsT3ZlcmZsb3coKTsKKyAgICAgICAgICAgIGludCBib3R0b21MYXlvdXRPdmVyZmxv
dyA9IGxhc3RSb290Qm94KCktPmJvdHRvbUxheW91dE92ZXJmbG93KCk7CisgICAgICAgICAgICBU
cmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3gqIHRyYWlsaW5nRmxvYXRzTGluZUJveCA9IG5ldyAo
cmVuZGVyQXJlbmEoKSkgVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94KHRoaXMpOworICAgICAg
ICAgICAgbV9saW5lQm94ZXMuYXBwZW5kTGluZUJveCh0cmFpbGluZ0Zsb2F0c0xpbmVCb3gpOwor
ICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT5zZXRDb25zdHJ1Y3RlZCgpOworICAg
ICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5lQm94LT52ZXJ0aWNhbGx5QWxpZ25Cb3hlcyhoZWln
aHQoKSk7CisgICAgICAgICAgICB0cmFpbGluZ0Zsb2F0c0xpbmVCb3gtPnNldFZlcnRpY2FsT3Zl
cmZsb3dQb3NpdGlvbnMoaGVpZ2h0KCksIGJvdHRvbUxheW91dE92ZXJmbG93LCBoZWlnaHQoKSwg
Ym90dG9tVmlzdWFsT3ZlcmZsb3csIDApOworICAgICAgICAgICAgdHJhaWxpbmdGbG9hdHNMaW5l
Qm94LT5zZXRCbG9ja0hlaWdodChoZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxh
c3RGbG9hdCkgeworICAgICAgICAgICAgZm9yIChGbG9hdGluZ09iamVjdCogZiA9IG1fZmxvYXRp
bmdPYmplY3RzLT5sYXN0KCk7IGYgIT0gbGFzdEZsb2F0OyBmID0gbV9mbG9hdGluZ09iamVjdHMt
PnByZXYoKSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mbG9hdGluZ09iamVjdHMt
Pm5leHQoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+
Zmlyc3QoKTsKKyAgICAgICAgZm9yIChGbG9hdGluZ09iamVjdCogZiA9IG1fZmxvYXRpbmdPYmpl
Y3RzLT5jdXJyZW50KCk7IGY7IGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bmV4dCgpKQorICAgICAg
ICAgICAgbGFzdFJvb3RCb3goKS0+ZmxvYXRzKCkuYXBwZW5kKGYtPm1fcmVuZGVyZXIpOworICAg
ICAgICBsYXN0RmxvYXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bGFzdCgpOworICAgIH0KKyAgICAv
LyBGbG9hdHMgdGhhdCBkaWQgbm90IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVwYWludCB3aGVuIHdl
IGxhaWQgdGhlbSBvdXQuIFRoZXkgd291bGQgaGF2ZQorICAgIC8vIHBhaW50ZWQgYnkgbm93IGlm
IHRoZXkgaGFkIG1vdmVkLCBidXQgaWYgdGhleSBzdGF5ZWQgYXQgKDAsIDApLCB0aGV5IHN0aWxs
IG5lZWQgdG8gYmUKKyAgICAvLyBwYWludGVkLgorICAgIHNpemVfdCBmbG9hdENvdW50ID0gZmxv
YXRzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsb2F0Q291bnQ7ICsraSkg
eworICAgICAgICBpZiAoIWZsb2F0c1tpXS5ldmVySGFkTGF5b3V0KSB7CisgICAgICAgICAgICBS
ZW5kZXJCb3gqIGYgPSBmbG9hdHNbaV0ub2JqZWN0OworICAgICAgICAgICAgaWYgKCFmLT54KCkg
JiYgIWYtPnkoKSAmJiBmLT5jaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQoKSkKKyAgICAgICAg
ICAgICAgICBmLT5yZXBhaW50KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVy
QmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgaW50JiBy
ZXBhaW50VG9wLCBpbnQmIHJlcGFpbnRCb3R0b20pCit7CisgICAgbV9vdmVyZmxvdy5jbGVhcigp
OworICAgICAgICAKKyAgICBzZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwor
ICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpv
bnRhbFNjcm9sbGJhckhlaWdodCgpOworCisgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQg
Y2xlYXIgb3V0IG91ciBsaW5lIGJveGVzLgorICAgIC8vIEZJWE1FOiBIYW5kbGUgcmVzaXplIGV2
ZW50dWFsbHkhCisgICAgYm9vbCBmdWxsTGF5b3V0ID0gIWZpcnN0TGluZUJveCgpIHx8IHNlbGZO
ZWVkc0xheW91dCgpIHx8IHJlbGF5b3V0Q2hpbGRyZW47CisgICAgaWYgKGZ1bGxMYXlvdXQpCisg
ICAgICAgIGxpbmVCb3hlcygpLT5kZWxldGVMaW5lQm94ZXMocmVuZGVyQXJlbmEoKSk7CisKKyAg
ICAvLyBUZXh0IHRydW5jYXRpb24gb25seSBraWNrcyBpbiBpZiB5b3VyIG92ZXJmbG93IGlzbid0
IHZpc2libGUgYW5kIHlvdXIgdGV4dC1vdmVyZmxvdy1tb2RlIGlzbid0CisgICAgLy8gY2xpcC4K
KyAgICAvLyBGSVhNRTogQ1NTMyBzYXlzIHRoYXQgZGVzY2VuZGFudHMgdGhhdCBhcmUgY2xpcHBl
ZCBtdXN0IGFsc28ga25vdyBob3cgdG8gdHJ1bmNhdGUuICBUaGlzIGlzIGluc2FuZWx5CisgICAg
Ly8gZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgKGVzcGVjaWFsbHkgaW4gdGhlIG1pZGRsZSBvZiBk
b2luZyBsYXlvdXQpLCBhbmQgaXMgcmVhbGx5IGFuIGVzb3RlcmljIHBpbGUgb2Ygbm9uc2Vuc2UK
KyAgICAvLyBhbnl3YXksIHNvIHdlIHdvbid0IHdvcnJ5IGFib3V0IGZvbGxvd2luZyB0aGUgZHJh
ZnQgaGVyZS4KKyAgICBib29sIGhhc1RleHRPdmVyZmxvdyA9IHN0eWxlKCktPnRleHRPdmVyZmxv
dygpICYmIGhhc092ZXJmbG93Q2xpcCgpOworCisgICAgLy8gV2FsayBhbGwgdGhlIGxpbmVzIGFu
ZCBkZWxldGUgb3VyIGVsbGlwc2lzIGxpbmUgYm94ZXMgaWYgdGhleSBleGlzdC4KKyAgICBpZiAo
aGFzVGV4dE92ZXJmbG93KQorICAgICAgICAgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKKwor
ICAgIGlmIChmaXJzdENoaWxkKCkpIHsKKyAgICAgICAgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+IGZs
b2F0czsKKyAgICAgICAgYm9vbCBoYXNJbmxpbmVDaGlsZCA9IGxheW91dFJlcGxhY2VkRWxlbWVu
dHMocmVsYXlvdXRDaGlsZHJlbiwgZnVsbExheW91dCwgZmxvYXRzKTsKKworICAgICAgICBpZiAo
ZnVsbExheW91dCAmJiBoYXNJbmxpbmVDaGlsZCAmJiAhc2VsZk5lZWRzTGF5b3V0KCkpIHsKKyAg
ICAgICAgICAgIHNldE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsgLy8gTWFyayBvdXJzZWx2ZXMg
YXMgbmVlZGluZyBhIGZ1bGwgbGF5b3V0LiBUaGlzIHdheSB3ZSdsbCByZXBhaW50IGxpa2UKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3VwcG9zZWQg
dG8uCisgICAgICAgICAgICBSZW5kZXJWaWV3KiB2ID0gdmlldygpOworICAgICAgICAgICAgaWYg
KHYgJiYgIXYtPmRvaW5nRnVsbFJlcGFpbnQoKSAmJiBoYXNMYXllcigpKSB7CisgICAgICAgICAg
ICAgICAgLy8gQmVjYXVzZSB3ZSB3YWl0ZWQgdW50aWwgd2Ugd2VyZSBhbHJlYWR5IGluc2lkZSBs
YXlvdXQgdG8gZGlzY292ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBibG9jayByZWFs
bHkgbmVlZGVkIGEgZnVsbCBsYXlvdXQsIHdlIG1pc3NlZCBvdXIgY2hhbmNlIHRvIHJlcGFpbnQg
dGhlIGxheWVyCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGxheW91dCBzdGFydGVkLiAgTHVj
a2lseSB0aGUgbGF5ZXIgaGFzIGNhY2hlZCB0aGUgcmVwYWludCByZWN0IGZvciBpdHMgb3JpZ2lu
YWwKKyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbmQgc2l6ZSwgYW5kIHNvIHdlIGNhbiB1
c2UgdGhhdCB0byBtYWtlIGEgcmVwYWludCBoYXBwZW4gbm93LgorICAgICAgICAgICAgICAgIHJl
cGFpbnRVc2luZ0NvbnRhaW5lcihjb250YWluZXJGb3JSZXBhaW50KCksIGxheWVyKCktPnJlcGFp
bnRSZWN0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgbGF5b3V0UnVu
c0FuZEZsb2F0cyhmdWxsTGF5b3V0LCBmbG9hdHMsIHJlcGFpbnRUb3AsIHJlcGFpbnRCb3R0b20p
OwogICAgIH0KIAogICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZy4K
</data>
<flag name="review"
          id="35816"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>