<?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>78785</bug_id>
          
          <creation_ts>2012-02-16 01:15:38 -0800</creation_ts>
          <short_desc>Upstream RenderThemeBlackberry.h/.cpp into WebCore/platform/blackberry</short_desc>
          <delta_ts>2012-02-20 21:24:15 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
    
    <blocked>78920</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Mary Wu">mawu</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>leo.yang</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>557980</commentid>
    <comment_count>0</comment_count>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-16 01:15:38 -0800</bug_when>
    <thetext>Upstream Blackberry implementation of RenderTheme.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>558767</commentid>
    <comment_count>1</comment_count>
      <attachid>127487</attachid>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-16 17:56:28 -0800</bug_when>
    <thetext>Created attachment 127487
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>558787</commentid>
    <comment_count>2</comment_count>
      <attachid>127491</attachid>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-16 18:31:21 -0800</bug_when>
    <thetext>Created attachment 127491
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>558810</commentid>
    <comment_count>3</comment_count>
      <attachid>127491</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-16 19:17:05 -0800</bug_when>
    <thetext>Comment on attachment 127491
Patch

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

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:159
&gt; +    : RenderTheme()

is this call needed?

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:410
&gt; +    switch (part) {
&gt; +    case CheckboxPart:
&gt; +            {
&gt; +                FloatSize smallCorner(smallRadius, smallRadius);
&gt; +                Path path;
&gt; +                path.addRoundedRect(rect, smallCorner);
&gt; +                info.context-&gt;drawPath(path);

the switch body is over indented.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>558883</commentid>
    <comment_count>4</comment_count>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-16 21:20:19 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 127491 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=127491&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:159
&gt; &gt; +    : RenderTheme()
&gt; 
&gt; is this call needed?
&gt; 
&gt; &gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:410
&gt; &gt; +    switch (part) {
&gt; &gt; +    case CheckboxPart:
&gt; &gt; +            {
&gt; &gt; +                FloatSize smallCorner(smallRadius, smallRadius);
&gt; &gt; +                Path path;
&gt; &gt; +                path.addRoundedRect(rect, smallCorner);
&gt; &gt; +                info.context-&gt;drawPath(path);
&gt; 
&gt; the switch body is over indented.

nice catch! Thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>558912</commentid>
    <comment_count>5</comment_count>
      <attachid>127522</attachid>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-16 22:07:34 -0800</bug_when>
    <thetext>Created attachment 127522
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559422</commentid>
    <comment_count>6</comment_count>
      <attachid>127522</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-17 12:12:25 -0800</bug_when>
    <thetext>Comment on attachment 127522
Patch

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

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:121
&gt; +float RenderThemeBlackBerry::defaultFontSize = 16.0;

Could move this up with the other constants

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:180
&gt; +    // in-page mode the same as in fullscreen mode..

I&apos;d do either 1 or 3 periods :)

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:187
&gt; +    return 0.0; // Turn off caret blinking.

Better use 0.

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:804
&gt; +    // paint main slider bar

Not a sentence.

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:811
&gt; +        // paint played part of bar (left of slider thumb) using selection color

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559601</commentid>
    <comment_count>7</comment_count>
      <attachid>127522</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-17 15:36:13 -0800</bug_when>
    <thetext>Comment on attachment 127522
Patch

r=me, but fix Rob&apos;s comments before pushing. thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559983</commentid>
    <comment_count>8</comment_count>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-19 19:03:51 -0800</bug_when>
    <thetext>thanks, patch updated according to Rob&apos;s comments, will commit soon...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560487</commentid>
    <comment_count>9</comment_count>
      <attachid>127877</attachid>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-20 17:45:56 -0800</bug_when>
    <thetext>Created attachment 127877
update patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560496</commentid>
    <comment_count>10</comment_count>
      <attachid>127882</attachid>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-20 17:56:13 -0800</bug_when>
    <thetext>Created attachment 127882
update patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560505</commentid>
    <comment_count>11</comment_count>
      <attachid>127882</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2012-02-20 18:07:35 -0800</bug_when>
    <thetext>Comment on attachment 127882
update patch

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

Pleas add the lost change log entry. Add address a nit. I&apos;ll help land.

&gt; Source/WebCore/platform/blackberry/RenderThemeBlackBerry.cpp:107
&gt; +float RenderThemeBlackBerry::defaultFontSize = 16.0;
&gt; +

Better 16</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560518</commentid>
    <comment_count>12</comment_count>
      <attachid>127887</attachid>
    <who name="Mary Wu">mawu</who>
    <bug_when>2012-02-20 18:23:31 -0800</bug_when>
    <thetext>Created attachment 127887
update patch

Thanks, Leo, here is the update patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560525</commentid>
    <comment_count>13</comment_count>
      <attachid>127887</attachid>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2012-02-20 18:31:17 -0800</bug_when>
    <thetext>Comment on attachment 127887
update patch

Good. Let me send to cq.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560540</commentid>
    <comment_count>14</comment_count>
      <attachid>127887</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-20 19:19:02 -0800</bug_when>
    <thetext>Comment on attachment 127887
update patch

Clearing flags on attachment: 127887

Committed r108290: &lt;http://trac.webkit.org/changeset/108290&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127487</attachid>
            <date>2012-02-16 17:56:28 -0800</date>
            <delta_ts>2012-02-16 18:31:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78785-20120217095626.patch</filename>
            <type>text/plain</type>
            <size>46125</size>
            <attacher name="Mary Wu">mawu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2MjE4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmI0OTI5NzJhMmFlNTlh
YjI4NDA5M2IzZTg2ZWRmZWM1YmQzYjQyYi4uOGRhYzg4YThiY2RmYTUyYTY2YzZmMmIzZDA4NjMw
OGUzMjc4ZjBmOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEyLTAyLTE2ICBNYXJ5
IFd1ICA8bWFyeS53dUB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJlYW0gUmVu
ZGVyVGhlbWVCbGFja2JlcnJ5LmgvLmNwcCBpbnRvIFdlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJy
eQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzg3ODUK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFs
IHVwc3RyZWFtLCBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ibGFja2JlcnJ5
L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2Js
YWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5Lmg6IEFkZGVkLgorCiAyMDEyLTAxLTMwICBQ
ZXRlciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVj
dG9yOiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiBjbGVhbiBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlci5oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5
L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFj
a2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjE4YWJjOTQwY2Vh
N2RkYmQ1Y2Y1M2EwYjBkMzY1MGQwZTM4NDQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmNwcApAQCAt
MCwwICsxLDk3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJDU1NWYWx1ZUtl
eXdvcmRzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJNZWRpYUNvbnRyb2xFbGVt
ZW50cy5oIgorI2luY2x1ZGUgIk1lZGlhUGxheWVyUHJpdmF0ZUJsYWNrQmVycnkuaCIKKyNpbmNs
dWRlICJQYWludEluZm8uaCIKKyNpbmNsdWRlICJSZW5kZXJQcm9ncmVzcy5oIgorI2luY2x1ZGUg
IlJlbmRlclNsaWRlci5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJVc2Vy
QWdlbnRTdHlsZVNoZWV0cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFNpemVzICh1
bml0IHB4KQorY29uc3QgdW5zaWduZWQgc21hbGxSYWRpdXMgPSAxOworY29uc3QgdW5zaWduZWQg
bGFyZ2VSYWRpdXMgPSAzOworY29uc3QgdW5zaWduZWQgbGluZVdpZHRoID0gMTsKK2NvbnN0IGlu
dCBtYXJnaW5TaXplID0gNDsKK2NvbnN0IGludCBtZWRpYVNsaWRlclRodW1iV2lkdGggPSA0MDsK
K2NvbnN0IGludCBtZWRpYVNsaWRlclRodW1iSGVpZ2h0ID0gMTM7Citjb25zdCBpbnQgbWVkaWFT
bGlkZXJUaHVtYlJhZGl1cyA9IDU7Citjb25zdCBpbnQgc2xpZGVyVGh1bWJXaWR0aCA9IDE1Owor
Y29uc3QgaW50IHNsaWRlclRodW1iSGVpZ2h0ID0gMjU7CisKKy8vIENoZWNrYm94IGNoZWNrIHNj
YWxlcnMKK2NvbnN0IGZsb2F0IGNoZWNrYm94TGVmdFggPSA3IC8gNDAuMDsKK2NvbnN0IGZsb2F0
IGNoZWNrYm94TGVmdFkgPSAxIC8gMi4wOworY29uc3QgZmxvYXQgY2hlY2tib3hNaWRkbGVYID0g
MTkgLyA1MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hNaWRkbGVZID0gNyAvIDI1LjA7Citjb25z
dCBmbG9hdCBjaGVja2JveFJpZ2h0WCA9IDMzIC8gNDAuMDsKK2NvbnN0IGZsb2F0IGNoZWNrYm94
UmlnaHRZID0gMSAvIDUuMDsKK2NvbnN0IGZsb2F0IGNoZWNrYm94U3Ryb2tlVGhpY2tuZXNzID0g
Ni41OworCisvLyBSYWRpbyBidXR0b24gc2NhbGVyCitjb25zdCBmbG9hdCByYWRpb0J1dHRvbkNo
ZWNrU3RhdGVTY2FsZXIgPSA3IC8gMzAuMDsKKworLy8gTXVsdGlwbGllcnMKK2NvbnN0IHVuc2ln
bmVkIHBhZGRpbmdEaXZpc29yID0gNTsKKworLy8gQ29sb3JzCitjb25zdCBSR0JBMzIgY2FyZXRC
b3R0b20gPSAweGZmMjE2M2JmOworY29uc3QgUkdCQTMyIGNhcmV0VG9wID0gMHhmZjY5YTVmYTsK
KworY29uc3QgUkdCQTMyIHJlZ3VsYXJCb3R0b20gPSAweGZmZGNkZWU0OworY29uc3QgUkdCQTMy
IHJlZ3VsYXJUb3AgPSAweGZmZjdmMmVlOworY29uc3QgUkdCQTMyIGhvdmVyQm90dG9tID0gMHhm
ZmI1ZDNmYzsKK2NvbnN0IFJHQkEzMiBob3ZlclRvcCA9IDB4ZmZjY2VhZmY7Citjb25zdCBSR0JB
MzIgZGVwcmVzc2VkQm90dG9tID0gMHhmZjMzODhmZjsKK2NvbnN0IFJHQkEzMiBkZXByZXNzZWRU
b3AgPSAweGZmNjZhMGYyOworY29uc3QgUkdCQTMyIGRpc2FibGVkQm90dG9tID0gMHhmZmU3ZTdl
NzsKK2NvbnN0IFJHQkEzMiBkaXNhYmxlZFRvcCA9IDB4ZmZlZmVmZWY7CisKK2NvbnN0IFJHQkEz
MiByZWd1bGFyQm90dG9tT3V0bGluZSA9IDB4ZmY2ZTcwNzM7Citjb25zdCBSR0JBMzIgcmVndWxh
clRvcE91dGxpbmUgPSAweGZmYjliOGI4OworY29uc3QgUkdCQTMyIGhvdmVyQm90dG9tT3V0bGlu
ZSA9IDB4ZmYyMTYzYmY7Citjb25zdCBSR0JBMzIgaG92ZXJUb3BPdXRsaW5lID0gMHhmZjY5YmVm
YTsKK2NvbnN0IFJHQkEzMiBkZXByZXNzZWRCb3R0b21PdXRsaW5lID0gMHhmZjBjM2Q4MTsKK2Nv
bnN0IFJHQkEzMiBkZXByZXNzZWRUb3BPdXRsaW5lID0gMHhmZjFkNGQ3MDsKK2NvbnN0IFJHQkEz
MiBkaXNhYmxlZE91dGxpbmUgPSAweGZmZDVkOWRlOworCitjb25zdCBSR0JBMzIgcHJvZ3Jlc3NS
ZWd1bGFyQm90dG9tID0gY2FyZXRUb3A7Citjb25zdCBSR0JBMzIgcHJvZ3Jlc3NSZWd1bGFyVG9w
ID0gY2FyZXRCb3R0b207CisKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b20g
PSAweGZmZjZmMmVlOworY29uc3QgUkdCQTMyIHJhbmdlU2xpZGVyUmVndWxhclRvcCA9IDB4ZmZk
ZWUwZTU7Citjb25zdCBSR0JBMzIgcmFuZ2VTbGlkZXJSb2xsQm90dG9tID0gMHhmZmM5ZThmZTsK
K2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJvbGxUb3AgPSAweGZmYjVkM2ZjOworCitjb25zdCBS
R0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tT3V0bGluZSA9IDB4ZmZiOWJhYmQ7Citjb25z
dCBSR0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyVG9wT3V0bGluZSA9IDB4ZmZiN2I3Yjc7Citjb25z
dCBSR0JBMzIgcmFuZ2VTbGlkZXJSb2xsQm90dG9tT3V0bGluZSA9IDB4ZmY2N2FiZTA7Citjb25z
dCBSR0JBMzIgcmFuZ2VTbGlkZXJSb2xsVG9wT3V0bGluZSA9IDB4ZmY2OWFkZjk7CisKK2NvbnN0
IFJHQkEzMiBkcmFnUmVndWxhckxpZ2h0ID0gMHhmZmZkZmRmZDsKK2NvbnN0IFJHQkEzMiBkcmFn
UmVndWxhckRhcmsgPSAweGZmYmFiYWJhOworY29uc3QgUkdCQTMyIGRyYWdSb2xsTGlnaHQgPSAw
eGZmZjJmMmYyOworY29uc3QgUkdCQTMyIGRyYWdSb2xsRGFyayA9IDB4ZmY2OWE4ZmY7CisKK2Nv
bnN0IFJHQkEzMiBzZWxlY3Rpb24gPSAweGZmMmI4ZmZmOworCitjb25zdCBSR0JBMzIgYmxhY2tQ
ZW4gPSBDb2xvcjo6YmxhY2s7Citjb25zdCBSR0JBMzIgZm9jdXNSaW5nUGVuID0gMHhmZmEzYzhm
ZTsKKworLy8gV2UgYWltIHRvIG1hdGNoIElFIGhlcmUuCisvLyAtSUUgdXNlcyBhIGZvbnQgYmFz
ZWQgb24gdGhlIGVuY29kaW5nIGFzIHRoZSBkZWZhdWx0IGZvbnQgZm9yIGZvcm0gY29udHJvbHMu
CisvLyAtR2Vja28gdXNlcyBNUyBTaGVsbCBEbGcgKGFjdHVhbGx5IGNhbGxzIEdldFN0b2NrT2Jq
ZWN0KERFRkFVTFRfR1VJX0ZPTlQpLAorLy8gd2hpY2ggcmV0dXJucyBNUyBTaGVsbCBEbGcpCisv
LyAtU2FmYXJpIHVzZXMgTHVjaWRhIEdyYW5kZS4KKy8vCisvLyBGSVhNRTogVGhlIG9ubHkgY2Fz
ZSB3aGVyZSB3ZSBrbm93IHdlIGRvbid0IG1hdGNoIElFIGlzIGZvciBBTlNJIGVuY29kaW5ncy4K
Ky8vIElFIHVzZXMgTVMgU2hlbGwgRGxnIHRoZXJlLCB3aGljaCB3ZSByZW5kZXIgaW5jb3JyZWN0
bHkgYXQgY2VydGFpbiBwaXhlbAorLy8gc2l6ZXMgKGUuZy4gMTVweCkuIFNvIHdlIGp1c3QgdXNl
IEFyaWFsIGZvciBub3cuCitjb25zdCBTdHJpbmcmIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6ZGVm
YXVsdEdVSUZvbnQoKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoU3RyaW5nLCBmb250RmFj
ZSwgKCJBcmlhbCIpKTsKKyAgICByZXR1cm4gZm9udEZhY2U7Cit9CisKK2Zsb2F0IFJlbmRlclRo
ZW1lQmxhY2tCZXJyeTo6ZGVmYXVsdEZvbnRTaXplID0gMTYuMDsKKworc3RhdGljIFBhc3NSZWZQ
dHI8R3JhZGllbnQ+IGNyZWF0ZUxpbmVhckdyYWRpZW50KFJHQkEzMiB0b3AsIFJHQkEzMiBib3R0
b20sIGNvbnN0IEludFBvaW50JiBhLCBjb25zdCBJbnRQb2ludCYgYikKK3sKKyAgICBSZWZQdHI8
R3JhZGllbnQ+IGdyYWRpZW50ID0gR3JhZGllbnQ6OmNyZWF0ZShhLCBiKTsKKyAgICBncmFkaWVu
dC0+YWRkQ29sb3JTdG9wKDAuMCwgQ29sb3IodG9wKSk7CisgICAgZ3JhZGllbnQtPmFkZENvbG9y
U3RvcCgxLjAsIENvbG9yKGJvdHRvbSkpOworICAgIHJldHVybiBncmFkaWVudC5yZWxlYXNlKCk7
Cit9CisKK3N0YXRpYyBQYXRoIHJvdW5kZWRSZWN0Rm9yQm9yZGVyKFJlbmRlck9iamVjdCogb2Jq
ZWN0LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG9i
amVjdC0+c3R5bGUoKTsKKyAgICBMZW5ndGhTaXplIHRvcExlZnRSYWRpdXMgPSBzdHlsZS0+Ym9y
ZGVyVG9wTGVmdFJhZGl1cygpOworICAgIExlbmd0aFNpemUgdG9wUmlnaHRSYWRpdXMgPSBzdHls
ZS0+Ym9yZGVyVG9wUmlnaHRSYWRpdXMoKTsKKyAgICBMZW5ndGhTaXplIGJvdHRvbUxlZnRSYWRp
dXMgPSBzdHlsZS0+Ym9yZGVyQm90dG9tTGVmdFJhZGl1cygpOworICAgIExlbmd0aFNpemUgYm90
dG9tUmlnaHRSYWRpdXMgPSBzdHlsZS0+Ym9yZGVyQm90dG9tUmlnaHRSYWRpdXMoKTsKKworICAg
IFBhdGggcm91bmRlZFJlY3Q7CisgICAgcm91bmRlZFJlY3QuYWRkUm91bmRlZFJlY3QocmVjdCwg
SW50U2l6ZSh0b3BMZWZ0UmFkaXVzLndpZHRoKCkudmFsdWUoKSwgdG9wTGVmdFJhZGl1cy5oZWln
aHQoKS52YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRT
aXplKHRvcFJpZ2h0UmFkaXVzLndpZHRoKCkudmFsdWUoKSwgdG9wUmlnaHRSYWRpdXMuaGVpZ2h0
KCkudmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50U2l6
ZShib3R0b21MZWZ0UmFkaXVzLndpZHRoKCkudmFsdWUoKSwgYm90dG9tTGVmdFJhZGl1cy5oZWln
aHQoKS52YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRT
aXplKGJvdHRvbVJpZ2h0UmFkaXVzLndpZHRoKCkudmFsdWUoKSwgYm90dG9tUmlnaHRSYWRpdXMu
aGVpZ2h0KCkudmFsdWUoKSkpOworICAgIHJldHVybiByb3VuZGVkUmVjdDsKK30KKworUGFzc1Jl
ZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZShQYWdlKiBwYWdlKQor
eworICAgIHN0YXRpYyBSZW5kZXJUaGVtZSogdGhlbWUgPSBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICByZXR1cm4gdGhlbWU7Cit9CisKK1Bhc3NSZWZQdHI8
UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y3JlYXRlKCkKK3sKKyAgICByZXR1
cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1lQmxhY2tCZXJyeSgpKTsKK30KKworUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpSZW5kZXJUaGVtZUJsYWNrQmVycnkoKQorICAgIDogUmVuZGVyVGhlbWUo
KQoreworfQorCitSZW5kZXJUaGVtZUJsYWNrQmVycnk6On5SZW5kZXJUaGVtZUJsYWNrQmVycnko
KQoreworfQorCitTdHJpbmcgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpleHRyYURlZmF1bHRTdHls
ZVNoZWV0KCkKK3sKKyAgICByZXR1cm4gU3RyaW5nKHRoZW1lQmxhY2tCZXJyeVVzZXJBZ2VudFN0
eWxlU2hlZXQsIHNpemVvZih0aGVtZUJsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0KSk7Cit9
CisKKyNpZiBFTkFCTEUoVklERU8pCitTdHJpbmcgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpleHRy
YU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCkKK3sKKyAgICByZXR1cm4gU3RyaW5nKG1lZGlhQ29u
dHJvbHNCbGFja0JlcnJ5VXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKG1lZGlhQ29udHJvbHNC
bGFja0JlcnJ5VXNlckFnZW50U3R5bGVTaGVldCkpOworfQorCitTdHJpbmcgUmVuZGVyVGhlbWVC
bGFja0JlcnJ5Ojpmb3JtYXRNZWRpYUNvbnRyb2xzUmVtYWluaW5nVGltZShmbG9hdCwgZmxvYXQg
ZHVyYXRpb24pIGNvbnN0Cit7CisgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gbWFrZSB0
aGUgYXBwZWFyYW5jZSBvZiBtZWRpYSB0aW1lIGNvbnRyb2xsZXIgaW4KKyAgICAvLyBpbi1wYWdl
IG1vZGUgdGhlIHNhbWUgYXMgaW4gZnVsbHNjcmVlbiBtb2RlLi4KKyAgICByZXR1cm4gZm9ybWF0
TWVkaWFDb250cm9sc1RpbWUoZHVyYXRpb24pOworfQorI2VuZGlmCisKK2RvdWJsZSBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OmNhcmV0QmxpbmtJbnRlcnZhbCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IDAuMDsgLy8gVHVybiBvZmYgY2FyZXQgYmxpbmtpbmcuCit9CisKK3ZvaWQgUmVuZGVyVGhlbWVC
bGFja0JlcnJ5OjpzeXN0ZW1Gb250KGludCBwcm9wSWQsIEZvbnREZXNjcmlwdGlvbiYgZm9udERl
c2NyaXB0aW9uKSBjb25zdAoreworICAgIGZsb2F0IGZvbnRTaXplID0gZGVmYXVsdEZvbnRTaXpl
OworCisgICAgaWYgKHByb3BJZCA9PSBDU1NWYWx1ZVdlYmtpdE1pbmlDb250cm9sIHx8IHByb3BJ
ZCA9PSAgQ1NTVmFsdWVXZWJraXRTbWFsbENvbnRyb2wgfHwgcHJvcElkID09IENTU1ZhbHVlV2Vi
a2l0Q29udHJvbCkgeworICAgICAgICAvLyBXaHkgMiBwb2ludHMgc21hbGxlcj8gQmVjYXVzZSB0
aGF0J3Mgd2hhdCBHZWNrbyBkb2VzLiBOb3RlIHRoYXQgd2UKKyAgICAgICAgLy8gYXJlIGFzc3Vt
aW5nIGEgOTZkcGkgc2NyZWVuLCB3aGljaCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSB1c2Ugb24g
V2luZG93cy4KKyAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IHBvaW50c1BlckluY2ggPSA3Mi4w
ZjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IHBpeGVsc1BlckluY2ggPSA5Ni4wZjsKKyAg
ICAgICAgZm9udFNpemUgLT0gKDIuMGYgLyBwb2ludHNQZXJJbmNoKSAqIHBpeGVsc1BlckluY2g7
CisgICAgfQorCisgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KGRl
ZmF1bHRHVUlGb250KCkpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKGZv
bnRTaXplKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0SXNBYnNvbHV0ZVNpemUodHJ1ZSk7Cisg
ICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0Zh
bWlseSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFdlaWdodChGb250V2VpZ2h0Tm9ybWFsKTsK
KyAgICBmb250RGVzY3JpcHRpb24uc2V0SXRhbGljKGZhbHNlKTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OnNldEJ1dHRvblN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QK
K3sKKyAgICBMZW5ndGggdmVydFBhZGRpbmcoaW50KHN0eWxlLT5mb250U2l6ZSgpIC8gcGFkZGlu
Z0Rpdmlzb3IpLCBGaXhlZCk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdUb3AodmVydFBhZGRpbmcp
OworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKHZlcnRQYWRkaW5nKTsKK30KKwordm9pZCBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIHNldEJ1dHRvblN0
eWxlKHN0eWxlKTsKKyAgICBzdHlsZS0+c2V0Q3Vyc29yKENVUlNPUl9XRUJLSVRfR1JBQik7Cit9
CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RUZXh0QXJlYVN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAg
IHNldEJ1dHRvblN0eWxlKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OnBhaW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0RmllbGRPclRl
eHRBcmVhT3JTZWFyY2hGaWVsZChvYmplY3QsIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRl
clRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0VGV4dEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvcios
IFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5
bGUoc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRUZXh0Rmll
bGRPclRleHRBcmVhT3JTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFp
bnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEFTU0VSVChpbmZvLmNv
bnRleHQpOworICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCA9IGluZm8uY29udGV4dDsKKwor
ICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VTdHlsZShTb2xpZFN0
cm9rZSk7CisgICAgY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisgICAg
aWYgKCFpc0VuYWJsZWQob2JqZWN0KSkKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Io
ZGlzYWJsZWRPdXRsaW5lLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBlbHNlIGlmIChpc1By
ZXNzZWQob2JqZWN0KSkKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChj
cmVhdGVMaW5lYXJHcmFkaWVudChkZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21P
dXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOwor
ICAgIGVsc2UgaWYgKGlzSG92ZXJlZChvYmplY3QpIHx8IGlzRm9jdXNlZChvYmplY3QpKQorICAg
ICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3Zl
clRvcE91dGxpbmUsIGhvdmVyQm90dG9tT3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCBy
ZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRleHQtPnNldFN0
cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJlZ3VsYXJUb3BPdXRsaW5lLCByZWd1
bGFyQm90dG9tT3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29y
bmVyKCkpKTsKKworICAgIFBhdGggdGV4dEZpZWxkUm91bmRlZFJlY3RhbmdsZSA9IHJvdW5kZWRS
ZWN0Rm9yQm9yZGVyKG9iamVjdCwgcmVjdCk7CisgICAgaWYgKG9iamVjdC0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpID09IFNlYXJjaEZpZWxkUGFydCkgeworICAgICAgICAvLyBXZSBmb3JjZSB0aGUg
ZmlsbCBjb2xvciB0byBXaGl0ZSBzbyBhcyB0byBtYXRjaCB0aGUgYmFja2dyb3VuZCBjb2xvciBv
ZiB0aGUgc2VhcmNoIGNhbmNlbCBidXR0b24gZ3JhcGhpYy4KKyAgICAgICAgY29udGV4dC0+c2V0
RmlsbENvbG9yKENvbG9yOjp3aGl0ZSwgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgIGNv
bnRleHQtPmRyYXdQYXRoKHRleHRGaWVsZFJvdW5kZWRSZWN0YW5nbGUpOworICAgIH0gZWxzZQor
ICAgICAgICBjb250ZXh0LT5zdHJva2VQYXRoKHRleHRGaWVsZFJvdW5kZWRSZWN0YW5nbGUpOwor
ICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVy
biBwYWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKG9iamVjdCwgaW5mbywgcmVj
dCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RTZWFyY2hGaWVsZFN0
eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25z
dAoreworICAgIHNldEJ1dHRvblN0eWxlKHN0eWxlKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJs
YWNrQmVycnk6OmFkanVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxl
Y3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc3RhdGlj
IGNvbnN0IGZsb2F0IGRlZmF1bHRDb250cm9sRm9udFBpeGVsU2l6ZSA9IDEzOworICAgIHN0YXRp
YyBjb25zdCBmbG9hdCBkZWZhdWx0Q2FuY2VsQnV0dG9uU2l6ZSA9IDk7CisgICAgc3RhdGljIGNv
bnN0IGZsb2F0IG1pbkNhbmNlbEJ1dHRvblNpemUgPSA1OworICAgIHN0YXRpYyBjb25zdCBmbG9h
dCBtYXhDYW5jZWxCdXR0b25TaXplID0gMjE7CisKKyAgICAvLyBTY2FsZSB0aGUgYnV0dG9uIHNp
emUgYmFzZWQgb24gdGhlIGZvbnQgc2l6ZQorICAgIGZsb2F0IGZvbnRTY2FsZSA9IHN0eWxlLT5m
b250U2l6ZSgpIC8gZGVmYXVsdENvbnRyb2xGb250UGl4ZWxTaXplOworICAgIGludCBjYW5jZWxC
dXR0b25TaXplID0gbHJvdW5kZihzdGQ6Om1pbihzdGQ6Om1heChtaW5DYW5jZWxCdXR0b25TaXpl
LCBkZWZhdWx0Q2FuY2VsQnV0dG9uU2l6ZSAqIGZvbnRTY2FsZSksIG1heENhbmNlbEJ1dHRvblNp
emUpKTsKKyAgICBMZW5ndGggbGVuZ3RoKGNhbmNlbEJ1dHRvblNpemUsIEZpeGVkKTsKKyAgICBz
dHlsZS0+c2V0V2lkdGgobGVuZ3RoKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KGxlbmd0aCk7Cit9
CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNlYXJjaEZpZWxkKFJlbmRlck9i
amVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkT3JUZXh0QXJlYU9yU2VhcmNoRmllbGQob2Jq
ZWN0LCBpbmZvLCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50
U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEFTU0VSVChvYmpl
Y3QtPnBhcmVudCgpKTsKKyAgICBpZiAoIW9iamVjdC0+cGFyZW50KCkgfHwgIW9iamVjdC0+cGFy
ZW50KCktPmlzQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFJlbmRlckJveCog
cGFyZW50UmVuZGVyQm94ID0gdG9SZW5kZXJCb3gob2JqZWN0LT5wYXJlbnQoKSk7CisKKyAgICBJ
bnRSZWN0IHBhcmVudEJveCA9IHBhcmVudFJlbmRlckJveC0+YWJzb2x1dGVDb250ZW50Qm94KCk7
CisgICAgSW50UmVjdCBib3VuZHMgPSByZWN0OworICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2NhbGVk
IGJ1dHRvbiBzdGF5cyBzcXVhcmUgYW5kIGZpdHMgaW4gaXRzIHBhcmVudCdzIGJveC4KKyAgICBi
b3VuZHMuc2V0SGVpZ2h0KHN0ZDo6bWluKHBhcmVudEJveC53aWR0aCgpLCBzdGQ6Om1pbihwYXJl
bnRCb3guaGVpZ2h0KCksIGJvdW5kcy5oZWlnaHQoKSkpKTsKKyAgICBib3VuZHMuc2V0V2lkdGgo
Ym91bmRzLmhlaWdodCgpKTsKKworICAgIC8vIFB1dCB0aGUgYnV0dG9uIGluIHRoZSBtaWRkbGUg
dmVydGljYWxseSwgYW5kIHJvdW5kIHVwIHRoZSB2YWx1ZS4KKyAgICAvLyBTbyBpZiBpdCBoYXMg
dG8gYmUgb25lIHBpeGVsIG9mZi1jZW50ZXIsIGl0IHdvdWxkIGJlIG9uZSBwaXhlbCBjbG9zZXIK
KyAgICAvLyB0byB0aGUgYm90dG9tIG9mIHRoZSBmaWVsZC4gVGhpcyB3b3VsZCBsb29rIGJldHRl
ciB3aXRoIHRoZSB0ZXh0LgorICAgIGJvdW5kcy5zZXRZKHBhcmVudEJveC55KCkgKyAocGFyZW50
Qm94LmhlaWdodCgpIC0gYm91bmRzLmhlaWdodCgpICsgMSkgLyAyKTsKKworICAgIHN0YXRpYyBJ
bWFnZSogY2FuY2VsSW1hZ2UgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInNlYXJjaENh
bmNlbCIpLmxlYWtSZWYoKTsKKyAgICBzdGF0aWMgSW1hZ2UqIGNhbmNlbFByZXNzZWRJbWFnZSA9
IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZSgic2VhcmNoQ2FuY2VsUHJlc3NlZCIpLmxlYWtS
ZWYoKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0ltYWdlKGlzUHJlc3NlZChvYmplY3Qp
ID8gY2FuY2VsUHJlc3NlZEltYWdlIDogY2FuY2VsSW1hZ2UsIG9iamVjdC0+c3R5bGUoKS0+Y29s
b3JTcGFjZSgpLCBib3VuZHMpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgLy8gVGhlc2Ug
c2VlbSB0byBiZSByZWFzb25hYmxlIHBhZGRpbmcgdmFsdWVzIGZyb20gb2JzZXJ2YXRpb24uCisg
ICAgY29uc3QgaW50IHBhZGRpbmdMZWZ0ID0gODsKKyAgICBjb25zdCBpbnQgcGFkZGluZ1JpZ2h0
ID0gNDsKKworICAgIGNvbnN0IGludCBtaW5IZWlnaHQgPSBzdHlsZS0+Zm9udFNpemUoKSAqIDI7
CisKKyAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisgICAgc3R5bGUtPnNldEhlaWdodChMZW5n
dGgoQXV0bykpOworCisgICAgc3R5bGUtPnNldFBhZGRpbmdSaWdodChMZW5ndGgobWluSGVpZ2h0
ICsgcGFkZGluZ1JpZ2h0LCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5n
dGgocGFkZGluZ0xlZnQsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEN1cnNvcihDVVJTT1JfV0VC
S0lUX0dSQUIpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y2FsY3VsYXRlQnV0
dG9uU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaW50IHNpemUgPSBzdHls
ZS0+Zm9udFNpemUoKTsKKyAgICBMZW5ndGggbGVuZ3RoKHNpemUsIEZpeGVkKTsKKyAgICBpZiAo
c3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBDaGVja2JveFBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2Uo
KSA9PSBSYWRpb1BhcnQpIHsKKyAgICAgICAgc3R5bGUtPnNldFdpZHRoKGxlbmd0aCk7CisgICAg
ICAgIHN0eWxlLT5zZXRIZWlnaHQobGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgdGhlbiB3
ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNp
Y09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICBz
dHlsZS0+c2V0V2lkdGgobGVuZ3RoKTsKKworICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRv
KCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQobGVuZ3RoKTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFp
bnRCdXR0b24ob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAg
Y2FsY3VsYXRlQnV0dG9uU2l6ZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0Jl
cnJ5OjpwYWludFJhZGlvKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGlu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50QnV0dG9uKG9iamVj
dCwgaW5mbywgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpzZXRSYWRp
b1NpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGNhbGN1bGF0ZUJ1dHRvblNp
emUoc3R5bGUpOworfQorCisvLyBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIFdlYkNv
cmUgYXNzdW1lcyB0aGUgYnV0dG9uIGlzIGZ1bGx5IGRlY29yYXRlZAorYm9vbCBSZW5kZXJUaGVt
ZUJsYWNrQmVycnk6OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQVNTRVJUKGluZm8uY29u
dGV4dCk7CisgICAgaW5mby5jb250ZXh0LT5zYXZlKCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNl
dFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRo
aWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAgQ29sb3IgY2hlY2soYmxhY2tQZW4pOworICAgIGlm
ICghaXNFbmFibGVkKG9iamVjdCkpIHsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGlzYWJsZWRUb3AsIGRpc2FibGVkQm90dG9tLCBy
ZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBp
bmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRpc2FibGVkT3V0bGluZSwgQ29sb3JTcGFjZURl
dmljZVJHQik7CisgICAgfSBlbHNlIGlmIChpc1ByZXNzZWQob2JqZWN0KSkgeworICAgICAgICBp
bmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChkZXByZXNz
ZWRUb3AsIGRlcHJlc3NlZEJvdHRvbSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhN
YXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChj
cmVhdGVMaW5lYXJHcmFkaWVudChkZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21P
dXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOwor
ICAgIH0gZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpIHsKKyAgICAgICAgaW5mby5jb250ZXh0
LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3AsIGhvdmVyQm90
dG9tLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAg
ICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50
KGhvdmVyVG9wT3V0bGluZSwgaG92ZXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVy
KCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZm8u
Y29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJlZ3VsYXJUb3As
IHJlZ3VsYXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5l
cigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQocmVndWxhclRvcE91dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRsaW5lLCByZWN0
Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0KKworICAg
IENvbnRyb2xQYXJ0IHBhcnQgPSBvYmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKyAgICBz
d2l0Y2ggKHBhcnQpIHsKKyAgICBjYXNlIENoZWNrYm94UGFydDoKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICBGbG9hdFNpemUgc21hbGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFk
aXVzKTsKKyAgICAgICAgICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgICAgICAgICAgcGF0aC5h
ZGRSb3VuZGVkUmVjdChyZWN0LCBzbWFsbENvcm5lcik7CisgICAgICAgICAgICAgICAgaW5mby5j
b250ZXh0LT5kcmF3UGF0aChwYXRoKTsKKworICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQo
b2JqZWN0KSkgeworICAgICAgICAgICAgICAgICAgICBQYXRoIGNoZWNrUGF0aDsKKyAgICAgICAg
ICAgICAgICAgICAgSW50UmVjdCByZWN0MiA9IHJlY3Q7CisgICAgICAgICAgICAgICAgICAgIHJl
Y3QyLmluZmxhdGUoLTEpOworICAgICAgICAgICAgICAgICAgICBjaGVja1BhdGgubW92ZVRvKEZs
b2F0UG9pbnQocmVjdDIueCgpICsgcmVjdDIud2lkdGgoKSAqIGNoZWNrYm94TGVmdFgsIHJlY3Qy
LnkoKSArIHJlY3QyLmhlaWdodCgpICogY2hlY2tib3hMZWZ0WSkpOworICAgICAgICAgICAgICAg
ICAgICBjaGVja1BhdGguYWRkTGluZVRvKEZsb2F0UG9pbnQocmVjdDIueCgpICsgcmVjdDIud2lk
dGgoKSAqIGNoZWNrYm94TWlkZGxlWCwgcmVjdDIubWF4WSgpIC0gcmVjdDIuaGVpZ2h0KCkgKiBj
aGVja2JveE1pZGRsZVkpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXRoLmFkZExpbmVU
byhGbG9hdFBvaW50KHJlY3QyLngoKSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveFJpZ2h0WCwg
cmVjdDIueSgpICsgcmVjdDIuaGVpZ2h0KCkgKiBjaGVja2JveFJpZ2h0WSkpOworICAgICAgICAg
ICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldExpbmVDYXAoUm91bmRDYXApOworICAgICAgICAg
ICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGJsYWNrUGVuLCBDb2xvclNw
YWNlRGV2aWNlUkdCKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJv
a2VUaGlja25lc3MocmVjdDIud2lkdGgoKSAvIGNoZWNrYm94U3Ryb2tlVGhpY2tuZXNzKTsKKyAg
ICAgICAgICAgICAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3UGF0aChjaGVja1BhdGgpOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIGNh
c2UgUmFkaW9QYXJ0OgorICAgICAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3RWxsaXBzZShyZWN0
KTsKKyAgICAgICAgICAgIGlmIChpc0NoZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgICAg
IEludFJlY3QgcmVjdDIgPSByZWN0OworICAgICAgICAgICAgICAgIHJlY3QyLmluZmxhdGUoLXJl
Y3Qud2lkdGgoKSAqIHJhZGlvQnV0dG9uQ2hlY2tTdGF0ZVNjYWxlcik7CisgICAgICAgICAgICAg
ICAgaW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoY2hlY2ssIENvbG9yU3BhY2VEZXZpY2VSR0Ip
OworICAgICAgICAgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoY2hlY2ssIENv
bG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd0Vs
bGlwc2UocmVjdDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBCdXR0b25QYXJ0OgorICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6CisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgRmxvYXRTaXplIGxhcmdlQ29ybmVyKGxhcmdlUmFkaXVzLCBsYXJnZVJh
ZGl1cyk7CisgICAgICAgICAgICAgICAgUGF0aCBwYXRoOworICAgICAgICAgICAgICAgIHBhdGgu
YWRkUm91bmRlZFJlY3QocmVjdCwgbGFyZ2VDb3JuZXIpOworICAgICAgICAgICAgICAgIGluZm8u
Y29udGV4dC0+ZHJhd1BhdGgocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICBjYXNlIFNxdWFyZUJ1dHRvblBhcnQ6CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgUGF0aCBwYXRoOworICAgICAgICAgICAgICAgIHBhdGguYWRkUmVjdChyZWN0KTsKKyAg
ICAgICAgICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdQYXRoKHBhdGgpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGluZm8uY29u
dGV4dC0+cmVzdG9yZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
aW5mby5jb250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJl
bmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiBjc3MsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZWxlbWVudCkgY29uc3QKK3sKKyAg
ICBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKGNzcywgc3R5bGUsIGVsZW1lbnQpOworfQorCit2
b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0Q2hlY2tib3hTdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRD
aGVja2JveFNpemUoc3R5bGUpOworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Cisg
ICAgTGVuZ3RoIG1hcmdpbihtYXJnaW5TaXplLCBGaXhlZCk7CisgICAgc3R5bGUtPnNldE1hcmdp
bkJvdHRvbShtYXJnaW4pOworICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChtYXJnaW4pOworICAg
IHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09SX1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OmFkanVzdFJhZGlvU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRl
clN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0UmFkaW9TaXplKHN0eWxl
KTsKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworICAgIExlbmd0aCBtYXJnaW4o
bWFyZ2luU2l6ZSwgRml4ZWQpOworICAgIHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20obWFyZ2luKTsK
KyAgICBzdHlsZS0+c2V0TWFyZ2luUmlnaHQobWFyZ2luKTsKKyAgICBzdHlsZS0+c2V0Q3Vyc29y
KENVUlNPUl9XRUJLSVRfR1JBQik7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojpw
YWludE1lbnVMaXN0QnV0dG9uR3JhZGllbnRBbmRBcnJvdyhHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIFJlbmRlck9iamVjdCogb2JqZWN0LCBJbnRSZWN0IGJ1dHRvblJlY3QsIGNvbnN0IFBhdGgm
IGNsaXBQYXRoKQoreworICAgIEFTU0VSVChjb250ZXh0KTsKKyAgICBjb250ZXh0LT5zYXZlKCk7
CisgICAgaWYgKCFpc0VuYWJsZWQob2JqZWN0KSkKKyAgICAgICAgY29udGV4dC0+c2V0RmlsbEdy
YWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRpc2FibGVkVG9wLCBkaXNhYmxlZEJvdHRvbSwg
YnV0dG9uUmVjdC5tYXhYTWluWUNvcm5lcigpLCBidXR0b25SZWN0Lm1heFhNYXhZQ29ybmVyKCkp
KTsKKyAgICBlbHNlIGlmIChpc1ByZXNzZWQob2JqZWN0KSkKKyAgICAgICAgY29udGV4dC0+c2V0
RmlsbEdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcCwgZGVwcmVzc2Vk
Qm90dG9tLCBidXR0b25SZWN0Lm1heFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlD
b3JuZXIoKSkpOworICAgIGVsc2UgaWYgKGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICBjb250
ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3AsIGhvdmVy
Qm90dG9tLCBidXR0b25SZWN0Lm1heFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlD
b3JuZXIoKSkpOworICAgIGVsc2UKKyAgICAgICAgY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNy
ZWF0ZUxpbmVhckdyYWRpZW50KHJlZ3VsYXJUb3AsIHJlZ3VsYXJCb3R0b20sIGJ1dHRvblJlY3Qu
bWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisKKyAgICAv
LyAxLiBQYWludCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgYnV0dG9uLgorICAgIGNvbnRleHQtPmNs
aXAoY2xpcFBhdGgpOworICAgIGNvbnRleHQtPmRyYXdSZWN0KGJ1dHRvblJlY3QpOworICAgIGNv
bnRleHQtPnJlc3RvcmUoKTsKKworICAgIC8vIDIuIFBhaW50IHRoZSBidXR0b24gYXJyb3cuCisg
ICAgYnV0dG9uUmVjdC5pbmZsYXRlKC1idXR0b25SZWN0LndpZHRoKCkgLyAzKTsKKyAgICBidXR0
b25SZWN0Lm1vdmUoMCwgYnV0dG9uUmVjdC5oZWlnaHQoKSAqIDcgLyAyMCk7CisgICAgUGF0aCBw
YXRoOworICAgIHBhdGgubW92ZVRvKEZsb2F0UG9pbnQoYnV0dG9uUmVjdC54KCksIGJ1dHRvblJl
Y3QueSgpKSk7CisgICAgcGF0aC5hZGRMaW5lVG8oRmxvYXRQb2ludChidXR0b25SZWN0LngoKSAr
IGJ1dHRvblJlY3Qud2lkdGgoKSwgYnV0dG9uUmVjdC55KCkpKTsKKyAgICBwYXRoLmFkZExpbmVU
byhGbG9hdFBvaW50KGJ1dHRvblJlY3QueCgpICsgYnV0dG9uUmVjdC53aWR0aCgpIC8gMi4wLCBi
dXR0b25SZWN0LnkoKSArIGJ1dHRvblJlY3QuaGVpZ2h0KCkgLyAyLjApKTsKKyAgICBwYXRoLmNs
b3NlU3VicGF0aCgpOworCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0
cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3Mo
bGluZVdpZHRoKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6YmxhY2ssIENv
bG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6Ymxh
Y2ssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGNvbnRleHQtPnNldExpbmVKb2luKEJldmVs
Sm9pbik7CisgICAgY29udGV4dC0+ZmlsbFBhdGgocGF0aCk7CisgICAgY29udGV4dC0+cmVzdG9y
ZSgpOworfQorCitzdGF0aWMgSW50UmVjdCBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3Qo
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBGSVhNRTogVGhlIG1lbnUgbGlzdCBhcnJv
dyBidXR0b24gc2hvdWxkIGhhdmUgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIHdpZHRoICh0byBlbnN1
cmUgdXNhYmlsaXR5KSBvcgorICAgIC8vIHNjYWxlIHdpdGggcmVzcGVjdCB0byB0aGUgZm9udCBz
aXplIHVzZWQgaW4gdGhlIG1lbnUgbGlzdCBjb250cm9sIG9yIHNvbWUgY29tYmluYXRpb24gb2Yg
Ym90aC4KKyAgICByZXR1cm4gSW50UmVjdChJbnRQb2ludChyZWN0Lm1heFgoKSAtIHJlY3QuaGVp
Z2h0KCksIHJlY3QueSgpKSwgSW50U2l6ZShyZWN0LmhlaWdodCgpLCByZWN0LmhlaWdodCgpKSk7
Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50TWVudUxpc3RCYWNrZ3JvdW5kKEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgY29uc3QgUGF0aCYgbWVudUxpc3RQYXRoLCBjb25zdCBDb2xvciYgYmFja2dy
b3VuZENvbG9yKQoreworICAgIEFTU0VSVChjb250ZXh0KTsKKyAgICBjb250ZXh0LT5zYXZlKCk7
CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKGJhY2tncm91bmRDb2xvciwgQ29sb3JTcGFjZURl
dmljZVJHQik7CisgICAgY29udGV4dC0+ZmlsbFBhdGgobWVudUxpc3RQYXRoKTsKKyAgICBjb250
ZXh0LT5yZXN0b3JlKCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1l
bnVMaXN0KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgLy8gTm90ZSwgdGhpcyBtZXRob2QgaXMgbm90IGNhbGxl
ZCBpZiB0aGUgbWVudSBsaXN0IGV4cGxpY2l0bHkgc3BlY2lmaWVzIGVpdGhlciBhIGJvcmRlciBv
ciBiYWNrZ3JvdW5kIGNvbG9yLgorICAgIC8vIEluc3RlYWQsIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6cGFpbnRNZW51TGlzdEJ1dHRvbiBpcyBjYWxsZWQuIFRoZXJlZm9yZSwgd2hlbiB0aGlzIG1l
dGhvZCBpcyBjYWxsZWQsIHdlIGRvbid0CisgICAgLy8gaGF2ZSB0byBhZGp1c3QgcmVjdCB3aXRo
IHJlc3BlY3QgdG8gdGhlIGJvcmRlciBkaW1lbnNpb25zLgorCisgICAgQVNTRVJUKGluZm8uY29u
dGV4dCk7CisgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gaW5mby5jb250ZXh0OworCisg
ICAgUGF0aCBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUgPSByb3VuZGVkUmVjdEZvckJvcmRlcihv
YmplY3QsIHJlY3QpOworCisgICAgLy8gMS4gUGFpbnQgdGhlIGJhY2tncm91bmQgb2YgdGhlIGVu
dGlyZSBjb250cm9sLgorICAgIHBhaW50TWVudUxpc3RCYWNrZ3JvdW5kKGNvbnRleHQsIG1lbnVM
aXN0Um91bmRlZFJlY3RhbmdsZSwgQ29sb3I6OndoaXRlKTsKKworICAgIC8vIDIuIFBhaW50IHRo
ZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24gYW5kIGl0cyBhcnJvdy4KKyAgICBJbnRSZWN0IGFy
cm93QnV0dG9uUmVjdGFuZ2xlID0gY29tcHV0ZU1lbnVMaXN0QXJyb3dCdXR0b25SZWN0KHJlY3Qp
OworICAgIHBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KGNvbnRleHQsIG9iamVj
dCwgYXJyb3dCdXR0b25SZWN0YW5nbGUsIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSk7CisKKyAg
ICAvLyA0LiBTdHJva2UgYW4gb3V0bGluZSBhcm91bmQgdGhlIGVudGlyZSBjb250cm9sLgorICAg
IGNvbnRleHQtPnNhdmUoKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VTdHlsZShTb2xpZFN0cm9r
ZSk7CisgICAgY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisgICAgaWYg
KCFpc0VuYWJsZWQob2JqZWN0KSkKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoZGlz
YWJsZWRPdXRsaW5lLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBlbHNlIGlmIChpc1ByZXNz
ZWQob2JqZWN0KSkKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQoZGVwcmVzc2VkVG9wT3V0bGluZSwgZGVwcmVzc2VkQm90dG9tT3V0bGluZSwg
cmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBlbHNl
IGlmIChpc0hvdmVyZWQob2JqZWN0KSkKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlR3JhZGll
bnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3ZlckJvdHRvbU91dGxp
bmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAg
ZWxzZQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFk
aWVudChyZWd1bGFyVG9wT3V0bGluZSwgcmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1p
bllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisKKyAgICBjb250ZXh0LT5zdHJv
a2VQYXRoKG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgp
OworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBh
aW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
aW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBOb3RlLCB0aGlzIG1ldGhvZCBp
cyBvbmx5IGNhbGxlZCBpZiB0aGUgbWVudSBsaXN0IGV4cGxpY2l0bHkgc3BlY2lmaWVzIGVpdGhl
ciBhIGJvcmRlciBvciBiYWNrZ3JvdW5kIGNvbG9yLgorICAgIC8vIE90aGVyd2lzZSwgUmVuZGVy
VGhlbWVCbGFja0JlcnJ5OjpwYWludE1lbnVMaXN0IGlzIGNhbGxlZC4gV2UgbmVlZCB0byBmaXQg
dGhlIGFycm93IGJ1dHRvbiB3aXRoIHRoZSBib3JkZXIgYm94CisgICAgLy8gb2YgdGhlIG1lbnUt
bGlzdCBzbyBhcyB0byBub3Qgb2NjbHVkZSB0aGUgY3VzdG9tIGJvcmRlci4KKworICAgIC8vIFdl
IGNvbXB1dGUgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGUgZGlt
ZW5zaW9ucyBvZiB0aGUgZW50aXJlIG1lbnUtbGlzdCBjb250cm9sIChpLmUuIHJlY3QpIGFuZAor
ICAgIC8vIGl0cyBib3JkZXIgcmFkaXVzIHNvIHRoYXQgd2UgY2xpcCB0aGUgY29udG91ciBvZiB0
aGUgYXJyb3cgYnV0dG9uICh3aGVuIHdlIHBhaW50IGl0IGJlbG93KSB0byBtYXRjaCB0aGUgY29u
dG91ciBvZgorICAgIC8vIHRoZSBjb250cm9sLgorICAgIFBhdGggbWVudUxpc3RSb3VuZGVkUmVj
dGFuZ2xlID0gcm91bmRlZFJlY3RGb3JCb3JkZXIob2JqZWN0LCByZWN0KTsKKworICAgIC8vIDEu
IFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBlbnRpcmUgY29udHJvbC4KKyAgICBDb2xvciBm
aWxsQ29sb3IgPSBvYmplY3QtPnN0eWxlKCktPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9w
ZXJ0eUJhY2tncm91bmRDb2xvcik7CisgICAgaWYgKCFmaWxsQ29sb3IuaXNWYWxpZCgpKQorICAg
ICAgICBmaWxsQ29sb3IgPSBDb2xvcjo6d2hpdGU7CisgICAgcGFpbnRNZW51TGlzdEJhY2tncm91
bmQoaW5mby5jb250ZXh0LCBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUsIGZpbGxDb2xvcik7CisK
KyAgICAvLyAyLiBQYWludCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgYnV0dG9uIGFuZCBpdHMgYXJy
b3cuCisgICAgSW50UmVjdCBib3VuZHMgPSBJbnRSZWN0KHJlY3QueCgpICsgb2JqZWN0LT5zdHls
ZSgpLT5ib3JkZXJMZWZ0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lnko
KSArIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyVG9wV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICByZWN0LndpZHRoKCkgLSBvYmplY3QtPnN0eWxlKCktPmJvcmRlckxlZnRXaWR0aCgp
IC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJSaWdodFdpZHRoKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgcmVjdC5oZWlnaHQoKSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyVG9wV2lkdGgo
KSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tV2lkdGgoKSk7CisKKyAgICBJbnRSZWN0
IGFycm93QnV0dG9uUmVjdGFuZ2xlID0gY29tcHV0ZU1lbnVMaXN0QXJyb3dCdXR0b25SZWN0KGJv
dW5kcyk7IC8vIEZpdCB0aGUgYXJyb3cgYnV0dG9uIHdpdGhpbiB0aGUgYm9yZGVyIGJveCBvZiB0
aGUgbWVudS1saXN0LgorICAgIHBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KGlu
Zm8uY29udGV4dCwgb2JqZWN0LCBhcnJvd0J1dHRvblJlY3RhbmdsZSwgbWVudUxpc3RSb3VuZGVk
UmVjdGFuZ2xlKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5OjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAor
eworICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBzdHlsZS0+YXBwZWFyYW5jZSgpOworICAgIGlmIChw
YXJ0ID09IE1lZGlhVm9sdW1lU2xpZGVyVGh1bWJQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJI
b3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7CisgICAg
ICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFy
dCA/IHNsaWRlclRodW1iSGVpZ2h0IDogc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAg
ICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgocGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFy
dCA/IHNsaWRlclRodW1iV2lkdGggOiBzbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKKyAgICB9
IGVsc2UgaWYgKHBhcnQgPT0gTWVkaWFTbGlkZXJUaHVtYlBhcnQpIHsKKyAgICAgICAgc3R5bGUt
PnNldFdpZHRoKExlbmd0aChtZWRpYVNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7CisgICAgICAg
IHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKG1lZGlhU2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7
CisgICAgfQorfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRTbGlkZXJUcmFj
ayhSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworICAgIGNvbnN0IHN0YXRpYyBpbnQgU2xpZGVyVHJhY2tIZWlnaHQgPSA1
OworICAgIEludFJlY3QgcmVjdDI7CisgICAgaWYgKG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpID09IFNsaWRlckhvcml6b250YWxQYXJ0KSB7CisgICAgICAgIHJlY3QyLnNldEhlaWdodChT
bGlkZXJUcmFja0hlaWdodCk7CisgICAgICAgIHJlY3QyLnNldFdpZHRoKHJlY3Qud2lkdGgoKSk7
CisgICAgICAgIHJlY3QyLnNldFgocmVjdC54KCkpOworICAgICAgICByZWN0Mi5zZXRZKHJlY3Qu
eSgpICsgKHJlY3QuaGVpZ2h0KCkgLSBTbGlkZXJUcmFja0hlaWdodCkgLyAyKTsKKyAgICB9IGVs
c2UgeworICAgICAgICByZWN0Mi5zZXRIZWlnaHQocmVjdC5oZWlnaHQoKSk7CisgICAgICAgIHJl
Y3QyLnNldFdpZHRoKFNsaWRlclRyYWNrSGVpZ2h0KTsKKyAgICAgICAgcmVjdDIuc2V0WChyZWN0
LngoKSArIChyZWN0LndpZHRoKCkgLSBTbGlkZXJUcmFja0hlaWdodCkgLyAyKTsKKyAgICAgICAg
cmVjdDIuc2V0WShyZWN0LnkoKSk7CisgICAgfQorICAgIHJldHVybiBwYWludFNsaWRlclRyYWNr
UmVjdChvYmplY3QsIGluZm8sIHJlY3QyKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVy
cnk6OnBhaW50U2xpZGVyVHJhY2tSZWN0KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50U2xp
ZGVyVHJhY2tSZWN0KG9iamVjdCwgaW5mbywgcmVjdCwgcmFuZ2VTbGlkZXJSZWd1bGFyVG9wT3V0
bGluZSwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tT3V0bGluZSwKKyAgICAgICAgICAgICAgICBy
YW5nZVNsaWRlclJlZ3VsYXJUb3AsIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbSk7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmpl
Y3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0LAor
ICAgICAgICBSR0JBMzIgc3Ryb2tlQ29sb3JTdGFydCwgUkdCQTMyIHN0cm9rZUNvbG9yRW5kLCBS
R0JBMzIgZmlsbENvbG9yU3RhcnQsIFJHQkEzMiBmaWxsQ29sb3JFbmQpCit7CisgICAgRmxvYXRT
aXplIHNtYWxsQ29ybmVyKHNtYWxsUmFkaXVzLCBzbWFsbFJhZGl1cyk7CisKKyAgICBpbmZvLmNv
bnRleHQtPnNhdmUoKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ry
b2tlKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOwor
CisgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVu
dChzdHJva2VDb2xvclN0YXJ0LCBzdHJva2VDb2xvckVuZCwgcmVjdC5tYXhYTWluWUNvcm5lcigp
LCByZWN0LiBtYXhYTWF4WUNvcm5lcigpKSk7CisgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZmlsbENvbG9yU3RhcnQsIGZpbGxDb2xvckVuZCwg
cmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIFBh
dGggcGF0aDsKKyAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIHNtYWxsQ29ybmVyKTsKKyAg
ICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgaW5mby5jb250ZXh0LT5yZXN0
b3JlKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6cGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEZsb2F0U2l6ZSBsYXJnZUNvcm5l
cihsYXJnZVJhZGl1cywgbGFyZ2VSYWRpdXMpOworCisgICAgaW5mby5jb250ZXh0LT5zYXZlKCk7
CisgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VTdHlsZShTb2xpZFN0cm9rZSk7CisgICAgaW5m
by5jb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKKworICAgIGlmIChpc1By
ZXNzZWQob2JqZWN0KSB8fCBpc0hvdmVyZWQob2JqZWN0KSkgeworICAgICAgICBpbmZvLmNvbnRl
eHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGhvdmVyVG9wT3V0bGlu
ZSwgaG92ZXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QuIG1heFhN
YXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3Jl
YXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3AsIGhvdmVyQm90dG9tLCByZWN0Lm1heFhNaW5ZQ29y
bmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxh
clRvcE91dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCks
IHJlY3QuIG1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxs
R3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwg
cmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICB9CisK
KyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyZWN0LCBsYXJnZUNvcm5l
cik7CisgICAgaW5mby5jb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKworICAgIGJvb2wgaXNWZXJ0
aWNhbCA9IHJlY3Qud2lkdGgoKSA+IHJlY3QuaGVpZ2h0KCk7CisgICAgSW50UG9pbnQgc3RhcnRQ
b2ludChyZWN0LngoKSArIChpc1ZlcnRpY2FsID8gNSA6IDIpLCByZWN0LnkoKSArIChpc1ZlcnRp
Y2FsID8gMiA6IDUpKTsKKyAgICBJbnRQb2ludCBlbmRQb2ludChyZWN0LngoKSArIChpc1ZlcnRp
Y2FsID8gMjAgOiAyKSwgcmVjdC55KCkgKyAoaXNWZXJ0aWNhbCA/IDIgOiAyMCkpOworICAgIGNv
bnN0IGludCBsaW5lT2Zmc2V0ID0gMjsKKyAgICBjb25zdCBpbnQgc2hhZG93T2Zmc2V0ID0gMTsK
KworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGlmIChpc1ZlcnRp
Y2FsKSB7CisgICAgICAgICAgICBzdGFydFBvaW50LnNldFkoc3RhcnRQb2ludC55KCkgKyBsaW5l
T2Zmc2V0KTsKKyAgICAgICAgICAgIGVuZFBvaW50LnNldFkoZW5kUG9pbnQueSgpICsgbGluZU9m
ZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydFBvaW50LnNldFgoc3Rh
cnRQb2ludC54KCkgKyBsaW5lT2Zmc2V0KTsKKyAgICAgICAgICAgIGVuZFBvaW50LnNldFgoZW5k
UG9pbnQueCgpICsgbGluZU9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUHJlc3Nl
ZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICAgICAgaW5mby5jb250ZXh0
LT5zZXRTdHJva2VDb2xvcihkcmFnUm9sbExpZ2h0LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihkcmFn
UmVndWxhckxpZ2h0LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICAgICAgaW5mby5jb250ZXh0
LT5kcmF3TGluZShzdGFydFBvaW50LCBlbmRQb2ludCk7CisKKyAgICAgICAgaWYgKGlzVmVydGlj
YWwpIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WShzdGFydFBvaW50LnkoKSArIHNoYWRv
d09mZnNldCk7CisgICAgICAgICAgICBlbmRQb2ludC5zZXRZKGVuZFBvaW50LnkoKSArIHNoYWRv
d09mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydFBvaW50LnNldFgo
c3RhcnRQb2ludC54KCkgKyBzaGFkb3dPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0
WChlbmRQb2ludC54KCkgKyBzaGFkb3dPZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChp
c1ByZXNzZWQob2JqZWN0KSB8fCBpc0hvdmVyZWQob2JqZWN0KSkKKyAgICAgICAgICAgIGluZm8u
Y29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoZHJhZ1JvbGxEYXJrLCBDb2xvclNwYWNlRGV2aWNlUkdC
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xv
cihkcmFnUmVndWxhckRhcmssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBpbmZvLmNv
bnRleHQtPmRyYXdMaW5lKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKyAgICB9CisgICAgaW5mby5j
b250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBw
YWludE1lZGlhQnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYg
cmVjdCwgSW1hZ2UqIGltYWdlKQoreworICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFnZSwgQ29s
b3JTcGFjZURldmljZVJHQiwgcmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJl
bmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiBv
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworI2lmIEVOQUJMRShWSURFTykKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQg
PSB0b1BhcmVudE1lZGlhRWxlbWVudChvYmplY3QpOworCisgICAgaWYgKCFtZWRpYUVsZW1lbnQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0YXRpYyBJbWFnZSogbWVkaWFQbGF5ID0g
SW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJwbGF5IikubGVha1JlZigpOworICAgIHN0YXRp
YyBJbWFnZSogbWVkaWFQYXVzZSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZSgicGF1c2Ui
KS5sZWFrUmVmKCk7CisKKyAgICByZXR1cm4gcGFpbnRNZWRpYUJ1dHRvbihwYWludEluZm8uY29u
dGV4dCwgcmVjdCwgbWVkaWFFbGVtZW50LT5jYW5QbGF5KCkgPyBtZWRpYVBsYXkgOiBtZWRpYVBh
dXNlKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFN
KHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsK
KyNlbmRpZgorfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYU11dGVC
dXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBIVE1MTWVkaWFF
bGVtZW50KiBtZWRpYUVsZW1lbnQgPSB0b1BhcmVudE1lZGlhRWxlbWVudChvYmplY3QpOworCisg
ICAgaWYgKCFtZWRpYUVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0YXRp
YyBJbWFnZSogbWVkaWFNdXRlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJzcGVha2Vy
IikubGVha1JlZigpOworICAgIHN0YXRpYyBJbWFnZSogbWVkaWFVbm11dGUgPSBJbWFnZTo6bG9h
ZFBsYXRmb3JtUmVzb3VyY2UoInNwZWFrZXJfbXV0ZSIpLmxlYWtSZWYoKTsKKworICAgIHJldHVy
biBwYWludE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYUVsZW1lbnQt
Pm11dGVkKCkgfHwgIW1lZGlhRWxlbWVudC0+dm9sdW1lKCkgPyBtZWRpYVVubXV0ZSA6IG1lZGlh
TXV0ZSk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShvYmplY3QpOworICAgIFVOVVNFRF9QQVJB
TShwYWludEluZm8pOworICAgIFVOVVNFRF9QQVJBTShyZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7
CisjZW5kaWYKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVkaWFGdWxs
c2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyNpZiBFTkFCTEUoVklERU8pCisgICAgaWYg
KCF0b1BhcmVudE1lZGlhRWxlbWVudChvYmplY3QpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBzdGF0aWMgSW1hZ2UqIG1lZGlhRnVsbHNjcmVlbiA9IEltYWdlOjpsb2FkUGxhdGZvcm1S
ZXNvdXJjZSgiZnVsbHNjcmVlbiIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlh
QnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYUZ1bGxzY3JlZW4pOworI2Vsc2UK
KyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsK
KyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVy
T2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBJbnRSZWN0IHJlY3QyKHJlY3QueCgp
ICsgMywgcmVjdC55KCkgKyAxNCwgcmVjdC53aWR0aCgpIC0gNiwgMik7CisKKyAgICBIVE1MTWVk
aWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSB0b1BhcmVudE1lZGlhRWxlbWVudChvYmplY3QpOwor
CisgICAgaWYgKCFtZWRpYUVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZs
b2F0IGxvYWRlZCA9IDA7CisgICAgLy8gRklYTUU6IHJlcGxhY2UgbG9hZGVkIHdpdGggY29tbWVu
dGVkIG91dCBvbmUgd2hlbiBidWZmZXIgYnVnIGlzIGZpeGVkIChzZWUgY29tbWVudCBpbgorICAg
IC8vIE1lZGlhUGxheWVyUHJpdmF0ZU1NcmVuZGVyZXI6OnBlcmNlbnRMb2FkZWQpLgorICAgIC8v
IGxvYWRlZCA9IG1lZGlhRWxlbWVudC0+cGVyY2VudExvYWRlZCgpOworICAgIGlmIChtZWRpYUVs
ZW1lbnQtPnBsYXllcigpKQorICAgICAgICBsb2FkZWQgPSBzdGF0aWNfY2FzdDxNZWRpYVBsYXll
clByaXZhdGUgKj4obWVkaWFFbGVtZW50LT5wbGF5ZXIoKS0+aW1wbGVtZW50YXRpb24oKSktPnBl
cmNlbnRMb2FkZWQoKTsKKyAgICBmbG9hdCBwb3NpdGlvbiA9IG1lZGlhRWxlbWVudC0+ZHVyYXRp
b24oKSA+IDAgPyAobWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpIC8gbWVkaWFFbGVtZW50LT5k
dXJhdGlvbigpKSA6IDA7CisKKyAgICBpbnQgeCA9IHJlY3QueCgpICsgMzsKKyAgICBpbnQgeSA9
IHJlY3QueSgpICsgMTQ7CisgICAgaW50IHcgPSByZWN0LndpZHRoKCkgLSA2OworICAgIGludCBo
ID0gMjsKKworICAgIGludCB3UGxheWVkID0gKHcgKiBwb3NpdGlvbik7CisgICAgaW50IHdMb2Fk
ZWQgPSAodyAtIG1lZGlhU2xpZGVyVGh1bWJXaWR0aCkgKiBsb2FkZWQgKyBtZWRpYVNsaWRlclRo
dW1iV2lkdGg7CisKKyAgICBJbnRSZWN0IHBsYXllZCh4LCB5LCB3UGxheWVkLCBoKTsKKyAgICBJ
bnRSZWN0IGJ1ZmZlcmVkKHgsIHksIHdMb2FkZWQsIGgpOworCisgICAgLy8gcGFpbnQgbWFpbiBz
bGlkZXIgYmFyCisgICAgYm9vbCByZXN1bHQgPSBwYWludFNsaWRlclRyYWNrUmVjdChvYmplY3Qs
IHBhaW50SW5mbywgcmVjdDIpOworCisgICAgaWYgKGxvYWRlZCA+IDAgfHwgcG9zaXRpb24gPiAw
KSB7CisgICAgICAgIC8vIHBhaW50IGJ1ZmZlcmVkIGJhcgorICAgICAgICBwYWludFNsaWRlclRy
YWNrUmVjdChvYmplY3QsIHBhaW50SW5mbywgYnVmZmVyZWQsIENvbG9yOjpkYXJrR3JheSwgQ29s
b3I6OmRhcmtHcmF5LCBDb2xvcjo6ZGFya0dyYXksIENvbG9yOjpkYXJrR3JheSk7CisKKyAgICAg
ICAgLy8gcGFpbnQgcGxheWVkIHBhcnQgb2YgYmFyIChsZWZ0IG9mIHNsaWRlciB0aHVtYikgdXNp
bmcgc2VsZWN0aW9uIGNvbG9yCisgICAgICAgIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9iamVjdCwg
cGFpbnRJbmZvLCBwbGF5ZWQsIHNlbGVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVj
dGlvbik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisKKyNlbHNlCisgICAgVU5VU0VEX1BB
UkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BB
UkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitib29sIFJlbmRlclRo
ZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyNp
ZiBFTkFCTEUoVklERU8pCisgICAgaWYgKCFvYmplY3QtPnBhcmVudCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBSZW5kZXJTbGlkZXIqIHNsaWRlciA9IHRvUmVuZGVyU2xpZGVyKG9i
amVjdC0+cGFyZW50KCktPnBhcmVudCgpLT5wYXJlbnQoKSk7CisgICAgaWYgKCFzbGlkZXIpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7Cisg
ICAgUGF0aCBtZWRpYVRodW1iUm91bmRlZFJlY3RhbmdsZTsKKyAgICBtZWRpYVRodW1iUm91bmRl
ZFJlY3RhbmdsZS5hZGRSb3VuZGVkUmVjdChyZWN0LCBGbG9hdFNpemUobWVkaWFTbGlkZXJUaHVt
YlJhZGl1cywgbWVkaWFTbGlkZXJUaHVtYlJhZGl1cykpOworICAgIHBhaW50SW5mby5jb250ZXh0
LT5zZXRTdHJva2VTdHlsZShTb2xpZFN0cm9rZSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNl
dFN0cm9rZVRoaWNrbmVzcygwLjUpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VD
b2xvcihDb2xvcjo6YmxhY2ssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAgaWYgKGlzUHJl
c3NlZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpIHx8IHNsaWRlci0+aW5EcmFnTW9kZSgp
KSB7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQoc2VsZWN0aW9uLCBDb2xvcihzZWxlY3Rpb24pLmRhcmsoKS5yZ2IoKSwKKyAg
ICAgICAgICAgICAgICByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIo
KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoQ29sb3I6OndoaXRlLCBDb2xvcihDb2xvcjo6d2hp
dGUpLmRhcmsoKS5yZ2IoKSwKKyAgICAgICAgICAgICAgICByZWN0Lm1heFhNaW5ZQ29ybmVyKCks
IHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0KKyAgICBwYWludEluZm8uY29udGV4dC0+
ZmlsbFBhdGgobWVkaWFUaHVtYlJvdW5kZWRSZWN0YW5nbGUpOworICAgIHBhaW50SW5mby5jb250
ZXh0LT5yZXN0b3JlKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICAgVU5VU0VEX1BB
UkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BB
UkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitib29sIFJlbmRlclRo
ZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCog
b2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyNpZiBFTkFCTEUoVklERU8pCisgICAgZmxvYXQgcGFkID0gcmVjdC53aWR0aCgpICogMC40
NTsKKyAgICBmbG9hdCB4ID0gcmVjdC54KCkgKyBwYWQ7CisgICAgZmxvYXQgeSA9IHJlY3QueSgp
ICsgcGFkOworICAgIGZsb2F0IHdpZHRoID0gcmVjdC53aWR0aCgpICogMC4xOworICAgIGZsb2F0
IGhlaWdodCA9IHJlY3QuaGVpZ2h0KCkgLSAoMi4wICogcGFkKTsKKworICAgIEludFJlY3QgcmVj
dDIoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICByZXR1cm4gcGFpbnRTbGlkZXJUcmFja1Jl
Y3Qob2JqZWN0LCBwYWludEluZm8sIHJlY3QyKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9i
amVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJl
Y3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitib29sIFJlbmRlclRoZW1lQmxh
Y2tCZXJyeTo6cGFpbnRNZWRpYVZvbHVtZVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0
LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyNp
ZiBFTkFCTEUoVklERU8pCisgICAgc3RhdGljIEltYWdlKiBtZWRpYVZvbHVtZVRodW1iID0gSW1h
Z2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJ2b2x1bWVfdGh1bWIiKS5sZWFrUmVmKCk7CisKKyAg
ICByZXR1cm4gcGFpbnRNZWRpYUJ1dHRvbihwYWludEluZm8uY29udGV4dCwgcmVjdCwgbWVkaWFW
b2x1bWVUaHVtYik7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShvYmplY3QpOworICAgIFVOVVNF
RF9QQVJBTShwYWludEluZm8pOworICAgIFVOVVNFRF9QQVJBTShyZWN0KTsKKyAgICByZXR1cm4g
ZmFsc2U7CisjZW5kaWYKK30KKworQ29sb3IgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwbGF0Zm9y
bUZvY3VzUmluZ0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZm9jdXNSaW5nUGVuOworfQor
CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKK0NvbG9yIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6
cGxhdGZvcm1UYXBIaWdobGlnaHRDb2xvcigpIGNvbnN0Cit7CisgICAgLy8gU2FtZSBjb2xvciBh
cyAnZm9jdXNSaW5nUGVuJyArIDgwIG9mIGFscGhhIGNoYW5uZWwuCisgICAgcmV0dXJuIENvbG9y
KDE2MywgMjAwLCAyNTQsIDgwKTsKK30KKyNlbmRpZgorCitDb2xvciBSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gQ29sb3Ioc2VsZWN0aW9uKTsKK30KKworZG91YmxlIFJlbmRlclRoZW1lQmxh
Y2tCZXJyeTo6YW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9n
cmVzcyogcmVuZGVyUHJvZ3Jlc3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlbmRlclByb2dyZXNz
LT5pc0RldGVybWluYXRlKCkgPyAwLjAgOiAwLjE7Cit9CisKK2RvdWJsZSBSZW5kZXJUaGVtZUJs
YWNrQmVycnk6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3Mq
IHJlbmRlclByb2dyZXNzKSBjb25zdAoreworICAgIHJldHVybiByZW5kZXJQcm9ncmVzcy0+aXNE
ZXRlcm1pbmF0ZSgpID8gMC4wIDogMi4wOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6cGFpbnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghb2JqZWN0LT5pc1Byb2dy
ZXNzKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgUmVuZGVyUHJvZ3Jlc3MqIHJlbmRl
clByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVzcyhvYmplY3QpOworCisgICAgRmxvYXRTaXplIHNt
YWxsQ29ybmVyKHNtYWxsUmFkaXVzLCBzbWFsbFJhZGl1cyk7CisKKyAgICBpbmZvLmNvbnRleHQt
PnNhdmUoKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsK
KyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAg
aW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyYW5n
ZVNsaWRlclJlZ3VsYXJUb3BPdXRsaW5lLCByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b21PdXRsaW5l
LCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGlu
Zm8uY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJhbmdlU2xp
ZGVyUmVndWxhclRvcCwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tLCByZWN0Lm1heFhNaW5ZQ29y
bmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCBwYXRoOworICAgIHBh
dGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxDb3JuZXIpOworICAgIGluZm8uY29udGV4dC0+
ZmlsbFBhdGgocGF0aCk7CisKKyAgICBJbnRSZWN0IHJlY3QyID0gcmVjdDsKKyAgICByZWN0Mi5z
ZXRYKHJlY3QyLngoKSArIDEpOworICAgIHJlY3QyLnNldEhlaWdodChyZWN0Mi5oZWlnaHQoKSAt
IDIpOworICAgIHJlY3QyLnNldFkocmVjdDIueSgpICsgMSk7CisgICAgaW5mby5jb250ZXh0LT5z
ZXRTdHJva2VTdHlsZShOb1N0cm9rZSk7CisgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VUaGlj
a25lc3MoMCk7CisgICAgaWYgKHJlbmRlclByb2dyZXNzLT5pc0RldGVybWluYXRlKCkpIHsKKyAg
ICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdDIud2lkdGgoKSAqIHJlbmRlclByb2dyZXNzLT5wb3Np
dGlvbigpIC0gMik7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNyZWF0
ZUxpbmVhckdyYWRpZW50KHByb2dyZXNzUmVndWxhclRvcCwgcHJvZ3Jlc3NSZWd1bGFyQm90dG9t
LCByZWN0Mi5tYXhYTWluWUNvcm5lcigpLCByZWN0Mi5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgLy8gQW5pbWF0aW5nCisgICAgICAgIHJlY3QyLnNldFdpZHRoKHJl
Y3QyLndpZHRoKCkgLSAyKTsKKyAgICAgICAgUmVmUHRyPEdyYWRpZW50PiBncmFkaWVudCA9IEdy
YWRpZW50OjpjcmVhdGUocmVjdDIubWluWE1heFlDb3JuZXIoKSwgcmVjdDIubWF4WE1heFlDb3Ju
ZXIoKSk7CisgICAgICAgIGdyYWRpZW50LT5hZGRDb2xvclN0b3AoMC4wLCBDb2xvcihwcm9ncmVz
c1JlZ3VsYXJCb3R0b20pKTsKKyAgICAgICAgZ3JhZGllbnQtPmFkZENvbG9yU3RvcChyZW5kZXJQ
cm9ncmVzcy0+YW5pbWF0aW9uUHJvZ3Jlc3MoKSwgQ29sb3IocHJvZ3Jlc3NSZWd1bGFyVG9wKSk7
CisgICAgICAgIGdyYWRpZW50LT5hZGRDb2xvclN0b3AoMS4wLCBDb2xvcihwcm9ncmVzc1JlZ3Vs
YXJCb3R0b20pKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoZ3JhZGll
bnQpOworICAgIH0KKyAgICBQYXRoIHBhdGgyOworICAgIHBhdGgyLmFkZFJvdW5kZWRSZWN0KHJl
Y3QyLCBzbWFsbENvcm5lcik7CisgICAgaW5mby5jb250ZXh0LT5maWxsUGF0aChwYXRoMik7CisK
KyAgICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ibGFja2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjgzN2Yx
NzhmMTMwMGFjZDJjNjg4OTI4ZTNjMjExNTVkMjA1OTE3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5o
CkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgUmVuZGVyVGhlbWVCbGFja0JlcnJ5X2gKKyNk
ZWZpbmUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5X2gKKworI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmVuZGVyVGhlbWVCbGFja0JlcnJ5IDog
cHVibGljIFJlbmRlclRoZW1lIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5k
ZXJUaGVtZT4gY3JlYXRlKCk7CisgICAgdmlydHVhbCB+UmVuZGVyVGhlbWVCbGFja0JlcnJ5KCk7
CisKKyAgICB2aXJ0dWFsIFN0cmluZyBleHRyYURlZmF1bHRTdHlsZVNoZWV0KCk7CisKKyNpZiBF
TkFCTEUoVklERU8pCisgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFNZWRpYUNvbnRyb2xzU3R5bGVT
aGVldCgpOworICAgIHZpcnR1YWwgU3RyaW5nIGZvcm1hdE1lZGlhQ29udHJvbHNSZW1haW5pbmdU
aW1lKGZsb2F0IGN1cnJlbnRUaW1lLCBmbG9hdCBkdXJhdGlvbikgY29uc3Q7CisjZW5kaWYKKyAg
ICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNIb3Zlcihjb25zdCBSZW5kZXJTdHlsZSopIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KKworICAgIHZpcnR1YWwgZG91YmxlIGNhcmV0QmxpbmtJbnRlcnZhbCgp
IGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHN5c3RlbUZvbnQoaW50IGNzc1ZhbHVlSWQsIEZv
bnREZXNjcmlwdGlvbiYpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVh
bCBib29sIHBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqKSBj
b25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3Qg
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZvaWQgY2FsY3VsYXRlQnV0dG9uU2l6
ZShSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdFN0
eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIGJvb2wgcGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRl
clRodW1iU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludFNs
aWRlclRyYWNrKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3Qm
KTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRT
KQorICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1UYXBIaWdobGlnaHRDb2xvcigpIGNvbnN0Owor
I2VuZGlmCisKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25z
dDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUq
IHN0eWxlKSBjb25zdCB7IHJldHVybiBzdHlsZS0+aGFzQXBwZWFyYW5jZSgpOyB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0
eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0RmllbGRT
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0QXJl
YVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsK
KyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNo
RmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29u
c3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUo
Q1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZp
cnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZENh
bmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0
Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2
b2lkIGFkanVzdENoZWNrYm94U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RSYWRpb1N0eWxlKENTU1N0
eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRNZW51TGlzdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0
b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAg
IHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3Qg
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlh
Vm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVy
T2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwg
Ym9vbCBwYWludE1lZGlhVm9sdW1lU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhUGxh
eUJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7
CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFNdXRlQnV0dG9uKFJlbmRlck9iamVjdCosIGNv
bnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRQ
cm9ncmVzc0JhcihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0
Jik7CisgICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVz
c0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OworICAgIHZpcnR1YWwgZG91YmxlIGFuaW1hdGlv
bkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdDsKKworICAgIHZp
cnR1YWwgQ29sb3IgcGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nJiBkZWZhdWx0R1VJRm9udCgp
OworCisgICAgLy8gVGhlIGRlZmF1bHQgdmFyaWFibGUtd2lkdGggZm9udCBzaXplLiBXZSB1c2Ug
dGhpcyBhcyB0aGUgZGVmYXVsdCBmb250CisgICAgLy8gc2l6ZSBmb3IgdGhlICJzeXN0ZW0gZm9u
dCIsIGFuZCBhcyBhIGJhc2Ugc2l6ZSAod2hpY2ggd2UgdGhlbiBzaHJpbmspIGZvcgorICAgIC8v
IGZvcm0gY29udHJvbCBmb250cy4KKyAgICBzdGF0aWMgZmxvYXQgZGVmYXVsdEZvbnRTaXplOwor
CisgICAgUmVuZGVyVGhlbWVCbGFja0JlcnJ5KCk7CisgICAgdm9pZCBzZXRCdXR0b25TdHlsZShS
ZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgdm9pZCBwYWludE1lbnVMaXN0QnV0dG9uR3JhZGll
bnRBbmRBcnJvdyhHcmFwaGljc0NvbnRleHQqLCBSZW5kZXJPYmplY3QqLCBJbnRSZWN0IGJ1dHRv
blJlY3QsIGNvbnN0IFBhdGgmIGNsaXBQYXRoKTsKKyAgICBib29sIHBhaW50VGV4dEZpZWxkT3JU
ZXh0QXJlYU9yU2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29u
c3QgSW50UmVjdCYpOworICAgIGJvb2wgcGFpbnRTbGlkZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIGJvb2wgcGFpbnRTbGlk
ZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYsIFJHQkEzMiBzdHJva2VDb2xvclN0YXJ0LAorICAgICAgICAgICAgICAgIFJHQkEzMiBzdHJv
a2VDb2xvckVuZCwgUkdCQTMyIGZpbGxDb2xvclN0YXJ0LCBSR0JBMzIgZmlsbENvbG9yRW5kKTsK
KworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmVuZGVyVGhlbWVC
bGFja0JlcnJ5X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127491</attachid>
            <date>2012-02-16 18:31:21 -0800</date>
            <delta_ts>2012-02-16 22:07:25 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78785-20120217103118.patch</filename>
            <type>text/plain</type>
            <size>46454</size>
            <attacher name="Mary Wu">mawu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2MjE4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmI0OTI5NzJhMmFlNTlh
YjI4NDA5M2IzZTg2ZWRmZWM1YmQzYjQyYi4uOWFkNjM2MmU1OTJlMDc2NGU5Mjg5MmMwYzk1YTk4
NDE0YzI0MmE5NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDEyLTAyLTE2ICBNYXJ5
IFd1ICA8bWFyeS53dUB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJlYW0gUmVu
ZGVyVGhlbWVCbGFja2JlcnJ5LmgvLmNwcCBpbnRvIFdlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJy
eQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzg3ODUK
KworICAgICAgICBNYWluIENvbnRyaWJ1dG9yczoKKyAgICAgICAgRGFuaWVsIEJhdGVzIDxkYmF0
ZXNAcmltLmNvbT4KKyAgICAgICAgQnJ5YW4gR2lzbGFzb24gPGJnaXNsYXNvbkByaW0uY29tPgor
ICAgICAgICBBa2FzaCBWYXN3YW5pIDxha3Zhc3dhbmlAcmltLmNvbT4KKyAgICAgICAgRGF2ZSBC
YXR0aXN0YSA8ZGJhdHRpc3RhQHJpbS5jb20+CisgICAgICAgIFJvYmluIENhbyAgPHJvYmluLmNh
b0B0b3JjaG1vYmlsZS5jb20uY24+CisgICAgICAgIEdlbmV2aWV2ZSBNYWsgPGdtYWtAcmltLmNv
bT4KKyAgICAgICAgTWlrZSBGZW50b24gIDxtaWZlbnRvbkByaW0uY29tPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5v
IG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5k
ZXJUaGVtZUJsYWNrQmVycnkuaDogQWRkZWQuCisKIDIwMTItMDEtMzAgIFBldGVyIFJ5YmluICA8
cGV0ZXIucnliaW5AZ21haWwuY29tPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IENvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHk6IGNsZWFuIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyLmgKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVy
VGhlbWVCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMThhYmM5NDBjZWE3ZGRiZDVjZjUzYTBi
MGQzNjUwZDBlMzg0NDdkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsOTcyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUaGVtZUJsYWNrQmVycnkuaCIKKworI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNp
bmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5j
bHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlQmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlBhaW50SW5m
by5oIgorI2luY2x1ZGUgIlJlbmRlclByb2dyZXNzLmgiCisjaW5jbHVkZSAiUmVuZGVyU2xpZGVy
LmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hl
ZXRzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gU2l6ZXMgKHVuaXQgcHgpCitjb25z
dCB1bnNpZ25lZCBzbWFsbFJhZGl1cyA9IDE7Citjb25zdCB1bnNpZ25lZCBsYXJnZVJhZGl1cyA9
IDM7Citjb25zdCB1bnNpZ25lZCBsaW5lV2lkdGggPSAxOworY29uc3QgaW50IG1hcmdpblNpemUg
PSA0OworY29uc3QgaW50IG1lZGlhU2xpZGVyVGh1bWJXaWR0aCA9IDQwOworY29uc3QgaW50IG1l
ZGlhU2xpZGVyVGh1bWJIZWlnaHQgPSAxMzsKK2NvbnN0IGludCBtZWRpYVNsaWRlclRodW1iUmFk
aXVzID0gNTsKK2NvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMTU7Citjb25zdCBpbnQgc2xp
ZGVyVGh1bWJIZWlnaHQgPSAyNTsKKworLy8gQ2hlY2tib3ggY2hlY2sgc2NhbGVycworY29uc3Qg
ZmxvYXQgY2hlY2tib3hMZWZ0WCA9IDcgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hMZWZ0
WSA9IDEgLyAyLjA7Citjb25zdCBmbG9hdCBjaGVja2JveE1pZGRsZVggPSAxOSAvIDUwLjA7Citj
b25zdCBmbG9hdCBjaGVja2JveE1pZGRsZVkgPSA3IC8gMjUuMDsKK2NvbnN0IGZsb2F0IGNoZWNr
Ym94UmlnaHRYID0gMzMgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hSaWdodFkgPSAxIC8g
NS4wOworY29uc3QgZmxvYXQgY2hlY2tib3hTdHJva2VUaGlja25lc3MgPSA2LjU7CisKKy8vIFJh
ZGlvIGJ1dHRvbiBzY2FsZXIKK2NvbnN0IGZsb2F0IHJhZGlvQnV0dG9uQ2hlY2tTdGF0ZVNjYWxl
ciA9IDcgLyAzMC4wOworCisvLyBNdWx0aXBsaWVycworY29uc3QgdW5zaWduZWQgcGFkZGluZ0Rp
dmlzb3IgPSA1OworCisvLyBDb2xvcnMKK2NvbnN0IFJHQkEzMiBjYXJldEJvdHRvbSA9IDB4ZmYy
MTYzYmY7Citjb25zdCBSR0JBMzIgY2FyZXRUb3AgPSAweGZmNjlhNWZhOworCitjb25zdCBSR0JB
MzIgcmVndWxhckJvdHRvbSA9IDB4ZmZkY2RlZTQ7Citjb25zdCBSR0JBMzIgcmVndWxhclRvcCA9
IDB4ZmZmN2YyZWU7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b20gPSAweGZmYjVkM2ZjOworY29u
c3QgUkdCQTMyIGhvdmVyVG9wID0gMHhmZmNjZWFmZjsKK2NvbnN0IFJHQkEzMiBkZXByZXNzZWRC
b3R0b20gPSAweGZmMzM4OGZmOworY29uc3QgUkdCQTMyIGRlcHJlc3NlZFRvcCA9IDB4ZmY2NmEw
ZjI7Citjb25zdCBSR0JBMzIgZGlzYWJsZWRCb3R0b20gPSAweGZmZTdlN2U3OworY29uc3QgUkdC
QTMyIGRpc2FibGVkVG9wID0gMHhmZmVmZWZlZjsKKworY29uc3QgUkdCQTMyIHJlZ3VsYXJCb3R0
b21PdXRsaW5lID0gMHhmZjZlNzA3MzsKK2NvbnN0IFJHQkEzMiByZWd1bGFyVG9wT3V0bGluZSA9
IDB4ZmZiOWI4Yjg7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b21PdXRsaW5lID0gMHhmZjIxNjNi
ZjsKK2NvbnN0IFJHQkEzMiBob3ZlclRvcE91dGxpbmUgPSAweGZmNjliZWZhOworY29uc3QgUkdC
QTMyIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUgPSAweGZmMGMzZDgxOworY29uc3QgUkdCQTMyIGRl
cHJlc3NlZFRvcE91dGxpbmUgPSAweGZmMWQ0ZDcwOworY29uc3QgUkdCQTMyIGRpc2FibGVkT3V0
bGluZSA9IDB4ZmZkNWQ5ZGU7CisKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJCb3R0b20g
PSBjYXJldFRvcDsKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJUb3AgPSBjYXJldEJvdHRv
bTsKKworY29uc3QgUkdCQTMyIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbSA9IDB4ZmZmNmYyZWU7
Citjb25zdCBSR0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyVG9wID0gMHhmZmRlZTBlNTsKK2NvbnN0
IFJHQkEzMiByYW5nZVNsaWRlclJvbGxCb3R0b20gPSAweGZmYzllOGZlOworY29uc3QgUkdCQTMy
IHJhbmdlU2xpZGVyUm9sbFRvcCA9IDB4ZmZiNWQzZmM7CisKK2NvbnN0IFJHQkEzMiByYW5nZVNs
aWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lID0gMHhmZmI5YmFiZDsKK2NvbnN0IFJHQkEzMiByYW5n
ZVNsaWRlclJlZ3VsYXJUb3BPdXRsaW5lID0gMHhmZmI3YjdiNzsKK2NvbnN0IFJHQkEzMiByYW5n
ZVNsaWRlclJvbGxCb3R0b21PdXRsaW5lID0gMHhmZjY3YWJlMDsKK2NvbnN0IFJHQkEzMiByYW5n
ZVNsaWRlclJvbGxUb3BPdXRsaW5lID0gMHhmZjY5YWRmOTsKKworY29uc3QgUkdCQTMyIGRyYWdS
ZWd1bGFyTGlnaHQgPSAweGZmZmRmZGZkOworY29uc3QgUkdCQTMyIGRyYWdSZWd1bGFyRGFyayA9
IDB4ZmZiYWJhYmE7Citjb25zdCBSR0JBMzIgZHJhZ1JvbGxMaWdodCA9IDB4ZmZmMmYyZjI7Citj
b25zdCBSR0JBMzIgZHJhZ1JvbGxEYXJrID0gMHhmZjY5YThmZjsKKworY29uc3QgUkdCQTMyIHNl
bGVjdGlvbiA9IDB4ZmYyYjhmZmY7CisKK2NvbnN0IFJHQkEzMiBibGFja1BlbiA9IENvbG9yOjpi
bGFjazsKK2NvbnN0IFJHQkEzMiBmb2N1c1JpbmdQZW4gPSAweGZmYTNjOGZlOworCisvLyBXZSBh
aW0gdG8gbWF0Y2ggSUUgaGVyZS4KKy8vIC1JRSB1c2VzIGEgZm9udCBiYXNlZCBvbiB0aGUgZW5j
b2RpbmcgYXMgdGhlIGRlZmF1bHQgZm9udCBmb3IgZm9ybSBjb250cm9scy4KKy8vIC1HZWNrbyB1
c2VzIE1TIFNoZWxsIERsZyAoYWN0dWFsbHkgY2FsbHMgR2V0U3RvY2tPYmplY3QoREVGQVVMVF9H
VUlfRk9OVCksCisvLyB3aGljaCByZXR1cm5zIE1TIFNoZWxsIERsZykKKy8vIC1TYWZhcmkgdXNl
cyBMdWNpZGEgR3JhbmRlLgorLy8KKy8vIEZJWE1FOiBUaGUgb25seSBjYXNlIHdoZXJlIHdlIGtu
b3cgd2UgZG9uJ3QgbWF0Y2ggSUUgaXMgZm9yIEFOU0kgZW5jb2RpbmdzLgorLy8gSUUgdXNlcyBN
UyBTaGVsbCBEbGcgdGhlcmUsIHdoaWNoIHdlIHJlbmRlciBpbmNvcnJlY3RseSBhdCBjZXJ0YWlu
IHBpeGVsCisvLyBzaXplcyAoZS5nLiAxNXB4KS4gU28gd2UganVzdCB1c2UgQXJpYWwgZm9yIG5v
dy4KK2NvbnN0IFN0cmluZyYgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpkZWZhdWx0R1VJRm9udCgp
Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIGZvbnRGYWNlLCAoIkFyaWFsIikp
OworICAgIHJldHVybiBmb250RmFjZTsKK30KKworZmxvYXQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5
OjpkZWZhdWx0Rm9udFNpemUgPSAxNi4wOworCitzdGF0aWMgUGFzc1JlZlB0cjxHcmFkaWVudD4g
Y3JlYXRlTGluZWFyR3JhZGllbnQoUkdCQTMyIHRvcCwgUkdCQTMyIGJvdHRvbSwgY29uc3QgSW50
UG9pbnQmIGEsIGNvbnN0IEludFBvaW50JiBiKQoreworICAgIFJlZlB0cjxHcmFkaWVudD4gZ3Jh
ZGllbnQgPSBHcmFkaWVudDo6Y3JlYXRlKGEsIGIpOworICAgIGdyYWRpZW50LT5hZGRDb2xvclN0
b3AoMC4wLCBDb2xvcih0b3ApKTsKKyAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKDEuMCwgQ29s
b3IoYm90dG9tKSk7CisgICAgcmV0dXJuIGdyYWRpZW50LnJlbGVhc2UoKTsKK30KKworc3RhdGlj
IFBhdGggcm91bmRlZFJlY3RGb3JCb3JkZXIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gb2JqZWN0LT5zdHlsZSgp
OworICAgIExlbmd0aFNpemUgdG9wTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BMZWZ0UmFk
aXVzKCk7CisgICAgTGVuZ3RoU2l6ZSB0b3BSaWdodFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BS
aWdodFJhZGl1cygpOworICAgIExlbmd0aFNpemUgYm90dG9tTGVmdFJhZGl1cyA9IHN0eWxlLT5i
b3JkZXJCb3R0b21MZWZ0UmFkaXVzKCk7CisgICAgTGVuZ3RoU2l6ZSBib3R0b21SaWdodFJhZGl1
cyA9IHN0eWxlLT5ib3JkZXJCb3R0b21SaWdodFJhZGl1cygpOworCisgICAgUGF0aCByb3VuZGVk
UmVjdDsKKyAgICByb3VuZGVkUmVjdC5hZGRSb3VuZGVkUmVjdChyZWN0LCBJbnRTaXplKHRvcExl
ZnRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCB0b3BMZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUodG9wUmlnaHRS
YWRpdXMud2lkdGgoKS52YWx1ZSgpLCB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1ZSgpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTaXplKGJvdHRvbUxlZnRS
YWRpdXMud2lkdGgoKS52YWx1ZSgpLCBib3R0b21MZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUoYm90dG9tUmln
aHRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1
ZSgpKSk7CisgICAgcmV0dXJuIHJvdW5kZWRSZWN0OworfQorCitQYXNzUmVmUHRyPFJlbmRlclRo
ZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAgc3RhdGlj
IFJlbmRlclRoZW1lKiB0aGVtZSA9IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y3JlYXRlKCkubGVh
a1JlZigpOworICAgIHJldHVybiB0aGVtZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4g
UmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjcmVhdGUoKQoreworICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgUmVuZGVyVGhlbWVCbGFja0JlcnJ5KCkpOworfQorCitSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OlJlbmRlclRoZW1lQmxhY2tCZXJyeSgpCisgICAgOiBSZW5kZXJUaGVtZSgpCit7Cit9CisKK1Jl
bmRlclRoZW1lQmxhY2tCZXJyeTo6flJlbmRlclRoZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1N0
cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKQorewor
ICAgIHJldHVybiBTdHJpbmcodGhlbWVCbGFja0JlcnJ5VXNlckFnZW50U3R5bGVTaGVldCwgc2l6
ZW9mKHRoZW1lQmxhY2tCZXJyeVVzZXJBZ2VudFN0eWxlU2hlZXQpKTsKK30KKworI2lmIEVOQUJM
RShWSURFTykKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmV4dHJhTWVkaWFDb250cm9s
c1N0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBTdHJpbmcobWVkaWFDb250cm9sc0JsYWNrQmVy
cnlVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2YobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2Vy
QWdlbnRTdHlsZVNoZWV0KSk7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmZv
cm1hdE1lZGlhQ29udHJvbHNSZW1haW5pbmdUaW1lKGZsb2F0LCBmbG9hdCBkdXJhdGlvbikgY29u
c3QKK3sKKyAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBtYWtlIHRoZSBhcHBlYXJhbmNl
IG9mIG1lZGlhIHRpbWUgY29udHJvbGxlciBpbgorICAgIC8vIGluLXBhZ2UgbW9kZSB0aGUgc2Ft
ZSBhcyBpbiBmdWxsc2NyZWVuIG1vZGUuLgorICAgIHJldHVybiBmb3JtYXRNZWRpYUNvbnRyb2xz
VGltZShkdXJhdGlvbik7Cit9CisjZW5kaWYKKworZG91YmxlIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6Y2FyZXRCbGlua0ludGVydmFsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gMC4wOyAvLyBUdXJu
IG9mZiBjYXJldCBibGlua2luZy4KK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnN5
c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNv
bnN0Cit7CisgICAgZmxvYXQgZm9udFNpemUgPSBkZWZhdWx0Rm9udFNpemU7CisKKyAgICBpZiAo
cHJvcElkID09IENTU1ZhbHVlV2Via2l0TWluaUNvbnRyb2wgfHwgcHJvcElkID09ICBDU1NWYWx1
ZVdlYmtpdFNtYWxsQ29udHJvbCB8fCBwcm9wSWQgPT0gQ1NTVmFsdWVXZWJraXRDb250cm9sKSB7
CisgICAgICAgIC8vIFdoeSAyIHBvaW50cyBzbWFsbGVyPyBCZWNhdXNlIHRoYXQncyB3aGF0IEdl
Y2tvIGRvZXMuIE5vdGUgdGhhdCB3ZQorICAgICAgICAvLyBhcmUgYXNzdW1pbmcgYSA5NmRwaSBz
Y3JlZW4sIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVlIHdlIHVzZSBvbiBXaW5kb3dzLgorICAg
ICAgICBzdGF0aWMgY29uc3QgZmxvYXQgcG9pbnRzUGVySW5jaCA9IDcyLjBmOworICAgICAgICBz
dGF0aWMgY29uc3QgZmxvYXQgcGl4ZWxzUGVySW5jaCA9IDk2LjBmOworICAgICAgICBmb250U2l6
ZSAtPSAoMi4wZiAvIHBvaW50c1BlckluY2gpICogcGl4ZWxzUGVySW5jaDsKKyAgICB9CisKKyAg
ICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoZGVmYXVsdEdVSUZvbnQo
KSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoZm9udFNpemUpOworICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKKyAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICBm
b250RGVzY3JpcHRpb24uc2V0V2VpZ2h0KEZvbnRXZWlnaHROb3JtYWwpOworICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRJdGFsaWMoZmFsc2UpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6c2V0QnV0dG9uU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIExlbmd0
aCB2ZXJ0UGFkZGluZyhpbnQoc3R5bGUtPmZvbnRTaXplKCkgLyBwYWRkaW5nRGl2aXNvciksIEZp
eGVkKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1RvcCh2ZXJ0UGFkZGluZyk7CisgICAgc3R5bGUt
PnNldFBhZGRpbmdCb3R0b20odmVydFBhZGRpbmcpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxh
Y2tCZXJyeTo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOwor
ICAgIHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09SX1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvcios
IFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5
bGUoc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRUZXh0QXJl
YShSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJj
aEZpZWxkKG9iamVjdCwgaW5mbywgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0Jl
cnJ5OjphZGp1c3RUZXh0RmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRCdXR0b25TdHlsZShzdHlsZSk7Cit9
CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFRleHRGaWVsZE9yVGV4dEFyZWFP
clNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQVNTRVJUKGluZm8uY29udGV4dCk7CisgICAg
R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gaW5mby5jb250ZXh0OworCisgICAgY29udGV4dC0+
c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBj
b250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKKyAgICBpZiAoIWlzRW5hYmxl
ZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihkaXNhYmxlZE91dGxp
bmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3Qp
KQorICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdy
YWRpZW50KGRlcHJlc3NlZFRvcE91dGxpbmUsIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUsIHJlY3Qu
bWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgZWxzZSBpZiAo
aXNIb3ZlcmVkKG9iamVjdCkgfHwgaXNGb2N1c2VkKG9iamVjdCkpCisgICAgICAgIGNvbnRleHQt
PnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGhvdmVyVG9wT3V0bGluZSwg
aG92ZXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlD
b3JuZXIoKSkpOworICAgIGVsc2UKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQo
Y3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcE91dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRs
aW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisg
ICAgUGF0aCB0ZXh0RmllbGRSb3VuZGVkUmVjdGFuZ2xlID0gcm91bmRlZFJlY3RGb3JCb3JkZXIo
b2JqZWN0LCByZWN0KTsKKyAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0g
U2VhcmNoRmllbGRQYXJ0KSB7CisgICAgICAgIC8vIFdlIGZvcmNlIHRoZSBmaWxsIGNvbG9yIHRv
IFdoaXRlIHNvIGFzIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWFyY2gg
Y2FuY2VsIGJ1dHRvbiBncmFwaGljLgorICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29s
b3I6OndoaXRlLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICAgICAgY29udGV4dC0+ZHJhd1Bh
dGgodGV4dEZpZWxkUm91bmRlZFJlY3RhbmdsZSk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnRl
eHQtPnN0cm9rZVBhdGgodGV4dEZpZWxkUm91bmRlZFJlY3RhbmdsZSk7CisgICAgY29udGV4dC0+
cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludElu
Zm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGV4dEZp
ZWxkT3JUZXh0QXJlYU9yU2VhcmNoRmllbGQob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9p
ZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVT
ZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0
QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRq
dXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQg
ZGVmYXVsdENvbnRyb2xGb250UGl4ZWxTaXplID0gMTM7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0
IGRlZmF1bHRDYW5jZWxCdXR0b25TaXplID0gOTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlu
Q2FuY2VsQnV0dG9uU2l6ZSA9IDU7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1heENhbmNlbEJ1
dHRvblNpemUgPSAyMTsKKworICAgIC8vIFNjYWxlIHRoZSBidXR0b24gc2l6ZSBiYXNlZCBvbiB0
aGUgZm9udCBzaXplCisgICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBk
ZWZhdWx0Q29udHJvbEZvbnRQaXhlbFNpemU7CisgICAgaW50IGNhbmNlbEJ1dHRvblNpemUgPSBs
cm91bmRmKHN0ZDo6bWluKHN0ZDo6bWF4KG1pbkNhbmNlbEJ1dHRvblNpemUsIGRlZmF1bHRDYW5j
ZWxCdXR0b25TaXplICogZm9udFNjYWxlKSwgbWF4Q2FuY2VsQnV0dG9uU2l6ZSkpOworICAgIExl
bmd0aCBsZW5ndGgoY2FuY2VsQnV0dG9uU2l6ZSwgRml4ZWQpOworICAgIHN0eWxlLT5zZXRXaWR0
aChsZW5ndGgpOworICAgIHN0eWxlLT5zZXRIZWlnaHQobGVuZ3RoKTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1
cm4gcGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFyY2hGaWVsZChvYmplY3QsIGluZm8sIHJl
Y3QpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRTZWFyY2hGaWVsZENh
bmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQVNTRVJUKG9iamVjdC0+cGFyZW50KCkp
OworICAgIGlmICghb2JqZWN0LT5wYXJlbnQoKSB8fCAhb2JqZWN0LT5wYXJlbnQoKS0+aXNCb3go
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUmVuZGVyQm94KiBwYXJlbnRSZW5kZXJC
b3ggPSB0b1JlbmRlckJveChvYmplY3QtPnBhcmVudCgpKTsKKworICAgIEludFJlY3QgcGFyZW50
Qm94ID0gcGFyZW50UmVuZGVyQm94LT5hYnNvbHV0ZUNvbnRlbnRCb3goKTsKKyAgICBJbnRSZWN0
IGJvdW5kcyA9IHJlY3Q7CisgICAgLy8gTWFrZSBzdXJlIHRoZSBzY2FsZWQgYnV0dG9uIHN0YXlz
IHNxdWFyZSBhbmQgZml0cyBpbiBpdHMgcGFyZW50J3MgYm94LgorICAgIGJvdW5kcy5zZXRIZWln
aHQoc3RkOjptaW4ocGFyZW50Qm94LndpZHRoKCksIHN0ZDo6bWluKHBhcmVudEJveC5oZWlnaHQo
KSwgYm91bmRzLmhlaWdodCgpKSkpOworICAgIGJvdW5kcy5zZXRXaWR0aChib3VuZHMuaGVpZ2h0
KCkpOworCisgICAgLy8gUHV0IHRoZSBidXR0b24gaW4gdGhlIG1pZGRsZSB2ZXJ0aWNhbGx5LCBh
bmQgcm91bmQgdXAgdGhlIHZhbHVlLgorICAgIC8vIFNvIGlmIGl0IGhhcyB0byBiZSBvbmUgcGl4
ZWwgb2ZmLWNlbnRlciwgaXQgd291bGQgYmUgb25lIHBpeGVsIGNsb3NlcgorICAgIC8vIHRvIHRo
ZSBib3R0b20gb2YgdGhlIGZpZWxkLiBUaGlzIHdvdWxkIGxvb2sgYmV0dGVyIHdpdGggdGhlIHRl
eHQuCisgICAgYm91bmRzLnNldFkocGFyZW50Qm94LnkoKSArIChwYXJlbnRCb3guaGVpZ2h0KCkg
LSBib3VuZHMuaGVpZ2h0KCkgKyAxKSAvIDIpOworCisgICAgc3RhdGljIEltYWdlKiBjYW5jZWxJ
bWFnZSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZSgic2VhcmNoQ2FuY2VsIikubGVha1Jl
ZigpOworICAgIHN0YXRpYyBJbWFnZSogY2FuY2VsUHJlc3NlZEltYWdlID0gSW1hZ2U6OmxvYWRQ
bGF0Zm9ybVJlc291cmNlKCJzZWFyY2hDYW5jZWxQcmVzc2VkIikubGVha1JlZigpOworICAgIHBh
aW50SW5mby5jb250ZXh0LT5kcmF3SW1hZ2UoaXNQcmVzc2VkKG9iamVjdCkgPyBjYW5jZWxQcmVz
c2VkSW1hZ2UgOiBjYW5jZWxJbWFnZSwgb2JqZWN0LT5zdHlsZSgpLT5jb2xvclNwYWNlKCksIGJv
dW5kcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5
bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICAvLyBUaGVzZSBzZWVtIHRvIGJlIHJl
YXNvbmFibGUgcGFkZGluZyB2YWx1ZXMgZnJvbSBvYnNlcnZhdGlvbi4KKyAgICBjb25zdCBpbnQg
cGFkZGluZ0xlZnQgPSA4OworICAgIGNvbnN0IGludCBwYWRkaW5nUmlnaHQgPSA0OworCisgICAg
Y29uc3QgaW50IG1pbkhlaWdodCA9IHN0eWxlLT5mb250U2l6ZSgpICogMjsKKworICAgIHN0eWxl
LT5yZXNldFBhZGRpbmcoKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7CisK
KyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChtaW5IZWlnaHQgKyBwYWRkaW5nUmln
aHQsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nTGVm
dCwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0Q3Vyc29yKENVUlNPUl9XRUJLSVRfR1JBQik7Cit9
CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjYWxjdWxhdGVCdXR0b25TaXplKFJlbmRl
clN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgc2l6ZSA9IHN0eWxlLT5mb250U2l6ZSgp
OworICAgIExlbmd0aCBsZW5ndGgoc2l6ZSwgRml4ZWQpOworICAgIGlmIChzdHlsZS0+YXBwZWFy
YW5jZSgpID09IENoZWNrYm94UGFydCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IFJhZGlvUGFy
dCkgeworICAgICAgICBzdHlsZS0+c2V0V2lkdGgobGVuZ3RoKTsKKyAgICAgICAgc3R5bGUtPnNl
dEhlaWdodChsZW5ndGgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhl
IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGlu
ZyB0byBkby4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYg
IXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHN0
eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRXaWR0
aChsZW5ndGgpOworCisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAg
c3R5bGUtPnNldEhlaWdodChsZW5ndGgpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBp
bmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludEJ1dHRvbihvYmpl
Y3QsIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0Q2hl
Y2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBjYWxjdWxhdGVCdXR0
b25TaXplKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50UmFk
aW8oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRCdXR0b24ob2JqZWN0LCBpbmZvLCByZWN0
KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnNldFJhZGlvU2l6ZShSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgY2FsY3VsYXRlQnV0dG9uU2l6ZShzdHlsZSk7Cit9
CisKKy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgV2ViQ29yZSBhc3N1bWVzIHRo
ZSBidXR0b24gaXMgZnVsbHkgZGVjb3JhdGVkCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6
cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBBU1NFUlQoaW5mby5jb250ZXh0KTsKKyAgICBp
bmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUo
U29saWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVX
aWR0aCk7CisKKyAgICBDb2xvciBjaGVjayhibGFja1Blbik7CisgICAgaWYgKCFpc0VuYWJsZWQo
b2JqZWN0KSkgeworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVM
aW5lYXJHcmFkaWVudChkaXNhYmxlZFRvcCwgZGlzYWJsZWRCb3R0b20sIHJlY3QubWF4WE1pbllD
b3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+
c2V0U3Ryb2tlQ29sb3IoZGlzYWJsZWRPdXRsaW5lLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAg
ICB9IGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKSB7CisgICAgICAgIGluZm8uY29udGV4dC0+
c2V0RmlsbEdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcCwgZGVwcmVz
c2VkQm90dG9tLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkp
OworICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdy
YWRpZW50KGRlcHJlc3NlZFRvcE91dGxpbmUsIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUsIHJlY3Qu
bWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIGlm
IChpc0hvdmVyZWQob2JqZWN0KSkgeworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFk
aWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4
WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgICAgIGluZm8uY29u
dGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRs
aW5lLCBob3ZlckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhY
TWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRG
aWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRv
bSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICAg
ICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChy
ZWd1bGFyVG9wT3V0bGluZSwgcmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3Ju
ZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfQorCisgICAgQ29udHJvbFBhcnQg
cGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIHN3aXRjaCAocGFydCkg
eworICAgIGNhc2UgQ2hlY2tib3hQYXJ0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IEZsb2F0U2l6ZSBzbWFsbENvcm5lcihzbWFsbFJhZGl1cywgc21hbGxSYWRpdXMpOworICAgICAg
ICAgICAgICAgIFBhdGggcGF0aDsKKyAgICAgICAgICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0
KHJlY3QsIHNtYWxsQ29ybmVyKTsKKyAgICAgICAgICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdQ
YXRoKHBhdGgpOworCisgICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZChvYmplY3QpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIFBhdGggY2hlY2tQYXRoOworICAgICAgICAgICAgICAgICAgICBJ
bnRSZWN0IHJlY3QyID0gcmVjdDsKKyAgICAgICAgICAgICAgICAgICAgcmVjdDIuaW5mbGF0ZSgt
MSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrUGF0aC5tb3ZlVG8oRmxvYXRQb2ludChyZWN0
Mi54KCkgKyByZWN0Mi53aWR0aCgpICogY2hlY2tib3hMZWZ0WCwgcmVjdDIueSgpICsgcmVjdDIu
aGVpZ2h0KCkgKiBjaGVja2JveExlZnRZKSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrUGF0
aC5hZGRMaW5lVG8oRmxvYXRQb2ludChyZWN0Mi54KCkgKyByZWN0Mi53aWR0aCgpICogY2hlY2ti
b3hNaWRkbGVYLCByZWN0Mi5tYXhZKCkgLSByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TWlkZGxl
WSkpOworICAgICAgICAgICAgICAgICAgICBjaGVja1BhdGguYWRkTGluZVRvKEZsb2F0UG9pbnQo
cmVjdDIueCgpICsgcmVjdDIud2lkdGgoKSAqIGNoZWNrYm94UmlnaHRYLCByZWN0Mi55KCkgKyBy
ZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94UmlnaHRZKSk7CisgICAgICAgICAgICAgICAgICAgIGlu
Zm8uY29udGV4dC0+c2V0TGluZUNhcChSb3VuZENhcCk7CisgICAgICAgICAgICAgICAgICAgIGlu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoYmxhY2tQZW4sIENvbG9yU3BhY2VEZXZpY2VSR0Ip
OworICAgICAgICAgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhy
ZWN0Mi53aWR0aCgpIC8gY2hlY2tib3hTdHJva2VUaGlja25lc3MpOworICAgICAgICAgICAgICAg
ICAgICBpbmZvLmNvbnRleHQtPmRyYXdQYXRoKGNoZWNrUGF0aCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSYWRpb1BhcnQ6
CisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdFbGxpcHNlKHJlY3QpOworICAgICAgICAg
ICAgaWYgKGlzQ2hlY2tlZChvYmplY3QpKSB7CisgICAgICAgICAgICAgICAgSW50UmVjdCByZWN0
MiA9IHJlY3Q7CisgICAgICAgICAgICAgICAgcmVjdDIuaW5mbGF0ZSgtcmVjdC53aWR0aCgpICog
cmFkaW9CdXR0b25DaGVja1N0YXRlU2NhbGVyKTsKKyAgICAgICAgICAgICAgICBpbmZvLmNvbnRl
eHQtPnNldEZpbGxDb2xvcihjaGVjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgICAg
ICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihjaGVjaywgQ29sb3JTcGFjZURldmlj
ZVJHQik7CisgICAgICAgICAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3RWxsaXBzZShyZWN0Mik7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEJ1dHRvblBhcnQ6
CisgICAgY2FzZSBQdXNoQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBGbG9hdFNpemUgbGFyZ2VDb3JuZXIobGFyZ2VSYWRpdXMsIGxhcmdlUmFkaXVzKTsKKyAgICAg
ICAgICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgICAgICAgICAgcGF0aC5hZGRSb3VuZGVkUmVj
dChyZWN0LCBsYXJnZUNvcm5lcik7CisgICAgICAgICAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3
UGF0aChwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
U3F1YXJlQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXRoIHBh
dGg7CisgICAgICAgICAgICAgICAgcGF0aC5hZGRSZWN0KHJlY3QpOworICAgICAgICAgICAgICAg
IGluZm8uY29udGV4dC0+ZHJhd1BhdGgocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAgICAgaW5mby5jb250ZXh0LT5yZXN0b3Jl
KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbmZvLmNvbnRleHQt
PnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIGNzcywgUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGFkanVzdE1lbnVM
aXN0QnV0dG9uU3R5bGUoY3NzLCBzdHlsZSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjphZGp1c3RDaGVja2JveFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5k
ZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIHNldENoZWNrYm94U2l6ZShz
dHlsZSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKKyAgICBMZW5ndGggbWFy
Z2luKG1hcmdpblNpemUsIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKG1hcmdp
bik7CisgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KG1hcmdpbik7CisgICAgc3R5bGUtPnNldEN1
cnNvcihDVVJTT1JfV0VCS0lUX0dSQUIpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6YWRqdXN0UmFkaW9TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRSYWRpb1NpemUoc3R5bGUpOworICAgIHN0eWxl
LT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisgICAgTGVuZ3RoIG1hcmdpbihtYXJnaW5TaXplLCBG
aXhlZCk7CisgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShtYXJnaW4pOworICAgIHN0eWxlLT5z
ZXRNYXJnaW5SaWdodChtYXJnaW4pOworICAgIHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09SX1dFQktJ
VF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVudUxpc3RC
dXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgUmVuZGVyT2Jq
ZWN0KiBvYmplY3QsIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xpcFBhdGgpCit7
CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBpZiAoIWlz
RW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRl
TGluZWFyR3JhZGllbnQoZGlzYWJsZWRUb3AsIGRpc2FibGVkQm90dG9tLCBidXR0b25SZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2Ug
aWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQo
Y3JlYXRlTGluZWFyR3JhZGllbnQoZGVwcmVzc2VkVG9wLCBkZXByZXNzZWRCb3R0b20sIGJ1dHRv
blJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgIGNvbnRleHQtPnNldEZpbGxH
cmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIGJ1dHRv
blJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgZWxzZQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3Jh
ZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgYnV0dG9uUmVjdC5tYXhYTWluWUNvcm5l
cigpLCBidXR0b25SZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIC8vIDEuIFBhaW50IHRo
ZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24uCisgICAgY29udGV4dC0+Y2xpcChjbGlwUGF0aCk7
CisgICAgY29udGV4dC0+ZHJhd1JlY3QoYnV0dG9uUmVjdCk7CisgICAgY29udGV4dC0+cmVzdG9y
ZSgpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJ1dHRvbiBhcnJvdy4KKyAgICBidXR0b25SZWN0
LmluZmxhdGUoLWJ1dHRvblJlY3Qud2lkdGgoKSAvIDMpOworICAgIGJ1dHRvblJlY3QubW92ZSgw
LCBidXR0b25SZWN0LmhlaWdodCgpICogNyAvIDIwKTsKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0
aC5tb3ZlVG8oRmxvYXRQb2ludChidXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCkpKTsKKyAg
ICBwYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KGJ1dHRvblJlY3QueCgpICsgYnV0dG9uUmVjdC53
aWR0aCgpLCBidXR0b25SZWN0LnkoKSkpOworICAgIHBhdGguYWRkTGluZVRvKEZsb2F0UG9pbnQo
YnV0dG9uUmVjdC54KCkgKyBidXR0b25SZWN0LndpZHRoKCkgLyAyLjAsIGJ1dHRvblJlY3QueSgp
ICsgYnV0dG9uUmVjdC5oZWlnaHQoKSAvIDIuMCkpOworICAgIHBhdGguY2xvc2VTdWJwYXRoKCk7
CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29s
aWRTdHJva2UpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOwor
ICAgIGNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFjZURldmlj
ZVJHQik7CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFj
ZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0TGluZUpvaW4oQmV2ZWxKb2luKTsKKyAgICBj
b250ZXh0LT5maWxsUGF0aChwYXRoKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7Cit9CisKK3N0
YXRpYyBJbnRSZWN0IGNvbXB1dGVNZW51TGlzdEFycm93QnV0dG9uUmVjdChjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGUgbWVudSBsaXN0IGFycm93IGJ1dHRvbiBzaG91
bGQgaGF2ZSBhIG1pbmltdW0gYW5kIG1heGltdW0gd2lkdGggKHRvIGVuc3VyZSB1c2FiaWxpdHkp
IG9yCisgICAgLy8gc2NhbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBmb250IHNpemUgdXNlZCBpbiB0
aGUgbWVudSBsaXN0IGNvbnRyb2wgb3Igc29tZSBjb21iaW5hdGlvbiBvZiBib3RoLgorICAgIHJl
dHVybiBJbnRSZWN0KEludFBvaW50KHJlY3QubWF4WCgpIC0gcmVjdC5oZWlnaHQoKSwgcmVjdC55
KCkpLCBJbnRTaXplKHJlY3QuaGVpZ2h0KCksIHJlY3QuaGVpZ2h0KCkpKTsKK30KKworc3RhdGlj
IHZvaWQgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBj
b25zdCBQYXRoJiBtZW51TGlzdFBhdGgsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3IpCit7
CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBjb250ZXh0
LT5zZXRGaWxsQ29sb3IoYmFja2dyb3VuZENvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAg
ICBjb250ZXh0LT5maWxsUGF0aChtZW51TGlzdFBhdGgpOworICAgIGNvbnRleHQtPnJlc3RvcmUo
KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVudUxpc3QoUmVuZGVy
T2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICAvLyBOb3RlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGlmIHRoZSBtZW51
IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9yZGVyIG9yIGJhY2tncm91bmQg
Y29sb3IuCisgICAgLy8gSW5zdGVhZCwgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lbnVM
aXN0QnV0dG9uIGlzIGNhbGxlZC4gVGhlcmVmb3JlLCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxl
ZCwgd2UgZG9uJ3QKKyAgICAvLyBoYXZlIHRvIGFkanVzdCByZWN0IHdpdGggcmVzcGVjdCB0byB0
aGUgYm9yZGVyIGRpbWVuc2lvbnMuCisKKyAgICBBU1NFUlQoaW5mby5jb250ZXh0KTsKKyAgICBH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSBpbmZvLmNvbnRleHQ7CisKKyAgICBQYXRoIG1lbnVM
aXN0Um91bmRlZFJlY3RhbmdsZSA9IHJvdW5kZWRSZWN0Rm9yQm9yZGVyKG9iamVjdCwgcmVjdCk7
CisKKyAgICAvLyAxLiBQYWludCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgZW50aXJlIGNvbnRyb2wu
CisgICAgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoY29udGV4dCwgbWVudUxpc3RSb3VuZGVkUmVj
dGFuZ2xlLCBDb2xvcjo6d2hpdGUpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJhY2tncm91bmQg
b2YgdGhlIGJ1dHRvbiBhbmQgaXRzIGFycm93LgorICAgIEludFJlY3QgYXJyb3dCdXR0b25SZWN0
YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3QocmVjdCk7CisgICAgcGFpbnRN
ZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coY29udGV4dCwgb2JqZWN0LCBhcnJvd0J1dHRv
blJlY3RhbmdsZSwgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKworICAgIC8vIDQuIFN0cm9r
ZSBhbiBvdXRsaW5lIGFyb3VuZCB0aGUgZW50aXJlIGNvbnRyb2wuCisgICAgY29udGV4dC0+c2F2
ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBjb250
ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChv
YmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihkaXNhYmxlZE91dGxpbmUs
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQor
ICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChk
ZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2UgaWYgKGlzSG92ZXJl
ZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5l
YXJHcmFkaWVudChob3ZlclRvcE91dGxpbmUsIGhvdmVyQm90dG9tT3V0bGluZSwgcmVjdC5tYXhY
TWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBlbHNlCisgICAgICAg
IGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJlZ3VsYXJU
b3BPdXRsaW5lLCByZWd1bGFyQm90dG9tT3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCBy
ZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIGNvbnRleHQtPnN0cm9rZVBhdGgobWVudUxp
c3RSb3VuZGVkUmVjdGFuZ2xlKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZW51TGlzdEJ1
dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworICAgIC8vIE5vdGUsIHRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVk
IGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9yZGVyIG9y
IGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gT3RoZXJ3aXNlLCBSZW5kZXJUaGVtZUJsYWNrQmVy
cnk6OnBhaW50TWVudUxpc3QgaXMgY2FsbGVkLiBXZSBuZWVkIHRvIGZpdCB0aGUgYXJyb3cgYnV0
dG9uIHdpdGggdGhlIGJvcmRlciBib3gKKyAgICAvLyBvZiB0aGUgbWVudS1saXN0IHNvIGFzIHRv
IG5vdCBvY2NsdWRlIHRoZSBjdXN0b20gYm9yZGVyLgorCisgICAgLy8gV2UgY29tcHV0ZSBtZW51
TGlzdFJvdW5kZWRSZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBkaW1lbnNpb25zIG9mIHRo
ZSBlbnRpcmUgbWVudS1saXN0IGNvbnRyb2wgKGkuZS4gcmVjdCkgYW5kCisgICAgLy8gaXRzIGJv
cmRlciByYWRpdXMgc28gdGhhdCB3ZSBjbGlwIHRoZSBjb250b3VyIG9mIHRoZSBhcnJvdyBidXR0
b24gKHdoZW4gd2UgcGFpbnQgaXQgYmVsb3cpIHRvIG1hdGNoIHRoZSBjb250b3VyIG9mCisgICAg
Ly8gdGhlIGNvbnRyb2wuCisgICAgUGF0aCBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUgPSByb3Vu
ZGVkUmVjdEZvckJvcmRlcihvYmplY3QsIHJlY3QpOworCisgICAgLy8gMS4gUGFpbnQgdGhlIGJh
Y2tncm91bmQgb2YgdGhlIGVudGlyZSBjb250cm9sLgorICAgIENvbG9yIGZpbGxDb2xvciA9IG9i
amVjdC0+c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5QmFja2dyb3Vu
ZENvbG9yKTsKKyAgICBpZiAoIWZpbGxDb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIGZpbGxDb2xv
ciA9IENvbG9yOjp3aGl0ZTsKKyAgICBwYWludE1lbnVMaXN0QmFja2dyb3VuZChpbmZvLmNvbnRl
eHQsIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSwgZmlsbENvbG9yKTsKKworICAgIC8vIDIuIFBh
aW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24gYW5kIGl0cyBhcnJvdy4KKyAgICBJbnRS
ZWN0IGJvdW5kcyA9IEludFJlY3QocmVjdC54KCkgKyBvYmplY3QtPnN0eWxlKCktPmJvcmRlckxl
ZnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsgb2JqZWN0LT5z
dHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qu
d2lkdGgoKSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCkgLSBvYmplY3QtPnN0
eWxlKCktPmJvcmRlclJpZ2h0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0
LmhlaWdodCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpIC0gb2JqZWN0LT5z
dHlsZSgpLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKKworICAgIEludFJlY3QgYXJyb3dCdXR0b25S
ZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3QoYm91bmRzKTsgLy8gRml0
IHRoZSBhcnJvdyBidXR0b24gd2l0aGluIHRoZSBib3JkZXIgYm94IG9mIHRoZSBtZW51LWxpc3Qu
CisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coaW5mby5jb250ZXh0LCBv
YmplY3QsIGFycm93QnV0dG9uUmVjdGFuZ2xlLCBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUpOwor
ICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVz
dFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgQ29udHJv
bFBhcnQgcGFydCA9IHN0eWxlLT5hcHBlYXJhbmNlKCk7CisgICAgaWYgKHBhcnQgPT0gTWVkaWFW
b2x1bWVTbGlkZXJUaHVtYlBhcnQgfHwgcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0
IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgc3R5bGUtPnNl
dFdpZHRoKExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0ID8gc2xpZGVyVGh1
bWJIZWlnaHQgOiBzbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkpOworICAgICAgICBzdHlsZS0+c2V0
SGVpZ2h0KExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0ID8gc2xpZGVyVGh1
bWJXaWR0aCA6IHNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAgIH0gZWxzZSBpZiAocGFy
dCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgeworICAgICAgICBzdHlsZS0+c2V0V2lkdGgoTGVu
Z3RoKG1lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgc3R5bGUtPnNldEhl
aWdodChMZW5ndGgobWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKKyAgICB9Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVj
dCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgY29uc3Qgc3RhdGljIGludCBTbGlkZXJUcmFja0hlaWdodCA9IDU7CisgICAgSW50UmVj
dCByZWN0MjsKKyAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVy
SG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgcmVjdDIuc2V0SGVpZ2h0KFNsaWRlclRyYWNrSGVp
Z2h0KTsKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdC53aWR0aCgpKTsKKyAgICAgICAgcmVj
dDIuc2V0WChyZWN0LngoKSk7CisgICAgICAgIHJlY3QyLnNldFkocmVjdC55KCkgKyAocmVjdC5o
ZWlnaHQoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAgIH0gZWxzZSB7CisgICAgICAg
IHJlY3QyLnNldEhlaWdodChyZWN0LmhlaWdodCgpKTsKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgo
U2xpZGVyVHJhY2tIZWlnaHQpOworICAgICAgICByZWN0Mi5zZXRYKHJlY3QueCgpICsgKHJlY3Qu
d2lkdGgoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAgICAgICByZWN0Mi5zZXRZKHJl
Y3QueSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9iamVjdCwg
aW5mbywgcmVjdDIpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRTbGlk
ZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRTbGlkZXJUcmFja1JlY3Qo
b2JqZWN0LCBpbmZvLCByZWN0LCByYW5nZVNsaWRlclJlZ3VsYXJUb3BPdXRsaW5lLCByYW5nZVNs
aWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lLAorICAgICAgICAgICAgICAgIHJhbmdlU2xpZGVyUmVn
dWxhclRvcCwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tKTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUJsYWNrQmVycnk6OnBhaW50U2xpZGVyVHJhY2tSZWN0KFJlbmRlck9iamVjdCogb2JqZWN0LCBj
b25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAgICAgIFJHQkEz
MiBzdHJva2VDb2xvclN0YXJ0LCBSR0JBMzIgc3Ryb2tlQ29sb3JFbmQsIFJHQkEzMiBmaWxsQ29s
b3JTdGFydCwgUkdCQTMyIGZpbGxDb2xvckVuZCkKK3sKKyAgICBGbG9hdFNpemUgc21hbGxDb3Ju
ZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGluZm8uY29udGV4dC0+c2F2ZSgp
OworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGlu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBpbmZvLmNv
bnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHN0cm9rZUNvbG9y
U3RhcnQsIHN0cm9rZUNvbG9yRW5kLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QuIG1heFhN
YXhZQ29ybmVyKCkpKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVM
aW5lYXJHcmFkaWVudChmaWxsQ29sb3JTdGFydCwgZmlsbENvbG9yRW5kLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCBwYXRoOworICAg
IHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxDb3JuZXIpOworICAgIGluZm8uY29udGV4
dC0+ZmlsbFBhdGgocGF0aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNsaWRl
clRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgRmxvYXRTaXplIGxhcmdlQ29ybmVyKGxhcmdlUmFkaXVz
LCBsYXJnZVJhZGl1cyk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBpbmZvLmNv
bnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRleHQtPnNl
dFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAgaWYgKGlzUHJlc3NlZChvYmplY3Qp
IHx8IGlzSG92ZXJlZChvYmplY3QpKSB7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tl
R3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3ZlckJvdHRv
bU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4gbWF4WE1heFlDb3JuZXIoKSkp
OworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFk
aWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby5jb250ZXh0LT5z
ZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0bGluZSwg
cmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4gbWF4WE1h
eFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVh
dGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wLCByZWd1bGFyQm90dG9tLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0KKworICAgIFBhdGggcGF0
aDsKKyAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29ybmVyKTsKKyAgICBpbmZv
LmNvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgYm9vbCBpc1ZlcnRpY2FsID0gcmVjdC53
aWR0aCgpID4gcmVjdC5oZWlnaHQoKTsKKyAgICBJbnRQb2ludCBzdGFydFBvaW50KHJlY3QueCgp
ICsgKGlzVmVydGljYWwgPyA1IDogMiksIHJlY3QueSgpICsgKGlzVmVydGljYWwgPyAyIDogNSkp
OworICAgIEludFBvaW50IGVuZFBvaW50KHJlY3QueCgpICsgKGlzVmVydGljYWwgPyAyMCA6IDIp
LCByZWN0LnkoKSArIChpc1ZlcnRpY2FsID8gMiA6IDIwKSk7CisgICAgY29uc3QgaW50IGxpbmVP
ZmZzZXQgPSAyOworICAgIGNvbnN0IGludCBzaGFkb3dPZmZzZXQgPSAxOworCisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKGlzVmVydGljYWwpIHsKKyAgICAg
ICAgICAgIHN0YXJ0UG9pbnQuc2V0WShzdGFydFBvaW50LnkoKSArIGxpbmVPZmZzZXQpOworICAg
ICAgICAgICAgZW5kUG9pbnQuc2V0WShlbmRQb2ludC55KCkgKyBsaW5lT2Zmc2V0KTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChzdGFydFBvaW50LngoKSAr
IGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WChlbmRQb2ludC54KCkgKyBs
aW5lT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkgfHwg
aXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNv
bG9yKGRyYWdSb2xsTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdSZWd1bGFyTGlnaHQs
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdMaW5lKHN0
YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpZiAoaXNWZXJ0aWNhbCkgeworICAgICAg
ICAgICAgc3RhcnRQb2ludC5zZXRZKHN0YXJ0UG9pbnQueSgpICsgc2hhZG93T2Zmc2V0KTsKKyAg
ICAgICAgICAgIGVuZFBvaW50LnNldFkoZW5kUG9pbnQueSgpICsgc2hhZG93T2Zmc2V0KTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChzdGFydFBvaW50Lngo
KSArIHNoYWRvd09mZnNldCk7CisgICAgICAgICAgICBlbmRQb2ludC5zZXRYKGVuZFBvaW50Lngo
KSArIHNoYWRvd09mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUHJlc3NlZChvYmpl
Y3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRT
dHJva2VDb2xvcihkcmFnUm9sbERhcmssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdSZWd1bGFy
RGFyaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd0xp
bmUoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworICAgIH0KKyAgICBpbmZvLmNvbnRleHQtPnJlc3Rv
cmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBhaW50TWVkaWFCdXR0
b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBJbWFnZSog
aW1hZ2UpCit7CisgICAgY29udGV4dC0+ZHJhd0ltYWdlKGltYWdlLCBDb2xvclNwYWNlRGV2aWNl
UkdCLCByZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5OjpwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3Qg
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxF
KFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVk
aWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdlKiBtZWRpYVBsYXkgPSBJbWFnZTo6bG9hZFBs
YXRmb3JtUmVzb3VyY2UoInBsYXkiKS5sZWFrUmVmKCk7CisgICAgc3RhdGljIEltYWdlKiBtZWRp
YVBhdXNlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJwYXVzZSIpLmxlYWtSZWYoKTsK
KworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCByZWN0LCBt
ZWRpYUVsZW1lbnQtPmNhblBsYXkoKSA/IG1lZGlhUGxheSA6IG1lZGlhUGF1c2UpOworI2Vsc2UK
KyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsK
KyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJP
YmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlh
RWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1lZGlh
RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdlKiBtZWRp
YU11dGUgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInNwZWFrZXIiKS5sZWFrUmVmKCk7
CisgICAgc3RhdGljIEltYWdlKiBtZWRpYVVubXV0ZSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNv
dXJjZSgic3BlYWtlcl9tdXRlIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50TWVkaWFC
dXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRWxlbWVudC0+bXV0ZWQoKSB8fCAh
bWVkaWFFbGVtZW50LT52b2x1bWUoKSA/IG1lZGlhVW5tdXRlIDogbWVkaWFNdXRlKTsKKyNlbHNl
CisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7
CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQor
Citib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24o
UmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAoIXRvUGFyZW50TWVk
aWFFbGVtZW50KG9iamVjdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0YXRpYyBJ
bWFnZSogbWVkaWFGdWxsc2NyZWVuID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJmdWxs
c2NyZWVuIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50TWVkaWFCdXR0b24ocGFpbnRJ
bmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRnVsbHNjcmVlbik7CisjZWxzZQorICAgIFVOVVNFRF9Q
QVJBTShvYmplY3QpOworICAgIFVOVVNFRF9QQVJBTShwYWludEluZm8pOworICAgIFVOVVNFRF9Q
QVJBTShyZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworYm9vbCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG9iamVj
dCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cisj
aWYgRU5BQkxFKFZJREVPKQorICAgIEludFJlY3QgcmVjdDIocmVjdC54KCkgKyAzLCByZWN0Lnko
KSArIDE0LCByZWN0LndpZHRoKCkgLSA2LCAyKTsKKworICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1l
ZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1l
ZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZmxvYXQgbG9hZGVkID0g
MDsKKyAgICAvLyBGSVhNRTogcmVwbGFjZSBsb2FkZWQgd2l0aCBjb21tZW50ZWQgb3V0IG9uZSB3
aGVuIGJ1ZmZlciBidWcgaXMgZml4ZWQgKHNlZSBjb21tZW50IGluCisgICAgLy8gTWVkaWFQbGF5
ZXJQcml2YXRlTU1yZW5kZXJlcjo6cGVyY2VudExvYWRlZCkuCisgICAgLy8gbG9hZGVkID0gbWVk
aWFFbGVtZW50LT5wZXJjZW50TG9hZGVkKCk7CisgICAgaWYgKG1lZGlhRWxlbWVudC0+cGxheWVy
KCkpCisgICAgICAgIGxvYWRlZCA9IHN0YXRpY19jYXN0PE1lZGlhUGxheWVyUHJpdmF0ZSAqPiht
ZWRpYUVsZW1lbnQtPnBsYXllcigpLT5pbXBsZW1lbnRhdGlvbigpKS0+cGVyY2VudExvYWRlZCgp
OworICAgIGZsb2F0IHBvc2l0aW9uID0gbWVkaWFFbGVtZW50LT5kdXJhdGlvbigpID4gMCA/ICht
ZWRpYUVsZW1lbnQtPmN1cnJlbnRUaW1lKCkgLyBtZWRpYUVsZW1lbnQtPmR1cmF0aW9uKCkpIDog
MDsKKworICAgIGludCB4ID0gcmVjdC54KCkgKyAzOworICAgIGludCB5ID0gcmVjdC55KCkgKyAx
NDsKKyAgICBpbnQgdyA9IHJlY3Qud2lkdGgoKSAtIDY7CisgICAgaW50IGggPSAyOworCisgICAg
aW50IHdQbGF5ZWQgPSAodyAqIHBvc2l0aW9uKTsKKyAgICBpbnQgd0xvYWRlZCA9ICh3IC0gbWVk
aWFTbGlkZXJUaHVtYldpZHRoKSAqIGxvYWRlZCArIG1lZGlhU2xpZGVyVGh1bWJXaWR0aDsKKwor
ICAgIEludFJlY3QgcGxheWVkKHgsIHksIHdQbGF5ZWQsIGgpOworICAgIEludFJlY3QgYnVmZmVy
ZWQoeCwgeSwgd0xvYWRlZCwgaCk7CisKKyAgICAvLyBwYWludCBtYWluIHNsaWRlciBiYXIKKyAg
ICBib29sIHJlc3VsdCA9IHBhaW50U2xpZGVyVHJhY2tSZWN0KG9iamVjdCwgcGFpbnRJbmZvLCBy
ZWN0Mik7CisKKyAgICBpZiAobG9hZGVkID4gMCB8fCBwb3NpdGlvbiA+IDApIHsKKyAgICAgICAg
Ly8gcGFpbnQgYnVmZmVyZWQgYmFyCisgICAgICAgIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9iamVj
dCwgcGFpbnRJbmZvLCBidWZmZXJlZCwgQ29sb3I6OmRhcmtHcmF5LCBDb2xvcjo6ZGFya0dyYXks
IENvbG9yOjpkYXJrR3JheSwgQ29sb3I6OmRhcmtHcmF5KTsKKworICAgICAgICAvLyBwYWludCBw
bGF5ZWQgcGFydCBvZiBiYXIgKGxlZnQgb2Ygc2xpZGVyIHRodW1iKSB1c2luZyBzZWxlY3Rpb24g
Y29sb3IKKyAgICAgICAgcGFpbnRTbGlkZXJUcmFja1JlY3Qob2JqZWN0LCBwYWludEluZm8sIHBs
YXllZCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKKyAgICB9
CisgICAgcmV0dXJuIHJlc3VsdDsKKworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsK
KyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7Cisg
ICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5
OjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURF
TykKKyAgICBpZiAoIW9iamVjdC0+cGFyZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIFJlbmRlclNsaWRlciogc2xpZGVyID0gdG9SZW5kZXJTbGlkZXIob2JqZWN0LT5wYXJlbnQo
KS0+cGFyZW50KCktPnBhcmVudCgpKTsKKyAgICBpZiAoIXNsaWRlcikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBQYXRoIG1lZGlh
VGh1bWJSb3VuZGVkUmVjdGFuZ2xlOworICAgIG1lZGlhVGh1bWJSb3VuZGVkUmVjdGFuZ2xlLmFk
ZFJvdW5kZWRSZWN0KHJlY3QsIEZsb2F0U2l6ZShtZWRpYVNsaWRlclRodW1iUmFkaXVzLCBtZWRp
YVNsaWRlclRodW1iUmFkaXVzKSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0
eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tu
ZXNzKDAuNSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpi
bGFjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisKKyAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkg
fHwgaXNIb3ZlcmVkKG9iamVjdCkgfHwgc2xpZGVyLT5pbkRyYWdNb2RlKCkpIHsKKyAgICAgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChz
ZWxlY3Rpb24sIENvbG9yKHNlbGVjdGlvbikuZGFyaygpLnJnYigpLAorICAgICAgICAgICAgICAg
IHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVM
aW5lYXJHcmFkaWVudChDb2xvcjo6d2hpdGUsIENvbG9yKENvbG9yOjp3aGl0ZSkuZGFyaygpLnJn
YigpLAorICAgICAgICAgICAgICAgIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4
WUNvcm5lcigpKSk7CisgICAgfQorICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUGF0aChtZWRp
YVRodW1iUm91bmRlZFJlY3RhbmdsZSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUo
KTsKKworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsK
KyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7Cisg
ICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5
OjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJM
RShWSURFTykKKyAgICBmbG9hdCBwYWQgPSByZWN0LndpZHRoKCkgKiAwLjQ1OworICAgIGZsb2F0
IHggPSByZWN0LngoKSArIHBhZDsKKyAgICBmbG9hdCB5ID0gcmVjdC55KCkgKyBwYWQ7CisgICAg
ZmxvYXQgd2lkdGggPSByZWN0LndpZHRoKCkgKiAwLjE7CisgICAgZmxvYXQgaGVpZ2h0ID0gcmVj
dC5oZWlnaHQoKSAtICgyLjAgKiBwYWQpOworCisgICAgSW50UmVjdCByZWN0Mih4LCB5LCB3aWR0
aCwgaGVpZ2h0KTsKKworICAgIHJldHVybiBwYWludFNsaWRlclRyYWNrUmVjdChvYmplY3QsIHBh
aW50SW5mbywgcmVjdDIpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBV
TlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0
dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWlu
dE1lZGlhVm9sdW1lU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURF
TykKKyAgICBzdGF0aWMgSW1hZ2UqIG1lZGlhVm9sdW1lVGh1bWIgPSBJbWFnZTo6bG9hZFBsYXRm
b3JtUmVzb3VyY2UoInZvbHVtZV90aHVtYiIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWlu
dE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYVZvbHVtZVRodW1iKTsK
KyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50
SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRp
ZgorfQorCitDb2xvciBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBsYXRmb3JtRm9jdXNSaW5nQ29s
b3IoKSBjb25zdAoreworICAgIHJldHVybiBmb2N1c1JpbmdQZW47Cit9CisKKyNpZiBFTkFCTEUo
VE9VQ0hfRVZFTlRTKQorQ29sb3IgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwbGF0Zm9ybVRhcEhp
Z2hsaWdodENvbG9yKCkgY29uc3QKK3sKKyAgICAvLyBTYW1lIGNvbG9yIGFzICdmb2N1c1JpbmdQ
ZW4nICsgODAgb2YgYWxwaGEgY2hhbm5lbC4KKyAgICByZXR1cm4gQ29sb3IoMTYzLCAyMDAsIDI1
NCwgODApOworfQorI2VuZGlmCisKK0NvbG9yIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGxhdGZv
cm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBD
b2xvcihzZWxlY3Rpb24pOworfQorCitkb3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojphbmlt
YXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKiByZW5kZXJQ
cm9ncmVzcykgY29uc3QKK3sKKyAgICByZXR1cm4gcmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5h
dGUoKSA/IDAuMCA6IDAuMTsKK30KKworZG91YmxlIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YW5p
bWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jl
c3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlbmRlclByb2dyZXNzLT5pc0RldGVybWluYXRlKCkg
PyAwLjAgOiAyLjA7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFByb2dy
ZXNzQmFyKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFvYmplY3QtPmlzUHJvZ3Jlc3MoKSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0
b1JlbmRlclByb2dyZXNzKG9iamVjdCk7CisKKyAgICBGbG9hdFNpemUgc21hbGxDb3JuZXIoc21h
bGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGluZm8uY29udGV4dC0+c2F2ZSgpOworICAg
IGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGluZm8uY29u
dGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBpbmZvLmNvbnRleHQt
PnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJhbmdlU2xpZGVyUmVndWxh
clRvcE91dGxpbmUsIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1p
bllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgaW5mby5jb250ZXh0LT5z
ZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmFuZ2VTbGlkZXJSZWd1bGFyVG9w
LCByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVk
UmVjdChyZWN0LCBzbWFsbENvcm5lcik7CisgICAgaW5mby5jb250ZXh0LT5maWxsUGF0aChwYXRo
KTsKKworICAgIEludFJlY3QgcmVjdDIgPSByZWN0OworICAgIHJlY3QyLnNldFgocmVjdDIueCgp
ICsgMSk7CisgICAgcmVjdDIuc2V0SGVpZ2h0KHJlY3QyLmhlaWdodCgpIC0gMik7CisgICAgcmVj
dDIuc2V0WShyZWN0Mi55KCkgKyAxKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxl
KE5vU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcygwKTsKKyAg
ICBpZiAocmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSkgeworICAgICAgICByZWN0Mi5z
ZXRXaWR0aChyZWN0Mi53aWR0aCgpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkgLSAyKTsK
KyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGll
bnQocHJvZ3Jlc3NSZWd1bGFyVG9wLCBwcm9ncmVzc1JlZ3VsYXJCb3R0b20sIHJlY3QyLm1heFhN
aW5ZQ29ybmVyKCksIHJlY3QyLm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICAvLyBBbmltYXRpbmcKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdDIud2lkdGgoKSAt
IDIpOworICAgICAgICBSZWZQdHI8R3JhZGllbnQ+IGdyYWRpZW50ID0gR3JhZGllbnQ6OmNyZWF0
ZShyZWN0Mi5taW5YTWF4WUNvcm5lcigpLCByZWN0Mi5tYXhYTWF4WUNvcm5lcigpKTsKKyAgICAg
ICAgZ3JhZGllbnQtPmFkZENvbG9yU3RvcCgwLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRv
bSkpOworICAgICAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKHJlbmRlclByb2dyZXNzLT5hbmlt
YXRpb25Qcm9ncmVzcygpLCBDb2xvcihwcm9ncmVzc1JlZ3VsYXJUb3ApKTsKKyAgICAgICAgZ3Jh
ZGllbnQtPmFkZENvbG9yU3RvcCgxLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRvbSkpOwor
ICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChncmFkaWVudCk7CisgICAgfQor
ICAgIFBhdGggcGF0aDI7CisgICAgcGF0aDIuYWRkUm91bmRlZFJlY3QocmVjdDIsIHNtYWxsQ29y
bmVyKTsKKyAgICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgyKTsKKworICAgIGluZm8uY29u
dGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9S
ZW5kZXJUaGVtZUJsYWNrQmVycnkuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVy
cnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODM3ZjE3OGYxMzAwYWNkMmM2
ODg5MjhlM2MyMTE1NWQyMDU5MTdmMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgKQEAgLTAsMCArMSwx
MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNB
CisgKi8KKworI2lmbmRlZiBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAorI2RlZmluZSBSZW5kZXJU
aGVtZUJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJUaGVtZUJsYWNrQmVycnkgOiBwdWJsaWMgUmVuZGVy
VGhlbWUgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVh
dGUoKTsKKyAgICB2aXJ0dWFsIH5SZW5kZXJUaGVtZUJsYWNrQmVycnkoKTsKKworICAgIHZpcnR1
YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKTsKKworI2lmIEVOQUJMRShWSURFTykK
KyAgICB2aXJ0dWFsIFN0cmluZyBleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCk7CisgICAg
dmlydHVhbCBTdHJpbmcgZm9ybWF0TWVkaWFDb250cm9sc1JlbWFpbmluZ1RpbWUoZmxvYXQgY3Vy
cmVudFRpbWUsIGZsb2F0IGR1cmF0aW9uKSBjb25zdDsKKyNlbmRpZgorICAgIHZpcnR1YWwgYm9v
bCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKikgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQorCisgICAgdmlydHVhbCBkb3VibGUgY2FyZXRCbGlua0ludGVydmFsKCkgY29uc3Q7CisKKyAg
ICB2aXJ0dWFsIHZvaWQgc3lzdGVtRm9udChpbnQgY3NzVmFsdWVJZCwgRm9udERlc2NyaXB0aW9u
JikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRD
aGVja2JveFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRS
YWRpbyhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Cisg
ICAgdmlydHVhbCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZp
cnR1YWwgYm9vbCBwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdm9pZCBjYWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxl
KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVT
ZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9v
bCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xpZGVyVGh1bWJTaXplKFJl
bmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVHJhY2soUmVu
ZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1
YWwgYm9vbCBwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgdmlydHVh
bCBDb2xvciBwbGF0Zm9ybVRhcEhpZ2hsaWdodENvbG9yKCkgY29uc3Q7CisjZW5kaWYKKworICAg
IHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpIGNvbnN0OworICAgIHZpcnR1
YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
IHsgcmV0dXJuIHN0eWxlLT5oYXNBcHBlYXJhbmNlKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50
KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5
bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwg
Ym9vbCBwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENT
U1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVj
dG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBh
aW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZp
cnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBS
ZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Q2hl
Y2tib3hTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29u
c3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFJhZGlvU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvcios
IFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1l
bnVMaXN0KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsK
KworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmpl
Y3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29s
IHBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJU
cmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Cisg
ICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFWb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRl
ck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZv
JiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFByb2dyZXNzQmFyKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0
dWFsIGRvdWJsZSBhbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclBy
b2dyZXNzKikgY29uc3Q7CisgICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQ
cm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OworCisgICAgdmlydHVhbCBDb2xvciBw
bGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OworCitwcml2YXRl
OgorICAgIHN0YXRpYyBjb25zdCBTdHJpbmcmIGRlZmF1bHRHVUlGb250KCk7CisKKyAgICAvLyBU
aGUgZGVmYXVsdCB2YXJpYWJsZS13aWR0aCBmb250IHNpemUuIFdlIHVzZSB0aGlzIGFzIHRoZSBk
ZWZhdWx0IGZvbnQKKyAgICAvLyBzaXplIGZvciB0aGUgInN5c3RlbSBmb250IiwgYW5kIGFzIGEg
YmFzZSBzaXplICh3aGljaCB3ZSB0aGVuIHNocmluaykgZm9yCisgICAgLy8gZm9ybSBjb250cm9s
IGZvbnRzLgorICAgIHN0YXRpYyBmbG9hdCBkZWZhdWx0Rm9udFNpemU7CisKKyAgICBSZW5kZXJU
aGVtZUJsYWNrQmVycnkoKTsKKyAgICB2b2lkIHNldEJ1dHRvblN0eWxlKFJlbmRlclN0eWxlKikg
Y29uc3Q7CisKKyAgICB2b2lkIHBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdy
YXBoaWNzQ29udGV4dCosIFJlbmRlck9iamVjdCosIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3Qg
UGF0aCYgY2xpcFBhdGgpOworICAgIGJvb2wgcGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFy
Y2hGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7
CisgICAgYm9vbCBwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgYm9vbCBwYWludFNsaWRlclRyYWNrUmVjdChS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0JiwgUkdCQTMyIHN0
cm9rZUNvbG9yU3RhcnQsCisgICAgICAgICAgICAgICAgUkdCQTMyIHN0cm9rZUNvbG9yRW5kLCBS
R0JBMzIgZmlsbENvbG9yU3RhcnQsIFJHQkEzMiBmaWxsQ29sb3JFbmQpOworCit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127522</attachid>
            <date>2012-02-16 22:07:34 -0800</date>
            <delta_ts>2012-02-17 15:36:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78785-20120217140732.patch</filename>
            <type>text/plain</type>
            <size>46130</size>
            <attacher name="Mary Wu">mawu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2MjE4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmI0OTI5NzJhMmFlNTlh
YjI4NDA5M2IzZTg2ZWRmZWM1YmQzYjQyYi4uOWFkNjM2MmU1OTJlMDc2NGU5Mjg5MmMwYzk1YTk4
NDE0YzI0MmE5NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDEyLTAyLTE2ICBNYXJ5
IFd1ICA8bWFyeS53dUB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJlYW0gUmVu
ZGVyVGhlbWVCbGFja2JlcnJ5LmgvLmNwcCBpbnRvIFdlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJy
eQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzg3ODUK
KworICAgICAgICBNYWluIENvbnRyaWJ1dG9yczoKKyAgICAgICAgRGFuaWVsIEJhdGVzIDxkYmF0
ZXNAcmltLmNvbT4KKyAgICAgICAgQnJ5YW4gR2lzbGFzb24gPGJnaXNsYXNvbkByaW0uY29tPgor
ICAgICAgICBBa2FzaCBWYXN3YW5pIDxha3Zhc3dhbmlAcmltLmNvbT4KKyAgICAgICAgRGF2ZSBC
YXR0aXN0YSA8ZGJhdHRpc3RhQHJpbS5jb20+CisgICAgICAgIFJvYmluIENhbyAgPHJvYmluLmNh
b0B0b3JjaG1vYmlsZS5jb20uY24+CisgICAgICAgIEdlbmV2aWV2ZSBNYWsgPGdtYWtAcmltLmNv
bT4KKyAgICAgICAgTWlrZSBGZW50b24gIDxtaWZlbnRvbkByaW0uY29tPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5v
IG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5k
ZXJUaGVtZUJsYWNrQmVycnkuaDogQWRkZWQuCisKIDIwMTItMDEtMzAgIFBldGVyIFJ5YmluICA8
cGV0ZXIucnliaW5AZ21haWwuY29tPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IENvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHk6IGNsZWFuIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyLmgKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVy
VGhlbWVCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42ZjYwN2VhNDZmMDllYmFkYTNiMWE1ZDE0
ODI2NzBiZjZhYmVjODY1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsOTY4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUaGVtZUJsYWNrQmVycnkuaCIKKworI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNp
bmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5j
bHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlQmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlBhaW50SW5m
by5oIgorI2luY2x1ZGUgIlJlbmRlclByb2dyZXNzLmgiCisjaW5jbHVkZSAiUmVuZGVyU2xpZGVy
LmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hl
ZXRzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gU2l6ZXMgKHVuaXQgcHgpCitjb25z
dCB1bnNpZ25lZCBzbWFsbFJhZGl1cyA9IDE7Citjb25zdCB1bnNpZ25lZCBsYXJnZVJhZGl1cyA9
IDM7Citjb25zdCB1bnNpZ25lZCBsaW5lV2lkdGggPSAxOworY29uc3QgaW50IG1hcmdpblNpemUg
PSA0OworY29uc3QgaW50IG1lZGlhU2xpZGVyVGh1bWJXaWR0aCA9IDQwOworY29uc3QgaW50IG1l
ZGlhU2xpZGVyVGh1bWJIZWlnaHQgPSAxMzsKK2NvbnN0IGludCBtZWRpYVNsaWRlclRodW1iUmFk
aXVzID0gNTsKK2NvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMTU7Citjb25zdCBpbnQgc2xp
ZGVyVGh1bWJIZWlnaHQgPSAyNTsKKworLy8gQ2hlY2tib3ggY2hlY2sgc2NhbGVycworY29uc3Qg
ZmxvYXQgY2hlY2tib3hMZWZ0WCA9IDcgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hMZWZ0
WSA9IDEgLyAyLjA7Citjb25zdCBmbG9hdCBjaGVja2JveE1pZGRsZVggPSAxOSAvIDUwLjA7Citj
b25zdCBmbG9hdCBjaGVja2JveE1pZGRsZVkgPSA3IC8gMjUuMDsKK2NvbnN0IGZsb2F0IGNoZWNr
Ym94UmlnaHRYID0gMzMgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hSaWdodFkgPSAxIC8g
NS4wOworY29uc3QgZmxvYXQgY2hlY2tib3hTdHJva2VUaGlja25lc3MgPSA2LjU7CisKKy8vIFJh
ZGlvIGJ1dHRvbiBzY2FsZXIKK2NvbnN0IGZsb2F0IHJhZGlvQnV0dG9uQ2hlY2tTdGF0ZVNjYWxl
ciA9IDcgLyAzMC4wOworCisvLyBNdWx0aXBsaWVycworY29uc3QgdW5zaWduZWQgcGFkZGluZ0Rp
dmlzb3IgPSA1OworCisvLyBDb2xvcnMKK2NvbnN0IFJHQkEzMiBjYXJldEJvdHRvbSA9IDB4ZmYy
MTYzYmY7Citjb25zdCBSR0JBMzIgY2FyZXRUb3AgPSAweGZmNjlhNWZhOworCitjb25zdCBSR0JB
MzIgcmVndWxhckJvdHRvbSA9IDB4ZmZkY2RlZTQ7Citjb25zdCBSR0JBMzIgcmVndWxhclRvcCA9
IDB4ZmZmN2YyZWU7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b20gPSAweGZmYjVkM2ZjOworY29u
c3QgUkdCQTMyIGhvdmVyVG9wID0gMHhmZmNjZWFmZjsKK2NvbnN0IFJHQkEzMiBkZXByZXNzZWRC
b3R0b20gPSAweGZmMzM4OGZmOworY29uc3QgUkdCQTMyIGRlcHJlc3NlZFRvcCA9IDB4ZmY2NmEw
ZjI7Citjb25zdCBSR0JBMzIgZGlzYWJsZWRCb3R0b20gPSAweGZmZTdlN2U3OworY29uc3QgUkdC
QTMyIGRpc2FibGVkVG9wID0gMHhmZmVmZWZlZjsKKworY29uc3QgUkdCQTMyIHJlZ3VsYXJCb3R0
b21PdXRsaW5lID0gMHhmZjZlNzA3MzsKK2NvbnN0IFJHQkEzMiByZWd1bGFyVG9wT3V0bGluZSA9
IDB4ZmZiOWI4Yjg7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b21PdXRsaW5lID0gMHhmZjIxNjNi
ZjsKK2NvbnN0IFJHQkEzMiBob3ZlclRvcE91dGxpbmUgPSAweGZmNjliZWZhOworY29uc3QgUkdC
QTMyIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUgPSAweGZmMGMzZDgxOworY29uc3QgUkdCQTMyIGRl
cHJlc3NlZFRvcE91dGxpbmUgPSAweGZmMWQ0ZDcwOworY29uc3QgUkdCQTMyIGRpc2FibGVkT3V0
bGluZSA9IDB4ZmZkNWQ5ZGU7CisKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJCb3R0b20g
PSBjYXJldFRvcDsKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJUb3AgPSBjYXJldEJvdHRv
bTsKKworY29uc3QgUkdCQTMyIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbSA9IDB4ZmZmNmYyZWU7
Citjb25zdCBSR0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyVG9wID0gMHhmZmRlZTBlNTsKK2NvbnN0
IFJHQkEzMiByYW5nZVNsaWRlclJvbGxCb3R0b20gPSAweGZmYzllOGZlOworY29uc3QgUkdCQTMy
IHJhbmdlU2xpZGVyUm9sbFRvcCA9IDB4ZmZiNWQzZmM7CisKK2NvbnN0IFJHQkEzMiByYW5nZVNs
aWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lID0gMHhmZmI5YmFiZDsKK2NvbnN0IFJHQkEzMiByYW5n
ZVNsaWRlclJlZ3VsYXJUb3BPdXRsaW5lID0gMHhmZmI3YjdiNzsKK2NvbnN0IFJHQkEzMiByYW5n
ZVNsaWRlclJvbGxCb3R0b21PdXRsaW5lID0gMHhmZjY3YWJlMDsKK2NvbnN0IFJHQkEzMiByYW5n
ZVNsaWRlclJvbGxUb3BPdXRsaW5lID0gMHhmZjY5YWRmOTsKKworY29uc3QgUkdCQTMyIGRyYWdS
ZWd1bGFyTGlnaHQgPSAweGZmZmRmZGZkOworY29uc3QgUkdCQTMyIGRyYWdSZWd1bGFyRGFyayA9
IDB4ZmZiYWJhYmE7Citjb25zdCBSR0JBMzIgZHJhZ1JvbGxMaWdodCA9IDB4ZmZmMmYyZjI7Citj
b25zdCBSR0JBMzIgZHJhZ1JvbGxEYXJrID0gMHhmZjY5YThmZjsKKworY29uc3QgUkdCQTMyIHNl
bGVjdGlvbiA9IDB4ZmYyYjhmZmY7CisKK2NvbnN0IFJHQkEzMiBibGFja1BlbiA9IENvbG9yOjpi
bGFjazsKK2NvbnN0IFJHQkEzMiBmb2N1c1JpbmdQZW4gPSAweGZmYTNjOGZlOworCisvLyBXZSBh
aW0gdG8gbWF0Y2ggSUUgaGVyZS4KKy8vIC1JRSB1c2VzIGEgZm9udCBiYXNlZCBvbiB0aGUgZW5j
b2RpbmcgYXMgdGhlIGRlZmF1bHQgZm9udCBmb3IgZm9ybSBjb250cm9scy4KKy8vIC1HZWNrbyB1
c2VzIE1TIFNoZWxsIERsZyAoYWN0dWFsbHkgY2FsbHMgR2V0U3RvY2tPYmplY3QoREVGQVVMVF9H
VUlfRk9OVCksCisvLyB3aGljaCByZXR1cm5zIE1TIFNoZWxsIERsZykKKy8vIC1TYWZhcmkgdXNl
cyBMdWNpZGEgR3JhbmRlLgorLy8KKy8vIEZJWE1FOiBUaGUgb25seSBjYXNlIHdoZXJlIHdlIGtu
b3cgd2UgZG9uJ3QgbWF0Y2ggSUUgaXMgZm9yIEFOU0kgZW5jb2RpbmdzLgorLy8gSUUgdXNlcyBN
UyBTaGVsbCBEbGcgdGhlcmUsIHdoaWNoIHdlIHJlbmRlciBpbmNvcnJlY3RseSBhdCBjZXJ0YWlu
IHBpeGVsCisvLyBzaXplcyAoZS5nLiAxNXB4KS4gU28gd2UganVzdCB1c2UgQXJpYWwgZm9yIG5v
dy4KK2NvbnN0IFN0cmluZyYgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpkZWZhdWx0R1VJRm9udCgp
Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIGZvbnRGYWNlLCAoIkFyaWFsIikp
OworICAgIHJldHVybiBmb250RmFjZTsKK30KKworZmxvYXQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5
OjpkZWZhdWx0Rm9udFNpemUgPSAxNi4wOworCitzdGF0aWMgUGFzc1JlZlB0cjxHcmFkaWVudD4g
Y3JlYXRlTGluZWFyR3JhZGllbnQoUkdCQTMyIHRvcCwgUkdCQTMyIGJvdHRvbSwgY29uc3QgSW50
UG9pbnQmIGEsIGNvbnN0IEludFBvaW50JiBiKQoreworICAgIFJlZlB0cjxHcmFkaWVudD4gZ3Jh
ZGllbnQgPSBHcmFkaWVudDo6Y3JlYXRlKGEsIGIpOworICAgIGdyYWRpZW50LT5hZGRDb2xvclN0
b3AoMC4wLCBDb2xvcih0b3ApKTsKKyAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKDEuMCwgQ29s
b3IoYm90dG9tKSk7CisgICAgcmV0dXJuIGdyYWRpZW50LnJlbGVhc2UoKTsKK30KKworc3RhdGlj
IFBhdGggcm91bmRlZFJlY3RGb3JCb3JkZXIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gb2JqZWN0LT5zdHlsZSgp
OworICAgIExlbmd0aFNpemUgdG9wTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BMZWZ0UmFk
aXVzKCk7CisgICAgTGVuZ3RoU2l6ZSB0b3BSaWdodFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BS
aWdodFJhZGl1cygpOworICAgIExlbmd0aFNpemUgYm90dG9tTGVmdFJhZGl1cyA9IHN0eWxlLT5i
b3JkZXJCb3R0b21MZWZ0UmFkaXVzKCk7CisgICAgTGVuZ3RoU2l6ZSBib3R0b21SaWdodFJhZGl1
cyA9IHN0eWxlLT5ib3JkZXJCb3R0b21SaWdodFJhZGl1cygpOworCisgICAgUGF0aCByb3VuZGVk
UmVjdDsKKyAgICByb3VuZGVkUmVjdC5hZGRSb3VuZGVkUmVjdChyZWN0LCBJbnRTaXplKHRvcExl
ZnRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCB0b3BMZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUodG9wUmlnaHRS
YWRpdXMud2lkdGgoKS52YWx1ZSgpLCB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1ZSgpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTaXplKGJvdHRvbUxlZnRS
YWRpdXMud2lkdGgoKS52YWx1ZSgpLCBib3R0b21MZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUoYm90dG9tUmln
aHRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1
ZSgpKSk7CisgICAgcmV0dXJuIHJvdW5kZWRSZWN0OworfQorCitQYXNzUmVmUHRyPFJlbmRlclRo
ZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAgc3RhdGlj
IFJlbmRlclRoZW1lKiB0aGVtZSA9IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y3JlYXRlKCkubGVh
a1JlZigpOworICAgIHJldHVybiB0aGVtZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4g
UmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjcmVhdGUoKQoreworICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgUmVuZGVyVGhlbWVCbGFja0JlcnJ5KCkpOworfQorCitSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OlJlbmRlclRoZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1JlbmRlclRoZW1lQmxhY2tCZXJyeTo6
flJlbmRlclRoZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBTdHJpbmcodGhl
bWVCbGFja0JlcnJ5VXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKHRoZW1lQmxhY2tCZXJyeVVz
ZXJBZ2VudFN0eWxlU2hlZXQpKTsKK30KKworI2lmIEVOQUJMRShWSURFTykKK1N0cmluZyBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQoKQoreworICAg
IHJldHVybiBTdHJpbmcobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0
LCBzaXplb2YobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0KSk7Cit9
CisKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmZvcm1hdE1lZGlhQ29udHJvbHNSZW1h
aW5pbmdUaW1lKGZsb2F0LCBmbG9hdCBkdXJhdGlvbikgY29uc3QKK3sKKyAgICAvLyBUaGlzIGlz
IGEgd29ya2Fyb3VuZCB0byBtYWtlIHRoZSBhcHBlYXJhbmNlIG9mIG1lZGlhIHRpbWUgY29udHJv
bGxlciBpbgorICAgIC8vIGluLXBhZ2UgbW9kZSB0aGUgc2FtZSBhcyBpbiBmdWxsc2NyZWVuIG1v
ZGUuLgorICAgIHJldHVybiBmb3JtYXRNZWRpYUNvbnRyb2xzVGltZShkdXJhdGlvbik7Cit9Cisj
ZW5kaWYKKworZG91YmxlIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y2FyZXRCbGlua0ludGVydmFs
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gMC4wOyAvLyBUdXJuIG9mZiBjYXJldCBibGlua2luZy4K
K30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnN5c3RlbUZvbnQoaW50IHByb3BJZCwg
Rm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgZmxvYXQgZm9u
dFNpemUgPSBkZWZhdWx0Rm9udFNpemU7CisKKyAgICBpZiAocHJvcElkID09IENTU1ZhbHVlV2Vi
a2l0TWluaUNvbnRyb2wgfHwgcHJvcElkID09ICBDU1NWYWx1ZVdlYmtpdFNtYWxsQ29udHJvbCB8
fCBwcm9wSWQgPT0gQ1NTVmFsdWVXZWJraXRDb250cm9sKSB7CisgICAgICAgIC8vIFdoeSAyIHBv
aW50cyBzbWFsbGVyPyBCZWNhdXNlIHRoYXQncyB3aGF0IEdlY2tvIGRvZXMuIE5vdGUgdGhhdCB3
ZQorICAgICAgICAvLyBhcmUgYXNzdW1pbmcgYSA5NmRwaSBzY3JlZW4sIHdoaWNoIGlzIHRoZSBk
ZWZhdWx0IHZhbHVlIHdlIHVzZSBvbiBXaW5kb3dzLgorICAgICAgICBzdGF0aWMgY29uc3QgZmxv
YXQgcG9pbnRzUGVySW5jaCA9IDcyLjBmOworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQgcGl4
ZWxzUGVySW5jaCA9IDk2LjBmOworICAgICAgICBmb250U2l6ZSAtPSAoMi4wZiAvIHBvaW50c1Bl
ckluY2gpICogcGl4ZWxzUGVySW5jaDsKKyAgICB9CisKKyAgICBmb250RGVzY3JpcHRpb24uZmly
c3RGYW1pbHkoKS5zZXRGYW1pbHkoZGVmYXVsdEdVSUZvbnQoKSk7CisgICAgZm9udERlc2NyaXB0
aW9uLnNldFNwZWNpZmllZFNpemUoZm9udFNpemUpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJ
c0Fic29sdXRlU2l6ZSh0cnVlKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWls
eShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0V2Vp
Z2h0KEZvbnRXZWlnaHROb3JtYWwpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJdGFsaWMoZmFs
c2UpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0QnV0dG9uU3R5bGUoUmVu
ZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIExlbmd0aCB2ZXJ0UGFkZGluZyhpbnQoc3R5
bGUtPmZvbnRTaXplKCkgLyBwYWRkaW5nRGl2aXNvciksIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0
UGFkZGluZ1RvcCh2ZXJ0UGFkZGluZyk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20odmVy
dFBhZGRpbmcpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0QnV0dG9u
U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNv
bnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworICAgIHN0eWxlLT5zZXRDdXJzb3Io
Q1VSU09SX1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFk
anVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwg
RWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCitib29s
IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqIG9iamVj
dCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJl
dHVybiBwYWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKG9iamVjdCwgaW5mbywg
cmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RUZXh0RmllbGRT
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29u
c3QKK3sKKyAgICBzZXRCdXR0b25TdHlsZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVC
bGFja0JlcnJ5OjpwYWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKFJlbmRlck9i
amVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgQVNTRVJUKGluZm8uY29udGV4dCk7CisgICAgR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0ID0gaW5mby5jb250ZXh0OworCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQt
PnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VUaGlj
a25lc3MobGluZVdpZHRoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBj
b250ZXh0LT5zZXRTdHJva2VDb2xvcihkaXNhYmxlZE91dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VS
R0IpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBpbmZvLmNvbnRl
eHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcE91
dGxpbmUsIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVj
dC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkgfHwg
aXNGb2N1c2VkKG9iamVjdCkpCisgICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNy
ZWF0ZUxpbmVhckdyYWRpZW50KGhvdmVyVG9wT3V0bGluZSwgaG92ZXJCb3R0b21PdXRsaW5lLCBy
ZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2UK
KyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQo
cmVndWxhclRvcE91dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29y
bmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCB0ZXh0RmllbGRSb3Vu
ZGVkUmVjdGFuZ2xlID0gcm91bmRlZFJlY3RGb3JCb3JkZXIob2JqZWN0LCByZWN0KTsKKyAgICBp
ZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2VhcmNoRmllbGRQYXJ0KSB7Cisg
ICAgICAgIC8vIFdlIGZvcmNlIHRoZSBmaWxsIGNvbG9yIHRvIFdoaXRlIHNvIGFzIHRvIG1hdGNo
IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBncmFwaGlj
LgorICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlLCBDb2xvclNwYWNl
RGV2aWNlUkdCKTsKKyAgICAgICAgY29udGV4dC0+ZHJhd1BhdGgodGV4dEZpZWxkUm91bmRlZFJl
Y3RhbmdsZSk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnRleHQtPnN0cm9rZVBhdGgodGV4dEZp
ZWxkUm91bmRlZFJlY3RhbmdsZSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVy
biBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50VGV4dEZpZWxk
KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJl
Y3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkT3JUZXh0QXJlYU9yU2VhcmNo
RmllbGQob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVy
cnk6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOwor
fQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxC
dXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KikgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZGVmYXVsdENvbnRyb2xGb250UGl4
ZWxTaXplID0gMTM7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGRlZmF1bHRDYW5jZWxCdXR0b25T
aXplID0gOTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWluQ2FuY2VsQnV0dG9uU2l6ZSA9IDU7
CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1heENhbmNlbEJ1dHRvblNpemUgPSAyMTsKKworICAg
IC8vIFNjYWxlIHRoZSBidXR0b24gc2l6ZSBiYXNlZCBvbiB0aGUgZm9udCBzaXplCisgICAgZmxv
YXQgZm9udFNjYWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBkZWZhdWx0Q29udHJvbEZvbnRQaXhl
bFNpemU7CisgICAgaW50IGNhbmNlbEJ1dHRvblNpemUgPSBscm91bmRmKHN0ZDo6bWluKHN0ZDo6
bWF4KG1pbkNhbmNlbEJ1dHRvblNpemUsIGRlZmF1bHRDYW5jZWxCdXR0b25TaXplICogZm9udFNj
YWxlKSwgbWF4Q2FuY2VsQnV0dG9uU2l6ZSkpOworICAgIExlbmd0aCBsZW5ndGgoY2FuY2VsQnV0
dG9uU2l6ZSwgRml4ZWQpOworICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworICAgIHN0eWxl
LT5zZXRIZWlnaHQobGVuZ3RoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBh
aW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0RmllbGRPclRl
eHRBcmVhT3JTZWFyY2hGaWVsZChvYmplY3QsIGluZm8sIHJlY3QpOworfQorCitib29sIFJlbmRl
clRoZW1lQmxhY2tCZXJyeTo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmpl
Y3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgQVNTRVJUKG9iamVjdC0+cGFyZW50KCkpOworICAgIGlmICghb2JqZWN0LT5w
YXJlbnQoKSB8fCAhb2JqZWN0LT5wYXJlbnQoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgUmVuZGVyQm94KiBwYXJlbnRSZW5kZXJCb3ggPSB0b1JlbmRlckJveChvYmpl
Y3QtPnBhcmVudCgpKTsKKworICAgIEludFJlY3QgcGFyZW50Qm94ID0gcGFyZW50UmVuZGVyQm94
LT5hYnNvbHV0ZUNvbnRlbnRCb3goKTsKKyAgICBJbnRSZWN0IGJvdW5kcyA9IHJlY3Q7CisgICAg
Ly8gTWFrZSBzdXJlIHRoZSBzY2FsZWQgYnV0dG9uIHN0YXlzIHNxdWFyZSBhbmQgZml0cyBpbiBp
dHMgcGFyZW50J3MgYm94LgorICAgIGJvdW5kcy5zZXRIZWlnaHQoc3RkOjptaW4ocGFyZW50Qm94
LndpZHRoKCksIHN0ZDo6bWluKHBhcmVudEJveC5oZWlnaHQoKSwgYm91bmRzLmhlaWdodCgpKSkp
OworICAgIGJvdW5kcy5zZXRXaWR0aChib3VuZHMuaGVpZ2h0KCkpOworCisgICAgLy8gUHV0IHRo
ZSBidXR0b24gaW4gdGhlIG1pZGRsZSB2ZXJ0aWNhbGx5LCBhbmQgcm91bmQgdXAgdGhlIHZhbHVl
LgorICAgIC8vIFNvIGlmIGl0IGhhcyB0byBiZSBvbmUgcGl4ZWwgb2ZmLWNlbnRlciwgaXQgd291
bGQgYmUgb25lIHBpeGVsIGNsb3NlcgorICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGZpZWxk
LiBUaGlzIHdvdWxkIGxvb2sgYmV0dGVyIHdpdGggdGhlIHRleHQuCisgICAgYm91bmRzLnNldFko
cGFyZW50Qm94LnkoKSArIChwYXJlbnRCb3guaGVpZ2h0KCkgLSBib3VuZHMuaGVpZ2h0KCkgKyAx
KSAvIDIpOworCisgICAgc3RhdGljIEltYWdlKiBjYW5jZWxJbWFnZSA9IEltYWdlOjpsb2FkUGxh
dGZvcm1SZXNvdXJjZSgic2VhcmNoQ2FuY2VsIikubGVha1JlZigpOworICAgIHN0YXRpYyBJbWFn
ZSogY2FuY2VsUHJlc3NlZEltYWdlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJzZWFy
Y2hDYW5jZWxQcmVzc2VkIikubGVha1JlZigpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3
SW1hZ2UoaXNQcmVzc2VkKG9iamVjdCkgPyBjYW5jZWxQcmVzc2VkSW1hZ2UgOiBjYW5jZWxJbWFn
ZSwgb2JqZWN0LT5zdHlsZSgpLT5jb2xvclNwYWNlKCksIGJvdW5kcyk7CisgICAgcmV0dXJuIGZh
bHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0TWVudUxpc3RCdXR0
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50Kikg
Y29uc3QKK3sKKyAgICAvLyBUaGVzZSBzZWVtIHRvIGJlIHJlYXNvbmFibGUgcGFkZGluZyB2YWx1
ZXMgZnJvbSBvYnNlcnZhdGlvbi4KKyAgICBjb25zdCBpbnQgcGFkZGluZ0xlZnQgPSA4OworICAg
IGNvbnN0IGludCBwYWRkaW5nUmlnaHQgPSA0OworCisgICAgY29uc3QgaW50IG1pbkhlaWdodCA9
IHN0eWxlLT5mb250U2l6ZSgpICogMjsKKworICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKKyAg
ICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7CisKKyAgICBzdHlsZS0+c2V0UGFkZGlu
Z1JpZ2h0KExlbmd0aChtaW5IZWlnaHQgKyBwYWRkaW5nUmlnaHQsIEZpeGVkKSk7CisgICAgc3R5
bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nTGVmdCwgRml4ZWQpKTsKKyAgICBzdHls
ZS0+c2V0Q3Vyc29yKENVUlNPUl9XRUJLSVRfR1JBQik7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVC
bGFja0JlcnJ5OjpjYWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QK
K3sKKyAgICBpbnQgc2l6ZSA9IHN0eWxlLT5mb250U2l6ZSgpOworICAgIExlbmd0aCBsZW5ndGgo
c2l6ZSwgRml4ZWQpOworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IENoZWNrYm94UGFy
dCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkgeworICAgICAgICBzdHlsZS0+
c2V0V2lkdGgobGVuZ3RoKTsKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5ndGgpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJl
IGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KKyAgICBpZiAoIXN0
eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1
dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmlu
c2ljT3JBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworCisgICAgaWYg
KHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5n
dGgpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRDaGVja2JveChSZW5k
ZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworICAgIHJldHVybiBwYWludEJ1dHRvbihvYmplY3QsIGluZm8sIHJlY3QpOworfQor
Cit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxl
KiBzdHlsZSkgY29uc3QKK3sKKyAgICBjYWxjdWxhdGVCdXR0b25TaXplKHN0eWxlKTsKK30KKwor
Ym9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvYmpl
Y3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBy
ZXR1cm4gcGFpbnRCdXR0b24ob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7
CisgICAgY2FsY3VsYXRlQnV0dG9uU2l6ZShzdHlsZSk7Cit9CisKKy8vIElmIHRoaXMgZnVuY3Rp
b24gcmV0dXJucyBmYWxzZSwgV2ViQ29yZSBhc3N1bWVzIHRoZSBidXR0b24gaXMgZnVsbHkgZGVj
b3JhdGVkCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRCdXR0b24oUmVuZGVyT2Jq
ZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBBU1NFUlQoaW5mby5jb250ZXh0KTsKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUoKTsK
KworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGlu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBDb2xvciBj
aGVjayhibGFja1Blbik7CisgICAgaWYgKCFpc0VuYWJsZWQob2JqZWN0KSkgeworICAgICAgICBp
bmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChkaXNhYmxl
ZFRvcCwgZGlzYWJsZWRCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4
WUNvcm5lcigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoZGlzYWJs
ZWRPdXRsaW5lLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICB9IGVsc2UgaWYgKGlzUHJlc3Nl
ZChvYmplY3QpKSB7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNyZWF0
ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcCwgZGVwcmVzc2VkQm90dG9tLCByZWN0Lm1heFhN
aW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRl
eHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcE91
dGxpbmUsIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVj
dC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQob2JqZWN0KSkg
eworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFk
aWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlR3JhZGll
bnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3ZlckJvdHRvbU91dGxp
bmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgcmVjdC5tYXhYTWluWUNvcm5l
cigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRT
dHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0bGluZSwgcmVn
dWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNv
cm5lcigpKSk7CisgICAgfQorCisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUo
KS0+YXBwZWFyYW5jZSgpOworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQ2hlY2tib3hQ
YXJ0OiB7CisgICAgICAgIEZsb2F0U2l6ZSBzbWFsbENvcm5lcihzbWFsbFJhZGl1cywgc21hbGxS
YWRpdXMpOworICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3Qo
cmVjdCwgc21hbGxDb3JuZXIpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdQYXRoKHBhdGgp
OworCisgICAgICAgIGlmIChpc0NoZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgUGF0aCBj
aGVja1BhdGg7CisgICAgICAgICAgICBJbnRSZWN0IHJlY3QyID0gcmVjdDsKKyAgICAgICAgICAg
IHJlY3QyLmluZmxhdGUoLTEpOworICAgICAgICAgICAgY2hlY2tQYXRoLm1vdmVUbyhGbG9hdFBv
aW50KHJlY3QyLngoKSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveExlZnRYLCByZWN0Mi55KCkg
KyByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TGVmdFkpKTsKKyAgICAgICAgICAgIGNoZWNrUGF0
aC5hZGRMaW5lVG8oRmxvYXRQb2ludChyZWN0Mi54KCkgKyByZWN0Mi53aWR0aCgpICogY2hlY2ti
b3hNaWRkbGVYLCByZWN0Mi5tYXhZKCkgLSByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TWlkZGxl
WSkpOworICAgICAgICAgICAgY2hlY2tQYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KHJlY3QyLngo
KSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveFJpZ2h0WCwgcmVjdDIueSgpICsgcmVjdDIuaGVp
Z2h0KCkgKiBjaGVja2JveFJpZ2h0WSkpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRM
aW5lQ2FwKFJvdW5kQ2FwKTsKKyAgICAgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29s
b3IoYmxhY2tQZW4sIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250
ZXh0LT5zZXRTdHJva2VUaGlja25lc3MocmVjdDIud2lkdGgoKSAvIGNoZWNrYm94U3Ryb2tlVGhp
Y2tuZXNzKTsKKyAgICAgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd1BhdGgoY2hlY2tQYXRoKTsK
KyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBSYWRpb1BhcnQ6Cisg
ICAgICAgIGluZm8uY29udGV4dC0+ZHJhd0VsbGlwc2UocmVjdCk7CisgICAgICAgIGlmIChpc0No
ZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgSW50UmVjdCByZWN0MiA9IHJlY3Q7CisgICAg
ICAgICAgICByZWN0Mi5pbmZsYXRlKC1yZWN0LndpZHRoKCkgKiByYWRpb0J1dHRvbkNoZWNrU3Rh
dGVTY2FsZXIpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoY2hlY2ss
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJv
a2VDb2xvcihjaGVjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgICAgICBpbmZvLmNv
bnRleHQtPmRyYXdFbGxpcHNlKHJlY3QyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAg
ICBjYXNlIEJ1dHRvblBhcnQ6CisgICAgY2FzZSBQdXNoQnV0dG9uUGFydDogeworICAgICAgICBG
bG9hdFNpemUgbGFyZ2VDb3JuZXIobGFyZ2VSYWRpdXMsIGxhcmdlUmFkaXVzKTsKKyAgICAgICAg
UGF0aCBwYXRoOworICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29ybmVy
KTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3UGF0aChwYXRoKTsKKyAgICAgICAgYnJlYWs7
CisgICAgfQorICAgIGNhc2UgU3F1YXJlQnV0dG9uUGFydDogeworICAgICAgICBQYXRoIHBhdGg7
CisgICAgICAgIHBhdGguYWRkUmVjdChyZWN0KTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3
UGF0aChwYXRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAg
IGluZm8uY29udGV4dC0+cmVzdG9yZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxlU2Vs
ZWN0b3IqIGNzcywgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAor
eworICAgIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoY3NzLCBzdHlsZSwgZWxlbWVudCk7Cit9
CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RDaGVja2JveFN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAg
IHNldENoZWNrYm94U2l6ZShzdHlsZSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRy
KTsKKyAgICBMZW5ndGggbWFyZ2luKG1hcmdpblNpemUsIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0
TWFyZ2luQm90dG9tKG1hcmdpbik7CisgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KG1hcmdpbik7
CisgICAgc3R5bGUtPnNldEN1cnNvcihDVVJTT1JfV0VCS0lUX0dSQUIpOworfQorCit2b2lkIFJl
bmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0UmFkaW9TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRSYWRpb1NpemUo
c3R5bGUpOworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisgICAgTGVuZ3RoIG1h
cmdpbihtYXJnaW5TaXplLCBGaXhlZCk7CisgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShtYXJn
aW4pOworICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChtYXJnaW4pOworICAgIHN0eWxlLT5zZXRD
dXJzb3IoQ1VSU09SX1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVy
cnk6OnBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgUmVuZGVyT2JqZWN0KiBvYmplY3QsIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3Qg
UGF0aCYgY2xpcFBhdGgpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNh
dmUoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRG
aWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGlzYWJsZWRUb3AsIGRpc2FibGVkQm90
dG9tLCBidXR0b25SZWN0Lm1heFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlDb3Ju
ZXIoKSkpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0
LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGVwcmVzc2VkVG9wLCBkZXBy
ZXNzZWRCb3R0b20sIGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhY
TWF4WUNvcm5lcigpKSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAg
IGNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwg
aG92ZXJCb3R0b20sIGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhY
TWF4WUNvcm5lcigpKSk7CisgICAgZWxzZQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGll
bnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgYnV0dG9u
UmVjdC5tYXhYTWluWUNvcm5lcigpLCBidXR0b25SZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKwor
ICAgIC8vIDEuIFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24uCisgICAgY29udGV4
dC0+Y2xpcChjbGlwUGF0aCk7CisgICAgY29udGV4dC0+ZHJhd1JlY3QoYnV0dG9uUmVjdCk7Cisg
ICAgY29udGV4dC0+cmVzdG9yZSgpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJ1dHRvbiBhcnJv
dy4KKyAgICBidXR0b25SZWN0LmluZmxhdGUoLWJ1dHRvblJlY3Qud2lkdGgoKSAvIDMpOworICAg
IGJ1dHRvblJlY3QubW92ZSgwLCBidXR0b25SZWN0LmhlaWdodCgpICogNyAvIDIwKTsKKyAgICBQ
YXRoIHBhdGg7CisgICAgcGF0aC5tb3ZlVG8oRmxvYXRQb2ludChidXR0b25SZWN0LngoKSwgYnV0
dG9uUmVjdC55KCkpKTsKKyAgICBwYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KGJ1dHRvblJlY3Qu
eCgpICsgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LnkoKSkpOworICAgIHBhdGguYWRk
TGluZVRvKEZsb2F0UG9pbnQoYnV0dG9uUmVjdC54KCkgKyBidXR0b25SZWN0LndpZHRoKCkgLyAy
LjAsIGJ1dHRvblJlY3QueSgpICsgYnV0dG9uUmVjdC5oZWlnaHQoKSAvIDIuMCkpOworICAgIHBh
dGguY2xvc2VTdWJwYXRoKCk7CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4dC0+
c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVRoaWNr
bmVzcyhsaW5lV2lkdGgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFj
aywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9y
OjpibGFjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0TGluZUpvaW4o
QmV2ZWxKb2luKTsKKyAgICBjb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKyAgICBjb250ZXh0LT5y
ZXN0b3JlKCk7Cit9CisKK3N0YXRpYyBJbnRSZWN0IGNvbXB1dGVNZW51TGlzdEFycm93QnV0dG9u
UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGUgbWVudSBsaXN0
IGFycm93IGJ1dHRvbiBzaG91bGQgaGF2ZSBhIG1pbmltdW0gYW5kIG1heGltdW0gd2lkdGggKHRv
IGVuc3VyZSB1c2FiaWxpdHkpIG9yCisgICAgLy8gc2NhbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBm
b250IHNpemUgdXNlZCBpbiB0aGUgbWVudSBsaXN0IGNvbnRyb2wgb3Igc29tZSBjb21iaW5hdGlv
biBvZiBib3RoLgorICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KHJlY3QubWF4WCgpIC0gcmVj
dC5oZWlnaHQoKSwgcmVjdC55KCkpLCBJbnRTaXplKHJlY3QuaGVpZ2h0KCksIHJlY3QuaGVpZ2h0
KCkpKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBjb25zdCBQYXRoJiBtZW51TGlzdFBhdGgsIGNvbnN0IENvbG9yJiBi
YWNrZ3JvdW5kQ29sb3IpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNh
dmUoKTsKKyAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoYmFja2dyb3VuZENvbG9yLCBDb2xvclNw
YWNlRGV2aWNlUkdCKTsKKyAgICBjb250ZXh0LT5maWxsUGF0aChtZW51TGlzdFBhdGgpOworICAg
IGNvbnRleHQtPnJlc3RvcmUoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBh
aW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBOb3RlLCB0aGlzIG1ldGhvZCBpcyBub3Qg
Y2FsbGVkIGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9y
ZGVyIG9yIGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gSW5zdGVhZCwgUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5OjpwYWludE1lbnVMaXN0QnV0dG9uIGlzIGNhbGxlZC4gVGhlcmVmb3JlLCB3aGVuIHRo
aXMgbWV0aG9kIGlzIGNhbGxlZCwgd2UgZG9uJ3QKKyAgICAvLyBoYXZlIHRvIGFkanVzdCByZWN0
IHdpdGggcmVzcGVjdCB0byB0aGUgYm9yZGVyIGRpbWVuc2lvbnMuCisKKyAgICBBU1NFUlQoaW5m
by5jb250ZXh0KTsKKyAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSBpbmZvLmNvbnRleHQ7
CisKKyAgICBQYXRoIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSA9IHJvdW5kZWRSZWN0Rm9yQm9y
ZGVyKG9iamVjdCwgcmVjdCk7CisKKyAgICAvLyAxLiBQYWludCB0aGUgYmFja2dyb3VuZCBvZiB0
aGUgZW50aXJlIGNvbnRyb2wuCisgICAgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoY29udGV4dCwg
bWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlLCBDb2xvcjo6d2hpdGUpOworCisgICAgLy8gMi4gUGFp
bnQgdGhlIGJhY2tncm91bmQgb2YgdGhlIGJ1dHRvbiBhbmQgaXRzIGFycm93LgorICAgIEludFJl
Y3QgYXJyb3dCdXR0b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3Qo
cmVjdCk7CisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coY29udGV4dCwg
b2JqZWN0LCBhcnJvd0J1dHRvblJlY3RhbmdsZSwgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsK
KworICAgIC8vIDQuIFN0cm9rZSBhbiBvdXRsaW5lIGFyb3VuZCB0aGUgZW50aXJlIGNvbnRyb2wu
CisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlk
U3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKKyAg
ICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xv
cihkaXNhYmxlZE91dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVsc2UgaWYgKGlz
UHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVh
dGVMaW5lYXJHcmFkaWVudChkZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21PdXRs
aW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAg
IGVsc2UgaWYgKGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VH
cmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcE91dGxpbmUsIGhvdmVyQm90dG9t
T3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsK
KyAgICBlbHNlCisgICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVh
ckdyYWRpZW50KHJlZ3VsYXJUb3BPdXRsaW5lLCByZWd1bGFyQm90dG9tT3V0bGluZSwgcmVjdC5t
YXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIGNvbnRleHQt
PnN0cm9rZVBhdGgobWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKyAgICBjb250ZXh0LT5yZXN0
b3JlKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJy
eTo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJ
bmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIE5vdGUsIHRoaXMgbWV0
aG9kIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMg
ZWl0aGVyIGEgYm9yZGVyIG9yIGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gT3RoZXJ3aXNlLCBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVudUxpc3QgaXMgY2FsbGVkLiBXZSBuZWVkIHRv
IGZpdCB0aGUgYXJyb3cgYnV0dG9uIHdpdGggdGhlIGJvcmRlciBib3gKKyAgICAvLyBvZiB0aGUg
bWVudS1saXN0IHNvIGFzIHRvIG5vdCBvY2NsdWRlIHRoZSBjdXN0b20gYm9yZGVyLgorCisgICAg
Ly8gV2UgY29tcHV0ZSBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRo
ZSBkaW1lbnNpb25zIG9mIHRoZSBlbnRpcmUgbWVudS1saXN0IGNvbnRyb2wgKGkuZS4gcmVjdCkg
YW5kCisgICAgLy8gaXRzIGJvcmRlciByYWRpdXMgc28gdGhhdCB3ZSBjbGlwIHRoZSBjb250b3Vy
IG9mIHRoZSBhcnJvdyBidXR0b24gKHdoZW4gd2UgcGFpbnQgaXQgYmVsb3cpIHRvIG1hdGNoIHRo
ZSBjb250b3VyIG9mCisgICAgLy8gdGhlIGNvbnRyb2wuCisgICAgUGF0aCBtZW51TGlzdFJvdW5k
ZWRSZWN0YW5nbGUgPSByb3VuZGVkUmVjdEZvckJvcmRlcihvYmplY3QsIHJlY3QpOworCisgICAg
Ly8gMS4gUGFpbnQgdGhlIGJhY2tncm91bmQgb2YgdGhlIGVudGlyZSBjb250cm9sLgorICAgIENv
bG9yIGZpbGxDb2xvciA9IG9iamVjdC0+c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENT
U1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKTsKKyAgICBpZiAoIWZpbGxDb2xvci5pc1ZhbGlkKCkp
CisgICAgICAgIGZpbGxDb2xvciA9IENvbG9yOjp3aGl0ZTsKKyAgICBwYWludE1lbnVMaXN0QmFj
a2dyb3VuZChpbmZvLmNvbnRleHQsIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSwgZmlsbENvbG9y
KTsKKworICAgIC8vIDIuIFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24gYW5kIGl0
cyBhcnJvdy4KKyAgICBJbnRSZWN0IGJvdW5kcyA9IEludFJlY3QocmVjdC54KCkgKyBvYmplY3Qt
PnN0eWxlKCktPmJvcmRlckxlZnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJl
Y3QueSgpICsgb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgIHJlY3Qud2lkdGgoKSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdp
ZHRoKCkgLSBvYmplY3QtPnN0eWxlKCktPmJvcmRlclJpZ2h0V2lkdGgoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICByZWN0LmhlaWdodCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BX
aWR0aCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKKworICAgIElu
dFJlY3QgYXJyb3dCdXR0b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJl
Y3QoYm91bmRzKTsgLy8gRml0IHRoZSBhcnJvdyBidXR0b24gd2l0aGluIHRoZSBib3JkZXIgYm94
IG9mIHRoZSBtZW51LWxpc3QuCisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJy
b3coaW5mby5jb250ZXh0LCBvYmplY3QsIGFycm93QnV0dG9uUmVjdGFuZ2xlLCBtZW51TGlzdFJv
dW5kZWRSZWN0YW5nbGUpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVt
ZUJsYWNrQmVycnk6OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNv
bnN0Cit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9IHN0eWxlLT5hcHBlYXJhbmNlKCk7CisgICAg
aWYgKHBhcnQgPT0gTWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQgfHwgcGFydCA9PSBTbGlkZXJU
aHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsK
KyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGlj
YWxQYXJ0ID8gc2xpZGVyVGh1bWJIZWlnaHQgOiBzbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkpOwor
ICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGlj
YWxQYXJ0ID8gc2xpZGVyVGh1bWJXaWR0aCA6IHNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOwor
ICAgIH0gZWxzZSBpZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgeworICAgICAgICBz
dHlsZS0+c2V0V2lkdGgoTGVuZ3RoKG1lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAg
ICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4
ZWQpKTsKKyAgICB9Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNsaWRl
clRyYWNrKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgY29uc3Qgc3RhdGljIGludCBTbGlkZXJUcmFja0hlaWdo
dCA9IDU7CisgICAgSW50UmVjdCByZWN0MjsKKyAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBl
YXJhbmNlKCkgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgcmVjdDIuc2V0SGVp
Z2h0KFNsaWRlclRyYWNrSGVpZ2h0KTsKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdC53aWR0
aCgpKTsKKyAgICAgICAgcmVjdDIuc2V0WChyZWN0LngoKSk7CisgICAgICAgIHJlY3QyLnNldFko
cmVjdC55KCkgKyAocmVjdC5oZWlnaHQoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAg
IH0gZWxzZSB7CisgICAgICAgIHJlY3QyLnNldEhlaWdodChyZWN0LmhlaWdodCgpKTsKKyAgICAg
ICAgcmVjdDIuc2V0V2lkdGgoU2xpZGVyVHJhY2tIZWlnaHQpOworICAgICAgICByZWN0Mi5zZXRY
KHJlY3QueCgpICsgKHJlY3Qud2lkdGgoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAg
ICAgICByZWN0Mi5zZXRZKHJlY3QueSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHBhaW50U2xpZGVy
VHJhY2tSZWN0KG9iamVjdCwgaW5mbywgcmVjdDIpOworfQorCitib29sIFJlbmRlclRoZW1lQmxh
Y2tCZXJyeTo6cGFpbnRTbGlkZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFp
bnRTbGlkZXJUcmFja1JlY3Qob2JqZWN0LCBpbmZvLCByZWN0LCByYW5nZVNsaWRlclJlZ3VsYXJU
b3BPdXRsaW5lLCByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lLAorICAgICAgICAgICAg
ICAgIHJhbmdlU2xpZGVyUmVndWxhclRvcCwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tKTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2xpZGVyVHJhY2tSZWN0KFJlbmRl
ck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QsCisgICAgICAgIFJHQkEzMiBzdHJva2VDb2xvclN0YXJ0LCBSR0JBMzIgc3Ryb2tlQ29sb3JF
bmQsIFJHQkEzMiBmaWxsQ29sb3JTdGFydCwgUkdCQTMyIGZpbGxDb2xvckVuZCkKK3sKKyAgICBG
bG9hdFNpemUgc21hbGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGlu
Zm8uY29udGV4dC0+c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29s
aWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0
aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdy
YWRpZW50KHN0cm9rZUNvbG9yU3RhcnQsIHN0cm9rZUNvbG9yRW5kLCByZWN0Lm1heFhNaW5ZQ29y
bmVyKCksIHJlY3QuIG1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldEZp
bGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChmaWxsQ29sb3JTdGFydCwgZmlsbENvbG9y
RW5kLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisg
ICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxDb3JuZXIp
OworICAgIGluZm8uY29udGV4dC0+ZmlsbFBhdGgocGF0aCk7CisKKyAgICBpbmZvLmNvbnRleHQt
PnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5OjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgRmxvYXRTaXplIGxhcmdl
Q29ybmVyKGxhcmdlUmFkaXVzLCBsYXJnZVJhZGl1cyk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNh
dmUoKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAg
ICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAgaWYg
KGlzUHJlc3NlZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKSB7CisgICAgICAgIGluZm8u
Y29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BP
dXRsaW5lLCBob3ZlckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4g
bWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVu
dChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1p
bllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChy
ZWd1bGFyVG9wT3V0bGluZSwgcmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3Ju
ZXIoKSwgcmVjdC4gbWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNl
dEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wLCByZWd1bGFyQm90
dG9tLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAg
IH0KKworICAgIFBhdGggcGF0aDsKKyAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdl
Q29ybmVyKTsKKyAgICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgYm9vbCBp
c1ZlcnRpY2FsID0gcmVjdC53aWR0aCgpID4gcmVjdC5oZWlnaHQoKTsKKyAgICBJbnRQb2ludCBz
dGFydFBvaW50KHJlY3QueCgpICsgKGlzVmVydGljYWwgPyA1IDogMiksIHJlY3QueSgpICsgKGlz
VmVydGljYWwgPyAyIDogNSkpOworICAgIEludFBvaW50IGVuZFBvaW50KHJlY3QueCgpICsgKGlz
VmVydGljYWwgPyAyMCA6IDIpLCByZWN0LnkoKSArIChpc1ZlcnRpY2FsID8gMiA6IDIwKSk7Cisg
ICAgY29uc3QgaW50IGxpbmVPZmZzZXQgPSAyOworICAgIGNvbnN0IGludCBzaGFkb3dPZmZzZXQg
PSAxOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKGlz
VmVydGljYWwpIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WShzdGFydFBvaW50LnkoKSAr
IGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WShlbmRQb2ludC55KCkgKyBs
aW5lT2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0
WChzdGFydFBvaW50LngoKSArIGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0
WChlbmRQb2ludC54KCkgKyBsaW5lT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQ
cmVzc2VkKG9iamVjdCkgfHwgaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgICAgICBpbmZvLmNv
bnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdSb2xsTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0Ip
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9y
KGRyYWdSZWd1bGFyTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBpbmZvLmNv
bnRleHQtPmRyYXdMaW5lKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpZiAoaXNW
ZXJ0aWNhbCkgeworICAgICAgICAgICAgc3RhcnRQb2ludC5zZXRZKHN0YXJ0UG9pbnQueSgpICsg
c2hhZG93T2Zmc2V0KTsKKyAgICAgICAgICAgIGVuZFBvaW50LnNldFkoZW5kUG9pbnQueSgpICsg
c2hhZG93T2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQu
c2V0WChzdGFydFBvaW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgICAgICBlbmRQb2lu
dC5zZXRYKGVuZFBvaW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKGlzUHJlc3NlZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICAgICAg
aW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihkcmFnUm9sbERhcmssIENvbG9yU3BhY2VEZXZp
Y2VSR0IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKGRyYWdSZWd1bGFyRGFyaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgIGlu
Zm8uY29udGV4dC0+ZHJhd0xpbmUoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworICAgIH0KKyAgICBp
bmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBi
b29sIHBhaW50TWVkaWFCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRS
ZWN0JiByZWN0LCBJbWFnZSogaW1hZ2UpCit7CisgICAgY29udGV4dC0+ZHJhd0ltYWdlKGltYWdl
LCBDb2xvclNwYWNlRGV2aWNlUkdCLCByZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJPYmpl
Y3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxl
bWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1lZGlhRWxl
bWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdlKiBtZWRpYVBs
YXkgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInBsYXkiKS5sZWFrUmVmKCk7CisgICAg
c3RhdGljIEltYWdlKiBtZWRpYVBhdXNlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJw
YXVzZSIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50SW5m
by5jb250ZXh0LCByZWN0LCBtZWRpYUVsZW1lbnQtPmNhblBsYXkoKSA/IG1lZGlhUGxheSA6IG1l
ZGlhUGF1c2UpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURf
UEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZh
bHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlh
TXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhUTUxN
ZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7
CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
c3RhdGljIEltYWdlKiBtZWRpYU11dGUgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInNw
ZWFrZXIiKS5sZWFrUmVmKCk7CisgICAgc3RhdGljIEltYWdlKiBtZWRpYVVubXV0ZSA9IEltYWdl
Ojpsb2FkUGxhdGZvcm1SZXNvdXJjZSgic3BlYWtlcl9tdXRlIikubGVha1JlZigpOworCisgICAg
cmV0dXJuIHBhaW50TWVkaWFCdXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRWxl
bWVudC0+bXV0ZWQoKSB8fCAhbWVkaWFFbGVtZW50LT52b2x1bWUoKSA/IG1lZGlhVW5tdXRlIDog
bWVkaWFNdXRlKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VE
X1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBm
YWxzZTsKKyNlbmRpZgorfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRp
YUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAg
ICBpZiAoIXRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIHN0YXRpYyBJbWFnZSogbWVkaWFGdWxsc2NyZWVuID0gSW1hZ2U6OmxvYWRQbGF0
Zm9ybVJlc291cmNlKCJmdWxsc2NyZWVuIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50
TWVkaWFCdXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRnVsbHNjcmVlbik7Cisj
ZWxzZQorICAgIFVOVVNFRF9QQVJBTShvYmplY3QpOworICAgIFVOVVNFRF9QQVJBTShwYWludElu
Zm8pOworICAgIFVOVVNFRF9QQVJBTShyZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYK
K30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhS
ZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEludFJlY3QgcmVjdDIocmVj
dC54KCkgKyAzLCByZWN0LnkoKSArIDE0LCByZWN0LndpZHRoKCkgLSA2LCAyKTsKKworICAgIEhU
TUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVj
dCk7CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgZmxvYXQgbG9hZGVkID0gMDsKKyAgICAvLyBGSVhNRTogcmVwbGFjZSBsb2FkZWQgd2l0aCBj
b21tZW50ZWQgb3V0IG9uZSB3aGVuIGJ1ZmZlciBidWcgaXMgZml4ZWQgKHNlZSBjb21tZW50IGlu
CisgICAgLy8gTWVkaWFQbGF5ZXJQcml2YXRlTU1yZW5kZXJlcjo6cGVyY2VudExvYWRlZCkuCisg
ICAgLy8gbG9hZGVkID0gbWVkaWFFbGVtZW50LT5wZXJjZW50TG9hZGVkKCk7CisgICAgaWYgKG1l
ZGlhRWxlbWVudC0+cGxheWVyKCkpCisgICAgICAgIGxvYWRlZCA9IHN0YXRpY19jYXN0PE1lZGlh
UGxheWVyUHJpdmF0ZSAqPihtZWRpYUVsZW1lbnQtPnBsYXllcigpLT5pbXBsZW1lbnRhdGlvbigp
KS0+cGVyY2VudExvYWRlZCgpOworICAgIGZsb2F0IHBvc2l0aW9uID0gbWVkaWFFbGVtZW50LT5k
dXJhdGlvbigpID4gMCA/IChtZWRpYUVsZW1lbnQtPmN1cnJlbnRUaW1lKCkgLyBtZWRpYUVsZW1l
bnQtPmR1cmF0aW9uKCkpIDogMDsKKworICAgIGludCB4ID0gcmVjdC54KCkgKyAzOworICAgIGlu
dCB5ID0gcmVjdC55KCkgKyAxNDsKKyAgICBpbnQgdyA9IHJlY3Qud2lkdGgoKSAtIDY7CisgICAg
aW50IGggPSAyOworCisgICAgaW50IHdQbGF5ZWQgPSAodyAqIHBvc2l0aW9uKTsKKyAgICBpbnQg
d0xvYWRlZCA9ICh3IC0gbWVkaWFTbGlkZXJUaHVtYldpZHRoKSAqIGxvYWRlZCArIG1lZGlhU2xp
ZGVyVGh1bWJXaWR0aDsKKworICAgIEludFJlY3QgcGxheWVkKHgsIHksIHdQbGF5ZWQsIGgpOwor
ICAgIEludFJlY3QgYnVmZmVyZWQoeCwgeSwgd0xvYWRlZCwgaCk7CisKKyAgICAvLyBwYWludCBt
YWluIHNsaWRlciBiYXIKKyAgICBib29sIHJlc3VsdCA9IHBhaW50U2xpZGVyVHJhY2tSZWN0KG9i
amVjdCwgcGFpbnRJbmZvLCByZWN0Mik7CisKKyAgICBpZiAobG9hZGVkID4gMCB8fCBwb3NpdGlv
biA+IDApIHsKKyAgICAgICAgLy8gcGFpbnQgYnVmZmVyZWQgYmFyCisgICAgICAgIHBhaW50U2xp
ZGVyVHJhY2tSZWN0KG9iamVjdCwgcGFpbnRJbmZvLCBidWZmZXJlZCwgQ29sb3I6OmRhcmtHcmF5
LCBDb2xvcjo6ZGFya0dyYXksIENvbG9yOjpkYXJrR3JheSwgQ29sb3I6OmRhcmtHcmF5KTsKKwor
ICAgICAgICAvLyBwYWludCBwbGF5ZWQgcGFydCBvZiBiYXIgKGxlZnQgb2Ygc2xpZGVyIHRodW1i
KSB1c2luZyBzZWxlY3Rpb24gY29sb3IKKyAgICAgICAgcGFpbnRTbGlkZXJUcmFja1JlY3Qob2Jq
ZWN0LCBwYWludEluZm8sIHBsYXllZCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbiwg
c2VsZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKworI2Vsc2UKKyAgICBVTlVT
RURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVT
RURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBv
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAoIW9iamVjdC0+cGFyZW50KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIFJlbmRlclNsaWRlciogc2xpZGVyID0gdG9SZW5kZXJTbGlk
ZXIob2JqZWN0LT5wYXJlbnQoKS0+cGFyZW50KCktPnBhcmVudCgpKTsKKyAgICBpZiAoIXNsaWRl
cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUo
KTsKKyAgICBQYXRoIG1lZGlhVGh1bWJSb3VuZGVkUmVjdGFuZ2xlOworICAgIG1lZGlhVGh1bWJS
b3VuZGVkUmVjdGFuZ2xlLmFkZFJvdW5kZWRSZWN0KHJlY3QsIEZsb2F0U2l6ZShtZWRpYVNsaWRl
clRodW1iUmFkaXVzLCBtZWRpYVNsaWRlclRodW1iUmFkaXVzKSk7CisgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBwYWludEluZm8uY29udGV4
dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKDAuNSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0
cm9rZUNvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisKKyAgICBpZiAo
aXNQcmVzc2VkKG9iamVjdCkgfHwgaXNIb3ZlcmVkKG9iamVjdCkgfHwgc2xpZGVyLT5pbkRyYWdN
b2RlKCkpIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVh
dGVMaW5lYXJHcmFkaWVudChzZWxlY3Rpb24sIENvbG9yKHNlbGVjdGlvbikuZGFyaygpLnJnYigp
LAorICAgICAgICAgICAgICAgIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNv
cm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZp
bGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChDb2xvcjo6d2hpdGUsIENvbG9yKENvbG9y
Ojp3aGl0ZSkuZGFyaygpLnJnYigpLAorICAgICAgICAgICAgICAgIHJlY3QubWF4WE1pbllDb3Ju
ZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfQorICAgIHBhaW50SW5mby5jb250
ZXh0LT5maWxsUGF0aChtZWRpYVRodW1iUm91bmRlZFJlY3RhbmdsZSk7CisgICAgcGFpbnRJbmZv
LmNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICBVTlVT
RURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVT
RURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2Jq
ZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBmbG9hdCBwYWQgPSByZWN0LndpZHRoKCkg
KiAwLjQ1OworICAgIGZsb2F0IHggPSByZWN0LngoKSArIHBhZDsKKyAgICBmbG9hdCB5ID0gcmVj
dC55KCkgKyBwYWQ7CisgICAgZmxvYXQgd2lkdGggPSByZWN0LndpZHRoKCkgKiAwLjE7CisgICAg
ZmxvYXQgaGVpZ2h0ID0gcmVjdC5oZWlnaHQoKSAtICgyLjAgKiBwYWQpOworCisgICAgSW50UmVj
dCByZWN0Mih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHJldHVybiBwYWludFNsaWRlclRy
YWNrUmVjdChvYmplY3QsIHBhaW50SW5mbywgcmVjdDIpOworI2Vsc2UKKyAgICBVTlVTRURfUEFS
QU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFS
QU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBv
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworI2lmIEVOQUJMRShWSURFTykKKyAgICBzdGF0aWMgSW1hZ2UqIG1lZGlhVm9sdW1lVGh1bWIg
PSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInZvbHVtZV90aHVtYiIpLmxlYWtSZWYoKTsK
KworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCByZWN0LCBt
ZWRpYVZvbHVtZVRodW1iKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAg
VU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJl
dHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitDb2xvciBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBs
YXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBmb2N1c1JpbmdQZW47
Cit9CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorQ29sb3IgUmVuZGVyVGhlbWVCbGFja0Jl
cnJ5OjpwbGF0Zm9ybVRhcEhpZ2hsaWdodENvbG9yKCkgY29uc3QKK3sKKyAgICAvLyBTYW1lIGNv
bG9yIGFzICdmb2N1c1JpbmdQZW4nICsgODAgb2YgYWxwaGEgY2hhbm5lbC4KKyAgICByZXR1cm4g
Q29sb3IoMTYzLCAyMDAsIDI1NCwgODApOworfQorI2VuZGlmCisKK0NvbG9yIFJlbmRlclRoZW1l
QmxhY2tCZXJyeTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dAoreworICAgIHJldHVybiBDb2xvcihzZWxlY3Rpb24pOworfQorCitkb3VibGUgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRl
clByb2dyZXNzKiByZW5kZXJQcm9ncmVzcykgY29uc3QKK3sKKyAgICByZXR1cm4gcmVuZGVyUHJv
Z3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSA/IDAuMCA6IDAuMTsKK30KKworZG91YmxlIFJlbmRlclRo
ZW1lQmxhY2tCZXJyeTo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9n
cmVzcyogcmVuZGVyUHJvZ3Jlc3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlbmRlclByb2dyZXNz
LT5pc0RldGVybWluYXRlKCkgPyAwLjAgOiAyLjA7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5OjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFvYmplY3QtPmlz
UHJvZ3Jlc3MoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBSZW5kZXJQcm9ncmVzcyog
cmVuZGVyUHJvZ3Jlc3MgPSB0b1JlbmRlclByb2dyZXNzKG9iamVjdCk7CisKKyAgICBGbG9hdFNp
emUgc21hbGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGluZm8uY29u
dGV4dC0+c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJv
a2UpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisK
KyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50
KHJhbmdlU2xpZGVyUmVndWxhclRvcE91dGxpbmUsIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbU91
dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmFu
Z2VTbGlkZXJSZWd1bGFyVG9wLCByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b20sIHJlY3QubWF4WE1p
bllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisKKyAgICBQYXRoIHBhdGg7Cisg
ICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyZWN0LCBzbWFsbENvcm5lcik7CisgICAgaW5mby5jb250
ZXh0LT5maWxsUGF0aChwYXRoKTsKKworICAgIEludFJlY3QgcmVjdDIgPSByZWN0OworICAgIHJl
Y3QyLnNldFgocmVjdDIueCgpICsgMSk7CisgICAgcmVjdDIuc2V0SGVpZ2h0KHJlY3QyLmhlaWdo
dCgpIC0gMik7CisgICAgcmVjdDIuc2V0WShyZWN0Mi55KCkgKyAxKTsKKyAgICBpbmZvLmNvbnRl
eHQtPnNldFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9r
ZVRoaWNrbmVzcygwKTsKKyAgICBpZiAocmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSkg
eworICAgICAgICByZWN0Mi5zZXRXaWR0aChyZWN0Mi53aWR0aCgpICogcmVuZGVyUHJvZ3Jlc3Mt
PnBvc2l0aW9uKCkgLSAyKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQo
Y3JlYXRlTGluZWFyR3JhZGllbnQocHJvZ3Jlc3NSZWd1bGFyVG9wLCBwcm9ncmVzc1JlZ3VsYXJC
b3R0b20sIHJlY3QyLm1heFhNaW5ZQ29ybmVyKCksIHJlY3QyLm1heFhNYXhZQ29ybmVyKCkpKTsK
KyAgICB9IGVsc2UgeworICAgICAgICAvLyBBbmltYXRpbmcKKyAgICAgICAgcmVjdDIuc2V0V2lk
dGgocmVjdDIud2lkdGgoKSAtIDIpOworICAgICAgICBSZWZQdHI8R3JhZGllbnQ+IGdyYWRpZW50
ID0gR3JhZGllbnQ6OmNyZWF0ZShyZWN0Mi5taW5YTWF4WUNvcm5lcigpLCByZWN0Mi5tYXhYTWF4
WUNvcm5lcigpKTsKKyAgICAgICAgZ3JhZGllbnQtPmFkZENvbG9yU3RvcCgwLjAsIENvbG9yKHBy
b2dyZXNzUmVndWxhckJvdHRvbSkpOworICAgICAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKHJl
bmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVzcygpLCBDb2xvcihwcm9ncmVzc1JlZ3VsYXJU
b3ApKTsKKyAgICAgICAgZ3JhZGllbnQtPmFkZENvbG9yU3RvcCgxLjAsIENvbG9yKHByb2dyZXNz
UmVndWxhckJvdHRvbSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChn
cmFkaWVudCk7CisgICAgfQorICAgIFBhdGggcGF0aDI7CisgICAgcGF0aDIuYWRkUm91bmRlZFJl
Y3QocmVjdDIsIHNtYWxsQ29ybmVyKTsKKyAgICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgy
KTsKKworICAgIGluZm8uY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ODM3ZjE3OGYxMzAwYWNkMmM2ODg5MjhlM2MyMTE1NWQyMDU5MTdmMAotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0Jl
cnJ5LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAs
IDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSZW5kZXJUaGVtZUJsYWNrQmVycnlf
aAorI2RlZmluZSBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiUmVuZGVyVGhl
bWUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJUaGVtZUJsYWNrQmVy
cnkgOiBwdWJsaWMgUmVuZGVyVGhlbWUgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKyAgICB2aXJ0dWFsIH5SZW5kZXJUaGVtZUJsYWNrQmVy
cnkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKTsKKwor
I2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0dWFsIFN0cmluZyBleHRyYU1lZGlhQ29udHJvbHNT
dHlsZVNoZWV0KCk7CisgICAgdmlydHVhbCBTdHJpbmcgZm9ybWF0TWVkaWFDb250cm9sc1JlbWFp
bmluZ1RpbWUoZmxvYXQgY3VycmVudFRpbWUsIGZsb2F0IGR1cmF0aW9uKSBjb25zdDsKKyNlbmRp
ZgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKikgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBkb3VibGUgY2FyZXRCbGlua0ludGVy
dmFsKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3lzdGVtRm9udChpbnQgY3NzVmFsdWVJ
ZCwgRm9udERlc2NyaXB0aW9uJikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50Q2hlY2ti
b3goUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICB2
aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHls
ZSopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdm9pZCBjYWxjdWxhdGVCdXR0
b25TaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVM
aXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0
OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCosIGNv
bnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0
U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBh
aW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCos
IGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworI2lmIEVOQUJMRShUT1VDSF9F
VkVOVFMpCisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybVRhcEhpZ2hsaWdodENvbG9yKCkgY29u
c3Q7CisjZW5kaWYKKworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigp
IGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0IHsgcmV0dXJuIHN0eWxlLT5oYXNBcHBlYXJhbmNlKCk7IH0KKwor
ICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVu
ZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRG
aWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25z
dDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3Qg
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRl
eHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNv
bnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RT
ZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQq
KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25T
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZp
ZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENT
U1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0Q2hlY2tib3hTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFJhZGlvU3R5bGUo
Q1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNjcmVl
bkJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7
CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50
TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJUaHVtYihS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBw
YWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBhbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclBy
b2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3Q7CisgICAgdmlydHVhbCBkb3VibGUgYW5p
bWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OworCisg
ICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigp
IGNvbnN0OworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBTdHJpbmcmIGRlZmF1bHRHVUlG
b250KCk7CisKKyAgICAvLyBUaGUgZGVmYXVsdCB2YXJpYWJsZS13aWR0aCBmb250IHNpemUuIFdl
IHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGZvbnQKKyAgICAvLyBzaXplIGZvciB0aGUgInN5c3Rl
bSBmb250IiwgYW5kIGFzIGEgYmFzZSBzaXplICh3aGljaCB3ZSB0aGVuIHNocmluaykgZm9yCisg
ICAgLy8gZm9ybSBjb250cm9sIGZvbnRzLgorICAgIHN0YXRpYyBmbG9hdCBkZWZhdWx0Rm9udFNp
emU7CisKKyAgICBSZW5kZXJUaGVtZUJsYWNrQmVycnkoKTsKKyAgICB2b2lkIHNldEJ1dHRvblN0
eWxlKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICB2b2lkIHBhaW50TWVudUxpc3RCdXR0b25H
cmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCosIFJlbmRlck9iamVjdCosIEludFJlY3Qg
YnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xpcFBhdGgpOworICAgIGJvb2wgcGFpbnRUZXh0Rmll
bGRPclRleHRBcmVhT3JTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0Jik7CisgICAgYm9vbCBwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgYm9vbCBwYWlu
dFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJ
bnRSZWN0JiwgUkdCQTMyIHN0cm9rZUNvbG9yU3RhcnQsCisgICAgICAgICAgICAgICAgUkdCQTMy
IHN0cm9rZUNvbG9yRW5kLCBSR0JBMzIgZmlsbENvbG9yU3RhcnQsIFJHQkEzMiBmaWxsQ29sb3JF
bmQpOworCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZW5kZXJU
aGVtZUJsYWNrQmVycnlfaAo=
</data>
<flag name="review"
          id="129674"
          type_id="1"
          status="+"
          setter="tonikitoo"
    />
    <flag name="commit-queue"
          id="129675"
          type_id="3"
          status="-"
          setter="tonikitoo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127877</attachid>
            <date>2012-02-20 17:45:56 -0800</date>
            <delta_ts>2012-02-20 17:56:13 -0800</delta_ts>
            <desc>update patch</desc>
            <filename>0001-2012-02-19-Mary-Wu-mary.wu-torchmobile.com.cn.patch</filename>
            <type>text/plain</type>
            <size>46155</size>
            <attacher name="Mary Wu">mawu</attacher>
            
              <data encoding="base64">RnJvbSBlNzU1ODI3NTAwNzBhMTFiYjRhYWE0YzMyYjdhN2E0NWFmYTI1ZWNlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ5IFd1IDxtYXJ5Lnd1QHRvcmNobW9iaWxlLmNvbS5jbj4K
RGF0ZTogTW9uLCAyMCBGZWIgMjAxMiAxMjoyOToyNyArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIDIw
MTItMDItMTkgIE1hcnkgV3UgIDxtYXJ5Lnd1QHRvcmNobW9iaWxlLmNvbS5jbj4KCiAgICAgICAg
VXBzdHJlYW0gUmVuZGVyVGhlbWVCbGFja2JlcnJ5LmgvLmNwcCBpbnRvIFdlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeQogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03ODc4NQoKICAgICAgICBNYWluIENvbnRyaWJ1dG9yczoKICAgICAgICBEYW5pZWwgQmF0
ZXMgPGRiYXRlc0ByaW0uY29tPgogICAgICAgIEJyeWFuIEdpc2xhc29uIDxiZ2lzbGFzb25Acmlt
LmNvbT4KICAgICAgICBBa2FzaCBWYXN3YW5pIDxha3Zhc3dhbmlAcmltLmNvbT4KICAgICAgICBE
YXZlIEJhdHRpc3RhIDxkYmF0dGlzdGFAcmltLmNvbT4KICAgICAgICBSb2JpbiBDYW8gIDxyb2Jp
bi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgogICAgICAgIEdlbmV2aWV2ZSBNYWsgPGdtYWtAcmlt
LmNvbT4KICAgICAgICBNaWtlIEZlbnRvbiAgPG1pZmVudG9uQHJpbS5jb20+CgogICAgICAgIFJl
dmlld2VkIGJ5IEFudG9uaW8gR29tZXMgYW5kIFJvYiBCdWlzLgoKICAgICAgICBJbml0aWFsIHVw
c3RyZWFtLCBubyBuZXcgdGVzdHMuCgogICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5k
ZXJUaGVtZUJsYWNrQmVycnkuY3BwOiBBZGRlZC4KICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVy
cnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5Lmg6IEFkZGVkLgotLS0KIC4uLi9wbGF0Zm9ybS9ibGFj
a2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHAgIHwgIDk2OCArKysrKysrKysrKysrKysr
KysrKwogLi4uL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmggICAg
fCAgMTEyICsrKwogMiBmaWxlcyBjaGFuZ2VkLCAxMDgwIGluc2VydGlvbnMoKyksIDAgZGVsZXRp
b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuaAoKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVy
VGhlbWVCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41
ZGYxZWNhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsOTY4IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUJs
YWNrQmVycnkuaCIKKworI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJG
cmFtZS5oIgorI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5jbHVkZSAiTWVk
aWFQbGF5ZXJQcml2YXRlQmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlBhaW50SW5mby5oIgorI2lu
Y2x1ZGUgIlJlbmRlclByb2dyZXNzLmgiCisjaW5jbHVkZSAiUmVuZGVyU2xpZGVyLmgiCisjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gU2l6ZXMgKHVuaXQgcHgpCitjb25zdCB1bnNpZ25l
ZCBzbWFsbFJhZGl1cyA9IDE7Citjb25zdCB1bnNpZ25lZCBsYXJnZVJhZGl1cyA9IDM7Citjb25z
dCB1bnNpZ25lZCBsaW5lV2lkdGggPSAxOworY29uc3QgaW50IG1hcmdpblNpemUgPSA0OworY29u
c3QgaW50IG1lZGlhU2xpZGVyVGh1bWJXaWR0aCA9IDQwOworY29uc3QgaW50IG1lZGlhU2xpZGVy
VGh1bWJIZWlnaHQgPSAxMzsKK2NvbnN0IGludCBtZWRpYVNsaWRlclRodW1iUmFkaXVzID0gNTsK
K2NvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMTU7Citjb25zdCBpbnQgc2xpZGVyVGh1bWJI
ZWlnaHQgPSAyNTsKKworLy8gQ2hlY2tib3ggY2hlY2sgc2NhbGVycworY29uc3QgZmxvYXQgY2hl
Y2tib3hMZWZ0WCA9IDcgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hMZWZ0WSA9IDEgLyAy
LjA7Citjb25zdCBmbG9hdCBjaGVja2JveE1pZGRsZVggPSAxOSAvIDUwLjA7Citjb25zdCBmbG9h
dCBjaGVja2JveE1pZGRsZVkgPSA3IC8gMjUuMDsKK2NvbnN0IGZsb2F0IGNoZWNrYm94UmlnaHRY
ID0gMzMgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hSaWdodFkgPSAxIC8gNS4wOworY29u
c3QgZmxvYXQgY2hlY2tib3hTdHJva2VUaGlja25lc3MgPSA2LjU7CisKKy8vIFJhZGlvIGJ1dHRv
biBzY2FsZXIKK2NvbnN0IGZsb2F0IHJhZGlvQnV0dG9uQ2hlY2tTdGF0ZVNjYWxlciA9IDcgLyAz
MC4wOworCisvLyBNdWx0aXBsaWVycworY29uc3QgdW5zaWduZWQgcGFkZGluZ0Rpdmlzb3IgPSA1
OworCisvLyBDb2xvcnMKK2NvbnN0IFJHQkEzMiBjYXJldEJvdHRvbSA9IDB4ZmYyMTYzYmY7Citj
b25zdCBSR0JBMzIgY2FyZXRUb3AgPSAweGZmNjlhNWZhOworCitjb25zdCBSR0JBMzIgcmVndWxh
ckJvdHRvbSA9IDB4ZmZkY2RlZTQ7Citjb25zdCBSR0JBMzIgcmVndWxhclRvcCA9IDB4ZmZmN2Yy
ZWU7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b20gPSAweGZmYjVkM2ZjOworY29uc3QgUkdCQTMy
IGhvdmVyVG9wID0gMHhmZmNjZWFmZjsKK2NvbnN0IFJHQkEzMiBkZXByZXNzZWRCb3R0b20gPSAw
eGZmMzM4OGZmOworY29uc3QgUkdCQTMyIGRlcHJlc3NlZFRvcCA9IDB4ZmY2NmEwZjI7Citjb25z
dCBSR0JBMzIgZGlzYWJsZWRCb3R0b20gPSAweGZmZTdlN2U3OworY29uc3QgUkdCQTMyIGRpc2Fi
bGVkVG9wID0gMHhmZmVmZWZlZjsKKworY29uc3QgUkdCQTMyIHJlZ3VsYXJCb3R0b21PdXRsaW5l
ID0gMHhmZjZlNzA3MzsKK2NvbnN0IFJHQkEzMiByZWd1bGFyVG9wT3V0bGluZSA9IDB4ZmZiOWI4
Yjg7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b21PdXRsaW5lID0gMHhmZjIxNjNiZjsKK2NvbnN0
IFJHQkEzMiBob3ZlclRvcE91dGxpbmUgPSAweGZmNjliZWZhOworY29uc3QgUkdCQTMyIGRlcHJl
c3NlZEJvdHRvbU91dGxpbmUgPSAweGZmMGMzZDgxOworY29uc3QgUkdCQTMyIGRlcHJlc3NlZFRv
cE91dGxpbmUgPSAweGZmMWQ0ZDcwOworY29uc3QgUkdCQTMyIGRpc2FibGVkT3V0bGluZSA9IDB4
ZmZkNWQ5ZGU7CisKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJCb3R0b20gPSBjYXJldFRv
cDsKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJUb3AgPSBjYXJldEJvdHRvbTsKKworY29u
c3QgUkdCQTMyIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbSA9IDB4ZmZmNmYyZWU7Citjb25zdCBS
R0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyVG9wID0gMHhmZmRlZTBlNTsKK2NvbnN0IFJHQkEzMiBy
YW5nZVNsaWRlclJvbGxCb3R0b20gPSAweGZmYzllOGZlOworY29uc3QgUkdCQTMyIHJhbmdlU2xp
ZGVyUm9sbFRvcCA9IDB4ZmZiNWQzZmM7CisKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJlZ3Vs
YXJCb3R0b21PdXRsaW5lID0gMHhmZmI5YmFiZDsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJl
Z3VsYXJUb3BPdXRsaW5lID0gMHhmZmI3YjdiNzsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJv
bGxCb3R0b21PdXRsaW5lID0gMHhmZjY3YWJlMDsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJv
bGxUb3BPdXRsaW5lID0gMHhmZjY5YWRmOTsKKworY29uc3QgUkdCQTMyIGRyYWdSZWd1bGFyTGln
aHQgPSAweGZmZmRmZGZkOworY29uc3QgUkdCQTMyIGRyYWdSZWd1bGFyRGFyayA9IDB4ZmZiYWJh
YmE7Citjb25zdCBSR0JBMzIgZHJhZ1JvbGxMaWdodCA9IDB4ZmZmMmYyZjI7Citjb25zdCBSR0JB
MzIgZHJhZ1JvbGxEYXJrID0gMHhmZjY5YThmZjsKKworY29uc3QgUkdCQTMyIHNlbGVjdGlvbiA9
IDB4ZmYyYjhmZmY7CisKK2NvbnN0IFJHQkEzMiBibGFja1BlbiA9IENvbG9yOjpibGFjazsKK2Nv
bnN0IFJHQkEzMiBmb2N1c1JpbmdQZW4gPSAweGZmYTNjOGZlOworCitmbG9hdCBSZW5kZXJUaGVt
ZUJsYWNrQmVycnk6OmRlZmF1bHRGb250U2l6ZSA9IDE2LjA7CisKKy8vIFdlIGFpbSB0byBtYXRj
aCBJRSBoZXJlLgorLy8gLUlFIHVzZXMgYSBmb250IGJhc2VkIG9uIHRoZSBlbmNvZGluZyBhcyB0
aGUgZGVmYXVsdCBmb250IGZvciBmb3JtIGNvbnRyb2xzLgorLy8gLUdlY2tvIHVzZXMgTVMgU2hl
bGwgRGxnIChhY3R1YWxseSBjYWxscyBHZXRTdG9ja09iamVjdChERUZBVUxUX0dVSV9GT05UKSwK
Ky8vIHdoaWNoIHJldHVybnMgTVMgU2hlbGwgRGxnKQorLy8gLVNhZmFyaSB1c2VzIEx1Y2lkYSBH
cmFuZGUuCisvLworLy8gRklYTUU6IFRoZSBvbmx5IGNhc2Ugd2hlcmUgd2Uga25vdyB3ZSBkb24n
dCBtYXRjaCBJRSBpcyBmb3IgQU5TSSBlbmNvZGluZ3MuCisvLyBJRSB1c2VzIE1TIFNoZWxsIERs
ZyB0aGVyZSwgd2hpY2ggd2UgcmVuZGVyIGluY29ycmVjdGx5IGF0IGNlcnRhaW4gcGl4ZWwKKy8v
IHNpemVzIChlLmcuIDE1cHgpLiBTbyB3ZSBqdXN0IHVzZSBBcmlhbCBmb3Igbm93LgorY29uc3Qg
U3RyaW5nJiBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmRlZmF1bHRHVUlGb250KCkKK3sKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgZm9udEZhY2UsICgiQXJpYWwiKSk7CisgICAgcmV0
dXJuIGZvbnRGYWNlOworfQorCitzdGF0aWMgUGFzc1JlZlB0cjxHcmFkaWVudD4gY3JlYXRlTGlu
ZWFyR3JhZGllbnQoUkdCQTMyIHRvcCwgUkdCQTMyIGJvdHRvbSwgY29uc3QgSW50UG9pbnQmIGEs
IGNvbnN0IEludFBvaW50JiBiKQoreworICAgIFJlZlB0cjxHcmFkaWVudD4gZ3JhZGllbnQgPSBH
cmFkaWVudDo6Y3JlYXRlKGEsIGIpOworICAgIGdyYWRpZW50LT5hZGRDb2xvclN0b3AoMC4wLCBD
b2xvcih0b3ApKTsKKyAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKDEuMCwgQ29sb3IoYm90dG9t
KSk7CisgICAgcmV0dXJuIGdyYWRpZW50LnJlbGVhc2UoKTsKK30KKworc3RhdGljIFBhdGggcm91
bmRlZFJlY3RGb3JCb3JkZXIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gb2JqZWN0LT5zdHlsZSgpOworICAgIExl
bmd0aFNpemUgdG9wTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BMZWZ0UmFkaXVzKCk7Cisg
ICAgTGVuZ3RoU2l6ZSB0b3BSaWdodFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BSaWdodFJhZGl1
cygpOworICAgIExlbmd0aFNpemUgYm90dG9tTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJCb3R0
b21MZWZ0UmFkaXVzKCk7CisgICAgTGVuZ3RoU2l6ZSBib3R0b21SaWdodFJhZGl1cyA9IHN0eWxl
LT5ib3JkZXJCb3R0b21SaWdodFJhZGl1cygpOworCisgICAgUGF0aCByb3VuZGVkUmVjdDsKKyAg
ICByb3VuZGVkUmVjdC5hZGRSb3VuZGVkUmVjdChyZWN0LCBJbnRTaXplKHRvcExlZnRSYWRpdXMu
d2lkdGgoKS52YWx1ZSgpLCB0b3BMZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUodG9wUmlnaHRSYWRpdXMud2lk
dGgoKS52YWx1ZSgpLCB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1ZSgpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTaXplKGJvdHRvbUxlZnRSYWRpdXMud2lk
dGgoKS52YWx1ZSgpLCBib3R0b21MZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUoYm90dG9tUmlnaHRSYWRpdXMu
d2lkdGgoKS52YWx1ZSgpLCBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1ZSgpKSk7Cisg
ICAgcmV0dXJuIHJvdW5kZWRSZWN0OworfQorCitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5k
ZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAgc3RhdGljIFJlbmRlclRo
ZW1lKiB0aGVtZSA9IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y3JlYXRlKCkubGVha1JlZigpOwor
ICAgIHJldHVybiB0aGVtZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpjcmVhdGUoKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVuZGVy
VGhlbWVCbGFja0JlcnJ5KCkpOworfQorCitSZW5kZXJUaGVtZUJsYWNrQmVycnk6OlJlbmRlclRo
ZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1JlbmRlclRoZW1lQmxhY2tCZXJyeTo6flJlbmRlclRo
ZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmV4
dHJhRGVmYXVsdFN0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBTdHJpbmcodGhlbWVCbGFja0Jl
cnJ5VXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKHRoZW1lQmxhY2tCZXJyeVVzZXJBZ2VudFN0
eWxlU2hlZXQpKTsKK30KKworI2lmIEVOQUJMRShWSURFTykKK1N0cmluZyBSZW5kZXJUaGVtZUJs
YWNrQmVycnk6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBT
dHJpbmcobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2Yo
bWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0KSk7Cit9CisKK1N0cmlu
ZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmZvcm1hdE1lZGlhQ29udHJvbHNSZW1haW5pbmdUaW1l
KGZsb2F0LCBmbG9hdCBkdXJhdGlvbikgY29uc3QKK3sKKyAgICAvLyBUaGlzIGlzIGEgd29ya2Fy
b3VuZCB0byBtYWtlIHRoZSBhcHBlYXJhbmNlIG9mIG1lZGlhIHRpbWUgY29udHJvbGxlciBpbgor
ICAgIC8vIGluLXBhZ2UgbW9kZSB0aGUgc2FtZSBhcyBpbiBmdWxsc2NyZWVuIG1vZGUuCisgICAg
cmV0dXJuIGZvcm1hdE1lZGlhQ29udHJvbHNUaW1lKGR1cmF0aW9uKTsKK30KKyNlbmRpZgorCitk
b3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjYXJldEJsaW5rSW50ZXJ2YWwoKSBjb25zdAor
eworICAgIHJldHVybiAwOyAvLyBUdXJuIG9mZiBjYXJldCBibGlua2luZy4KK30KKwordm9pZCBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OnN5c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2NyaXB0
aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgZmxvYXQgZm9udFNpemUgPSBkZWZh
dWx0Rm9udFNpemU7CisKKyAgICBpZiAocHJvcElkID09IENTU1ZhbHVlV2Via2l0TWluaUNvbnRy
b2wgfHwgcHJvcElkID09ICBDU1NWYWx1ZVdlYmtpdFNtYWxsQ29udHJvbCB8fCBwcm9wSWQgPT0g
Q1NTVmFsdWVXZWJraXRDb250cm9sKSB7CisgICAgICAgIC8vIFdoeSAyIHBvaW50cyBzbWFsbGVy
PyBCZWNhdXNlIHRoYXQncyB3aGF0IEdlY2tvIGRvZXMuIE5vdGUgdGhhdCB3ZQorICAgICAgICAv
LyBhcmUgYXNzdW1pbmcgYSA5NmRwaSBzY3JlZW4sIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVl
IHdlIHVzZSBvbiBXaW5kb3dzLgorICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQgcG9pbnRzUGVy
SW5jaCA9IDcyLjBmOworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQgcGl4ZWxzUGVySW5jaCA9
IDk2LjBmOworICAgICAgICBmb250U2l6ZSAtPSAoMi4wZiAvIHBvaW50c1BlckluY2gpICogcGl4
ZWxzUGVySW5jaDsKKyAgICB9CisKKyAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5z
ZXRGYW1pbHkoZGVmYXVsdEdVSUZvbnQoKSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNp
ZmllZFNpemUoZm9udFNpemUpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc0Fic29sdXRlU2l6
ZSh0cnVlKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3Jp
cHRpb246Ok5vRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0V2VpZ2h0KEZvbnRXZWln
aHROb3JtYWwpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJdGFsaWMoZmFsc2UpOworfQorCit2
b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0QnV0dG9uU3R5bGUoUmVuZGVyU3R5bGUqIHN0
eWxlKSBjb25zdAoreworICAgIExlbmd0aCB2ZXJ0UGFkZGluZyhpbnQoc3R5bGUtPmZvbnRTaXpl
KCkgLyBwYWRkaW5nRGl2aXNvciksIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1RvcCh2
ZXJ0UGFkZGluZyk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20odmVydFBhZGRpbmcpOwor
fQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5
bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAg
c2V0QnV0dG9uU3R5bGUoc3R5bGUpOworICAgIHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09SX1dFQktJ
VF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdFRleHRBcmVh
U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNv
bnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1l
QmxhY2tCZXJyeTo6cGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFp
bnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRl
eHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKG9iamVjdCwgaW5mbywgcmVjdCk7Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RUZXh0RmllbGRTdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBz
ZXRCdXR0b25TdHlsZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojpw
YWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCogb2JqZWN0
LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQVNT
RVJUKGluZm8uY29udGV4dCk7CisgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gaW5mby5j
b250ZXh0OworCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0
eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdp
ZHRoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRT
dHJva2VDb2xvcihkaXNhYmxlZE91dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVs
c2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcE91dGxpbmUsIGRlcHJl
c3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNv
cm5lcigpKSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkgfHwgaXNGb2N1c2VkKG9i
amVjdCkpCisgICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdy
YWRpZW50KGhvdmVyVG9wT3V0bGluZSwgaG92ZXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2UKKyAgICAgICAgY29u
dGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcE91
dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3Qu
bWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCB0ZXh0RmllbGRSb3VuZGVkUmVjdGFuZ2xl
ID0gcm91bmRlZFJlY3RGb3JCb3JkZXIob2JqZWN0LCByZWN0KTsKKyAgICBpZiAob2JqZWN0LT5z
dHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2VhcmNoRmllbGRQYXJ0KSB7CisgICAgICAgIC8vIFdl
IGZvcmNlIHRoZSBmaWxsIGNvbG9yIHRvIFdoaXRlIHNvIGFzIHRvIG1hdGNoIHRoZSBiYWNrZ3Jv
dW5kIGNvbG9yIG9mIHRoZSBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBncmFwaGljLgorICAgICAgICBj
b250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsK
KyAgICAgICAgY29udGV4dC0+ZHJhd1BhdGgodGV4dEZpZWxkUm91bmRlZFJlY3RhbmdsZSk7Cisg
ICAgfSBlbHNlCisgICAgICAgIGNvbnRleHQtPnN0cm9rZVBhdGgodGV4dEZpZWxkUm91bmRlZFJl
Y3RhbmdsZSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVj
dCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkT3JUZXh0QXJlYU9yU2VhcmNoRmllbGQob2JqZWN0
LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdFNl
YXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxl
bWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCit2b2lkIFJl
bmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShD
U1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sK
KyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZGVmYXVsdENvbnRyb2xGb250UGl4ZWxTaXplID0gMTM7
CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGRlZmF1bHRDYW5jZWxCdXR0b25TaXplID0gOTsKKyAg
ICBzdGF0aWMgY29uc3QgZmxvYXQgbWluQ2FuY2VsQnV0dG9uU2l6ZSA9IDU7CisgICAgc3RhdGlj
IGNvbnN0IGZsb2F0IG1heENhbmNlbEJ1dHRvblNpemUgPSAyMTsKKworICAgIC8vIFNjYWxlIHRo
ZSBidXR0b24gc2l6ZSBiYXNlZCBvbiB0aGUgZm9udCBzaXplCisgICAgZmxvYXQgZm9udFNjYWxl
ID0gc3R5bGUtPmZvbnRTaXplKCkgLyBkZWZhdWx0Q29udHJvbEZvbnRQaXhlbFNpemU7CisgICAg
aW50IGNhbmNlbEJ1dHRvblNpemUgPSBscm91bmRmKHN0ZDo6bWluKHN0ZDo6bWF4KG1pbkNhbmNl
bEJ1dHRvblNpemUsIGRlZmF1bHRDYW5jZWxCdXR0b25TaXplICogZm9udFNjYWxlKSwgbWF4Q2Fu
Y2VsQnV0dG9uU2l6ZSkpOworICAgIExlbmd0aCBsZW5ndGgoY2FuY2VsQnV0dG9uU2l6ZSwgRml4
ZWQpOworICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworICAgIHN0eWxlLT5zZXRIZWlnaHQo
bGVuZ3RoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2VhcmNoRmll
bGQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFy
Y2hGaWVsZChvYmplY3QsIGluZm8sIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tC
ZXJyeTo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAg
QVNTRVJUKG9iamVjdC0+cGFyZW50KCkpOworICAgIGlmICghb2JqZWN0LT5wYXJlbnQoKSB8fCAh
b2JqZWN0LT5wYXJlbnQoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
UmVuZGVyQm94KiBwYXJlbnRSZW5kZXJCb3ggPSB0b1JlbmRlckJveChvYmplY3QtPnBhcmVudCgp
KTsKKworICAgIEludFJlY3QgcGFyZW50Qm94ID0gcGFyZW50UmVuZGVyQm94LT5hYnNvbHV0ZUNv
bnRlbnRCb3goKTsKKyAgICBJbnRSZWN0IGJvdW5kcyA9IHJlY3Q7CisgICAgLy8gTWFrZSBzdXJl
IHRoZSBzY2FsZWQgYnV0dG9uIHN0YXlzIHNxdWFyZSBhbmQgZml0cyBpbiBpdHMgcGFyZW50J3Mg
Ym94LgorICAgIGJvdW5kcy5zZXRIZWlnaHQoc3RkOjptaW4ocGFyZW50Qm94LndpZHRoKCksIHN0
ZDo6bWluKHBhcmVudEJveC5oZWlnaHQoKSwgYm91bmRzLmhlaWdodCgpKSkpOworICAgIGJvdW5k
cy5zZXRXaWR0aChib3VuZHMuaGVpZ2h0KCkpOworCisgICAgLy8gUHV0IHRoZSBidXR0b24gaW4g
dGhlIG1pZGRsZSB2ZXJ0aWNhbGx5LCBhbmQgcm91bmQgdXAgdGhlIHZhbHVlLgorICAgIC8vIFNv
IGlmIGl0IGhhcyB0byBiZSBvbmUgcGl4ZWwgb2ZmLWNlbnRlciwgaXQgd291bGQgYmUgb25lIHBp
eGVsIGNsb3NlcgorICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGZpZWxkLiBUaGlzIHdvdWxk
IGxvb2sgYmV0dGVyIHdpdGggdGhlIHRleHQuCisgICAgYm91bmRzLnNldFkocGFyZW50Qm94Lnko
KSArIChwYXJlbnRCb3guaGVpZ2h0KCkgLSBib3VuZHMuaGVpZ2h0KCkgKyAxKSAvIDIpOworCisg
ICAgc3RhdGljIEltYWdlKiBjYW5jZWxJbWFnZSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJj
ZSgic2VhcmNoQ2FuY2VsIikubGVha1JlZigpOworICAgIHN0YXRpYyBJbWFnZSogY2FuY2VsUHJl
c3NlZEltYWdlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJzZWFyY2hDYW5jZWxQcmVz
c2VkIikubGVha1JlZigpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3SW1hZ2UoaXNQcmVz
c2VkKG9iamVjdCkgPyBjYW5jZWxQcmVzc2VkSW1hZ2UgOiBjYW5jZWxJbWFnZSwgb2JqZWN0LT5z
dHlsZSgpLT5jb2xvclNwYWNlKCksIGJvdW5kcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2
b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAg
ICAvLyBUaGVzZSBzZWVtIHRvIGJlIHJlYXNvbmFibGUgcGFkZGluZyB2YWx1ZXMgZnJvbSBvYnNl
cnZhdGlvbi4KKyAgICBjb25zdCBpbnQgcGFkZGluZ0xlZnQgPSA4OworICAgIGNvbnN0IGludCBw
YWRkaW5nUmlnaHQgPSA0OworCisgICAgY29uc3QgaW50IG1pbkhlaWdodCA9IHN0eWxlLT5mb250
U2l6ZSgpICogMjsKKworICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKKyAgICBzdHlsZS0+c2V0
SGVpZ2h0KExlbmd0aChBdXRvKSk7CisKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0
aChtaW5IZWlnaHQgKyBwYWRkaW5nUmlnaHQsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRp
bmdMZWZ0KExlbmd0aChwYWRkaW5nTGVmdCwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0Q3Vyc29y
KENVUlNPUl9XRUJLSVRfR1JBQik7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojpj
YWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQg
c2l6ZSA9IHN0eWxlLT5mb250U2l6ZSgpOworICAgIExlbmd0aCBsZW5ndGgoc2l6ZSwgRml4ZWQp
OworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IENoZWNrYm94UGFydCB8fCBzdHlsZS0+
YXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkgeworICAgICAgICBzdHlsZS0+c2V0V2lkdGgobGVu
Z3RoKTsKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5ndGgpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lm
aWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgp
LmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkp
CisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworCisgICAgaWYgKHN0eWxlLT5oZWln
aHQoKS5pc0F1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5ndGgpOworfQorCiti
b29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG9i
amVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IHJldHVybiBwYWludEJ1dHRvbihvYmplY3QsIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRl
clRoZW1lQmxhY2tCZXJyeTo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKK3sKKyAgICBjYWxjdWxhdGVCdXR0b25TaXplKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRC
dXR0b24ob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVy
cnk6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgY2FsY3Vs
YXRlQnV0dG9uU2l6ZShzdHlsZSk7Cit9CisKKy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBm
YWxzZSwgV2ViQ29yZSBhc3N1bWVzIHRoZSBidXR0b24gaXMgZnVsbHkgZGVjb3JhdGVkCitib29s
IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBBU1NF
UlQoaW5mby5jb250ZXh0KTsKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGluZm8u
Y29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+
c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBDb2xvciBjaGVjayhibGFja1Bl
bik7CisgICAgaWYgKCFpc0VuYWJsZWQob2JqZWN0KSkgeworICAgICAgICBpbmZvLmNvbnRleHQt
PnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChkaXNhYmxlZFRvcCwgZGlzYWJs
ZWRCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7
CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoZGlzYWJsZWRPdXRsaW5lLCBD
b2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICB9IGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKSB7
CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRp
ZW50KGRlcHJlc3NlZFRvcCwgZGVwcmVzc2VkQm90dG9tLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCks
IHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcE91dGxpbmUsIGRlcHJl
c3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNv
cm5lcigpKSk7CisgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQob2JqZWN0KSkgeworICAgICAgICBp
bmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRv
cCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5l
cigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3ZlckJvdHRvbU91dGxpbmUsIHJlY3QubWF4
WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQo
cmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1h
eFhNYXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVu
dChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0bGluZSwgcmVndWxhckJvdHRvbU91
dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgfQorCisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpOworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQ2hlY2tib3hQYXJ0OiB7CisgICAg
ICAgIEZsb2F0U2l6ZSBzbWFsbENvcm5lcihzbWFsbFJhZGl1cywgc21hbGxSYWRpdXMpOworICAg
ICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxD
b3JuZXIpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdQYXRoKHBhdGgpOworCisgICAgICAg
IGlmIChpc0NoZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgUGF0aCBjaGVja1BhdGg7Cisg
ICAgICAgICAgICBJbnRSZWN0IHJlY3QyID0gcmVjdDsKKyAgICAgICAgICAgIHJlY3QyLmluZmxh
dGUoLTEpOworICAgICAgICAgICAgY2hlY2tQYXRoLm1vdmVUbyhGbG9hdFBvaW50KHJlY3QyLngo
KSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveExlZnRYLCByZWN0Mi55KCkgKyByZWN0Mi5oZWln
aHQoKSAqIGNoZWNrYm94TGVmdFkpKTsKKyAgICAgICAgICAgIGNoZWNrUGF0aC5hZGRMaW5lVG8o
RmxvYXRQb2ludChyZWN0Mi54KCkgKyByZWN0Mi53aWR0aCgpICogY2hlY2tib3hNaWRkbGVYLCBy
ZWN0Mi5tYXhZKCkgLSByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TWlkZGxlWSkpOworICAgICAg
ICAgICAgY2hlY2tQYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KHJlY3QyLngoKSArIHJlY3QyLndp
ZHRoKCkgKiBjaGVja2JveFJpZ2h0WCwgcmVjdDIueSgpICsgcmVjdDIuaGVpZ2h0KCkgKiBjaGVj
a2JveFJpZ2h0WSkpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRMaW5lQ2FwKFJvdW5k
Q2FwKTsKKyAgICAgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoYmxhY2tQZW4s
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJv
a2VUaGlja25lc3MocmVjdDIud2lkdGgoKSAvIGNoZWNrYm94U3Ryb2tlVGhpY2tuZXNzKTsKKyAg
ICAgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd1BhdGgoY2hlY2tQYXRoKTsKKyAgICAgICAgfQor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBSYWRpb1BhcnQ6CisgICAgICAgIGluZm8u
Y29udGV4dC0+ZHJhd0VsbGlwc2UocmVjdCk7CisgICAgICAgIGlmIChpc0NoZWNrZWQob2JqZWN0
KSkgeworICAgICAgICAgICAgSW50UmVjdCByZWN0MiA9IHJlY3Q7CisgICAgICAgICAgICByZWN0
Mi5pbmZsYXRlKC1yZWN0LndpZHRoKCkgKiByYWRpb0J1dHRvbkNoZWNrU3RhdGVTY2FsZXIpOwor
ICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoY2hlY2ssIENvbG9yU3BhY2VE
ZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihjaGVj
aywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdF
bGxpcHNlKHJlY3QyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJ1dHRv
blBhcnQ6CisgICAgY2FzZSBQdXNoQnV0dG9uUGFydDogeworICAgICAgICBGbG9hdFNpemUgbGFy
Z2VDb3JuZXIobGFyZ2VSYWRpdXMsIGxhcmdlUmFkaXVzKTsKKyAgICAgICAgUGF0aCBwYXRoOwor
ICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29ybmVyKTsKKyAgICAgICAg
aW5mby5jb250ZXh0LT5kcmF3UGF0aChwYXRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGNhc2UgU3F1YXJlQnV0dG9uUGFydDogeworICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBh
dGguYWRkUmVjdChyZWN0KTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3UGF0aChwYXRoKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGluZm8uY29udGV4
dC0+cmVzdG9yZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbmZvLmNv
bnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIGNzcywg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGFkanVz
dE1lbnVMaXN0QnV0dG9uU3R5bGUoY3NzLCBzdHlsZSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RDaGVja2JveFN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIHNldENoZWNrYm94
U2l6ZShzdHlsZSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKKyAgICBMZW5n
dGggbWFyZ2luKG1hcmdpblNpemUsIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9t
KG1hcmdpbik7CisgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KG1hcmdpbik7CisgICAgc3R5bGUt
PnNldEN1cnNvcihDVVJTT1JfV0VCS0lUX0dSQUIpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxh
Y2tCZXJyeTo6YWRqdXN0UmFkaW9TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRSYWRpb1NpemUoc3R5bGUpOworICAg
IHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisgICAgTGVuZ3RoIG1hcmdpbihtYXJnaW5T
aXplLCBGaXhlZCk7CisgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShtYXJnaW4pOworICAgIHN0
eWxlLT5zZXRNYXJnaW5SaWdodChtYXJnaW4pOworICAgIHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09S
X1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVu
dUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgUmVu
ZGVyT2JqZWN0KiBvYmplY3QsIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xpcFBh
dGgpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBp
ZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQo
Y3JlYXRlTGluZWFyR3JhZGllbnQoZGlzYWJsZWRUb3AsIGRpc2FibGVkQm90dG9tLCBidXR0b25S
ZWN0Lm1heFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAg
IGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGVwcmVzc2VkVG9wLCBkZXByZXNzZWRCb3R0b20s
IGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigp
KSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgIGNvbnRleHQtPnNl
dEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20s
IGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigp
KSk7CisgICAgZWxzZQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgYnV0dG9uUmVjdC5tYXhYTWlu
WUNvcm5lcigpLCBidXR0b25SZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIC8vIDEuIFBh
aW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24uCisgICAgY29udGV4dC0+Y2xpcChjbGlw
UGF0aCk7CisgICAgY29udGV4dC0+ZHJhd1JlY3QoYnV0dG9uUmVjdCk7CisgICAgY29udGV4dC0+
cmVzdG9yZSgpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJ1dHRvbiBhcnJvdy4KKyAgICBidXR0
b25SZWN0LmluZmxhdGUoLWJ1dHRvblJlY3Qud2lkdGgoKSAvIDMpOworICAgIGJ1dHRvblJlY3Qu
bW92ZSgwLCBidXR0b25SZWN0LmhlaWdodCgpICogNyAvIDIwKTsKKyAgICBQYXRoIHBhdGg7Cisg
ICAgcGF0aC5tb3ZlVG8oRmxvYXRQb2ludChidXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCkp
KTsKKyAgICBwYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KGJ1dHRvblJlY3QueCgpICsgYnV0dG9u
UmVjdC53aWR0aCgpLCBidXR0b25SZWN0LnkoKSkpOworICAgIHBhdGguYWRkTGluZVRvKEZsb2F0
UG9pbnQoYnV0dG9uUmVjdC54KCkgKyBidXR0b25SZWN0LndpZHRoKCkgLyAyLjAsIGJ1dHRvblJl
Y3QueSgpICsgYnV0dG9uUmVjdC5oZWlnaHQoKSAvIDIuMCkpOworICAgIHBhdGguY2xvc2VTdWJw
YXRoKCk7CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4dC0+c2V0U3Ryb2tlU3R5
bGUoU29saWRTdHJva2UpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lk
dGgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFj
ZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpibGFjaywgQ29s
b3JTcGFjZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0TGluZUpvaW4oQmV2ZWxKb2luKTsK
KyAgICBjb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7Cit9
CisKK3N0YXRpYyBJbnRSZWN0IGNvbXB1dGVNZW51TGlzdEFycm93QnV0dG9uUmVjdChjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGUgbWVudSBsaXN0IGFycm93IGJ1dHRv
biBzaG91bGQgaGF2ZSBhIG1pbmltdW0gYW5kIG1heGltdW0gd2lkdGggKHRvIGVuc3VyZSB1c2Fi
aWxpdHkpIG9yCisgICAgLy8gc2NhbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBmb250IHNpemUgdXNl
ZCBpbiB0aGUgbWVudSBsaXN0IGNvbnRyb2wgb3Igc29tZSBjb21iaW5hdGlvbiBvZiBib3RoLgor
ICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KHJlY3QubWF4WCgpIC0gcmVjdC5oZWlnaHQoKSwg
cmVjdC55KCkpLCBJbnRTaXplKHJlY3QuaGVpZ2h0KCksIHJlY3QuaGVpZ2h0KCkpKTsKK30KKwor
c3RhdGljIHZvaWQgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBQYXRoJiBtZW51TGlzdFBhdGgsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29s
b3IpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBj
b250ZXh0LT5zZXRGaWxsQ29sb3IoYmFja2dyb3VuZENvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdC
KTsKKyAgICBjb250ZXh0LT5maWxsUGF0aChtZW51TGlzdFBhdGgpOworICAgIGNvbnRleHQtPnJl
c3RvcmUoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVudUxpc3Qo
UmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICAvLyBOb3RlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGlmIHRo
ZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9yZGVyIG9yIGJhY2tn
cm91bmQgY29sb3IuCisgICAgLy8gSW5zdGVhZCwgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWlu
dE1lbnVMaXN0QnV0dG9uIGlzIGNhbGxlZC4gVGhlcmVmb3JlLCB3aGVuIHRoaXMgbWV0aG9kIGlz
IGNhbGxlZCwgd2UgZG9uJ3QKKyAgICAvLyBoYXZlIHRvIGFkanVzdCByZWN0IHdpdGggcmVzcGVj
dCB0byB0aGUgYm9yZGVyIGRpbWVuc2lvbnMuCisKKyAgICBBU1NFUlQoaW5mby5jb250ZXh0KTsK
KyAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSBpbmZvLmNvbnRleHQ7CisKKyAgICBQYXRo
IG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSA9IHJvdW5kZWRSZWN0Rm9yQm9yZGVyKG9iamVjdCwg
cmVjdCk7CisKKyAgICAvLyAxLiBQYWludCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgZW50aXJlIGNv
bnRyb2wuCisgICAgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoY29udGV4dCwgbWVudUxpc3RSb3Vu
ZGVkUmVjdGFuZ2xlLCBDb2xvcjo6d2hpdGUpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJhY2tn
cm91bmQgb2YgdGhlIGJ1dHRvbiBhbmQgaXRzIGFycm93LgorICAgIEludFJlY3QgYXJyb3dCdXR0
b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3QocmVjdCk7CisgICAg
cGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coY29udGV4dCwgb2JqZWN0LCBhcnJv
d0J1dHRvblJlY3RhbmdsZSwgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKworICAgIC8vIDQu
IFN0cm9rZSBhbiBvdXRsaW5lIGFyb3VuZCB0aGUgZW50aXJlIGNvbnRyb2wuCisgICAgY29udGV4
dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAg
ICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKKyAgICBpZiAoIWlzRW5h
YmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihkaXNhYmxlZE91
dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmpl
Y3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFk
aWVudChkZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21PdXRsaW5lLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2UgaWYgKGlz
SG92ZXJlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVh
dGVMaW5lYXJHcmFkaWVudChob3ZlclRvcE91dGxpbmUsIGhvdmVyQm90dG9tT3V0bGluZSwgcmVj
dC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBlbHNlCisg
ICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJl
Z3VsYXJUb3BPdXRsaW5lLCByZWd1bGFyQm90dG9tT3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5l
cigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIGNvbnRleHQtPnN0cm9rZVBhdGgo
bWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZW51
TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIE5vdGUsIHRoaXMgbWV0aG9kIGlzIG9ubHkg
Y2FsbGVkIGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9y
ZGVyIG9yIGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gT3RoZXJ3aXNlLCBSZW5kZXJUaGVtZUJs
YWNrQmVycnk6OnBhaW50TWVudUxpc3QgaXMgY2FsbGVkLiBXZSBuZWVkIHRvIGZpdCB0aGUgYXJy
b3cgYnV0dG9uIHdpdGggdGhlIGJvcmRlciBib3gKKyAgICAvLyBvZiB0aGUgbWVudS1saXN0IHNv
IGFzIHRvIG5vdCBvY2NsdWRlIHRoZSBjdXN0b20gYm9yZGVyLgorCisgICAgLy8gV2UgY29tcHV0
ZSBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBkaW1lbnNpb25z
IG9mIHRoZSBlbnRpcmUgbWVudS1saXN0IGNvbnRyb2wgKGkuZS4gcmVjdCkgYW5kCisgICAgLy8g
aXRzIGJvcmRlciByYWRpdXMgc28gdGhhdCB3ZSBjbGlwIHRoZSBjb250b3VyIG9mIHRoZSBhcnJv
dyBidXR0b24gKHdoZW4gd2UgcGFpbnQgaXQgYmVsb3cpIHRvIG1hdGNoIHRoZSBjb250b3VyIG9m
CisgICAgLy8gdGhlIGNvbnRyb2wuCisgICAgUGF0aCBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUg
PSByb3VuZGVkUmVjdEZvckJvcmRlcihvYmplY3QsIHJlY3QpOworCisgICAgLy8gMS4gUGFpbnQg
dGhlIGJhY2tncm91bmQgb2YgdGhlIGVudGlyZSBjb250cm9sLgorICAgIENvbG9yIGZpbGxDb2xv
ciA9IG9iamVjdC0+c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5QmFj
a2dyb3VuZENvbG9yKTsKKyAgICBpZiAoIWZpbGxDb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIGZp
bGxDb2xvciA9IENvbG9yOjp3aGl0ZTsKKyAgICBwYWludE1lbnVMaXN0QmFja2dyb3VuZChpbmZv
LmNvbnRleHQsIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSwgZmlsbENvbG9yKTsKKworICAgIC8v
IDIuIFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24gYW5kIGl0cyBhcnJvdy4KKyAg
ICBJbnRSZWN0IGJvdW5kcyA9IEludFJlY3QocmVjdC54KCkgKyBvYmplY3QtPnN0eWxlKCktPmJv
cmRlckxlZnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsgb2Jq
ZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
IHJlY3Qud2lkdGgoKSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCkgLSBvYmpl
Y3QtPnN0eWxlKCktPmJvcmRlclJpZ2h0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICByZWN0LmhlaWdodCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpIC0gb2Jq
ZWN0LT5zdHlsZSgpLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKKworICAgIEludFJlY3QgYXJyb3dC
dXR0b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3QoYm91bmRzKTsg
Ly8gRml0IHRoZSBhcnJvdyBidXR0b24gd2l0aGluIHRoZSBib3JkZXIgYm94IG9mIHRoZSBtZW51
LWxpc3QuCisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coaW5mby5jb250
ZXh0LCBvYmplY3QsIGFycm93QnV0dG9uUmVjdGFuZ2xlLCBtZW51TGlzdFJvdW5kZWRSZWN0YW5n
bGUpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAg
Q29udHJvbFBhcnQgcGFydCA9IHN0eWxlLT5hcHBlYXJhbmNlKCk7CisgICAgaWYgKHBhcnQgPT0g
TWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQgfHwgcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250
YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgc3R5
bGUtPnNldFdpZHRoKExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0ID8gc2xp
ZGVyVGh1bWJIZWlnaHQgOiBzbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkpOworICAgICAgICBzdHls
ZS0+c2V0SGVpZ2h0KExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0ID8gc2xp
ZGVyVGh1bWJXaWR0aCA6IHNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAgIH0gZWxzZSBp
ZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgeworICAgICAgICBzdHlsZS0+c2V0V2lk
dGgoTGVuZ3RoKG1lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgc3R5bGUt
PnNldEhlaWdodChMZW5ndGgobWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKKyAgICB9
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNsaWRlclRyYWNrKFJlbmRl
ck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgY29uc3Qgc3RhdGljIGludCBTbGlkZXJUcmFja0hlaWdodCA9IDU7CisgICAg
SW50UmVjdCByZWN0MjsKKyAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0g
U2xpZGVySG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgcmVjdDIuc2V0SGVpZ2h0KFNsaWRlclRy
YWNrSGVpZ2h0KTsKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdC53aWR0aCgpKTsKKyAgICAg
ICAgcmVjdDIuc2V0WChyZWN0LngoKSk7CisgICAgICAgIHJlY3QyLnNldFkocmVjdC55KCkgKyAo
cmVjdC5oZWlnaHQoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIHJlY3QyLnNldEhlaWdodChyZWN0LmhlaWdodCgpKTsKKyAgICAgICAgcmVjdDIuc2V0
V2lkdGgoU2xpZGVyVHJhY2tIZWlnaHQpOworICAgICAgICByZWN0Mi5zZXRYKHJlY3QueCgpICsg
KHJlY3Qud2lkdGgoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAgICAgICByZWN0Mi5z
ZXRZKHJlY3QueSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9i
amVjdCwgaW5mbywgcmVjdDIpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFp
bnRTbGlkZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
aW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRTbGlkZXJUcmFj
a1JlY3Qob2JqZWN0LCBpbmZvLCByZWN0LCByYW5nZVNsaWRlclJlZ3VsYXJUb3BPdXRsaW5lLCBy
YW5nZVNsaWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lLAorICAgICAgICAgICAgICAgIHJhbmdlU2xp
ZGVyUmVndWxhclRvcCwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tKTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2xpZGVyVHJhY2tSZWN0KFJlbmRlck9iamVjdCogb2Jq
ZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAgICAg
IFJHQkEzMiBzdHJva2VDb2xvclN0YXJ0LCBSR0JBMzIgc3Ryb2tlQ29sb3JFbmQsIFJHQkEzMiBm
aWxsQ29sb3JTdGFydCwgUkdCQTMyIGZpbGxDb2xvckVuZCkKK3sKKyAgICBGbG9hdFNpemUgc21h
bGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGluZm8uY29udGV4dC0+
c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwor
ICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBp
bmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHN0cm9r
ZUNvbG9yU3RhcnQsIHN0cm9rZUNvbG9yRW5kLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3Qu
IG1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChj
cmVhdGVMaW5lYXJHcmFkaWVudChmaWxsQ29sb3JTdGFydCwgZmlsbENvbG9yRW5kLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCBwYXRo
OworICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxDb3JuZXIpOworICAgIGluZm8u
Y29udGV4dC0+ZmlsbFBhdGgocGF0aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWlu
dFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgRmxvYXRTaXplIGxhcmdlQ29ybmVyKGxhcmdl
UmFkaXVzLCBsYXJnZVJhZGl1cyk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBp
bmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRl
eHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAgaWYgKGlzUHJlc3NlZChv
YmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKSB7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0
U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3Zl
ckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4gbWF4WE1heFlDb3Ju
ZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5l
YXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwg
cmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby5jb250
ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0
bGluZSwgcmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4g
bWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVu
dChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wLCByZWd1bGFyQm90dG9tLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0KKworICAgIFBh
dGggcGF0aDsKKyAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29ybmVyKTsKKyAg
ICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgYm9vbCBpc1ZlcnRpY2FsID0g
cmVjdC53aWR0aCgpID4gcmVjdC5oZWlnaHQoKTsKKyAgICBJbnRQb2ludCBzdGFydFBvaW50KHJl
Y3QueCgpICsgKGlzVmVydGljYWwgPyA1IDogMiksIHJlY3QueSgpICsgKGlzVmVydGljYWwgPyAy
IDogNSkpOworICAgIEludFBvaW50IGVuZFBvaW50KHJlY3QueCgpICsgKGlzVmVydGljYWwgPyAy
MCA6IDIpLCByZWN0LnkoKSArIChpc1ZlcnRpY2FsID8gMiA6IDIwKSk7CisgICAgY29uc3QgaW50
IGxpbmVPZmZzZXQgPSAyOworICAgIGNvbnN0IGludCBzaGFkb3dPZmZzZXQgPSAxOworCisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKGlzVmVydGljYWwpIHsK
KyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WShzdGFydFBvaW50LnkoKSArIGxpbmVPZmZzZXQp
OworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WShlbmRQb2ludC55KCkgKyBsaW5lT2Zmc2V0KTsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChzdGFydFBvaW50
LngoKSArIGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WChlbmRQb2ludC54
KCkgKyBsaW5lT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQcmVzc2VkKG9iamVj
dCkgfHwgaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0
cm9rZUNvbG9yKGRyYWdSb2xsTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdSZWd1bGFy
TGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdM
aW5lKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpZiAoaXNWZXJ0aWNhbCkgewor
ICAgICAgICAgICAgc3RhcnRQb2ludC5zZXRZKHN0YXJ0UG9pbnQueSgpICsgc2hhZG93T2Zmc2V0
KTsKKyAgICAgICAgICAgIGVuZFBvaW50LnNldFkoZW5kUG9pbnQueSgpICsgc2hhZG93T2Zmc2V0
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChzdGFydFBv
aW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgICAgICBlbmRQb2ludC5zZXRYKGVuZFBv
aW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUHJlc3Nl
ZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICAgICAgaW5mby5jb250ZXh0
LT5zZXRTdHJva2VDb2xvcihkcmFnUm9sbERhcmssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdS
ZWd1bGFyRGFyaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgIGluZm8uY29udGV4dC0+
ZHJhd0xpbmUoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworICAgIH0KKyAgICBpbmZvLmNvbnRleHQt
PnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBhaW50TWVk
aWFCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBJ
bWFnZSogaW1hZ2UpCit7CisgICAgY29udGV4dC0+ZHJhd0ltYWdlKGltYWdlLCBDb2xvclNwYWNl
RGV2aWNlUkdCLCByZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisjaWYg
RU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFy
ZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdlKiBtZWRpYVBsYXkgPSBJbWFnZTo6
bG9hZFBsYXRmb3JtUmVzb3VyY2UoInBsYXkiKS5sZWFrUmVmKCk7CisgICAgc3RhdGljIEltYWdl
KiBtZWRpYVBhdXNlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJwYXVzZSIpLmxlYWtS
ZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCBy
ZWN0LCBtZWRpYUVsZW1lbnQtPmNhblBsYXkoKSA/IG1lZGlhUGxheSA6IG1lZGlhUGF1c2UpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJ
bmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlm
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhTXV0ZUJ1dHRvbihS
ZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQq
IG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAo
IW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdl
KiBtZWRpYU11dGUgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInNwZWFrZXIiKS5sZWFr
UmVmKCk7CisgICAgc3RhdGljIEltYWdlKiBtZWRpYVVubXV0ZSA9IEltYWdlOjpsb2FkUGxhdGZv
cm1SZXNvdXJjZSgic3BlYWtlcl9tdXRlIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50
TWVkaWFCdXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRWxlbWVudC0+bXV0ZWQo
KSB8fCAhbWVkaWFFbGVtZW50LT52b2x1bWUoKSA/IG1lZGlhVW5tdXRlIDogbWVkaWFNdXRlKTsK
KyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50
SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRp
ZgorfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5C
dXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAoIXRvUGFy
ZW50TWVkaWFFbGVtZW50KG9iamVjdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0
YXRpYyBJbWFnZSogbWVkaWFGdWxsc2NyZWVuID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNl
KCJmdWxsc2NyZWVuIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50TWVkaWFCdXR0b24o
cGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRnVsbHNjcmVlbik7CisjZWxzZQorICAgIFVO
VVNFRF9QQVJBTShvYmplY3QpOworICAgIFVOVVNFRF9QQVJBTShwYWludEluZm8pOworICAgIFVO
VVNFRF9QQVJBTShyZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworYm9vbCBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3Qq
IG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEludFJlY3QgcmVjdDIocmVjdC54KCkgKyAzLCBy
ZWN0LnkoKSArIDE0LCByZWN0LndpZHRoKCkgLSA2LCAyKTsKKworICAgIEhUTUxNZWRpYUVsZW1l
bnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBp
ZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZmxvYXQgbG9h
ZGVkID0gMDsKKyAgICAvLyBGSVhNRTogcmVwbGFjZSBsb2FkZWQgd2l0aCBjb21tZW50ZWQgb3V0
IG9uZSB3aGVuIGJ1ZmZlciBidWcgaXMgZml4ZWQgKHNlZSBjb21tZW50IGluCisgICAgLy8gTWVk
aWFQbGF5ZXJQcml2YXRlTU1yZW5kZXJlcjo6cGVyY2VudExvYWRlZCkuCisgICAgLy8gbG9hZGVk
ID0gbWVkaWFFbGVtZW50LT5wZXJjZW50TG9hZGVkKCk7CisgICAgaWYgKG1lZGlhRWxlbWVudC0+
cGxheWVyKCkpCisgICAgICAgIGxvYWRlZCA9IHN0YXRpY19jYXN0PE1lZGlhUGxheWVyUHJpdmF0
ZSAqPihtZWRpYUVsZW1lbnQtPnBsYXllcigpLT5pbXBsZW1lbnRhdGlvbigpKS0+cGVyY2VudExv
YWRlZCgpOworICAgIGZsb2F0IHBvc2l0aW9uID0gbWVkaWFFbGVtZW50LT5kdXJhdGlvbigpID4g
MCA/IChtZWRpYUVsZW1lbnQtPmN1cnJlbnRUaW1lKCkgLyBtZWRpYUVsZW1lbnQtPmR1cmF0aW9u
KCkpIDogMDsKKworICAgIGludCB4ID0gcmVjdC54KCkgKyAzOworICAgIGludCB5ID0gcmVjdC55
KCkgKyAxNDsKKyAgICBpbnQgdyA9IHJlY3Qud2lkdGgoKSAtIDY7CisgICAgaW50IGggPSAyOwor
CisgICAgaW50IHdQbGF5ZWQgPSAodyAqIHBvc2l0aW9uKTsKKyAgICBpbnQgd0xvYWRlZCA9ICh3
IC0gbWVkaWFTbGlkZXJUaHVtYldpZHRoKSAqIGxvYWRlZCArIG1lZGlhU2xpZGVyVGh1bWJXaWR0
aDsKKworICAgIEludFJlY3QgcGxheWVkKHgsIHksIHdQbGF5ZWQsIGgpOworICAgIEludFJlY3Qg
YnVmZmVyZWQoeCwgeSwgd0xvYWRlZCwgaCk7CisKKyAgICAvLyBUaGlzIGlzIHRvIHBhaW50IG1h
aW4gc2xpZGVyIGJhcgorICAgIGJvb2wgcmVzdWx0ID0gcGFpbnRTbGlkZXJUcmFja1JlY3Qob2Jq
ZWN0LCBwYWludEluZm8sIHJlY3QyKTsKKworICAgIGlmIChsb2FkZWQgPiAwIHx8IHBvc2l0aW9u
ID4gMCkgeworICAgICAgICAvLyBUaGlzIGlzIHRvIHBhaW50IGJ1ZmZlcmVkIGJhcgorICAgICAg
ICBwYWludFNsaWRlclRyYWNrUmVjdChvYmplY3QsIHBhaW50SW5mbywgYnVmZmVyZWQsIENvbG9y
OjpkYXJrR3JheSwgQ29sb3I6OmRhcmtHcmF5LCBDb2xvcjo6ZGFya0dyYXksIENvbG9yOjpkYXJr
R3JheSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0byBwYWludCBwbGF5ZWQgcGFydCBvZiBiYXIg
KGxlZnQgb2Ygc2xpZGVyIHRodW1iKSB1c2luZyBzZWxlY3Rpb24gY29sb3IKKyAgICAgICAgcGFp
bnRTbGlkZXJUcmFja1JlY3Qob2JqZWN0LCBwYWludEluZm8sIHBsYXllZCwgc2VsZWN0aW9uLCBz
ZWxlY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3Vs
dDsKKworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0o
cGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOwor
I2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhU2xpZGVy
VGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAoIW9iamVj
dC0+cGFyZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFJlbmRlclNsaWRlciog
c2xpZGVyID0gdG9SZW5kZXJTbGlkZXIob2JqZWN0LT5wYXJlbnQoKS0+cGFyZW50KCktPnBhcmVu
dCgpKTsKKyAgICBpZiAoIXNsaWRlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBQYXRoIG1lZGlhVGh1bWJSb3VuZGVkUmVjdGFu
Z2xlOworICAgIG1lZGlhVGh1bWJSb3VuZGVkUmVjdGFuZ2xlLmFkZFJvdW5kZWRSZWN0KHJlY3Qs
IEZsb2F0U2l6ZShtZWRpYVNsaWRlclRodW1iUmFkaXVzLCBtZWRpYVNsaWRlclRodW1iUmFkaXVz
KSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsK
KyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKDAuNSk7CisgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFjZURl
dmljZVJHQik7CisKKyAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkgfHwgaXNIb3ZlcmVkKG9iamVj
dCkgfHwgc2xpZGVyLT5pbkRyYWdNb2RlKCkpIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQt
PnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChzZWxlY3Rpb24sIENvbG9yKHNl
bGVjdGlvbikuZGFyaygpLnJnYigpLAorICAgICAgICAgICAgICAgIHJlY3QubWF4WE1pbllDb3Ju
ZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChDb2xv
cjo6d2hpdGUsIENvbG9yKENvbG9yOjp3aGl0ZSkuZGFyaygpLnJnYigpLAorICAgICAgICAgICAg
ICAgIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAg
fQorICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUGF0aChtZWRpYVRodW1iUm91bmRlZFJlY3Rh
bmdsZSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIHJldHVybiB0
cnVlOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0o
cGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOwor
I2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhVm9sdW1l
U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBmbG9h
dCBwYWQgPSByZWN0LndpZHRoKCkgKiAwLjQ1OworICAgIGZsb2F0IHggPSByZWN0LngoKSArIHBh
ZDsKKyAgICBmbG9hdCB5ID0gcmVjdC55KCkgKyBwYWQ7CisgICAgZmxvYXQgd2lkdGggPSByZWN0
LndpZHRoKCkgKiAwLjE7CisgICAgZmxvYXQgaGVpZ2h0ID0gcmVjdC5oZWlnaHQoKSAtICgyLjAg
KiBwYWQpOworCisgICAgSW50UmVjdCByZWN0Mih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKworICAg
IHJldHVybiBwYWludFNsaWRlclRyYWNrUmVjdChvYmplY3QsIHBhaW50SW5mbywgcmVjdDIpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJ
bmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlm
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhVm9sdW1lU2xpZGVy
VGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBzdGF0aWMgSW1h
Z2UqIG1lZGlhVm9sdW1lVGh1bWIgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInZvbHVt
ZV90aHVtYiIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50
SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYVZvbHVtZVRodW1iKTsKKyNlbHNlCisgICAgVU5VU0VE
X1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VE
X1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitDb2xvciBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OnBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25zdAoreworICAg
IHJldHVybiBmb2N1c1JpbmdQZW47Cit9CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorQ29s
b3IgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwbGF0Zm9ybVRhcEhpZ2hsaWdodENvbG9yKCkgY29u
c3QKK3sKKyAgICAvLyBTYW1lIGNvbG9yIGFzICdmb2N1c1JpbmdQZW4nICsgODAgb2YgYWxwaGEg
Y2hhbm5lbC4KKyAgICByZXR1cm4gQ29sb3IoMTYzLCAyMDAsIDI1NCwgODApOworfQorI2VuZGlm
CisKK0NvbG9yIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25C
YWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcihzZWxlY3Rpb24pOwor
fQorCitkb3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphbmltYXRpb25SZXBlYXRJbnRlcnZh
bEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcykgY29uc3QKK3sK
KyAgICByZXR1cm4gcmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSA/IDAuMCA6IDAuMTsK
K30KKworZG91YmxlIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQ
cm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHJlbmRlclByb2dyZXNzLT5pc0RldGVybWluYXRlKCkgPyAwLjAgOiAyLjA7Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVj
dCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKCFvYmplY3QtPmlzUHJvZ3Jlc3MoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0b1JlbmRlclByb2dyZXNzKG9i
amVjdCk7CisKKyAgICBGbG9hdFNpemUgc21hbGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFk
aXVzKTsKKworICAgIGluZm8uY29udGV4dC0+c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+c2V0
U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhp
Y2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50
KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJhbmdlU2xpZGVyUmVndWxhclRvcE91dGxpbmUsIHJhbmdl
U2xpZGVyUmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3Jl
YXRlTGluZWFyR3JhZGllbnQocmFuZ2VTbGlkZXJSZWd1bGFyVG9wLCByYW5nZVNsaWRlclJlZ3Vs
YXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7
CisKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyZWN0LCBzbWFsbENv
cm5lcik7CisgICAgaW5mby5jb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKworICAgIEludFJlY3Qg
cmVjdDIgPSByZWN0OworICAgIHJlY3QyLnNldFgocmVjdDIueCgpICsgMSk7CisgICAgcmVjdDIu
c2V0SGVpZ2h0KHJlY3QyLmhlaWdodCgpIC0gMik7CisgICAgcmVjdDIuc2V0WShyZWN0Mi55KCkg
KyAxKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKyAgICBp
bmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcygwKTsKKyAgICBpZiAocmVuZGVyUHJvZ3Jl
c3MtPmlzRGV0ZXJtaW5hdGUoKSkgeworICAgICAgICByZWN0Mi5zZXRXaWR0aChyZWN0Mi53aWR0
aCgpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkgLSAyKTsKKyAgICAgICAgaW5mby5jb250
ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocHJvZ3Jlc3NSZWd1bGFy
VG9wLCBwcm9ncmVzc1JlZ3VsYXJCb3R0b20sIHJlY3QyLm1heFhNaW5ZQ29ybmVyKCksIHJlY3Qy
Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBbmltYXRpbmcK
KyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdDIud2lkdGgoKSAtIDIpOworICAgICAgICBSZWZQ
dHI8R3JhZGllbnQ+IGdyYWRpZW50ID0gR3JhZGllbnQ6OmNyZWF0ZShyZWN0Mi5taW5YTWF4WUNv
cm5lcigpLCByZWN0Mi5tYXhYTWF4WUNvcm5lcigpKTsKKyAgICAgICAgZ3JhZGllbnQtPmFkZENv
bG9yU3RvcCgwLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRvbSkpOworICAgICAgICBncmFk
aWVudC0+YWRkQ29sb3JTdG9wKHJlbmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVzcygpLCBD
b2xvcihwcm9ncmVzc1JlZ3VsYXJUb3ApKTsKKyAgICAgICAgZ3JhZGllbnQtPmFkZENvbG9yU3Rv
cCgxLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRvbSkpOworICAgICAgICBpbmZvLmNvbnRl
eHQtPnNldEZpbGxHcmFkaWVudChncmFkaWVudCk7CisgICAgfQorICAgIFBhdGggcGF0aDI7Cisg
ICAgcGF0aDIuYWRkUm91bmRlZFJlY3QocmVjdDIsIHNtYWxsQ29ybmVyKTsKKyAgICBpbmZvLmNv
bnRleHQtPmZpbGxQYXRoKHBhdGgyKTsKKworICAgIGluZm8uY29udGV4dC0+cmVzdG9yZSgpOwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVy
cnkuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFj
a0JlcnJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3ZjE3OAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVy
VGhlbWVCbGFja0JlcnJ5LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0
d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSZW5kZXJUaGVt
ZUJsYWNrQmVycnlfaAorI2RlZmluZSBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAorCisjaW5jbHVk
ZSAiUmVuZGVyVGhlbWUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJU
aGVtZUJsYWNrQmVycnkgOiBwdWJsaWMgUmVuZGVyVGhlbWUgeworcHVibGljOgorICAgIHN0YXRp
YyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKyAgICB2aXJ0dWFsIH5SZW5kZXJU
aGVtZUJsYWNrQmVycnkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxl
U2hlZXQoKTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0dWFsIFN0cmluZyBleHRyYU1l
ZGlhQ29udHJvbHNTdHlsZVNoZWV0KCk7CisgICAgdmlydHVhbCBTdHJpbmcgZm9ybWF0TWVkaWFD
b250cm9sc1JlbWFpbmluZ1RpbWUoZmxvYXQgY3VycmVudFRpbWUsIGZsb2F0IGR1cmF0aW9uKSBj
b25zdDsKKyNlbmRpZgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRl
clN0eWxlKikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBkb3VibGUgY2Fy
ZXRCbGlua0ludGVydmFsKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3lzdGVtRm9udChp
bnQgY3NzVmFsdWVJZCwgRm9udERlc2NyaXB0aW9uJikgY29uc3Q7CisgICAgdmlydHVhbCBib29s
IHBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqKSBj
b25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIHNldFJhZGlvU2l6
ZShSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdm9pZCBj
YWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lk
IGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxl
bWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRl
ck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmly
dHVhbCBib29sIHBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZv
JiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRodW1iKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworI2lmIEVO
QUJMRShUT1VDSF9FVkVOVFMpCisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybVRhcEhpZ2hsaWdo
dENvbG9yKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1Gb2N1
c1JpbmdDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhj
b25zdCBSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0IHsgcmV0dXJuIHN0eWxlLT5oYXNBcHBlYXJh
bmNlKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lk
IGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVs
ZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2
b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRlck9i
amVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwg
dm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHls
ZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRD
YW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50
KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBw
YWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdEJ1
dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25z
dDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Q2hlY2tib3hTdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVz
dFJhZGlvU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNv
bnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludE1l
ZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVh
bCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFT
bGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0
Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUaHVtYihSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBi
b29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYU11dGVCdXR0b24o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZp
cnR1YWwgYm9vbCBwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBhbmltYXRpb25SZXBlYXRJ
bnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3Q7CisgICAgdmlydHVh
bCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyop
IGNvbnN0OworCisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tn
cm91bmRDb2xvcigpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBTdHJpbmcm
IGRlZmF1bHRHVUlGb250KCk7CisKKyAgICAvLyBUaGUgZGVmYXVsdCB2YXJpYWJsZS13aWR0aCBm
b250IHNpemUuIFdlIHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGZvbnQKKyAgICAvLyBzaXplIGZv
ciB0aGUgInN5c3RlbSBmb250IiwgYW5kIGFzIGEgYmFzZSBzaXplICh3aGljaCB3ZSB0aGVuIHNo
cmluaykgZm9yCisgICAgLy8gZm9ybSBjb250cm9sIGZvbnRzLgorICAgIHN0YXRpYyBmbG9hdCBk
ZWZhdWx0Rm9udFNpemU7CisKKyAgICBSZW5kZXJUaGVtZUJsYWNrQmVycnkoKTsKKyAgICB2b2lk
IHNldEJ1dHRvblN0eWxlKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICB2b2lkIHBhaW50TWVu
dUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCosIFJlbmRlck9iamVj
dCosIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xpcFBhdGgpOworICAgIGJvb2wg
cGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgYm9vbCBwYWludFNsaWRlclRyYWNr
UmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Cisg
ICAgYm9vbCBwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0JiwgUkdCQTMyIHN0cm9rZUNvbG9yU3RhcnQsCisgICAgICAgICAg
ICAgICAgUkdCQTMyIHN0cm9rZUNvbG9yRW5kLCBSR0JBMzIgZmlsbENvbG9yU3RhcnQsIFJHQkEz
MiBmaWxsQ29sb3JFbmQpOworCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAotLSAKMS43LjUuNAoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127882</attachid>
            <date>2012-02-20 17:56:13 -0800</date>
            <delta_ts>2012-02-20 18:23:31 -0800</delta_ts>
            <desc>update patch</desc>
            <filename>a.patch</filename>
            <type>text/plain</type>
            <size>46158</size>
            <attacher name="Mary Wu">mawu</attacher>
            
              <data encoding="base64">RnJvbSBmZTY5OTBjOTJmMzkwMjRkNzg3ZTAwOTRmMzBhY2YwYjNhY2YwNzdmIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ5IFd1IDxtYXJ5Lnd1QHRvcmNobW9iaWxlLmNvbS5jbj4K
RGF0ZTogTW9uLCAyMCBGZWIgMjAxMiAxMjoyOToyNyArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIDIw
MTItMDItMTkgIE1hcnkgV3UgIDxtYXJ5Lnd1QHRvcmNobW9iaWxlLmNvbS5jbj4KCiAgICAgICAg
VXBzdHJlYW0gUmVuZGVyVGhlbWVCbGFja2JlcnJ5LmgvLmNwcCBpbnRvIFdlYkNvcmUvcGxhdGZv
cm0vYmxhY2tiZXJyeQogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03ODc4NQoKICAgICAgICBNYWluIENvbnRyaWJ1dG9yczoKICAgICAgICBEYW5pZWwgQmF0
ZXMgPGRiYXRlc0ByaW0uY29tPgogICAgICAgIEJyeWFuIEdpc2xhc29uIDxiZ2lzbGFzb25Acmlt
LmNvbT4KICAgICAgICBBa2FzaCBWYXN3YW5pIDxha3Zhc3dhbmlAcmltLmNvbT4KICAgICAgICBE
YXZlIEJhdHRpc3RhIDxkYmF0dGlzdGFAcmltLmNvbT4KICAgICAgICBSb2JpbiBDYW8gIDxyb2Jp
bi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgogICAgICAgIEdlbmV2aWV2ZSBNYWsgPGdtYWtAcmlt
LmNvbT4KICAgICAgICBNaWtlIEZlbnRvbiAgPG1pZmVudG9uQHJpbS5jb20+CgogICAgICAgIFJl
dmlld2VkIGJ5IEFudG9uaW8gR29tZXMgYW5kIFJvYiBCdWlzLgoKICAgICAgICBJbml0aWFsIHVw
c3RyZWFtLCBubyBuZXcgdGVzdHMuCgogICAgICAgICogcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5k
ZXJUaGVtZUJsYWNrQmVycnkuY3BwOiBBZGRlZC4KICAgICAgICAqIHBsYXRmb3JtL2JsYWNrYmVy
cnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5Lmg6IEFkZGVkLgotLS0KIC4uLi9wbGF0Zm9ybS9ibGFj
a2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHAgIHwgIDk2OCArKysrKysrKysrKysrKysr
KysrKwogLi4uL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmggICAg
fCAgMTEyICsrKwogMiBmaWxlcyBjaGFuZ2VkLCAxMDgwIGluc2VydGlvbnMoKyksIDAgZGVsZXRp
b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuaAoKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVy
VGhlbWVCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44
NWU5NDFhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsOTY4IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUJs
YWNrQmVycnkuaCIKKworI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJG
cmFtZS5oIgorI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5jbHVkZSAiTWVk
aWFQbGF5ZXJQcml2YXRlQmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlBhaW50SW5mby5oIgorI2lu
Y2x1ZGUgIlJlbmRlclByb2dyZXNzLmgiCisjaW5jbHVkZSAiUmVuZGVyU2xpZGVyLmgiCisjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gU2l6ZXMgKHVuaXQgcHgpCitjb25zdCB1bnNpZ25l
ZCBzbWFsbFJhZGl1cyA9IDE7Citjb25zdCB1bnNpZ25lZCBsYXJnZVJhZGl1cyA9IDM7Citjb25z
dCB1bnNpZ25lZCBsaW5lV2lkdGggPSAxOworY29uc3QgaW50IG1hcmdpblNpemUgPSA0OworY29u
c3QgaW50IG1lZGlhU2xpZGVyVGh1bWJXaWR0aCA9IDQwOworY29uc3QgaW50IG1lZGlhU2xpZGVy
VGh1bWJIZWlnaHQgPSAxMzsKK2NvbnN0IGludCBtZWRpYVNsaWRlclRodW1iUmFkaXVzID0gNTsK
K2NvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMTU7Citjb25zdCBpbnQgc2xpZGVyVGh1bWJI
ZWlnaHQgPSAyNTsKKworLy8gQ2hlY2tib3ggY2hlY2sgc2NhbGVycworY29uc3QgZmxvYXQgY2hl
Y2tib3hMZWZ0WCA9IDcgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hMZWZ0WSA9IDEgLyAy
LjA7Citjb25zdCBmbG9hdCBjaGVja2JveE1pZGRsZVggPSAxOSAvIDUwLjA7Citjb25zdCBmbG9h
dCBjaGVja2JveE1pZGRsZVkgPSA3IC8gMjUuMDsKK2NvbnN0IGZsb2F0IGNoZWNrYm94UmlnaHRY
ID0gMzMgLyA0MC4wOworY29uc3QgZmxvYXQgY2hlY2tib3hSaWdodFkgPSAxIC8gNS4wOworY29u
c3QgZmxvYXQgY2hlY2tib3hTdHJva2VUaGlja25lc3MgPSA2LjU7CisKKy8vIFJhZGlvIGJ1dHRv
biBzY2FsZXIKK2NvbnN0IGZsb2F0IHJhZGlvQnV0dG9uQ2hlY2tTdGF0ZVNjYWxlciA9IDcgLyAz
MC4wOworCisvLyBNdWx0aXBsaWVycworY29uc3QgdW5zaWduZWQgcGFkZGluZ0Rpdmlzb3IgPSA1
OworCisvLyBDb2xvcnMKK2NvbnN0IFJHQkEzMiBjYXJldEJvdHRvbSA9IDB4ZmYyMTYzYmY7Citj
b25zdCBSR0JBMzIgY2FyZXRUb3AgPSAweGZmNjlhNWZhOworCitjb25zdCBSR0JBMzIgcmVndWxh
ckJvdHRvbSA9IDB4ZmZkY2RlZTQ7Citjb25zdCBSR0JBMzIgcmVndWxhclRvcCA9IDB4ZmZmN2Yy
ZWU7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b20gPSAweGZmYjVkM2ZjOworY29uc3QgUkdCQTMy
IGhvdmVyVG9wID0gMHhmZmNjZWFmZjsKK2NvbnN0IFJHQkEzMiBkZXByZXNzZWRCb3R0b20gPSAw
eGZmMzM4OGZmOworY29uc3QgUkdCQTMyIGRlcHJlc3NlZFRvcCA9IDB4ZmY2NmEwZjI7Citjb25z
dCBSR0JBMzIgZGlzYWJsZWRCb3R0b20gPSAweGZmZTdlN2U3OworY29uc3QgUkdCQTMyIGRpc2Fi
bGVkVG9wID0gMHhmZmVmZWZlZjsKKworY29uc3QgUkdCQTMyIHJlZ3VsYXJCb3R0b21PdXRsaW5l
ID0gMHhmZjZlNzA3MzsKK2NvbnN0IFJHQkEzMiByZWd1bGFyVG9wT3V0bGluZSA9IDB4ZmZiOWI4
Yjg7Citjb25zdCBSR0JBMzIgaG92ZXJCb3R0b21PdXRsaW5lID0gMHhmZjIxNjNiZjsKK2NvbnN0
IFJHQkEzMiBob3ZlclRvcE91dGxpbmUgPSAweGZmNjliZWZhOworY29uc3QgUkdCQTMyIGRlcHJl
c3NlZEJvdHRvbU91dGxpbmUgPSAweGZmMGMzZDgxOworY29uc3QgUkdCQTMyIGRlcHJlc3NlZFRv
cE91dGxpbmUgPSAweGZmMWQ0ZDcwOworY29uc3QgUkdCQTMyIGRpc2FibGVkT3V0bGluZSA9IDB4
ZmZkNWQ5ZGU7CisKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJCb3R0b20gPSBjYXJldFRv
cDsKK2NvbnN0IFJHQkEzMiBwcm9ncmVzc1JlZ3VsYXJUb3AgPSBjYXJldEJvdHRvbTsKKworY29u
c3QgUkdCQTMyIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbSA9IDB4ZmZmNmYyZWU7Citjb25zdCBS
R0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyVG9wID0gMHhmZmRlZTBlNTsKK2NvbnN0IFJHQkEzMiBy
YW5nZVNsaWRlclJvbGxCb3R0b20gPSAweGZmYzllOGZlOworY29uc3QgUkdCQTMyIHJhbmdlU2xp
ZGVyUm9sbFRvcCA9IDB4ZmZiNWQzZmM7CisKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJlZ3Vs
YXJCb3R0b21PdXRsaW5lID0gMHhmZmI5YmFiZDsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJl
Z3VsYXJUb3BPdXRsaW5lID0gMHhmZmI3YjdiNzsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJv
bGxCb3R0b21PdXRsaW5lID0gMHhmZjY3YWJlMDsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJv
bGxUb3BPdXRsaW5lID0gMHhmZjY5YWRmOTsKKworY29uc3QgUkdCQTMyIGRyYWdSZWd1bGFyTGln
aHQgPSAweGZmZmRmZGZkOworY29uc3QgUkdCQTMyIGRyYWdSZWd1bGFyRGFyayA9IDB4ZmZiYWJh
YmE7Citjb25zdCBSR0JBMzIgZHJhZ1JvbGxMaWdodCA9IDB4ZmZmMmYyZjI7Citjb25zdCBSR0JB
MzIgZHJhZ1JvbGxEYXJrID0gMHhmZjY5YThmZjsKKworY29uc3QgUkdCQTMyIHNlbGVjdGlvbiA9
IDB4ZmYyYjhmZmY7CisKK2NvbnN0IFJHQkEzMiBibGFja1BlbiA9IENvbG9yOjpibGFjazsKK2Nv
bnN0IFJHQkEzMiBmb2N1c1JpbmdQZW4gPSAweGZmYTNjOGZlOworCitmbG9hdCBSZW5kZXJUaGVt
ZUJsYWNrQmVycnk6OmRlZmF1bHRGb250U2l6ZSA9IDE2LjA7CisKKy8vIFdlIGFpbSB0byBtYXRj
aCBJRSBoZXJlLgorLy8gLUlFIHVzZXMgYSBmb250IGJhc2VkIG9uIHRoZSBlbmNvZGluZyBhcyB0
aGUgZGVmYXVsdCBmb250IGZvciBmb3JtIGNvbnRyb2xzLgorLy8gLUdlY2tvIHVzZXMgTVMgU2hl
bGwgRGxnIChhY3R1YWxseSBjYWxscyBHZXRTdG9ja09iamVjdChERUZBVUxUX0dVSV9GT05UKSwK
Ky8vIHdoaWNoIHJldHVybnMgTVMgU2hlbGwgRGxnKQorLy8gLVNhZmFyaSB1c2VzIEx1Y2lkYSBH
cmFuZGUuCisvLworLy8gRklYTUU6IFRoZSBvbmx5IGNhc2Ugd2hlcmUgd2Uga25vdyB3ZSBkb24n
dCBtYXRjaCBJRSBpcyBmb3IgQU5TSSBlbmNvZGluZ3MuCisvLyBJRSB1c2VzIE1TIFNoZWxsIERs
ZyB0aGVyZSwgd2hpY2ggd2UgcmVuZGVyIGluY29ycmVjdGx5IGF0IGNlcnRhaW4gcGl4ZWwKKy8v
IHNpemVzIChlLmcuIDE1cHgpLiBTbyB3ZSBqdXN0IHVzZSBBcmlhbCBmb3Igbm93LgorY29uc3Qg
U3RyaW5nJiBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmRlZmF1bHRHVUlGb250KCkKK3sKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgZm9udEZhY2UsICgiQXJpYWwiKSk7CisgICAgcmV0
dXJuIGZvbnRGYWNlOworfQorCitzdGF0aWMgUGFzc1JlZlB0cjxHcmFkaWVudD4gY3JlYXRlTGlu
ZWFyR3JhZGllbnQoUkdCQTMyIHRvcCwgUkdCQTMyIGJvdHRvbSwgY29uc3QgSW50UG9pbnQmIGEs
IGNvbnN0IEludFBvaW50JiBiKQoreworICAgIFJlZlB0cjxHcmFkaWVudD4gZ3JhZGllbnQgPSBH
cmFkaWVudDo6Y3JlYXRlKGEsIGIpOworICAgIGdyYWRpZW50LT5hZGRDb2xvclN0b3AoMC4wLCBD
b2xvcih0b3ApKTsKKyAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKDEuMCwgQ29sb3IoYm90dG9t
KSk7CisgICAgcmV0dXJuIGdyYWRpZW50LnJlbGVhc2UoKTsKK30KKworc3RhdGljIFBhdGggcm91
bmRlZFJlY3RGb3JCb3JkZXIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gb2JqZWN0LT5zdHlsZSgpOworICAgIExl
bmd0aFNpemUgdG9wTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BMZWZ0UmFkaXVzKCk7Cisg
ICAgTGVuZ3RoU2l6ZSB0b3BSaWdodFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BSaWdodFJhZGl1
cygpOworICAgIExlbmd0aFNpemUgYm90dG9tTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJCb3R0
b21MZWZ0UmFkaXVzKCk7CisgICAgTGVuZ3RoU2l6ZSBib3R0b21SaWdodFJhZGl1cyA9IHN0eWxl
LT5ib3JkZXJCb3R0b21SaWdodFJhZGl1cygpOworCisgICAgUGF0aCByb3VuZGVkUmVjdDsKKyAg
ICByb3VuZGVkUmVjdC5hZGRSb3VuZGVkUmVjdChyZWN0LCBJbnRTaXplKHRvcExlZnRSYWRpdXMu
d2lkdGgoKS52YWx1ZSgpLCB0b3BMZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUodG9wUmlnaHRSYWRpdXMud2lk
dGgoKS52YWx1ZSgpLCB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1ZSgpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTaXplKGJvdHRvbUxlZnRSYWRpdXMud2lk
dGgoKS52YWx1ZSgpLCBib3R0b21MZWZ0UmFkaXVzLmhlaWdodCgpLnZhbHVlKCkpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUoYm90dG9tUmlnaHRSYWRpdXMu
d2lkdGgoKS52YWx1ZSgpLCBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1ZSgpKSk7Cisg
ICAgcmV0dXJuIHJvdW5kZWRSZWN0OworfQorCitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5k
ZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAgc3RhdGljIFJlbmRlclRo
ZW1lKiB0aGVtZSA9IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y3JlYXRlKCkubGVha1JlZigpOwor
ICAgIHJldHVybiB0aGVtZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpjcmVhdGUoKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVuZGVy
VGhlbWVCbGFja0JlcnJ5KCkpOworfQorCitSZW5kZXJUaGVtZUJsYWNrQmVycnk6OlJlbmRlclRo
ZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1JlbmRlclRoZW1lQmxhY2tCZXJyeTo6flJlbmRlclRo
ZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmV4
dHJhRGVmYXVsdFN0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBTdHJpbmcodGhlbWVCbGFja0Jl
cnJ5VXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKHRoZW1lQmxhY2tCZXJyeVVzZXJBZ2VudFN0
eWxlU2hlZXQpKTsKK30KKworI2lmIEVOQUJMRShWSURFTykKK1N0cmluZyBSZW5kZXJUaGVtZUJs
YWNrQmVycnk6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBT
dHJpbmcobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2Yo
bWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0KSk7Cit9CisKK1N0cmlu
ZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmZvcm1hdE1lZGlhQ29udHJvbHNSZW1haW5pbmdUaW1l
KGZsb2F0LCBmbG9hdCBkdXJhdGlvbikgY29uc3QKK3sKKyAgICAvLyBUaGlzIGlzIGEgd29ya2Fy
b3VuZCB0byBtYWtlIHRoZSBhcHBlYXJhbmNlIG9mIG1lZGlhIHRpbWUgY29udHJvbGxlciBpbgor
ICAgIC8vIGluLXBhZ2UgbW9kZSB0aGUgc2FtZSBhcyBpbiBmdWxsc2NyZWVuIG1vZGUuCisgICAg
cmV0dXJuIGZvcm1hdE1lZGlhQ29udHJvbHNUaW1lKGR1cmF0aW9uKTsKK30KKyNlbmRpZgorCitk
b3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjYXJldEJsaW5rSW50ZXJ2YWwoKSBjb25zdAor
eworICAgIHJldHVybiAwOyAvLyBUdXJuIG9mZiBjYXJldCBibGlua2luZy4KK30KKwordm9pZCBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OnN5c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2NyaXB0
aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgZmxvYXQgZm9udFNpemUgPSBkZWZh
dWx0Rm9udFNpemU7CisKKyAgICBpZiAocHJvcElkID09IENTU1ZhbHVlV2Via2l0TWluaUNvbnRy
b2wgfHwgcHJvcElkID09ICBDU1NWYWx1ZVdlYmtpdFNtYWxsQ29udHJvbCB8fCBwcm9wSWQgPT0g
Q1NTVmFsdWVXZWJraXRDb250cm9sKSB7CisgICAgICAgIC8vIFdoeSAyIHBvaW50cyBzbWFsbGVy
PyBCZWNhdXNlIHRoYXQncyB3aGF0IEdlY2tvIGRvZXMuIE5vdGUgdGhhdCB3ZQorICAgICAgICAv
LyBhcmUgYXNzdW1pbmcgYSA5NmRwaSBzY3JlZW4sIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVl
IHdlIHVzZSBvbiBXaW5kb3dzLgorICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQgcG9pbnRzUGVy
SW5jaCA9IDcyLjBmOworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQgcGl4ZWxzUGVySW5jaCA9
IDk2LjBmOworICAgICAgICBmb250U2l6ZSAtPSAoMi4wZiAvIHBvaW50c1BlckluY2gpICogcGl4
ZWxzUGVySW5jaDsKKyAgICB9CisKKyAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5z
ZXRGYW1pbHkoZGVmYXVsdEdVSUZvbnQoKSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNp
ZmllZFNpemUoZm9udFNpemUpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc0Fic29sdXRlU2l6
ZSh0cnVlKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3Jp
cHRpb246Ok5vRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0V2VpZ2h0KEZvbnRXZWln
aHROb3JtYWwpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJdGFsaWMoZmFsc2UpOworfQorCit2
b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0QnV0dG9uU3R5bGUoUmVuZGVyU3R5bGUqIHN0
eWxlKSBjb25zdAoreworICAgIExlbmd0aCB2ZXJ0UGFkZGluZyhpbnQoc3R5bGUtPmZvbnRTaXpl
KCkgLyBwYWRkaW5nRGl2aXNvciksIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1RvcCh2
ZXJ0UGFkZGluZyk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20odmVydFBhZGRpbmcpOwor
fQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5
bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAg
c2V0QnV0dG9uU3R5bGUoc3R5bGUpOworICAgIHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09SX1dFQktJ
VF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdFRleHRBcmVh
U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNv
bnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1l
QmxhY2tCZXJyeTo6cGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFp
bnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRl
eHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKG9iamVjdCwgaW5mbywgcmVjdCk7Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RUZXh0RmllbGRTdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBz
ZXRCdXR0b25TdHlsZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojpw
YWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCogb2JqZWN0
LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQVNT
RVJUKGluZm8uY29udGV4dCk7CisgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gaW5mby5j
b250ZXh0OworCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0
eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdp
ZHRoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRT
dHJva2VDb2xvcihkaXNhYmxlZE91dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVs
c2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcE91dGxpbmUsIGRlcHJl
c3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNv
cm5lcigpKSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkgfHwgaXNGb2N1c2VkKG9i
amVjdCkpCisgICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdy
YWRpZW50KGhvdmVyVG9wT3V0bGluZSwgaG92ZXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2UKKyAgICAgICAgY29u
dGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcE91
dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3Qu
bWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCB0ZXh0RmllbGRSb3VuZGVkUmVjdGFuZ2xl
ID0gcm91bmRlZFJlY3RGb3JCb3JkZXIob2JqZWN0LCByZWN0KTsKKyAgICBpZiAob2JqZWN0LT5z
dHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2VhcmNoRmllbGRQYXJ0KSB7CisgICAgICAgIC8vIFdl
IGZvcmNlIHRoZSBmaWxsIGNvbG9yIHRvIFdoaXRlIHNvIGFzIHRvIG1hdGNoIHRoZSBiYWNrZ3Jv
dW5kIGNvbG9yIG9mIHRoZSBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBncmFwaGljLgorICAgICAgICBj
b250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsK
KyAgICAgICAgY29udGV4dC0+ZHJhd1BhdGgodGV4dEZpZWxkUm91bmRlZFJlY3RhbmdsZSk7Cisg
ICAgfSBlbHNlCisgICAgICAgIGNvbnRleHQtPnN0cm9rZVBhdGgodGV4dEZpZWxkUm91bmRlZFJl
Y3RhbmdsZSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVj
dCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkT3JUZXh0QXJlYU9yU2VhcmNoRmllbGQob2JqZWN0
LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmFkanVzdFNl
YXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxl
bWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCit2b2lkIFJl
bmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShD
U1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sK
KyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZGVmYXVsdENvbnRyb2xGb250UGl4ZWxTaXplID0gMTM7
CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGRlZmF1bHRDYW5jZWxCdXR0b25TaXplID0gOTsKKyAg
ICBzdGF0aWMgY29uc3QgZmxvYXQgbWluQ2FuY2VsQnV0dG9uU2l6ZSA9IDU7CisgICAgc3RhdGlj
IGNvbnN0IGZsb2F0IG1heENhbmNlbEJ1dHRvblNpemUgPSAyMTsKKworICAgIC8vIFNjYWxlIHRo
ZSBidXR0b24gc2l6ZSBiYXNlZCBvbiB0aGUgZm9udCBzaXplCisgICAgZmxvYXQgZm9udFNjYWxl
ID0gc3R5bGUtPmZvbnRTaXplKCkgLyBkZWZhdWx0Q29udHJvbEZvbnRQaXhlbFNpemU7CisgICAg
aW50IGNhbmNlbEJ1dHRvblNpemUgPSBscm91bmRmKHN0ZDo6bWluKHN0ZDo6bWF4KG1pbkNhbmNl
bEJ1dHRvblNpemUsIGRlZmF1bHRDYW5jZWxCdXR0b25TaXplICogZm9udFNjYWxlKSwgbWF4Q2Fu
Y2VsQnV0dG9uU2l6ZSkpOworICAgIExlbmd0aCBsZW5ndGgoY2FuY2VsQnV0dG9uU2l6ZSwgRml4
ZWQpOworICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworICAgIHN0eWxlLT5zZXRIZWlnaHQo
bGVuZ3RoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2VhcmNoRmll
bGQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFy
Y2hGaWVsZChvYmplY3QsIGluZm8sIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tC
ZXJyeTo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAg
QVNTRVJUKG9iamVjdC0+cGFyZW50KCkpOworICAgIGlmICghb2JqZWN0LT5wYXJlbnQoKSB8fCAh
b2JqZWN0LT5wYXJlbnQoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
UmVuZGVyQm94KiBwYXJlbnRSZW5kZXJCb3ggPSB0b1JlbmRlckJveChvYmplY3QtPnBhcmVudCgp
KTsKKworICAgIEludFJlY3QgcGFyZW50Qm94ID0gcGFyZW50UmVuZGVyQm94LT5hYnNvbHV0ZUNv
bnRlbnRCb3goKTsKKyAgICBJbnRSZWN0IGJvdW5kcyA9IHJlY3Q7CisgICAgLy8gTWFrZSBzdXJl
IHRoZSBzY2FsZWQgYnV0dG9uIHN0YXlzIHNxdWFyZSBhbmQgZml0cyBpbiBpdHMgcGFyZW50J3Mg
Ym94LgorICAgIGJvdW5kcy5zZXRIZWlnaHQoc3RkOjptaW4ocGFyZW50Qm94LndpZHRoKCksIHN0
ZDo6bWluKHBhcmVudEJveC5oZWlnaHQoKSwgYm91bmRzLmhlaWdodCgpKSkpOworICAgIGJvdW5k
cy5zZXRXaWR0aChib3VuZHMuaGVpZ2h0KCkpOworCisgICAgLy8gUHV0IHRoZSBidXR0b24gaW4g
dGhlIG1pZGRsZSB2ZXJ0aWNhbGx5LCBhbmQgcm91bmQgdXAgdGhlIHZhbHVlLgorICAgIC8vIFNv
IGlmIGl0IGhhcyB0byBiZSBvbmUgcGl4ZWwgb2ZmLWNlbnRlciwgaXQgd291bGQgYmUgb25lIHBp
eGVsIGNsb3NlcgorICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGZpZWxkLiBUaGlzIHdvdWxk
IGxvb2sgYmV0dGVyIHdpdGggdGhlIHRleHQuCisgICAgYm91bmRzLnNldFkocGFyZW50Qm94Lnko
KSArIChwYXJlbnRCb3guaGVpZ2h0KCkgLSBib3VuZHMuaGVpZ2h0KCkgKyAxKSAvIDIpOworCisg
ICAgc3RhdGljIEltYWdlKiBjYW5jZWxJbWFnZSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJj
ZSgic2VhcmNoQ2FuY2VsIikubGVha1JlZigpOworICAgIHN0YXRpYyBJbWFnZSogY2FuY2VsUHJl
c3NlZEltYWdlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJzZWFyY2hDYW5jZWxQcmVz
c2VkIikubGVha1JlZigpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3SW1hZ2UoaXNQcmVz
c2VkKG9iamVjdCkgPyBjYW5jZWxQcmVzc2VkSW1hZ2UgOiBjYW5jZWxJbWFnZSwgb2JqZWN0LT5z
dHlsZSgpLT5jb2xvclNwYWNlKCksIGJvdW5kcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2
b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAg
ICAvLyBUaGVzZSBzZWVtIHRvIGJlIHJlYXNvbmFibGUgcGFkZGluZyB2YWx1ZXMgZnJvbSBvYnNl
cnZhdGlvbi4KKyAgICBjb25zdCBpbnQgcGFkZGluZ0xlZnQgPSA4OworICAgIGNvbnN0IGludCBw
YWRkaW5nUmlnaHQgPSA0OworCisgICAgY29uc3QgaW50IG1pbkhlaWdodCA9IHN0eWxlLT5mb250
U2l6ZSgpICogMjsKKworICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKKyAgICBzdHlsZS0+c2V0
SGVpZ2h0KExlbmd0aChBdXRvKSk7CisKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0
aChtaW5IZWlnaHQgKyBwYWRkaW5nUmlnaHQsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRp
bmdMZWZ0KExlbmd0aChwYWRkaW5nTGVmdCwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0Q3Vyc29y
KENVUlNPUl9XRUJLSVRfR1JBQik7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojpj
YWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQg
c2l6ZSA9IHN0eWxlLT5mb250U2l6ZSgpOworICAgIExlbmd0aCBsZW5ndGgoc2l6ZSwgRml4ZWQp
OworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IENoZWNrYm94UGFydCB8fCBzdHlsZS0+
YXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkgeworICAgICAgICBzdHlsZS0+c2V0V2lkdGgobGVu
Z3RoKTsKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5ndGgpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lm
aWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgp
LmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkp
CisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworCisgICAgaWYgKHN0eWxlLT5oZWln
aHQoKS5pc0F1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5ndGgpOworfQorCiti
b29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG9i
amVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IHJldHVybiBwYWludEJ1dHRvbihvYmplY3QsIGluZm8sIHJlY3QpOworfQorCit2b2lkIFJlbmRl
clRoZW1lQmxhY2tCZXJyeTo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKK3sKKyAgICBjYWxjdWxhdGVCdXR0b25TaXplKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRC
dXR0b24ob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVy
cnk6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgY2FsY3Vs
YXRlQnV0dG9uU2l6ZShzdHlsZSk7Cit9CisKKy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBm
YWxzZSwgV2ViQ29yZSBhc3N1bWVzIHRoZSBidXR0b24gaXMgZnVsbHkgZGVjb3JhdGVkCitib29s
IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBBU1NF
UlQoaW5mby5jb250ZXh0KTsKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGluZm8u
Y29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+
c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBDb2xvciBjaGVjayhibGFja1Bl
bik7CisgICAgaWYgKCFpc0VuYWJsZWQob2JqZWN0KSkgeworICAgICAgICBpbmZvLmNvbnRleHQt
PnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChkaXNhYmxlZFRvcCwgZGlzYWJs
ZWRCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7
CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoZGlzYWJsZWRPdXRsaW5lLCBD
b2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICB9IGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKSB7
CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRp
ZW50KGRlcHJlc3NlZFRvcCwgZGVwcmVzc2VkQm90dG9tLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCks
IHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcE91dGxpbmUsIGRlcHJl
c3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNv
cm5lcigpKSk7CisgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQob2JqZWN0KSkgeworICAgICAgICBp
bmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRv
cCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5l
cigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3ZlckJvdHRvbU91dGxpbmUsIHJlY3QubWF4
WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQo
cmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1h
eFhNYXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVu
dChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0bGluZSwgcmVndWxhckJvdHRvbU91
dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgfQorCisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpOworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQ2hlY2tib3hQYXJ0OiB7CisgICAg
ICAgIEZsb2F0U2l6ZSBzbWFsbENvcm5lcihzbWFsbFJhZGl1cywgc21hbGxSYWRpdXMpOworICAg
ICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxD
b3JuZXIpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdQYXRoKHBhdGgpOworCisgICAgICAg
IGlmIChpc0NoZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgUGF0aCBjaGVja1BhdGg7Cisg
ICAgICAgICAgICBJbnRSZWN0IHJlY3QyID0gcmVjdDsKKyAgICAgICAgICAgIHJlY3QyLmluZmxh
dGUoLTEpOworICAgICAgICAgICAgY2hlY2tQYXRoLm1vdmVUbyhGbG9hdFBvaW50KHJlY3QyLngo
KSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveExlZnRYLCByZWN0Mi55KCkgKyByZWN0Mi5oZWln
aHQoKSAqIGNoZWNrYm94TGVmdFkpKTsKKyAgICAgICAgICAgIGNoZWNrUGF0aC5hZGRMaW5lVG8o
RmxvYXRQb2ludChyZWN0Mi54KCkgKyByZWN0Mi53aWR0aCgpICogY2hlY2tib3hNaWRkbGVYLCBy
ZWN0Mi5tYXhZKCkgLSByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TWlkZGxlWSkpOworICAgICAg
ICAgICAgY2hlY2tQYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KHJlY3QyLngoKSArIHJlY3QyLndp
ZHRoKCkgKiBjaGVja2JveFJpZ2h0WCwgcmVjdDIueSgpICsgcmVjdDIuaGVpZ2h0KCkgKiBjaGVj
a2JveFJpZ2h0WSkpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRMaW5lQ2FwKFJvdW5k
Q2FwKTsKKyAgICAgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoYmxhY2tQZW4s
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJv
a2VUaGlja25lc3MocmVjdDIud2lkdGgoKSAvIGNoZWNrYm94U3Ryb2tlVGhpY2tuZXNzKTsKKyAg
ICAgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd1BhdGgoY2hlY2tQYXRoKTsKKyAgICAgICAgfQor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBSYWRpb1BhcnQ6CisgICAgICAgIGluZm8u
Y29udGV4dC0+ZHJhd0VsbGlwc2UocmVjdCk7CisgICAgICAgIGlmIChpc0NoZWNrZWQob2JqZWN0
KSkgeworICAgICAgICAgICAgSW50UmVjdCByZWN0MiA9IHJlY3Q7CisgICAgICAgICAgICByZWN0
Mi5pbmZsYXRlKC1yZWN0LndpZHRoKCkgKiByYWRpb0J1dHRvbkNoZWNrU3RhdGVTY2FsZXIpOwor
ICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoY2hlY2ssIENvbG9yU3BhY2VE
ZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihjaGVj
aywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdF
bGxpcHNlKHJlY3QyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJ1dHRv
blBhcnQ6CisgICAgY2FzZSBQdXNoQnV0dG9uUGFydDogeworICAgICAgICBGbG9hdFNpemUgbGFy
Z2VDb3JuZXIobGFyZ2VSYWRpdXMsIGxhcmdlUmFkaXVzKTsKKyAgICAgICAgUGF0aCBwYXRoOwor
ICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29ybmVyKTsKKyAgICAgICAg
aW5mby5jb250ZXh0LT5kcmF3UGF0aChwYXRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGNhc2UgU3F1YXJlQnV0dG9uUGFydDogeworICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBh
dGguYWRkUmVjdChyZWN0KTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3UGF0aChwYXRoKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGluZm8uY29udGV4
dC0+cmVzdG9yZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbmZvLmNv
bnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIGNzcywg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGFkanVz
dE1lbnVMaXN0QnV0dG9uU3R5bGUoY3NzLCBzdHlsZSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RDaGVja2JveFN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIHNldENoZWNrYm94
U2l6ZShzdHlsZSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKKyAgICBMZW5n
dGggbWFyZ2luKG1hcmdpblNpemUsIEZpeGVkKTsKKyAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9t
KG1hcmdpbik7CisgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KG1hcmdpbik7CisgICAgc3R5bGUt
PnNldEN1cnNvcihDVVJTT1JfV0VCS0lUX0dSQUIpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxh
Y2tCZXJyeTo6YWRqdXN0UmFkaW9TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRSYWRpb1NpemUoc3R5bGUpOworICAg
IHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisgICAgTGVuZ3RoIG1hcmdpbihtYXJnaW5T
aXplLCBGaXhlZCk7CisgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShtYXJnaW4pOworICAgIHN0
eWxlLT5zZXRNYXJnaW5SaWdodChtYXJnaW4pOworICAgIHN0eWxlLT5zZXRDdXJzb3IoQ1VSU09S
X1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVu
dUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgUmVu
ZGVyT2JqZWN0KiBvYmplY3QsIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xpcFBh
dGgpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBp
ZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQo
Y3JlYXRlTGluZWFyR3JhZGllbnQoZGlzYWJsZWRUb3AsIGRpc2FibGVkQm90dG9tLCBidXR0b25S
ZWN0Lm1heFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAg
IGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGVwcmVzc2VkVG9wLCBkZXByZXNzZWRCb3R0b20s
IGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigp
KSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgIGNvbnRleHQtPnNl
dEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20s
IGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5tYXhYTWF4WUNvcm5lcigp
KSk7CisgICAgZWxzZQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGlu
ZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgYnV0dG9uUmVjdC5tYXhYTWlu
WUNvcm5lcigpLCBidXR0b25SZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIC8vIDEuIFBh
aW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24uCisgICAgY29udGV4dC0+Y2xpcChjbGlw
UGF0aCk7CisgICAgY29udGV4dC0+ZHJhd1JlY3QoYnV0dG9uUmVjdCk7CisgICAgY29udGV4dC0+
cmVzdG9yZSgpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJ1dHRvbiBhcnJvdy4KKyAgICBidXR0
b25SZWN0LmluZmxhdGUoLWJ1dHRvblJlY3Qud2lkdGgoKSAvIDMpOworICAgIGJ1dHRvblJlY3Qu
bW92ZSgwLCBidXR0b25SZWN0LmhlaWdodCgpICogNyAvIDIwKTsKKyAgICBQYXRoIHBhdGg7Cisg
ICAgcGF0aC5tb3ZlVG8oRmxvYXRQb2ludChidXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCkp
KTsKKyAgICBwYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KGJ1dHRvblJlY3QueCgpICsgYnV0dG9u
UmVjdC53aWR0aCgpLCBidXR0b25SZWN0LnkoKSkpOworICAgIHBhdGguYWRkTGluZVRvKEZsb2F0
UG9pbnQoYnV0dG9uUmVjdC54KCkgKyBidXR0b25SZWN0LndpZHRoKCkgLyAyLjAsIGJ1dHRvblJl
Y3QueSgpICsgYnV0dG9uUmVjdC5oZWlnaHQoKSAvIDIuMCkpOworICAgIHBhdGguY2xvc2VTdWJw
YXRoKCk7CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4dC0+c2V0U3Ryb2tlU3R5
bGUoU29saWRTdHJva2UpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lk
dGgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFj
ZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpibGFjaywgQ29s
b3JTcGFjZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0TGluZUpvaW4oQmV2ZWxKb2luKTsK
KyAgICBjb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7Cit9
CisKK3N0YXRpYyBJbnRSZWN0IGNvbXB1dGVNZW51TGlzdEFycm93QnV0dG9uUmVjdChjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGUgbWVudSBsaXN0IGFycm93IGJ1dHRv
biBzaG91bGQgaGF2ZSBhIG1pbmltdW0gYW5kIG1heGltdW0gd2lkdGggKHRvIGVuc3VyZSB1c2Fi
aWxpdHkpIG9yCisgICAgLy8gc2NhbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBmb250IHNpemUgdXNl
ZCBpbiB0aGUgbWVudSBsaXN0IGNvbnRyb2wgb3Igc29tZSBjb21iaW5hdGlvbiBvZiBib3RoLgor
ICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KHJlY3QubWF4WCgpIC0gcmVjdC5oZWlnaHQoKSwg
cmVjdC55KCkpLCBJbnRTaXplKHJlY3QuaGVpZ2h0KCksIHJlY3QuaGVpZ2h0KCkpKTsKK30KKwor
c3RhdGljIHZvaWQgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBQYXRoJiBtZW51TGlzdFBhdGgsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29s
b3IpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICBj
b250ZXh0LT5zZXRGaWxsQ29sb3IoYmFja2dyb3VuZENvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdC
KTsKKyAgICBjb250ZXh0LT5maWxsUGF0aChtZW51TGlzdFBhdGgpOworICAgIGNvbnRleHQtPnJl
c3RvcmUoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVudUxpc3Qo
UmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICAvLyBOb3RlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGlmIHRo
ZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9yZGVyIG9yIGJhY2tn
cm91bmQgY29sb3IuCisgICAgLy8gSW5zdGVhZCwgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWlu
dE1lbnVMaXN0QnV0dG9uIGlzIGNhbGxlZC4gVGhlcmVmb3JlLCB3aGVuIHRoaXMgbWV0aG9kIGlz
IGNhbGxlZCwgd2UgZG9uJ3QKKyAgICAvLyBoYXZlIHRvIGFkanVzdCByZWN0IHdpdGggcmVzcGVj
dCB0byB0aGUgYm9yZGVyIGRpbWVuc2lvbnMuCisKKyAgICBBU1NFUlQoaW5mby5jb250ZXh0KTsK
KyAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSBpbmZvLmNvbnRleHQ7CisKKyAgICBQYXRo
IG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSA9IHJvdW5kZWRSZWN0Rm9yQm9yZGVyKG9iamVjdCwg
cmVjdCk7CisKKyAgICAvLyAxLiBQYWludCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgZW50aXJlIGNv
bnRyb2wuCisgICAgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoY29udGV4dCwgbWVudUxpc3RSb3Vu
ZGVkUmVjdGFuZ2xlLCBDb2xvcjo6d2hpdGUpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJhY2tn
cm91bmQgb2YgdGhlIGJ1dHRvbiBhbmQgaXRzIGFycm93LgorICAgIEludFJlY3QgYXJyb3dCdXR0
b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3QocmVjdCk7CisgICAg
cGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coY29udGV4dCwgb2JqZWN0LCBhcnJv
d0J1dHRvblJlY3RhbmdsZSwgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKworICAgIC8vIDQu
IFN0cm9rZSBhbiBvdXRsaW5lIGFyb3VuZCB0aGUgZW50aXJlIGNvbnRyb2wuCisgICAgY29udGV4
dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAg
ICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKKyAgICBpZiAoIWlzRW5h
YmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihkaXNhYmxlZE91
dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmpl
Y3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFk
aWVudChkZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21PdXRsaW5lLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVsc2UgaWYgKGlz
SG92ZXJlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVh
dGVMaW5lYXJHcmFkaWVudChob3ZlclRvcE91dGxpbmUsIGhvdmVyQm90dG9tT3V0bGluZSwgcmVj
dC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBlbHNlCisg
ICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJl
Z3VsYXJUb3BPdXRsaW5lLCByZWd1bGFyQm90dG9tT3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5l
cigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIGNvbnRleHQtPnN0cm9rZVBhdGgo
bWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZW51
TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIE5vdGUsIHRoaXMgbWV0aG9kIGlzIG9ubHkg
Y2FsbGVkIGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEgYm9y
ZGVyIG9yIGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gT3RoZXJ3aXNlLCBSZW5kZXJUaGVtZUJs
YWNrQmVycnk6OnBhaW50TWVudUxpc3QgaXMgY2FsbGVkLiBXZSBuZWVkIHRvIGZpdCB0aGUgYXJy
b3cgYnV0dG9uIHdpdGggdGhlIGJvcmRlciBib3gKKyAgICAvLyBvZiB0aGUgbWVudS1saXN0IHNv
IGFzIHRvIG5vdCBvY2NsdWRlIHRoZSBjdXN0b20gYm9yZGVyLgorCisgICAgLy8gV2UgY29tcHV0
ZSBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRvIHRoZSBkaW1lbnNpb25z
IG9mIHRoZSBlbnRpcmUgbWVudS1saXN0IGNvbnRyb2wgKGkuZS4gcmVjdCkgYW5kCisgICAgLy8g
aXRzIGJvcmRlciByYWRpdXMgc28gdGhhdCB3ZSBjbGlwIHRoZSBjb250b3VyIG9mIHRoZSBhcnJv
dyBidXR0b24gKHdoZW4gd2UgcGFpbnQgaXQgYmVsb3cpIHRvIG1hdGNoIHRoZSBjb250b3VyIG9m
CisgICAgLy8gdGhlIGNvbnRyb2wuCisgICAgUGF0aCBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUg
PSByb3VuZGVkUmVjdEZvckJvcmRlcihvYmplY3QsIHJlY3QpOworCisgICAgLy8gMS4gUGFpbnQg
dGhlIGJhY2tncm91bmQgb2YgdGhlIGVudGlyZSBjb250cm9sLgorICAgIENvbG9yIGZpbGxDb2xv
ciA9IG9iamVjdC0+c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5QmFj
a2dyb3VuZENvbG9yKTsKKyAgICBpZiAoIWZpbGxDb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIGZp
bGxDb2xvciA9IENvbG9yOjp3aGl0ZTsKKyAgICBwYWludE1lbnVMaXN0QmFja2dyb3VuZChpbmZv
LmNvbnRleHQsIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSwgZmlsbENvbG9yKTsKKworICAgIC8v
IDIuIFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24gYW5kIGl0cyBhcnJvdy4KKyAg
ICBJbnRSZWN0IGJvdW5kcyA9IEludFJlY3QocmVjdC54KCkgKyBvYmplY3QtPnN0eWxlKCktPmJv
cmRlckxlZnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsgb2Jq
ZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
IHJlY3Qud2lkdGgoKSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCkgLSBvYmpl
Y3QtPnN0eWxlKCktPmJvcmRlclJpZ2h0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICByZWN0LmhlaWdodCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpIC0gb2Jq
ZWN0LT5zdHlsZSgpLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKKworICAgIEludFJlY3QgYXJyb3dC
dXR0b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJlY3QoYm91bmRzKTsg
Ly8gRml0IHRoZSBhcnJvdyBidXR0b24gd2l0aGluIHRoZSBib3JkZXIgYm94IG9mIHRoZSBtZW51
LWxpc3QuCisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coaW5mby5jb250
ZXh0LCBvYmplY3QsIGFycm93QnV0dG9uUmVjdGFuZ2xlLCBtZW51TGlzdFJvdW5kZWRSZWN0YW5n
bGUpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAg
Q29udHJvbFBhcnQgcGFydCA9IHN0eWxlLT5hcHBlYXJhbmNlKCk7CisgICAgaWYgKHBhcnQgPT0g
TWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQgfHwgcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250
YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgc3R5
bGUtPnNldFdpZHRoKExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0ID8gc2xp
ZGVyVGh1bWJIZWlnaHQgOiBzbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkpOworICAgICAgICBzdHls
ZS0+c2V0SGVpZ2h0KExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0ID8gc2xp
ZGVyVGh1bWJXaWR0aCA6IHNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAgIH0gZWxzZSBp
ZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgeworICAgICAgICBzdHlsZS0+c2V0V2lk
dGgoTGVuZ3RoKG1lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgc3R5bGUt
PnNldEhlaWdodChMZW5ndGgobWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKKyAgICB9
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNsaWRlclRyYWNrKFJlbmRl
ck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgY29uc3Qgc3RhdGljIGludCBTbGlkZXJUcmFja0hlaWdodCA9IDU7CisgICAg
SW50UmVjdCByZWN0MjsKKyAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0g
U2xpZGVySG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgcmVjdDIuc2V0SGVpZ2h0KFNsaWRlclRy
YWNrSGVpZ2h0KTsKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdC53aWR0aCgpKTsKKyAgICAg
ICAgcmVjdDIuc2V0WChyZWN0LngoKSk7CisgICAgICAgIHJlY3QyLnNldFkocmVjdC55KCkgKyAo
cmVjdC5oZWlnaHQoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIHJlY3QyLnNldEhlaWdodChyZWN0LmhlaWdodCgpKTsKKyAgICAgICAgcmVjdDIuc2V0
V2lkdGgoU2xpZGVyVHJhY2tIZWlnaHQpOworICAgICAgICByZWN0Mi5zZXRYKHJlY3QueCgpICsg
KHJlY3Qud2lkdGgoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOworICAgICAgICByZWN0Mi5z
ZXRZKHJlY3QueSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9i
amVjdCwgaW5mbywgcmVjdDIpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFp
bnRTbGlkZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
aW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRTbGlkZXJUcmFj
a1JlY3Qob2JqZWN0LCBpbmZvLCByZWN0LCByYW5nZVNsaWRlclJlZ3VsYXJUb3BPdXRsaW5lLCBy
YW5nZVNsaWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lLAorICAgICAgICAgICAgICAgIHJhbmdlU2xp
ZGVyUmVndWxhclRvcCwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tKTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2xpZGVyVHJhY2tSZWN0KFJlbmRlck9iamVjdCogb2Jq
ZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAgICAg
IFJHQkEzMiBzdHJva2VDb2xvclN0YXJ0LCBSR0JBMzIgc3Ryb2tlQ29sb3JFbmQsIFJHQkEzMiBm
aWxsQ29sb3JTdGFydCwgUkdCQTMyIGZpbGxDb2xvckVuZCkKK3sKKyAgICBGbG9hdFNpemUgc21h
bGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGluZm8uY29udGV4dC0+
c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwor
ICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBp
bmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHN0cm9r
ZUNvbG9yU3RhcnQsIHN0cm9rZUNvbG9yRW5kLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3Qu
IG1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChj
cmVhdGVMaW5lYXJHcmFkaWVudChmaWxsQ29sb3JTdGFydCwgZmlsbENvbG9yRW5kLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCBwYXRo
OworICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxDb3JuZXIpOworICAgIGluZm8u
Y29udGV4dC0+ZmlsbFBhdGgocGF0aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWlu
dFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgRmxvYXRTaXplIGxhcmdlQ29ybmVyKGxhcmdl
UmFkaXVzLCBsYXJnZVJhZGl1cyk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBp
bmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRl
eHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAgaWYgKGlzUHJlc3NlZChv
YmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKSB7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0
U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3Zl
ckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4gbWF4WE1heFlDb3Ju
ZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5l
YXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwg
cmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby5jb250
ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0
bGluZSwgcmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC4g
bWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVu
dChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wLCByZWd1bGFyQm90dG9tLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIH0KKworICAgIFBh
dGggcGF0aDsKKyAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29ybmVyKTsKKyAg
ICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgYm9vbCBpc1ZlcnRpY2FsID0g
cmVjdC53aWR0aCgpID4gcmVjdC5oZWlnaHQoKTsKKyAgICBJbnRQb2ludCBzdGFydFBvaW50KHJl
Y3QueCgpICsgKGlzVmVydGljYWwgPyA1IDogMiksIHJlY3QueSgpICsgKGlzVmVydGljYWwgPyAy
IDogNSkpOworICAgIEludFBvaW50IGVuZFBvaW50KHJlY3QueCgpICsgKGlzVmVydGljYWwgPyAy
MCA6IDIpLCByZWN0LnkoKSArIChpc1ZlcnRpY2FsID8gMiA6IDIwKSk7CisgICAgY29uc3QgaW50
IGxpbmVPZmZzZXQgPSAyOworICAgIGNvbnN0IGludCBzaGFkb3dPZmZzZXQgPSAxOworCisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKGlzVmVydGljYWwpIHsK
KyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WShzdGFydFBvaW50LnkoKSArIGxpbmVPZmZzZXQp
OworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WShlbmRQb2ludC55KCkgKyBsaW5lT2Zmc2V0KTsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChzdGFydFBvaW50
LngoKSArIGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WChlbmRQb2ludC54
KCkgKyBsaW5lT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQcmVzc2VkKG9iamVj
dCkgfHwgaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0
cm9rZUNvbG9yKGRyYWdSb2xsTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdSZWd1bGFy
TGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdM
aW5lKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpZiAoaXNWZXJ0aWNhbCkgewor
ICAgICAgICAgICAgc3RhcnRQb2ludC5zZXRZKHN0YXJ0UG9pbnQueSgpICsgc2hhZG93T2Zmc2V0
KTsKKyAgICAgICAgICAgIGVuZFBvaW50LnNldFkoZW5kUG9pbnQueSgpICsgc2hhZG93T2Zmc2V0
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChzdGFydFBv
aW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgICAgICBlbmRQb2ludC5zZXRYKGVuZFBv
aW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUHJlc3Nl
ZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICAgICAgaW5mby5jb250ZXh0
LT5zZXRTdHJva2VDb2xvcihkcmFnUm9sbERhcmssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdS
ZWd1bGFyRGFyaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgIGluZm8uY29udGV4dC0+
ZHJhd0xpbmUoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworICAgIH0KKyAgICBpbmZvLmNvbnRleHQt
PnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBhaW50TWVk
aWFCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBJ
bWFnZSogaW1hZ2UpCit7CisgICAgY29udGV4dC0+ZHJhd0ltYWdlKGltYWdlLCBDb2xvclNwYWNl
RGV2aWNlUkdCLCByZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisjaWYg
RU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFy
ZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdlKiBtZWRpYVBsYXkgPSBJbWFnZTo6
bG9hZFBsYXRmb3JtUmVzb3VyY2UoInBsYXkiKS5sZWFrUmVmKCk7CisgICAgc3RhdGljIEltYWdl
KiBtZWRpYVBhdXNlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJwYXVzZSIpLmxlYWtS
ZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCBy
ZWN0LCBtZWRpYUVsZW1lbnQtPmNhblBsYXkoKSA/IG1lZGlhUGxheSA6IG1lZGlhUGF1c2UpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFpbnRJ
bmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlm
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhTXV0ZUJ1dHRvbihS
ZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQq
IG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAo
IW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdl
KiBtZWRpYU11dGUgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInNwZWFrZXIiKS5sZWFr
UmVmKCk7CisgICAgc3RhdGljIEltYWdlKiBtZWRpYVVubXV0ZSA9IEltYWdlOjpsb2FkUGxhdGZv
cm1SZXNvdXJjZSgic3BlYWtlcl9tdXRlIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50
TWVkaWFCdXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRWxlbWVudC0+bXV0ZWQo
KSB8fCAhbWVkaWFFbGVtZW50LT52b2x1bWUoKSA/IG1lZGlhVW5tdXRlIDogbWVkaWFNdXRlKTsK
KyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50
SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRp
ZgorfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5C
dXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAoIXRvUGFy
ZW50TWVkaWFFbGVtZW50KG9iamVjdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0
YXRpYyBJbWFnZSogbWVkaWFGdWxsc2NyZWVuID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNl
KCJmdWxsc2NyZWVuIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBhaW50TWVkaWFCdXR0b24o
cGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRnVsbHNjcmVlbik7CisjZWxzZQorICAgIFVO
VVNFRF9QQVJBTShvYmplY3QpOworICAgIFVOVVNFRF9QQVJBTShwYWludEluZm8pOworICAgIFVO
VVNFRF9QQVJBTShyZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworYm9vbCBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3Qq
IG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEludFJlY3QgcmVjdDIocmVjdC54KCkgKyAzLCBy
ZWN0LnkoKSArIDE0LCByZWN0LndpZHRoKCkgLSA2LCAyKTsKKworICAgIEhUTUxNZWRpYUVsZW1l
bnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBp
ZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZmxvYXQgbG9h
ZGVkID0gMDsKKyAgICAvLyBGSVhNRTogcmVwbGFjZSBsb2FkZWQgd2l0aCBjb21tZW50ZWQgb3V0
IG9uZSB3aGVuIGJ1ZmZlciBidWcgaXMgZml4ZWQgKHNlZSBjb21tZW50IGluCisgICAgLy8gTWVk
aWFQbGF5ZXJQcml2YXRlTU1yZW5kZXJlcjo6cGVyY2VudExvYWRlZCkuCisgICAgLy8gbG9hZGVk
ID0gbWVkaWFFbGVtZW50LT5wZXJjZW50TG9hZGVkKCk7CisgICAgaWYgKG1lZGlhRWxlbWVudC0+
cGxheWVyKCkpCisgICAgICAgIGxvYWRlZCA9IHN0YXRpY19jYXN0PE1lZGlhUGxheWVyUHJpdmF0
ZSAqPihtZWRpYUVsZW1lbnQtPnBsYXllcigpLT5pbXBsZW1lbnRhdGlvbigpKS0+cGVyY2VudExv
YWRlZCgpOworICAgIGZsb2F0IHBvc2l0aW9uID0gbWVkaWFFbGVtZW50LT5kdXJhdGlvbigpID4g
MCA/IChtZWRpYUVsZW1lbnQtPmN1cnJlbnRUaW1lKCkgLyBtZWRpYUVsZW1lbnQtPmR1cmF0aW9u
KCkpIDogMDsKKworICAgIGludCB4ID0gcmVjdC54KCkgKyAzOworICAgIGludCB5ID0gcmVjdC55
KCkgKyAxNDsKKyAgICBpbnQgdyA9IHJlY3Qud2lkdGgoKSAtIDY7CisgICAgaW50IGggPSAyOwor
CisgICAgaW50IHdQbGF5ZWQgPSAodyAqIHBvc2l0aW9uKTsKKyAgICBpbnQgd0xvYWRlZCA9ICh3
IC0gbWVkaWFTbGlkZXJUaHVtYldpZHRoKSAqIGxvYWRlZCArIG1lZGlhU2xpZGVyVGh1bWJXaWR0
aDsKKworICAgIEludFJlY3QgcGxheWVkKHgsIHksIHdQbGF5ZWQsIGgpOworICAgIEludFJlY3Qg
YnVmZmVyZWQoeCwgeSwgd0xvYWRlZCwgaCk7CisKKyAgICAvLyBUaGlzIGlzIHRvIHBhaW50IG1h
aW4gc2xpZGVyIGJhci4KKyAgICBib29sIHJlc3VsdCA9IHBhaW50U2xpZGVyVHJhY2tSZWN0KG9i
amVjdCwgcGFpbnRJbmZvLCByZWN0Mik7CisKKyAgICBpZiAobG9hZGVkID4gMCB8fCBwb3NpdGlv
biA+IDApIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0byBwYWludCBidWZmZXJlZCBiYXIuCisgICAg
ICAgIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9iamVjdCwgcGFpbnRJbmZvLCBidWZmZXJlZCwgQ29s
b3I6OmRhcmtHcmF5LCBDb2xvcjo6ZGFya0dyYXksIENvbG9yOjpkYXJrR3JheSwgQ29sb3I6OmRh
cmtHcmF5KTsKKworICAgICAgICAvLyBUaGlzIGlzIHRvIHBhaW50IHBsYXllZCBwYXJ0IG9mIGJh
ciAobGVmdCBvZiBzbGlkZXIgdGh1bWIpIHVzaW5nIHNlbGVjdGlvbiBjb2xvci4KKyAgICAgICAg
cGFpbnRTbGlkZXJUcmFja1JlY3Qob2JqZWN0LCBwYWludEluZm8sIHBsYXllZCwgc2VsZWN0aW9u
LCBzZWxlY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHJl
c3VsdDsKKworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFS
QU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNl
OworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhU2xp
ZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAoIW9i
amVjdC0+cGFyZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFJlbmRlclNsaWRl
ciogc2xpZGVyID0gdG9SZW5kZXJTbGlkZXIob2JqZWN0LT5wYXJlbnQoKS0+cGFyZW50KCktPnBh
cmVudCgpKTsKKyAgICBpZiAoIXNsaWRlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBQYXRoIG1lZGlhVGh1bWJSb3VuZGVkUmVj
dGFuZ2xlOworICAgIG1lZGlhVGh1bWJSb3VuZGVkUmVjdGFuZ2xlLmFkZFJvdW5kZWRSZWN0KHJl
Y3QsIEZsb2F0U2l6ZShtZWRpYVNsaWRlclRodW1iUmFkaXVzLCBtZWRpYVNsaWRlclRodW1iUmFk
aXVzKSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tl
KTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKDAuNSk7CisgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjaywgQ29sb3JTcGFj
ZURldmljZVJHQik7CisKKyAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkgfHwgaXNIb3ZlcmVkKG9i
amVjdCkgfHwgc2xpZGVyLT5pbkRyYWdNb2RlKCkpIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChzZWxlY3Rpb24sIENvbG9y
KHNlbGVjdGlvbikuZGFyaygpLnJnYigpLAorICAgICAgICAgICAgICAgIHJlY3QubWF4WE1pbllD
b3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChD
b2xvcjo6d2hpdGUsIENvbG9yKENvbG9yOjp3aGl0ZSkuZGFyaygpLnJnYigpLAorICAgICAgICAg
ICAgICAgIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgfQorICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUGF0aChtZWRpYVRodW1iUm91bmRlZFJl
Y3RhbmdsZSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIHJldHVy
biB0cnVlOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFS
QU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNl
OworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhVm9s
dW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBm
bG9hdCBwYWQgPSByZWN0LndpZHRoKCkgKiAwLjQ1OworICAgIGZsb2F0IHggPSByZWN0LngoKSAr
IHBhZDsKKyAgICBmbG9hdCB5ID0gcmVjdC55KCkgKyBwYWQ7CisgICAgZmxvYXQgd2lkdGggPSBy
ZWN0LndpZHRoKCkgKiAwLjE7CisgICAgZmxvYXQgaGVpZ2h0ID0gcmVjdC5oZWlnaHQoKSAtICgy
LjAgKiBwYWQpOworCisgICAgSW50UmVjdCByZWN0Mih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwor
ICAgIHJldHVybiBwYWludFNsaWRlclRyYWNrUmVjdChvYmplY3QsIHBhaW50SW5mbywgcmVjdDIp
OworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVTRURfUEFSQU0ocGFp
bnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vu
ZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhVm9sdW1lU2xp
ZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBzdGF0aWMg
SW1hZ2UqIG1lZGlhVm9sdW1lVGh1bWIgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInZv
bHVtZV90aHVtYiIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBh
aW50SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYVZvbHVtZVRodW1iKTsKKyNlbHNlCisgICAgVU5V
U0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5V
U0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitDb2xvciBS
ZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBsYXRmb3JtRm9jdXNSaW5nQ29sb3IoKSBjb25zdAorewor
ICAgIHJldHVybiBmb2N1c1JpbmdQZW47Cit9CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQor
Q29sb3IgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwbGF0Zm9ybVRhcEhpZ2hsaWdodENvbG9yKCkg
Y29uc3QKK3sKKyAgICAvLyBTYW1lIGNvbG9yIGFzICdmb2N1c1JpbmdQZW4nICsgODAgb2YgYWxw
aGEgY2hhbm5lbC4KKyAgICByZXR1cm4gQ29sb3IoMTYzLCAyMDAsIDI1NCwgODApOworfQorI2Vu
ZGlmCisKK0NvbG9yIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcihzZWxlY3Rpb24p
OworfQorCitkb3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphbmltYXRpb25SZXBlYXRJbnRl
cnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcykgY29uc3QK
K3sKKyAgICByZXR1cm4gcmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSA/IDAuMCA6IDAu
MTsKK30KKworZG91YmxlIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YW5pbWF0aW9uRHVyYXRpb25G
b3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHJlbmRlclByb2dyZXNzLT5pc0RldGVybWluYXRlKCkgPyAwLjAgOiAyLjA7Cit9
CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9i
amVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgaWYgKCFvYmplY3QtPmlzUHJvZ3Jlc3MoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0b1JlbmRlclByb2dyZXNz
KG9iamVjdCk7CisKKyAgICBGbG9hdFNpemUgc21hbGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxs
UmFkaXVzKTsKKworICAgIGluZm8uY29udGV4dC0+c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+
c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tl
VGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRp
ZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJhbmdlU2xpZGVyUmVndWxhclRvcE91dGxpbmUsIHJh
bmdlU2xpZGVyUmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVj
dC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQo
Y3JlYXRlTGluZWFyR3JhZGllbnQocmFuZ2VTbGlkZXJSZWd1bGFyVG9wLCByYW5nZVNsaWRlclJl
Z3VsYXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigp
KSk7CisKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChyZWN0LCBzbWFs
bENvcm5lcik7CisgICAgaW5mby5jb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKworICAgIEludFJl
Y3QgcmVjdDIgPSByZWN0OworICAgIHJlY3QyLnNldFgocmVjdDIueCgpICsgMSk7CisgICAgcmVj
dDIuc2V0SGVpZ2h0KHJlY3QyLmhlaWdodCgpIC0gMik7CisgICAgcmVjdDIuc2V0WShyZWN0Mi55
KCkgKyAxKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKyAg
ICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcygwKTsKKyAgICBpZiAocmVuZGVyUHJv
Z3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSkgeworICAgICAgICByZWN0Mi5zZXRXaWR0aChyZWN0Mi53
aWR0aCgpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkgLSAyKTsKKyAgICAgICAgaW5mby5j
b250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocHJvZ3Jlc3NSZWd1
bGFyVG9wLCBwcm9ncmVzc1JlZ3VsYXJCb3R0b20sIHJlY3QyLm1heFhNaW5ZQ29ybmVyKCksIHJl
Y3QyLm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBbmltYXRp
bmcKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdDIud2lkdGgoKSAtIDIpOworICAgICAgICBS
ZWZQdHI8R3JhZGllbnQ+IGdyYWRpZW50ID0gR3JhZGllbnQ6OmNyZWF0ZShyZWN0Mi5taW5YTWF4
WUNvcm5lcigpLCByZWN0Mi5tYXhYTWF4WUNvcm5lcigpKTsKKyAgICAgICAgZ3JhZGllbnQtPmFk
ZENvbG9yU3RvcCgwLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRvbSkpOworICAgICAgICBn
cmFkaWVudC0+YWRkQ29sb3JTdG9wKHJlbmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVzcygp
LCBDb2xvcihwcm9ncmVzc1JlZ3VsYXJUb3ApKTsKKyAgICAgICAgZ3JhZGllbnQtPmFkZENvbG9y
U3RvcCgxLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRvbSkpOworICAgICAgICBpbmZvLmNv
bnRleHQtPnNldEZpbGxHcmFkaWVudChncmFkaWVudCk7CisgICAgfQorICAgIFBhdGggcGF0aDI7
CisgICAgcGF0aDIuYWRkUm91bmRlZFJlY3QocmVjdDIsIHNtYWxsQ29ybmVyKTsKKyAgICBpbmZv
LmNvbnRleHQtPmZpbGxQYXRoKHBhdGgyKTsKKworICAgIGluZm8uY29udGV4dC0+cmVzdG9yZSgp
OworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNr
QmVycnkuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVC
bGFja0JlcnJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3ZjE3OAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVu
ZGVyVGhlbWVCbGFja0JlcnJ5LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT
b2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSZW5kZXJU
aGVtZUJsYWNrQmVycnlfaAorI2RlZmluZSBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAorCisjaW5j
bHVkZSAiUmVuZGVyVGhlbWUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5k
ZXJUaGVtZUJsYWNrQmVycnkgOiBwdWJsaWMgUmVuZGVyVGhlbWUgeworcHVibGljOgorICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKyAgICB2aXJ0dWFsIH5SZW5k
ZXJUaGVtZUJsYWNrQmVycnkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0
eWxlU2hlZXQoKTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0dWFsIFN0cmluZyBleHRy
YU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCk7CisgICAgdmlydHVhbCBTdHJpbmcgZm9ybWF0TWVk
aWFDb250cm9sc1JlbWFpbmluZ1RpbWUoZmxvYXQgY3VycmVudFRpbWUsIGZsb2F0IGR1cmF0aW9u
KSBjb25zdDsKKyNlbmRpZgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJl
bmRlclN0eWxlKikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBkb3VibGUg
Y2FyZXRCbGlua0ludGVydmFsKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3lzdGVtRm9u
dChpbnQgY3NzVmFsdWVJZCwgRm9udERlc2NyaXB0aW9uJikgY29uc3Q7CisgICAgdmlydHVhbCBi
b29sIHBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUq
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIHNldFJhZGlv
U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdm9p
ZCBjYWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdmlydHVhbCB2
b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAg
dmlydHVhbCBib29sIHBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJ
bmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRodW1i
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworI2lm
IEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybVRhcEhpZ2hs
aWdodENvbG9yKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1G
b2N1c1JpbmdDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmlu
Zyhjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0IHsgcmV0dXJuIHN0eWxlLT5oYXNBcHBl
YXJhbmNlKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2
b2lkIGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVy
T2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVh
bCB2b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRl
ck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1
YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJT
dHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmll
bGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9v
bCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlz
dEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBj
b25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Q2hlY2tib3hTdHlsZShDU1NTdHlsZVNlbGVj
dG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFk
anVzdFJhZGlvU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCop
IGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCosIGNv
bnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgYm9vbCBwYWlu
dE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJUcmFjayhS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUaHVtYihSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVh
bCBib29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYU11dGVCdXR0
b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAg
IHZpcnR1YWwgYm9vbCBwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBhbmltYXRpb25SZXBl
YXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3Q7CisgICAgdmly
dHVhbCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVz
cyopIGNvbnN0OworCisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcigpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBTdHJp
bmcmIGRlZmF1bHRHVUlGb250KCk7CisKKyAgICAvLyBUaGUgZGVmYXVsdCB2YXJpYWJsZS13aWR0
aCBmb250IHNpemUuIFdlIHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGZvbnQKKyAgICAvLyBzaXpl
IGZvciB0aGUgInN5c3RlbSBmb250IiwgYW5kIGFzIGEgYmFzZSBzaXplICh3aGljaCB3ZSB0aGVu
IHNocmluaykgZm9yCisgICAgLy8gZm9ybSBjb250cm9sIGZvbnRzLgorICAgIHN0YXRpYyBmbG9h
dCBkZWZhdWx0Rm9udFNpemU7CisKKyAgICBSZW5kZXJUaGVtZUJsYWNrQmVycnkoKTsKKyAgICB2
b2lkIHNldEJ1dHRvblN0eWxlKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICB2b2lkIHBhaW50
TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4dCosIFJlbmRlck9i
amVjdCosIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xpcFBhdGgpOworICAgIGJv
b2wgcGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgYm9vbCBwYWludFNsaWRlclRy
YWNrUmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7
CisgICAgYm9vbCBwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0JiwgUkdCQTMyIHN0cm9rZUNvbG9yU3RhcnQsCisgICAgICAg
ICAgICAgICAgUkdCQTMyIHN0cm9rZUNvbG9yRW5kLCBSR0JBMzIgZmlsbENvbG9yU3RhcnQsIFJH
QkEzMiBmaWxsQ29sb3JFbmQpOworCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAotLSAKMS43LjUuNAoK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127887</attachid>
            <date>2012-02-20 18:23:31 -0800</date>
            <delta_ts>2012-02-20 19:19:02 -0800</delta_ts>
            <desc>update patch</desc>
            <filename>b.patch</filename>
            <type>text/plain</type>
            <size>47085</size>
            <attacher name="Mary Wu">mawu</attacher>
            
              <data encoding="base64">RnJvbSA0NDdiODQ3OGQwZDMyMWM2ODY0M2U4MDM2NDU1YWQ4MjdmNzA2YTk1IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ5IFd1IDxtYXJ5Lnd1QHRvcmNobW9iaWxlLmNvbS5jbj4K
RGF0ZTogVHVlLCAyMSBGZWIgMjAxMiAxMDoxOTowMiArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIFVw
c3RyZWFtIFJlbmRlclRoZW1lQmxhY2tiZXJyeS5oLy5jcHAgaW50bwogV2ViQ29yZS9wbGF0Zm9y
bS9ibGFja2JlcnJ5CiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzg3
ODUKCk1haW4gQ29udHJpYnV0b3JzOgpEYW5pZWwgQmF0ZXMgPGRiYXRlc0ByaW0uY29tPgpCcnlh
biBHaXNsYXNvbiA8Ymdpc2xhc29uQHJpbS5jb20+CkFrYXNoIFZhc3dhbmkgPGFrdmFzd2FuaUBy
aW0uY29tPgpEYXZlIEJhdHRpc3RhIDxkYmF0dGlzdGFAcmltLmNvbT4KUm9iaW4gQ2FvICA8cm9i
aW4uY2FvQHRvcmNobW9iaWxlLmNvbS5jbj4KR2VuZXZpZXZlIE1hayA8Z21ha0ByaW0uY29tPgpN
aWtlIEZlbnRvbiAgPG1pZmVudG9uQHJpbS5jb20+CgpSZXZpZXdlZCBieSBBbnRvbmlvIEdvbWVz
LgoKSW5pdGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgoKKiBwbGF0Zm9ybS9ibGFja2JlcnJ5
L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgoqIHBsYXRmb3JtL2JsYWNrYmVycnkv
UmVuZGVyVGhlbWVCbGFja0JlcnJ5Lmg6IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMSArCiAuLi4vcGxhdGZvcm0vYmxh
Y2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwICB8ICA5NjggKysrKysrKysrKysrKysr
KysrKysKIC4uLi9wbGF0Zm9ybS9ibGFja2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5oICAg
IHwgIDExMiArKysKIDMgZmlsZXMgY2hhbmdlZCwgMTEwMSBpbnNlcnRpb25zKCspLCAwIGRlbGV0
aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNr
YmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgKCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFu
Z2VMb2cKaW5kZXggMmI0OTI5Ny4uYWE3MWFiNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
Q2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBA
CisyMDEyLTAyLTIwICBNYXJ5IFd1ICA8bWFyeS53dUB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAg
ICAgICAgVXBzdHJlYW0gUmVuZGVyVGhlbWVCbGFja2JlcnJ5LmgvLmNwcCBpbnRvIFdlYkNvcmUv
cGxhdGZvcm0vYmxhY2tiZXJyeQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9Nzg3ODUKKworICAgICAgICBNYWluIENvbnRyaWJ1dG9yczoKKyAgICAgICAg
RGFuaWVsIEJhdGVzIDxkYmF0ZXNAcmltLmNvbT4KKyAgICAgICAgQnJ5YW4gR2lzbGFzb24gPGJn
aXNsYXNvbkByaW0uY29tPgorICAgICAgICBBa2FzaCBWYXN3YW5pIDxha3Zhc3dhbmlAcmltLmNv
bT4KKyAgICAgICAgRGF2ZSBCYXR0aXN0YSA8ZGJhdHRpc3RhQHJpbS5jb20+CisgICAgICAgIFJv
YmluIENhbyAgPHJvYmluLmNhb0B0b3JjaG1vYmlsZS5jb20uY24+CisgICAgICAgIEdlbmV2aWV2
ZSBNYWsgPGdtYWtAcmltLmNvbT4KKyAgICAgICAgTWlrZSBGZW50b24gIDxtaWZlbnRvbkByaW0u
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IEFudG9uaW8gR29tZXMuCisKKyAgICAgICAgSW5p
dGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vYmxhY2ti
ZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ibGFja2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5oOiBBZGRlZC4KKwogMjAxMi0wMS0z
MCAgUGV0ZXIgUnliaW4gIDxwZXRlci5yeWJpbkBnbWFpbC5jb20+CiAKICAgICAgICAgV2ViIElu
c3BlY3RvcjogQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weTogY2xlYW4gSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXIuaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2ti
ZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
YmxhY2tiZXJyeS9SZW5kZXJUaGVtZUJsYWNrQmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmQ5NTk4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ibGFja2JlcnJ5L1JlbmRlclRoZW1lQmxhY2tCZXJyeS5jcHAKQEAgLTAsMCAr
MSw5NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLgorICog
Q29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIw
MTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICog
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9u
LCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlJlbmRlclRoZW1lQmxhY2tCZXJyeS5oIgorCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jk
cy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiTWVkaWFDb250cm9sRWxlbWVudHMu
aCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAi
UGFpbnRJbmZvLmgiCisjaW5jbHVkZSAiUmVuZGVyUHJvZ3Jlc3MuaCIKKyNpbmNsdWRlICJSZW5k
ZXJTbGlkZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAiVXNlckFnZW50
U3R5bGVTaGVldHMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBTaXplcyAodW5pdCBw
eCkKK2NvbnN0IHVuc2lnbmVkIHNtYWxsUmFkaXVzID0gMTsKK2NvbnN0IHVuc2lnbmVkIGxhcmdl
UmFkaXVzID0gMzsKK2NvbnN0IHVuc2lnbmVkIGxpbmVXaWR0aCA9IDE7Citjb25zdCBpbnQgbWFy
Z2luU2l6ZSA9IDQ7Citjb25zdCBpbnQgbWVkaWFTbGlkZXJUaHVtYldpZHRoID0gNDA7Citjb25z
dCBpbnQgbWVkaWFTbGlkZXJUaHVtYkhlaWdodCA9IDEzOworY29uc3QgaW50IG1lZGlhU2xpZGVy
VGh1bWJSYWRpdXMgPSA1OworY29uc3QgaW50IHNsaWRlclRodW1iV2lkdGggPSAxNTsKK2NvbnN0
IGludCBzbGlkZXJUaHVtYkhlaWdodCA9IDI1OworCisvLyBDaGVja2JveCBjaGVjayBzY2FsZXJz
Citjb25zdCBmbG9hdCBjaGVja2JveExlZnRYID0gNyAvIDQwLjA7Citjb25zdCBmbG9hdCBjaGVj
a2JveExlZnRZID0gMSAvIDIuMDsKK2NvbnN0IGZsb2F0IGNoZWNrYm94TWlkZGxlWCA9IDE5IC8g
NTAuMDsKK2NvbnN0IGZsb2F0IGNoZWNrYm94TWlkZGxlWSA9IDcgLyAyNS4wOworY29uc3QgZmxv
YXQgY2hlY2tib3hSaWdodFggPSAzMyAvIDQwLjA7Citjb25zdCBmbG9hdCBjaGVja2JveFJpZ2h0
WSA9IDEgLyA1LjA7Citjb25zdCBmbG9hdCBjaGVja2JveFN0cm9rZVRoaWNrbmVzcyA9IDYuNTsK
KworLy8gUmFkaW8gYnV0dG9uIHNjYWxlcgorY29uc3QgZmxvYXQgcmFkaW9CdXR0b25DaGVja1N0
YXRlU2NhbGVyID0gNyAvIDMwLjA7CisKKy8vIE11bHRpcGxpZXJzCitjb25zdCB1bnNpZ25lZCBw
YWRkaW5nRGl2aXNvciA9IDU7CisKKy8vIENvbG9ycworY29uc3QgUkdCQTMyIGNhcmV0Qm90dG9t
ID0gMHhmZjIxNjNiZjsKK2NvbnN0IFJHQkEzMiBjYXJldFRvcCA9IDB4ZmY2OWE1ZmE7CisKK2Nv
bnN0IFJHQkEzMiByZWd1bGFyQm90dG9tID0gMHhmZmRjZGVlNDsKK2NvbnN0IFJHQkEzMiByZWd1
bGFyVG9wID0gMHhmZmY3ZjJlZTsKK2NvbnN0IFJHQkEzMiBob3ZlckJvdHRvbSA9IDB4ZmZiNWQz
ZmM7Citjb25zdCBSR0JBMzIgaG92ZXJUb3AgPSAweGZmY2NlYWZmOworY29uc3QgUkdCQTMyIGRl
cHJlc3NlZEJvdHRvbSA9IDB4ZmYzMzg4ZmY7Citjb25zdCBSR0JBMzIgZGVwcmVzc2VkVG9wID0g
MHhmZjY2YTBmMjsKK2NvbnN0IFJHQkEzMiBkaXNhYmxlZEJvdHRvbSA9IDB4ZmZlN2U3ZTc7Citj
b25zdCBSR0JBMzIgZGlzYWJsZWRUb3AgPSAweGZmZWZlZmVmOworCitjb25zdCBSR0JBMzIgcmVn
dWxhckJvdHRvbU91dGxpbmUgPSAweGZmNmU3MDczOworY29uc3QgUkdCQTMyIHJlZ3VsYXJUb3BP
dXRsaW5lID0gMHhmZmI5YjhiODsKK2NvbnN0IFJHQkEzMiBob3ZlckJvdHRvbU91dGxpbmUgPSAw
eGZmMjE2M2JmOworY29uc3QgUkdCQTMyIGhvdmVyVG9wT3V0bGluZSA9IDB4ZmY2OWJlZmE7Citj
b25zdCBSR0JBMzIgZGVwcmVzc2VkQm90dG9tT3V0bGluZSA9IDB4ZmYwYzNkODE7Citjb25zdCBS
R0JBMzIgZGVwcmVzc2VkVG9wT3V0bGluZSA9IDB4ZmYxZDRkNzA7Citjb25zdCBSR0JBMzIgZGlz
YWJsZWRPdXRsaW5lID0gMHhmZmQ1ZDlkZTsKKworY29uc3QgUkdCQTMyIHByb2dyZXNzUmVndWxh
ckJvdHRvbSA9IGNhcmV0VG9wOworY29uc3QgUkdCQTMyIHByb2dyZXNzUmVndWxhclRvcCA9IGNh
cmV0Qm90dG9tOworCitjb25zdCBSR0JBMzIgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tID0gMHhm
ZmY2ZjJlZTsKK2NvbnN0IFJHQkEzMiByYW5nZVNsaWRlclJlZ3VsYXJUb3AgPSAweGZmZGVlMGU1
OworY29uc3QgUkdCQTMyIHJhbmdlU2xpZGVyUm9sbEJvdHRvbSA9IDB4ZmZjOWU4ZmU7Citjb25z
dCBSR0JBMzIgcmFuZ2VTbGlkZXJSb2xsVG9wID0gMHhmZmI1ZDNmYzsKKworY29uc3QgUkdCQTMy
IHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbU91dGxpbmUgPSAweGZmYjliYWJkOworY29uc3QgUkdC
QTMyIHJhbmdlU2xpZGVyUmVndWxhclRvcE91dGxpbmUgPSAweGZmYjdiN2I3OworY29uc3QgUkdC
QTMyIHJhbmdlU2xpZGVyUm9sbEJvdHRvbU91dGxpbmUgPSAweGZmNjdhYmUwOworY29uc3QgUkdC
QTMyIHJhbmdlU2xpZGVyUm9sbFRvcE91dGxpbmUgPSAweGZmNjlhZGY5OworCitjb25zdCBSR0JB
MzIgZHJhZ1JlZ3VsYXJMaWdodCA9IDB4ZmZmZGZkZmQ7Citjb25zdCBSR0JBMzIgZHJhZ1JlZ3Vs
YXJEYXJrID0gMHhmZmJhYmFiYTsKK2NvbnN0IFJHQkEzMiBkcmFnUm9sbExpZ2h0ID0gMHhmZmYy
ZjJmMjsKK2NvbnN0IFJHQkEzMiBkcmFnUm9sbERhcmsgPSAweGZmNjlhOGZmOworCitjb25zdCBS
R0JBMzIgc2VsZWN0aW9uID0gMHhmZjJiOGZmZjsKKworY29uc3QgUkdCQTMyIGJsYWNrUGVuID0g
Q29sb3I6OmJsYWNrOworY29uc3QgUkdCQTMyIGZvY3VzUmluZ1BlbiA9IDB4ZmZhM2M4ZmU7CisK
K2Zsb2F0IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6ZGVmYXVsdEZvbnRTaXplID0gMTY7CisKKy8v
IFdlIGFpbSB0byBtYXRjaCBJRSBoZXJlLgorLy8gLUlFIHVzZXMgYSBmb250IGJhc2VkIG9uIHRo
ZSBlbmNvZGluZyBhcyB0aGUgZGVmYXVsdCBmb250IGZvciBmb3JtIGNvbnRyb2xzLgorLy8gLUdl
Y2tvIHVzZXMgTVMgU2hlbGwgRGxnIChhY3R1YWxseSBjYWxscyBHZXRTdG9ja09iamVjdChERUZB
VUxUX0dVSV9GT05UKSwKKy8vIHdoaWNoIHJldHVybnMgTVMgU2hlbGwgRGxnKQorLy8gLVNhZmFy
aSB1c2VzIEx1Y2lkYSBHcmFuZGUuCisvLworLy8gRklYTUU6IFRoZSBvbmx5IGNhc2Ugd2hlcmUg
d2Uga25vdyB3ZSBkb24ndCBtYXRjaCBJRSBpcyBmb3IgQU5TSSBlbmNvZGluZ3MuCisvLyBJRSB1
c2VzIE1TIFNoZWxsIERsZyB0aGVyZSwgd2hpY2ggd2UgcmVuZGVyIGluY29ycmVjdGx5IGF0IGNl
cnRhaW4gcGl4ZWwKKy8vIHNpemVzIChlLmcuIDE1cHgpLiBTbyB3ZSBqdXN0IHVzZSBBcmlhbCBm
b3Igbm93LgorY29uc3QgU3RyaW5nJiBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmRlZmF1bHRHVUlG
b250KCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgZm9udEZhY2UsICgiQXJp
YWwiKSk7CisgICAgcmV0dXJuIGZvbnRGYWNlOworfQorCitzdGF0aWMgUGFzc1JlZlB0cjxHcmFk
aWVudD4gY3JlYXRlTGluZWFyR3JhZGllbnQoUkdCQTMyIHRvcCwgUkdCQTMyIGJvdHRvbSwgY29u
c3QgSW50UG9pbnQmIGEsIGNvbnN0IEludFBvaW50JiBiKQoreworICAgIFJlZlB0cjxHcmFkaWVu
dD4gZ3JhZGllbnQgPSBHcmFkaWVudDo6Y3JlYXRlKGEsIGIpOworICAgIGdyYWRpZW50LT5hZGRD
b2xvclN0b3AoMC4wLCBDb2xvcih0b3ApKTsKKyAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKDEu
MCwgQ29sb3IoYm90dG9tKSk7CisgICAgcmV0dXJuIGdyYWRpZW50LnJlbGVhc2UoKTsKK30KKwor
c3RhdGljIFBhdGggcm91bmRlZFJlY3RGb3JCb3JkZXIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNv
bnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gb2JqZWN0LT5z
dHlsZSgpOworICAgIExlbmd0aFNpemUgdG9wTGVmdFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJUb3BM
ZWZ0UmFkaXVzKCk7CisgICAgTGVuZ3RoU2l6ZSB0b3BSaWdodFJhZGl1cyA9IHN0eWxlLT5ib3Jk
ZXJUb3BSaWdodFJhZGl1cygpOworICAgIExlbmd0aFNpemUgYm90dG9tTGVmdFJhZGl1cyA9IHN0
eWxlLT5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzKCk7CisgICAgTGVuZ3RoU2l6ZSBib3R0b21SaWdo
dFJhZGl1cyA9IHN0eWxlLT5ib3JkZXJCb3R0b21SaWdodFJhZGl1cygpOworCisgICAgUGF0aCBy
b3VuZGVkUmVjdDsKKyAgICByb3VuZGVkUmVjdC5hZGRSb3VuZGVkUmVjdChyZWN0LCBJbnRTaXpl
KHRvcExlZnRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCB0b3BMZWZ0UmFkaXVzLmhlaWdodCgpLnZh
bHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUodG9w
UmlnaHRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKS52YWx1
ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTaXplKGJvdHRv
bUxlZnRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCBib3R0b21MZWZ0UmFkaXVzLmhlaWdodCgpLnZh
bHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFNpemUoYm90
dG9tUmlnaHRSYWRpdXMud2lkdGgoKS52YWx1ZSgpLCBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQo
KS52YWx1ZSgpKSk7CisgICAgcmV0dXJuIHJvdW5kZWRSZWN0OworfQorCitQYXNzUmVmUHRyPFJl
bmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAg
c3RhdGljIFJlbmRlclRoZW1lKiB0aGVtZSA9IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6Y3JlYXRl
KCkubGVha1JlZigpOworICAgIHJldHVybiB0aGVtZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJU
aGVtZT4gUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjcmVhdGUoKQoreworICAgIHJldHVybiBhZG9w
dFJlZihuZXcgUmVuZGVyVGhlbWVCbGFja0JlcnJ5KCkpOworfQorCitSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OlJlbmRlclRoZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1JlbmRlclRoZW1lQmxhY2tC
ZXJyeTo6flJlbmRlclRoZW1lQmxhY2tCZXJyeSgpCit7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVt
ZUJsYWNrQmVycnk6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBTdHJp
bmcodGhlbWVCbGFja0JlcnJ5VXNlckFnZW50U3R5bGVTaGVldCwgc2l6ZW9mKHRoZW1lQmxhY2tC
ZXJyeVVzZXJBZ2VudFN0eWxlU2hlZXQpKTsKK30KKworI2lmIEVOQUJMRShWSURFTykKK1N0cmlu
ZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQoKQor
eworICAgIHJldHVybiBTdHJpbmcobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHls
ZVNoZWV0LCBzaXplb2YobWVkaWFDb250cm9sc0JsYWNrQmVycnlVc2VyQWdlbnRTdHlsZVNoZWV0
KSk7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OmZvcm1hdE1lZGlhQ29udHJv
bHNSZW1haW5pbmdUaW1lKGZsb2F0LCBmbG9hdCBkdXJhdGlvbikgY29uc3QKK3sKKyAgICAvLyBU
aGlzIGlzIGEgd29ya2Fyb3VuZCB0byBtYWtlIHRoZSBhcHBlYXJhbmNlIG9mIG1lZGlhIHRpbWUg
Y29udHJvbGxlciBpbgorICAgIC8vIGluLXBhZ2UgbW9kZSB0aGUgc2FtZSBhcyBpbiBmdWxsc2Ny
ZWVuIG1vZGUuCisgICAgcmV0dXJuIGZvcm1hdE1lZGlhQ29udHJvbHNUaW1lKGR1cmF0aW9uKTsK
K30KKyNlbmRpZgorCitkb3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpjYXJldEJsaW5rSW50
ZXJ2YWwoKSBjb25zdAoreworICAgIHJldHVybiAwOyAvLyBUdXJuIG9mZiBjYXJldCBibGlua2lu
Zy4KK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnN5c3RlbUZvbnQoaW50IHByb3BJ
ZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgZmxvYXQg
Zm9udFNpemUgPSBkZWZhdWx0Rm9udFNpemU7CisKKyAgICBpZiAocHJvcElkID09IENTU1ZhbHVl
V2Via2l0TWluaUNvbnRyb2wgfHwgcHJvcElkID09ICBDU1NWYWx1ZVdlYmtpdFNtYWxsQ29udHJv
bCB8fCBwcm9wSWQgPT0gQ1NTVmFsdWVXZWJraXRDb250cm9sKSB7CisgICAgICAgIC8vIFdoeSAy
IHBvaW50cyBzbWFsbGVyPyBCZWNhdXNlIHRoYXQncyB3aGF0IEdlY2tvIGRvZXMuIE5vdGUgdGhh
dCB3ZQorICAgICAgICAvLyBhcmUgYXNzdW1pbmcgYSA5NmRwaSBzY3JlZW4sIHdoaWNoIGlzIHRo
ZSBkZWZhdWx0IHZhbHVlIHdlIHVzZSBvbiBXaW5kb3dzLgorICAgICAgICBzdGF0aWMgY29uc3Qg
ZmxvYXQgcG9pbnRzUGVySW5jaCA9IDcyLjBmOworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQg
cGl4ZWxzUGVySW5jaCA9IDk2LjBmOworICAgICAgICBmb250U2l6ZSAtPSAoMi4wZiAvIHBvaW50
c1BlckluY2gpICogcGl4ZWxzUGVySW5jaDsKKyAgICB9CisKKyAgICBmb250RGVzY3JpcHRpb24u
Zmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoZGVmYXVsdEdVSUZvbnQoKSk7CisgICAgZm9udERlc2Ny
aXB0aW9uLnNldFNwZWNpZmllZFNpemUoZm9udFNpemUpOworICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0Zh
bWlseShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0
V2VpZ2h0KEZvbnRXZWlnaHROb3JtYWwpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJdGFsaWMo
ZmFsc2UpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0QnV0dG9uU3R5bGUo
UmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIExlbmd0aCB2ZXJ0UGFkZGluZyhpbnQo
c3R5bGUtPmZvbnRTaXplKCkgLyBwYWRkaW5nRGl2aXNvciksIEZpeGVkKTsKKyAgICBzdHlsZS0+
c2V0UGFkZGluZ1RvcCh2ZXJ0UGFkZGluZyk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20o
dmVydFBhZGRpbmcpOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0QnV0
dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCop
IGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworICAgIHN0eWxlLT5zZXRDdXJz
b3IoQ1VSU09SX1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OmFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHls
ZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUpOworfQorCiti
b29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqIG9i
amVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IHJldHVybiBwYWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKG9iamVjdCwgaW5m
bywgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RUZXh0Rmll
bGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50Kikg
Y29uc3QKK3sKKyAgICBzZXRCdXR0b25TdHlsZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpwYWludFRleHRGaWVsZE9yVGV4dEFyZWFPclNlYXJjaEZpZWxkKFJlbmRl
ck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgQVNTRVJUKGluZm8uY29udGV4dCk7CisgICAgR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0ID0gaW5mby5jb250ZXh0OworCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRl
eHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VU
aGlja25lc3MobGluZVdpZHRoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAg
ICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihkaXNhYmxlZE91dGxpbmUsIENvbG9yU3BhY2VEZXZp
Y2VSR0IpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBpbmZvLmNv
bnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRv
cE91dGxpbmUsIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwg
cmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkg
fHwgaXNGb2N1c2VkKG9iamVjdCkpCisgICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50
KGNyZWF0ZUxpbmVhckdyYWRpZW50KGhvdmVyVG9wT3V0bGluZSwgaG92ZXJCb3R0b21PdXRsaW5l
LCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgIGVs
c2UKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGll
bnQocmVndWxhclRvcE91dGxpbmUsIHJlZ3VsYXJCb3R0b21PdXRsaW5lLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworCisgICAgUGF0aCB0ZXh0RmllbGRS
b3VuZGVkUmVjdGFuZ2xlID0gcm91bmRlZFJlY3RGb3JCb3JkZXIob2JqZWN0LCByZWN0KTsKKyAg
ICBpZiAob2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2VhcmNoRmllbGRQYXJ0KSB7
CisgICAgICAgIC8vIFdlIGZvcmNlIHRoZSBmaWxsIGNvbG9yIHRvIFdoaXRlIHNvIGFzIHRvIG1h
dGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBncmFw
aGljLgorICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlLCBDb2xvclNw
YWNlRGV2aWNlUkdCKTsKKyAgICAgICAgY29udGV4dC0+ZHJhd1BhdGgodGV4dEZpZWxkUm91bmRl
ZFJlY3RhbmdsZSk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnRleHQtPnN0cm9rZVBhdGgodGV4
dEZpZWxkUm91bmRlZFJlY3RhbmdsZSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJl
dHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50VGV4dEZp
ZWxkKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkT3JUZXh0QXJlYU9yU2Vh
cmNoRmllbGQob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0
eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgc2V0QnV0dG9uU3R5bGUoc3R5bGUp
OworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0U2VhcmNoRmllbGRDYW5j
ZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVt
ZW50KikgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZGVmYXVsdENvbnRyb2xGb250
UGl4ZWxTaXplID0gMTM7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGRlZmF1bHRDYW5jZWxCdXR0
b25TaXplID0gOTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWluQ2FuY2VsQnV0dG9uU2l6ZSA9
IDU7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1heENhbmNlbEJ1dHRvblNpemUgPSAyMTsKKwor
ICAgIC8vIFNjYWxlIHRoZSBidXR0b24gc2l6ZSBiYXNlZCBvbiB0aGUgZm9udCBzaXplCisgICAg
ZmxvYXQgZm9udFNjYWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBkZWZhdWx0Q29udHJvbEZvbnRQ
aXhlbFNpemU7CisgICAgaW50IGNhbmNlbEJ1dHRvblNpemUgPSBscm91bmRmKHN0ZDo6bWluKHN0
ZDo6bWF4KG1pbkNhbmNlbEJ1dHRvblNpemUsIGRlZmF1bHRDYW5jZWxCdXR0b25TaXplICogZm9u
dFNjYWxlKSwgbWF4Q2FuY2VsQnV0dG9uU2l6ZSkpOworICAgIExlbmd0aCBsZW5ndGgoY2FuY2Vs
QnV0dG9uU2l6ZSwgRml4ZWQpOworICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworICAgIHN0
eWxlLT5zZXRIZWlnaHQobGVuZ3RoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYg
aW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0RmllbGRP
clRleHRBcmVhT3JTZWFyY2hGaWVsZChvYmplY3QsIGluZm8sIHJlY3QpOworfQorCitib29sIFJl
bmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJP
YmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgQVNTRVJUKG9iamVjdC0+cGFyZW50KCkpOworICAgIGlmICghb2JqZWN0
LT5wYXJlbnQoKSB8fCAhb2JqZWN0LT5wYXJlbnQoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgUmVuZGVyQm94KiBwYXJlbnRSZW5kZXJCb3ggPSB0b1JlbmRlckJveChv
YmplY3QtPnBhcmVudCgpKTsKKworICAgIEludFJlY3QgcGFyZW50Qm94ID0gcGFyZW50UmVuZGVy
Qm94LT5hYnNvbHV0ZUNvbnRlbnRCb3goKTsKKyAgICBJbnRSZWN0IGJvdW5kcyA9IHJlY3Q7Cisg
ICAgLy8gTWFrZSBzdXJlIHRoZSBzY2FsZWQgYnV0dG9uIHN0YXlzIHNxdWFyZSBhbmQgZml0cyBp
biBpdHMgcGFyZW50J3MgYm94LgorICAgIGJvdW5kcy5zZXRIZWlnaHQoc3RkOjptaW4ocGFyZW50
Qm94LndpZHRoKCksIHN0ZDo6bWluKHBhcmVudEJveC5oZWlnaHQoKSwgYm91bmRzLmhlaWdodCgp
KSkpOworICAgIGJvdW5kcy5zZXRXaWR0aChib3VuZHMuaGVpZ2h0KCkpOworCisgICAgLy8gUHV0
IHRoZSBidXR0b24gaW4gdGhlIG1pZGRsZSB2ZXJ0aWNhbGx5LCBhbmQgcm91bmQgdXAgdGhlIHZh
bHVlLgorICAgIC8vIFNvIGlmIGl0IGhhcyB0byBiZSBvbmUgcGl4ZWwgb2ZmLWNlbnRlciwgaXQg
d291bGQgYmUgb25lIHBpeGVsIGNsb3NlcgorICAgIC8vIHRvIHRoZSBib3R0b20gb2YgdGhlIGZp
ZWxkLiBUaGlzIHdvdWxkIGxvb2sgYmV0dGVyIHdpdGggdGhlIHRleHQuCisgICAgYm91bmRzLnNl
dFkocGFyZW50Qm94LnkoKSArIChwYXJlbnRCb3guaGVpZ2h0KCkgLSBib3VuZHMuaGVpZ2h0KCkg
KyAxKSAvIDIpOworCisgICAgc3RhdGljIEltYWdlKiBjYW5jZWxJbWFnZSA9IEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZSgic2VhcmNoQ2FuY2VsIikubGVha1JlZigpOworICAgIHN0YXRpYyBJ
bWFnZSogY2FuY2VsUHJlc3NlZEltYWdlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJz
ZWFyY2hDYW5jZWxQcmVzc2VkIikubGVha1JlZigpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5k
cmF3SW1hZ2UoaXNQcmVzc2VkKG9iamVjdCkgPyBjYW5jZWxQcmVzc2VkSW1hZ2UgOiBjYW5jZWxJ
bWFnZSwgb2JqZWN0LT5zdHlsZSgpLT5jb2xvclNwYWNlKCksIGJvdW5kcyk7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0TWVudUxpc3RC
dXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KikgY29uc3QKK3sKKyAgICAvLyBUaGVzZSBzZWVtIHRvIGJlIHJlYXNvbmFibGUgcGFkZGluZyB2
YWx1ZXMgZnJvbSBvYnNlcnZhdGlvbi4KKyAgICBjb25zdCBpbnQgcGFkZGluZ0xlZnQgPSA4Owor
ICAgIGNvbnN0IGludCBwYWRkaW5nUmlnaHQgPSA0OworCisgICAgY29uc3QgaW50IG1pbkhlaWdo
dCA9IHN0eWxlLT5mb250U2l6ZSgpICogMjsKKworICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsK
KyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7CisKKyAgICBzdHlsZS0+c2V0UGFk
ZGluZ1JpZ2h0KExlbmd0aChtaW5IZWlnaHQgKyBwYWRkaW5nUmlnaHQsIEZpeGVkKSk7CisgICAg
c3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nTGVmdCwgRml4ZWQpKTsKKyAgICBz
dHlsZS0+c2V0Q3Vyc29yKENVUlNPUl9XRUJLSVRfR1JBQik7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVCbGFja0JlcnJ5OjpjYWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKK3sKKyAgICBpbnQgc2l6ZSA9IHN0eWxlLT5mb250U2l6ZSgpOworICAgIExlbmd0aCBsZW5n
dGgoc2l6ZSwgRml4ZWQpOworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IENoZWNrYm94
UGFydCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IFJhZGlvUGFydCkgeworICAgICAgICBzdHls
ZS0+c2V0V2lkdGgobGVuZ3RoKTsKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChsZW5ndGgpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQg
YXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KKyAgICBpZiAo
IXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5p
c0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50
cmluc2ljT3JBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChsZW5ndGgpOworCisgICAg
aWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChs
ZW5ndGgpOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRDaGVja2JveChS
ZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIHJldHVybiBwYWludEJ1dHRvbihvYmplY3QsIGluZm8sIHJlY3QpOwor
fQorCit2b2lkIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0
eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBjYWxjdWxhdGVCdXR0b25TaXplKHN0eWxlKTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBv
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAg
ICByZXR1cm4gcGFpbnRCdXR0b24ob2JqZWN0LCBpbmZvLCByZWN0KTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZUJsYWNrQmVycnk6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
Cit7CisgICAgY2FsY3VsYXRlQnV0dG9uU2l6ZShzdHlsZSk7Cit9CisKKy8vIElmIHRoaXMgZnVu
Y3Rpb24gcmV0dXJucyBmYWxzZSwgV2ViQ29yZSBhc3N1bWVzIHRoZSBidXR0b24gaXMgZnVsbHkg
ZGVjb3JhdGVkCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRCdXR0b24oUmVuZGVy
T2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICBBU1NFUlQoaW5mby5jb250ZXh0KTsKKyAgICBpbmZvLmNvbnRleHQtPnNhdmUo
KTsKKworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAg
IGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBDb2xv
ciBjaGVjayhibGFja1Blbik7CisgICAgaWYgKCFpc0VuYWJsZWQob2JqZWN0KSkgeworICAgICAg
ICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChkaXNh
YmxlZFRvcCwgZGlzYWJsZWRCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhY
TWF4WUNvcm5lcigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoZGlz
YWJsZWRPdXRsaW5lLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICB9IGVsc2UgaWYgKGlzUHJl
c3NlZChvYmplY3QpKSB7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0RmlsbEdyYWRpZW50KGNy
ZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRvcCwgZGVwcmVzc2VkQm90dG9tLCByZWN0Lm1h
eFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNv
bnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KGRlcHJlc3NlZFRv
cE91dGxpbmUsIGRlcHJlc3NlZEJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwg
cmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQob2JqZWN0
KSkgeworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJH
cmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVj
dC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJUb3BPdXRsaW5lLCBob3ZlckJvdHRvbU91
dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRl
TGluZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgcmVjdC5tYXhYTWluWUNv
cm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5z
ZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wT3V0bGluZSwg
cmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4
WUNvcm5lcigpKSk7CisgICAgfQorCisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5
bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQ2hlY2ti
b3hQYXJ0OiB7CisgICAgICAgIEZsb2F0U2l6ZSBzbWFsbENvcm5lcihzbWFsbFJhZGl1cywgc21h
bGxSYWRpdXMpOworICAgICAgICBQYXRoIHBhdGg7CisgICAgICAgIHBhdGguYWRkUm91bmRlZFJl
Y3QocmVjdCwgc21hbGxDb3JuZXIpOworICAgICAgICBpbmZvLmNvbnRleHQtPmRyYXdQYXRoKHBh
dGgpOworCisgICAgICAgIGlmIChpc0NoZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgUGF0
aCBjaGVja1BhdGg7CisgICAgICAgICAgICBJbnRSZWN0IHJlY3QyID0gcmVjdDsKKyAgICAgICAg
ICAgIHJlY3QyLmluZmxhdGUoLTEpOworICAgICAgICAgICAgY2hlY2tQYXRoLm1vdmVUbyhGbG9h
dFBvaW50KHJlY3QyLngoKSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveExlZnRYLCByZWN0Mi55
KCkgKyByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TGVmdFkpKTsKKyAgICAgICAgICAgIGNoZWNr
UGF0aC5hZGRMaW5lVG8oRmxvYXRQb2ludChyZWN0Mi54KCkgKyByZWN0Mi53aWR0aCgpICogY2hl
Y2tib3hNaWRkbGVYLCByZWN0Mi5tYXhZKCkgLSByZWN0Mi5oZWlnaHQoKSAqIGNoZWNrYm94TWlk
ZGxlWSkpOworICAgICAgICAgICAgY2hlY2tQYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KHJlY3Qy
LngoKSArIHJlY3QyLndpZHRoKCkgKiBjaGVja2JveFJpZ2h0WCwgcmVjdDIueSgpICsgcmVjdDIu
aGVpZ2h0KCkgKiBjaGVja2JveFJpZ2h0WSkpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5z
ZXRMaW5lQ2FwKFJvdW5kQ2FwKTsKKyAgICAgICAgICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tl
Q29sb3IoYmxhY2tQZW4sIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5j
b250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MocmVjdDIud2lkdGgoKSAvIGNoZWNrYm94U3Ryb2tl
VGhpY2tuZXNzKTsKKyAgICAgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd1BhdGgoY2hlY2tQYXRo
KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBSYWRpb1BhcnQ6
CisgICAgICAgIGluZm8uY29udGV4dC0+ZHJhd0VsbGlwc2UocmVjdCk7CisgICAgICAgIGlmIChp
c0NoZWNrZWQob2JqZWN0KSkgeworICAgICAgICAgICAgSW50UmVjdCByZWN0MiA9IHJlY3Q7Cisg
ICAgICAgICAgICByZWN0Mi5pbmZsYXRlKC1yZWN0LndpZHRoKCkgKiByYWRpb0J1dHRvbkNoZWNr
U3RhdGVTY2FsZXIpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoY2hl
Y2ssIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICAgICAgaW5mby5jb250ZXh0LT5zZXRT
dHJva2VDb2xvcihjaGVjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAgICAgICBpbmZv
LmNvbnRleHQtPmRyYXdFbGxpcHNlKHJlY3QyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsK
KyAgICBjYXNlIEJ1dHRvblBhcnQ6CisgICAgY2FzZSBQdXNoQnV0dG9uUGFydDogeworICAgICAg
ICBGbG9hdFNpemUgbGFyZ2VDb3JuZXIobGFyZ2VSYWRpdXMsIGxhcmdlUmFkaXVzKTsKKyAgICAg
ICAgUGF0aCBwYXRoOworICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxhcmdlQ29y
bmVyKTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5kcmF3UGF0aChwYXRoKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIGNhc2UgU3F1YXJlQnV0dG9uUGFydDogeworICAgICAgICBQYXRoIHBh
dGg7CisgICAgICAgIHBhdGguYWRkUmVjdChyZWN0KTsKKyAgICAgICAgaW5mby5jb250ZXh0LT5k
cmF3UGF0aChwYXRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAg
ICAgIGluZm8uY29udGV4dC0+cmVzdG9yZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqIGNzcywgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25z
dAoreworICAgIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoY3NzLCBzdHlsZSwgZWxlbWVudCk7
Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjphZGp1c3RDaGVja2JveFN0eWxlKENT
U1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAorewor
ICAgIHNldENoZWNrYm94U2l6ZShzdHlsZSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxs
cHRyKTsKKyAgICBMZW5ndGggbWFyZ2luKG1hcmdpblNpemUsIEZpeGVkKTsKKyAgICBzdHlsZS0+
c2V0TWFyZ2luQm90dG9tKG1hcmdpbik7CisgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KG1hcmdp
bik7CisgICAgc3R5bGUtPnNldEN1cnNvcihDVVJTT1JfV0VCS0lUX0dSQUIpOworfQorCit2b2lk
IFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YWRqdXN0UmFkaW9TdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBzZXRSYWRpb1Np
emUoc3R5bGUpOworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisgICAgTGVuZ3Ro
IG1hcmdpbihtYXJnaW5TaXplLCBGaXhlZCk7CisgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbSht
YXJnaW4pOworICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChtYXJnaW4pOworICAgIHN0eWxlLT5z
ZXRDdXJzb3IoQ1VSU09SX1dFQktJVF9HUkFCKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJsYWNr
QmVycnk6OnBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgUmVuZGVyT2JqZWN0KiBvYmplY3QsIEludFJlY3QgYnV0dG9uUmVjdCwgY29u
c3QgUGF0aCYgY2xpcFBhdGgpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQt
PnNhdmUoKTsKKyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5z
ZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGlzYWJsZWRUb3AsIGRpc2FibGVk
Qm90dG9tLCBidXR0b25SZWN0Lm1heFhNaW5ZQ29ybmVyKCksIGJ1dHRvblJlY3QubWF4WE1heFlD
b3JuZXIoKSkpOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250
ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoZGVwcmVzc2VkVG9wLCBk
ZXByZXNzZWRCb3R0b20sIGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKG9iamVjdCkpCisgICAg
ICAgIGNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRv
cCwgaG92ZXJCb3R0b20sIGJ1dHRvblJlY3QubWF4WE1pbllDb3JuZXIoKSwgYnV0dG9uUmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisgICAgZWxzZQorICAgICAgICBjb250ZXh0LT5zZXRGaWxsR3Jh
ZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmVndWxhclRvcCwgcmVndWxhckJvdHRvbSwgYnV0
dG9uUmVjdC5tYXhYTWluWUNvcm5lcigpLCBidXR0b25SZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsK
KworICAgIC8vIDEuIFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24uCisgICAgY29u
dGV4dC0+Y2xpcChjbGlwUGF0aCk7CisgICAgY29udGV4dC0+ZHJhd1JlY3QoYnV0dG9uUmVjdCk7
CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworCisgICAgLy8gMi4gUGFpbnQgdGhlIGJ1dHRvbiBh
cnJvdy4KKyAgICBidXR0b25SZWN0LmluZmxhdGUoLWJ1dHRvblJlY3Qud2lkdGgoKSAvIDMpOwor
ICAgIGJ1dHRvblJlY3QubW92ZSgwLCBidXR0b25SZWN0LmhlaWdodCgpICogNyAvIDIwKTsKKyAg
ICBQYXRoIHBhdGg7CisgICAgcGF0aC5tb3ZlVG8oRmxvYXRQb2ludChidXR0b25SZWN0LngoKSwg
YnV0dG9uUmVjdC55KCkpKTsKKyAgICBwYXRoLmFkZExpbmVUbyhGbG9hdFBvaW50KGJ1dHRvblJl
Y3QueCgpICsgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LnkoKSkpOworICAgIHBhdGgu
YWRkTGluZVRvKEZsb2F0UG9pbnQoYnV0dG9uUmVjdC54KCkgKyBidXR0b25SZWN0LndpZHRoKCkg
LyAyLjAsIGJ1dHRvblJlY3QueSgpICsgYnV0dG9uUmVjdC5oZWlnaHQoKSAvIDIuMCkpOworICAg
IHBhdGguY2xvc2VTdWJwYXRoKCk7CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4
dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVRo
aWNrbmVzcyhsaW5lV2lkdGgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpi
bGFjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKENv
bG9yOjpibGFjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgY29udGV4dC0+c2V0TGluZUpv
aW4oQmV2ZWxKb2luKTsKKyAgICBjb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKyAgICBjb250ZXh0
LT5yZXN0b3JlKCk7Cit9CisKK3N0YXRpYyBJbnRSZWN0IGNvbXB1dGVNZW51TGlzdEFycm93QnV0
dG9uUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGUgbWVudSBs
aXN0IGFycm93IGJ1dHRvbiBzaG91bGQgaGF2ZSBhIG1pbmltdW0gYW5kIG1heGltdW0gd2lkdGgg
KHRvIGVuc3VyZSB1c2FiaWxpdHkpIG9yCisgICAgLy8gc2NhbGUgd2l0aCByZXNwZWN0IHRvIHRo
ZSBmb250IHNpemUgdXNlZCBpbiB0aGUgbWVudSBsaXN0IGNvbnRyb2wgb3Igc29tZSBjb21iaW5h
dGlvbiBvZiBib3RoLgorICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KHJlY3QubWF4WCgpIC0g
cmVjdC5oZWlnaHQoKSwgcmVjdC55KCkpLCBJbnRTaXplKHJlY3QuaGVpZ2h0KCksIHJlY3QuaGVp
Z2h0KCkpKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBQYXRoJiBtZW51TGlzdFBhdGgsIGNvbnN0IENvbG9y
JiBiYWNrZ3JvdW5kQ29sb3IpCit7CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIGNvbnRleHQt
PnNhdmUoKTsKKyAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoYmFja2dyb3VuZENvbG9yLCBDb2xv
clNwYWNlRGV2aWNlUkdCKTsKKyAgICBjb250ZXh0LT5maWxsUGF0aChtZW51TGlzdFBhdGgpOwor
ICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6
OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBOb3RlLCB0aGlzIG1ldGhvZCBpcyBu
b3QgY2FsbGVkIGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZpZXMgZWl0aGVyIGEg
Ym9yZGVyIG9yIGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gSW5zdGVhZCwgUmVuZGVyVGhlbWVC
bGFja0JlcnJ5OjpwYWludE1lbnVMaXN0QnV0dG9uIGlzIGNhbGxlZC4gVGhlcmVmb3JlLCB3aGVu
IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgd2UgZG9uJ3QKKyAgICAvLyBoYXZlIHRvIGFkanVzdCBy
ZWN0IHdpdGggcmVzcGVjdCB0byB0aGUgYm9yZGVyIGRpbWVuc2lvbnMuCisKKyAgICBBU1NFUlQo
aW5mby5jb250ZXh0KTsKKyAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSBpbmZvLmNvbnRl
eHQ7CisKKyAgICBQYXRoIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSA9IHJvdW5kZWRSZWN0Rm9y
Qm9yZGVyKG9iamVjdCwgcmVjdCk7CisKKyAgICAvLyAxLiBQYWludCB0aGUgYmFja2dyb3VuZCBv
ZiB0aGUgZW50aXJlIGNvbnRyb2wuCisgICAgcGFpbnRNZW51TGlzdEJhY2tncm91bmQoY29udGV4
dCwgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlLCBDb2xvcjo6d2hpdGUpOworCisgICAgLy8gMi4g
UGFpbnQgdGhlIGJhY2tncm91bmQgb2YgdGhlIGJ1dHRvbiBhbmQgaXRzIGFycm93LgorICAgIElu
dFJlY3QgYXJyb3dCdXR0b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRvblJl
Y3QocmVjdCk7CisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5kQXJyb3coY29udGV4
dCwgb2JqZWN0LCBhcnJvd0J1dHRvblJlY3RhbmdsZSwgbWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xl
KTsKKworICAgIC8vIDQuIFN0cm9rZSBhbiBvdXRsaW5lIGFyb3VuZCB0aGUgZW50aXJlIGNvbnRy
b2wuCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIGNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNv
bGlkU3Ryb2tlKTsKKyAgICBjb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsK
KyAgICBpZiAoIWlzRW5hYmxlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VD
b2xvcihkaXNhYmxlZE91dGxpbmUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGVsc2UgaWYg
KGlzUHJlc3NlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChj
cmVhdGVMaW5lYXJHcmFkaWVudChkZXByZXNzZWRUb3BPdXRsaW5lLCBkZXByZXNzZWRCb3R0b21P
dXRsaW5lLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOwor
ICAgIGVsc2UgaWYgKGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICBjb250ZXh0LT5zZXRTdHJv
a2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcE91dGxpbmUsIGhvdmVyQm90
dG9tT3V0bGluZSwgcmVjdC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkp
KTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxp
bmVhckdyYWRpZW50KHJlZ3VsYXJUb3BPdXRsaW5lLCByZWd1bGFyQm90dG9tT3V0bGluZSwgcmVj
dC5tYXhYTWluWUNvcm5lcigpLCByZWN0Lm1heFhNYXhZQ29ybmVyKCkpKTsKKworICAgIGNvbnRl
eHQtPnN0cm9rZVBhdGgobWVudUxpc3RSb3VuZGVkUmVjdGFuZ2xlKTsKKyAgICBjb250ZXh0LT5y
ZXN0b3JlKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tC
ZXJyeTo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFp
bnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIE5vdGUsIHRoaXMg
bWV0aG9kIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBtZW51IGxpc3QgZXhwbGljaXRseSBzcGVjaWZp
ZXMgZWl0aGVyIGEgYm9yZGVyIG9yIGJhY2tncm91bmQgY29sb3IuCisgICAgLy8gT3RoZXJ3aXNl
LCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVudUxpc3QgaXMgY2FsbGVkLiBXZSBuZWVk
IHRvIGZpdCB0aGUgYXJyb3cgYnV0dG9uIHdpdGggdGhlIGJvcmRlciBib3gKKyAgICAvLyBvZiB0
aGUgbWVudS1saXN0IHNvIGFzIHRvIG5vdCBvY2NsdWRlIHRoZSBjdXN0b20gYm9yZGVyLgorCisg
ICAgLy8gV2UgY29tcHV0ZSBtZW51TGlzdFJvdW5kZWRSZWN0YW5nbGUgd2l0aCByZXNwZWN0IHRv
IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbnRpcmUgbWVudS1saXN0IGNvbnRyb2wgKGkuZS4gcmVj
dCkgYW5kCisgICAgLy8gaXRzIGJvcmRlciByYWRpdXMgc28gdGhhdCB3ZSBjbGlwIHRoZSBjb250
b3VyIG9mIHRoZSBhcnJvdyBidXR0b24gKHdoZW4gd2UgcGFpbnQgaXQgYmVsb3cpIHRvIG1hdGNo
IHRoZSBjb250b3VyIG9mCisgICAgLy8gdGhlIGNvbnRyb2wuCisgICAgUGF0aCBtZW51TGlzdFJv
dW5kZWRSZWN0YW5nbGUgPSByb3VuZGVkUmVjdEZvckJvcmRlcihvYmplY3QsIHJlY3QpOworCisg
ICAgLy8gMS4gUGFpbnQgdGhlIGJhY2tncm91bmQgb2YgdGhlIGVudGlyZSBjb250cm9sLgorICAg
IENvbG9yIGZpbGxDb2xvciA9IG9iamVjdC0+c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9y
KENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKTsKKyAgICBpZiAoIWZpbGxDb2xvci5pc1ZhbGlk
KCkpCisgICAgICAgIGZpbGxDb2xvciA9IENvbG9yOjp3aGl0ZTsKKyAgICBwYWludE1lbnVMaXN0
QmFja2dyb3VuZChpbmZvLmNvbnRleHQsIG1lbnVMaXN0Um91bmRlZFJlY3RhbmdsZSwgZmlsbENv
bG9yKTsKKworICAgIC8vIDIuIFBhaW50IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBidXR0b24gYW5k
IGl0cyBhcnJvdy4KKyAgICBJbnRSZWN0IGJvdW5kcyA9IEludFJlY3QocmVjdC54KCkgKyBvYmpl
Y3QtPnN0eWxlKCktPmJvcmRlckxlZnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
IHJlY3QueSgpICsgb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlY3Qud2lkdGgoKSAtIG9iamVjdC0+c3R5bGUoKS0+Ym9yZGVyTGVm
dFdpZHRoKCkgLSBvYmplY3QtPnN0eWxlKCktPmJvcmRlclJpZ2h0V2lkdGgoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJU
b3BXaWR0aCgpIC0gb2JqZWN0LT5zdHlsZSgpLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKKworICAg
IEludFJlY3QgYXJyb3dCdXR0b25SZWN0YW5nbGUgPSBjb21wdXRlTWVudUxpc3RBcnJvd0J1dHRv
blJlY3QoYm91bmRzKTsgLy8gRml0IHRoZSBhcnJvdyBidXR0b24gd2l0aGluIHRoZSBib3JkZXIg
Ym94IG9mIHRoZSBtZW51LWxpc3QuCisgICAgcGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50QW5k
QXJyb3coaW5mby5jb250ZXh0LCBvYmplY3QsIGFycm93QnV0dG9uUmVjdGFuZ2xlLCBtZW51TGlz
dFJvdW5kZWRSZWN0YW5nbGUpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUJsYWNrQmVycnk6OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0Cit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9IHN0eWxlLT5hcHBlYXJhbmNlKCk7Cisg
ICAgaWYgKHBhcnQgPT0gTWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQgfHwgcGFydCA9PSBTbGlk
ZXJUaHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQp
IHsKKyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVy
dGljYWxQYXJ0ID8gc2xpZGVyVGh1bWJIZWlnaHQgOiBzbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkp
OworICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChwYXJ0ID09IFNsaWRlclRodW1iVmVy
dGljYWxQYXJ0ID8gc2xpZGVyVGh1bWJXaWR0aCA6IHNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkp
OworICAgIH0gZWxzZSBpZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgeworICAgICAg
ICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKG1lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsK
KyAgICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobWVkaWFTbGlkZXJUaHVtYkhlaWdodCwg
Rml4ZWQpKTsKKyAgICB9Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFNs
aWRlclRyYWNrKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNv
bnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgY29uc3Qgc3RhdGljIGludCBTbGlkZXJUcmFja0hl
aWdodCA9IDU7CisgICAgSW50UmVjdCByZWN0MjsKKyAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5h
cHBlYXJhbmNlKCkgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgcmVjdDIuc2V0
SGVpZ2h0KFNsaWRlclRyYWNrSGVpZ2h0KTsKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdC53
aWR0aCgpKTsKKyAgICAgICAgcmVjdDIuc2V0WChyZWN0LngoKSk7CisgICAgICAgIHJlY3QyLnNl
dFkocmVjdC55KCkgKyAocmVjdC5oZWlnaHQoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHJlY3QyLnNldEhlaWdodChyZWN0LmhlaWdodCgpKTsKKyAg
ICAgICAgcmVjdDIuc2V0V2lkdGgoU2xpZGVyVHJhY2tIZWlnaHQpOworICAgICAgICByZWN0Mi5z
ZXRYKHJlY3QueCgpICsgKHJlY3Qud2lkdGgoKSAtIFNsaWRlclRyYWNrSGVpZ2h0KSAvIDIpOwor
ICAgICAgICByZWN0Mi5zZXRZKHJlY3QueSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHBhaW50U2xp
ZGVyVHJhY2tSZWN0KG9iamVjdCwgaW5mbywgcmVjdDIpOworfQorCitib29sIFJlbmRlclRoZW1l
QmxhY2tCZXJyeTo6cGFpbnRTbGlkZXJUcmFja1JlY3QoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNv
bnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4g
cGFpbnRTbGlkZXJUcmFja1JlY3Qob2JqZWN0LCBpbmZvLCByZWN0LCByYW5nZVNsaWRlclJlZ3Vs
YXJUb3BPdXRsaW5lLCByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b21PdXRsaW5lLAorICAgICAgICAg
ICAgICAgIHJhbmdlU2xpZGVyUmVndWxhclRvcCwgcmFuZ2VTbGlkZXJSZWd1bGFyQm90dG9tKTsK
K30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50U2xpZGVyVHJhY2tSZWN0KFJl
bmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QsCisgICAgICAgIFJHQkEzMiBzdHJva2VDb2xvclN0YXJ0LCBSR0JBMzIgc3Ryb2tlQ29s
b3JFbmQsIFJHQkEzMiBmaWxsQ29sb3JTdGFydCwgUkdCQTMyIGZpbGxDb2xvckVuZCkKK3sKKyAg
ICBGbG9hdFNpemUgc21hbGxDb3JuZXIoc21hbGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAg
IGluZm8uY29udGV4dC0+c2F2ZSgpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUo
U29saWRTdHJva2UpOworICAgIGluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVX
aWR0aCk7CisKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVh
ckdyYWRpZW50KHN0cm9rZUNvbG9yU3RhcnQsIHN0cm9rZUNvbG9yRW5kLCByZWN0Lm1heFhNaW5Z
Q29ybmVyKCksIHJlY3QuIG1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICBpbmZvLmNvbnRleHQtPnNl
dEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChmaWxsQ29sb3JTdGFydCwgZmlsbENv
bG9yRW5kLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOwor
CisgICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkUm91bmRlZFJlY3QocmVjdCwgc21hbGxDb3Ju
ZXIpOworICAgIGluZm8uY29udGV4dC0+ZmlsbFBhdGgocGF0aCk7CisKKyAgICBpbmZvLmNvbnRl
eHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVC
bGFja0JlcnJ5OjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQ
YWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgRmxvYXRTaXplIGxh
cmdlQ29ybmVyKGxhcmdlUmFkaXVzLCBsYXJnZVJhZGl1cyk7CisKKyAgICBpbmZvLmNvbnRleHQt
PnNhdmUoKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsK
KyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworCisgICAg
aWYgKGlzUHJlc3NlZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKSB7CisgICAgICAgIGlu
Zm8uY29udGV4dC0+c2V0U3Ryb2tlR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQoaG92ZXJU
b3BPdXRsaW5lLCBob3ZlckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVj
dC4gbWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFk
aWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChob3ZlclRvcCwgaG92ZXJCb3R0b20sIHJlY3QubWF4
WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVu
dChyZWd1bGFyVG9wT3V0bGluZSwgcmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1pbllD
b3JuZXIoKSwgcmVjdC4gbWF4WE1heFlDb3JuZXIoKSkpOworICAgICAgICBpbmZvLmNvbnRleHQt
PnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChyZWd1bGFyVG9wLCByZWd1bGFy
Qm90dG9tLCByZWN0Lm1heFhNaW5ZQ29ybmVyKCksIHJlY3QubWF4WE1heFlDb3JuZXIoKSkpOwor
ICAgIH0KKworICAgIFBhdGggcGF0aDsKKyAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHJlY3QsIGxh
cmdlQ29ybmVyKTsKKyAgICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgYm9v
bCBpc1ZlcnRpY2FsID0gcmVjdC53aWR0aCgpID4gcmVjdC5oZWlnaHQoKTsKKyAgICBJbnRQb2lu
dCBzdGFydFBvaW50KHJlY3QueCgpICsgKGlzVmVydGljYWwgPyA1IDogMiksIHJlY3QueSgpICsg
KGlzVmVydGljYWwgPyAyIDogNSkpOworICAgIEludFBvaW50IGVuZFBvaW50KHJlY3QueCgpICsg
KGlzVmVydGljYWwgPyAyMCA6IDIpLCByZWN0LnkoKSArIChpc1ZlcnRpY2FsID8gMiA6IDIwKSk7
CisgICAgY29uc3QgaW50IGxpbmVPZmZzZXQgPSAyOworICAgIGNvbnN0IGludCBzaGFkb3dPZmZz
ZXQgPSAxOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYg
KGlzVmVydGljYWwpIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WShzdGFydFBvaW50Lnko
KSArIGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQuc2V0WShlbmRQb2ludC55KCkg
KyBsaW5lT2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQu
c2V0WChzdGFydFBvaW50LngoKSArIGxpbmVPZmZzZXQpOworICAgICAgICAgICAgZW5kUG9pbnQu
c2V0WChlbmRQb2ludC54KCkgKyBsaW5lT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAo
aXNQcmVzc2VkKG9iamVjdCkgfHwgaXNIb3ZlcmVkKG9iamVjdCkpCisgICAgICAgICAgICBpbmZv
LmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGRyYWdSb2xsTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VS
R0IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZUNv
bG9yKGRyYWdSZWd1bGFyTGlnaHQsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICBpbmZv
LmNvbnRleHQtPmRyYXdMaW5lKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpZiAo
aXNWZXJ0aWNhbCkgeworICAgICAgICAgICAgc3RhcnRQb2ludC5zZXRZKHN0YXJ0UG9pbnQueSgp
ICsgc2hhZG93T2Zmc2V0KTsKKyAgICAgICAgICAgIGVuZFBvaW50LnNldFkoZW5kUG9pbnQueSgp
ICsgc2hhZG93T2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0UG9p
bnQuc2V0WChzdGFydFBvaW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgICAgICBlbmRQ
b2ludC5zZXRYKGVuZFBvaW50LngoKSArIHNoYWRvd09mZnNldCk7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKGlzUHJlc3NlZChvYmplY3QpIHx8IGlzSG92ZXJlZChvYmplY3QpKQorICAgICAgICAg
ICAgaW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihkcmFnUm9sbERhcmssIENvbG9yU3BhY2VE
ZXZpY2VSR0IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLmNvbnRleHQtPnNldFN0
cm9rZUNvbG9yKGRyYWdSZWd1bGFyRGFyaywgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgICAg
IGluZm8uY29udGV4dC0+ZHJhd0xpbmUoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworICAgIH0KKyAg
ICBpbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp
YyBib29sIHBhaW50TWVkaWFCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJ
bnRSZWN0JiByZWN0LCBJbWFnZSogaW1hZ2UpCit7CisgICAgY29udGV4dC0+ZHJhd0ltYWdlKGlt
YWdlLCBDb2xvclNwYWNlRGV2aWNlUkdCLCByZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJP
YmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlh
RWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCk7CisKKyAgICBpZiAoIW1lZGlh
RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIEltYWdlKiBtZWRp
YVBsYXkgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoInBsYXkiKS5sZWFrUmVmKCk7Cisg
ICAgc3RhdGljIEltYWdlKiBtZWRpYVBhdXNlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNl
KCJwYXVzZSIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWludE1lZGlhQnV0dG9uKHBhaW50
SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYUVsZW1lbnQtPmNhblBsYXkoKSA/IG1lZGlhUGxheSA6
IG1lZGlhUGF1c2UpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBVTlVT
RURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0dXJu
IGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludE1l
ZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWlu
dEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEhU
TUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVj
dCk7CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgc3RhdGljIEltYWdlKiBtZWRpYU11dGUgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2Uo
InNwZWFrZXIiKS5sZWFrUmVmKCk7CisgICAgc3RhdGljIEltYWdlKiBtZWRpYVVubXV0ZSA9IElt
YWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZSgic3BlYWtlcl9tdXRlIikubGVha1JlZigpOworCisg
ICAgcmV0dXJuIHBhaW50TWVkaWFCdXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlh
RWxlbWVudC0+bXV0ZWQoKSB8fCAhbWVkaWFFbGVtZW50LT52b2x1bWUoKSA/IG1lZGlhVW5tdXRl
IDogbWVkaWFNdXRlKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5V
U0VEX1BBUkFNKHBhaW50SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVy
biBmYWxzZTsKKyNlbmRpZgorfQorCitib29sIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGFpbnRN
ZWRpYUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5m
byYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURFTykK
KyAgICBpZiAoIXRvUGFyZW50TWVkaWFFbGVtZW50KG9iamVjdCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIHN0YXRpYyBJbWFnZSogbWVkaWFGdWxsc2NyZWVuID0gSW1hZ2U6OmxvYWRQ
bGF0Zm9ybVJlc291cmNlKCJmdWxsc2NyZWVuIikubGVha1JlZigpOworCisgICAgcmV0dXJuIHBh
aW50TWVkaWFCdXR0b24ocGFpbnRJbmZvLmNvbnRleHQsIHJlY3QsIG1lZGlhRnVsbHNjcmVlbik7
CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShvYmplY3QpOworICAgIFVOVVNFRF9QQVJBTShwYWlu
dEluZm8pOworICAgIFVOVVNFRF9QQVJBTShyZWN0KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5k
aWYKK30KKworYm9vbCBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBhaW50TWVkaWFTbGlkZXJUcmFj
ayhSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIEludFJlY3QgcmVjdDIo
cmVjdC54KCkgKyAzLCByZWN0LnkoKSArIDE0LCByZWN0LndpZHRoKCkgLSA2LCAyKTsKKworICAg
IEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHRvUGFyZW50TWVkaWFFbGVtZW50KG9i
amVjdCk7CisKKyAgICBpZiAoIW1lZGlhRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgZmxvYXQgbG9hZGVkID0gMDsKKyAgICAvLyBGSVhNRTogcmVwbGFjZSBsb2FkZWQgd2l0
aCBjb21tZW50ZWQgb3V0IG9uZSB3aGVuIGJ1ZmZlciBidWcgaXMgZml4ZWQgKHNlZSBjb21tZW50
IGluCisgICAgLy8gTWVkaWFQbGF5ZXJQcml2YXRlTU1yZW5kZXJlcjo6cGVyY2VudExvYWRlZCku
CisgICAgLy8gbG9hZGVkID0gbWVkaWFFbGVtZW50LT5wZXJjZW50TG9hZGVkKCk7CisgICAgaWYg
KG1lZGlhRWxlbWVudC0+cGxheWVyKCkpCisgICAgICAgIGxvYWRlZCA9IHN0YXRpY19jYXN0PE1l
ZGlhUGxheWVyUHJpdmF0ZSAqPihtZWRpYUVsZW1lbnQtPnBsYXllcigpLT5pbXBsZW1lbnRhdGlv
bigpKS0+cGVyY2VudExvYWRlZCgpOworICAgIGZsb2F0IHBvc2l0aW9uID0gbWVkaWFFbGVtZW50
LT5kdXJhdGlvbigpID4gMCA/IChtZWRpYUVsZW1lbnQtPmN1cnJlbnRUaW1lKCkgLyBtZWRpYUVs
ZW1lbnQtPmR1cmF0aW9uKCkpIDogMDsKKworICAgIGludCB4ID0gcmVjdC54KCkgKyAzOworICAg
IGludCB5ID0gcmVjdC55KCkgKyAxNDsKKyAgICBpbnQgdyA9IHJlY3Qud2lkdGgoKSAtIDY7Cisg
ICAgaW50IGggPSAyOworCisgICAgaW50IHdQbGF5ZWQgPSAodyAqIHBvc2l0aW9uKTsKKyAgICBp
bnQgd0xvYWRlZCA9ICh3IC0gbWVkaWFTbGlkZXJUaHVtYldpZHRoKSAqIGxvYWRlZCArIG1lZGlh
U2xpZGVyVGh1bWJXaWR0aDsKKworICAgIEludFJlY3QgcGxheWVkKHgsIHksIHdQbGF5ZWQsIGgp
OworICAgIEludFJlY3QgYnVmZmVyZWQoeCwgeSwgd0xvYWRlZCwgaCk7CisKKyAgICAvLyBUaGlz
IGlzIHRvIHBhaW50IG1haW4gc2xpZGVyIGJhci4KKyAgICBib29sIHJlc3VsdCA9IHBhaW50U2xp
ZGVyVHJhY2tSZWN0KG9iamVjdCwgcGFpbnRJbmZvLCByZWN0Mik7CisKKyAgICBpZiAobG9hZGVk
ID4gMCB8fCBwb3NpdGlvbiA+IDApIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0byBwYWludCBidWZm
ZXJlZCBiYXIuCisgICAgICAgIHBhaW50U2xpZGVyVHJhY2tSZWN0KG9iamVjdCwgcGFpbnRJbmZv
LCBidWZmZXJlZCwgQ29sb3I6OmRhcmtHcmF5LCBDb2xvcjo6ZGFya0dyYXksIENvbG9yOjpkYXJr
R3JheSwgQ29sb3I6OmRhcmtHcmF5KTsKKworICAgICAgICAvLyBUaGlzIGlzIHRvIHBhaW50IHBs
YXllZCBwYXJ0IG9mIGJhciAobGVmdCBvZiBzbGlkZXIgdGh1bWIpIHVzaW5nIHNlbGVjdGlvbiBj
b2xvci4KKyAgICAgICAgcGFpbnRTbGlkZXJUcmFja1JlY3Qob2JqZWN0LCBwYWludEluZm8sIHBs
YXllZCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKKyAgICB9
CisgICAgcmV0dXJuIHJlc3VsdDsKKworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsK
KyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7Cisg
ICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5
OjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURF
TykKKyAgICBpZiAoIW9iamVjdC0+cGFyZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIFJlbmRlclNsaWRlciogc2xpZGVyID0gdG9SZW5kZXJTbGlkZXIob2JqZWN0LT5wYXJlbnQo
KS0+cGFyZW50KCktPnBhcmVudCgpKTsKKyAgICBpZiAoIXNsaWRlcikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBQYXRoIG1lZGlh
VGh1bWJSb3VuZGVkUmVjdGFuZ2xlOworICAgIG1lZGlhVGh1bWJSb3VuZGVkUmVjdGFuZ2xlLmFk
ZFJvdW5kZWRSZWN0KHJlY3QsIEZsb2F0U2l6ZShtZWRpYVNsaWRlclRodW1iUmFkaXVzLCBtZWRp
YVNsaWRlclRodW1iUmFkaXVzKSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0
eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tu
ZXNzKDAuNSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpi
bGFjaywgQ29sb3JTcGFjZURldmljZVJHQik7CisKKyAgICBpZiAoaXNQcmVzc2VkKG9iamVjdCkg
fHwgaXNIb3ZlcmVkKG9iamVjdCkgfHwgc2xpZGVyLT5pbkRyYWdNb2RlKCkpIHsKKyAgICAgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVMaW5lYXJHcmFkaWVudChz
ZWxlY3Rpb24sIENvbG9yKHNlbGVjdGlvbikuZGFyaygpLnJnYigpLAorICAgICAgICAgICAgICAg
IHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChjcmVhdGVM
aW5lYXJHcmFkaWVudChDb2xvcjo6d2hpdGUsIENvbG9yKENvbG9yOjp3aGl0ZSkuZGFyaygpLnJn
YigpLAorICAgICAgICAgICAgICAgIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4
WUNvcm5lcigpKSk7CisgICAgfQorICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUGF0aChtZWRp
YVRodW1iUm91bmRlZFJlY3RhbmdsZSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUo
KTsKKworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsK
KyAgICBVTlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7Cisg
ICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5
OjpwYWludE1lZGlhVm9sdW1lU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJM
RShWSURFTykKKyAgICBmbG9hdCBwYWQgPSByZWN0LndpZHRoKCkgKiAwLjQ1OworICAgIGZsb2F0
IHggPSByZWN0LngoKSArIHBhZDsKKyAgICBmbG9hdCB5ID0gcmVjdC55KCkgKyBwYWQ7CisgICAg
ZmxvYXQgd2lkdGggPSByZWN0LndpZHRoKCkgKiAwLjE7CisgICAgZmxvYXQgaGVpZ2h0ID0gcmVj
dC5oZWlnaHQoKSAtICgyLjAgKiBwYWQpOworCisgICAgSW50UmVjdCByZWN0Mih4LCB5LCB3aWR0
aCwgaGVpZ2h0KTsKKworICAgIHJldHVybiBwYWludFNsaWRlclRyYWNrUmVjdChvYmplY3QsIHBh
aW50SW5mbywgcmVjdDIpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ob2JqZWN0KTsKKyAgICBV
TlVTRURfUEFSQU0ocGFpbnRJbmZvKTsKKyAgICBVTlVTRURfUEFSQU0ocmVjdCk7CisgICAgcmV0
dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWlu
dE1lZGlhVm9sdW1lU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworI2lmIEVOQUJMRShWSURF
TykKKyAgICBzdGF0aWMgSW1hZ2UqIG1lZGlhVm9sdW1lVGh1bWIgPSBJbWFnZTo6bG9hZFBsYXRm
b3JtUmVzb3VyY2UoInZvbHVtZV90aHVtYiIpLmxlYWtSZWYoKTsKKworICAgIHJldHVybiBwYWlu
dE1lZGlhQnV0dG9uKHBhaW50SW5mby5jb250ZXh0LCByZWN0LCBtZWRpYVZvbHVtZVRodW1iKTsK
KyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKG9iamVjdCk7CisgICAgVU5VU0VEX1BBUkFNKHBhaW50
SW5mbyk7CisgICAgVU5VU0VEX1BBUkFNKHJlY3QpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRp
ZgorfQorCitDb2xvciBSZW5kZXJUaGVtZUJsYWNrQmVycnk6OnBsYXRmb3JtRm9jdXNSaW5nQ29s
b3IoKSBjb25zdAoreworICAgIHJldHVybiBmb2N1c1JpbmdQZW47Cit9CisKKyNpZiBFTkFCTEUo
VE9VQ0hfRVZFTlRTKQorQ29sb3IgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwbGF0Zm9ybVRhcEhp
Z2hsaWdodENvbG9yKCkgY29uc3QKK3sKKyAgICAvLyBTYW1lIGNvbG9yIGFzICdmb2N1c1JpbmdQ
ZW4nICsgODAgb2YgYWxwaGEgY2hhbm5lbC4KKyAgICByZXR1cm4gQ29sb3IoMTYzLCAyMDAsIDI1
NCwgODApOworfQorI2VuZGlmCisKK0NvbG9yIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6cGxhdGZv
cm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBD
b2xvcihzZWxlY3Rpb24pOworfQorCitkb3VibGUgUmVuZGVyVGhlbWVCbGFja0JlcnJ5Ojphbmlt
YXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKiByZW5kZXJQ
cm9ncmVzcykgY29uc3QKK3sKKyAgICByZXR1cm4gcmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5h
dGUoKSA/IDAuMCA6IDAuMTsKK30KKworZG91YmxlIFJlbmRlclRoZW1lQmxhY2tCZXJyeTo6YW5p
bWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jl
c3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlbmRlclByb2dyZXNzLT5pc0RldGVybWluYXRlKCkg
PyAwLjAgOiAyLjA7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCbGFja0JlcnJ5OjpwYWludFByb2dy
ZXNzQmFyKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFvYmplY3QtPmlzUHJvZ3Jlc3MoKSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0
b1JlbmRlclByb2dyZXNzKG9iamVjdCk7CisKKyAgICBGbG9hdFNpemUgc21hbGxDb3JuZXIoc21h
bGxSYWRpdXMsIHNtYWxsUmFkaXVzKTsKKworICAgIGluZm8uY29udGV4dC0+c2F2ZSgpOworICAg
IGluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGluZm8uY29u
dGV4dC0+c2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CisKKyAgICBpbmZvLmNvbnRleHQt
PnNldFN0cm9rZUdyYWRpZW50KGNyZWF0ZUxpbmVhckdyYWRpZW50KHJhbmdlU2xpZGVyUmVndWxh
clRvcE91dGxpbmUsIHJhbmdlU2xpZGVyUmVndWxhckJvdHRvbU91dGxpbmUsIHJlY3QubWF4WE1p
bllDb3JuZXIoKSwgcmVjdC5tYXhYTWF4WUNvcm5lcigpKSk7CisgICAgaW5mby5jb250ZXh0LT5z
ZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGllbnQocmFuZ2VTbGlkZXJSZWd1bGFyVG9w
LCByYW5nZVNsaWRlclJlZ3VsYXJCb3R0b20sIHJlY3QubWF4WE1pbllDb3JuZXIoKSwgcmVjdC5t
YXhYTWF4WUNvcm5lcigpKSk7CisKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVk
UmVjdChyZWN0LCBzbWFsbENvcm5lcik7CisgICAgaW5mby5jb250ZXh0LT5maWxsUGF0aChwYXRo
KTsKKworICAgIEludFJlY3QgcmVjdDIgPSByZWN0OworICAgIHJlY3QyLnNldFgocmVjdDIueCgp
ICsgMSk7CisgICAgcmVjdDIuc2V0SGVpZ2h0KHJlY3QyLmhlaWdodCgpIC0gMik7CisgICAgcmVj
dDIuc2V0WShyZWN0Mi55KCkgKyAxKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0eWxl
KE5vU3Ryb2tlKTsKKyAgICBpbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcygwKTsKKyAg
ICBpZiAocmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSkgeworICAgICAgICByZWN0Mi5z
ZXRXaWR0aChyZWN0Mi53aWR0aCgpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkgLSAyKTsK
KyAgICAgICAgaW5mby5jb250ZXh0LT5zZXRGaWxsR3JhZGllbnQoY3JlYXRlTGluZWFyR3JhZGll
bnQocHJvZ3Jlc3NSZWd1bGFyVG9wLCBwcm9ncmVzc1JlZ3VsYXJCb3R0b20sIHJlY3QyLm1heFhN
aW5ZQ29ybmVyKCksIHJlY3QyLm1heFhNYXhZQ29ybmVyKCkpKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICAvLyBBbmltYXRpbmcKKyAgICAgICAgcmVjdDIuc2V0V2lkdGgocmVjdDIud2lkdGgoKSAt
IDIpOworICAgICAgICBSZWZQdHI8R3JhZGllbnQ+IGdyYWRpZW50ID0gR3JhZGllbnQ6OmNyZWF0
ZShyZWN0Mi5taW5YTWF4WUNvcm5lcigpLCByZWN0Mi5tYXhYTWF4WUNvcm5lcigpKTsKKyAgICAg
ICAgZ3JhZGllbnQtPmFkZENvbG9yU3RvcCgwLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRv
bSkpOworICAgICAgICBncmFkaWVudC0+YWRkQ29sb3JTdG9wKHJlbmRlclByb2dyZXNzLT5hbmlt
YXRpb25Qcm9ncmVzcygpLCBDb2xvcihwcm9ncmVzc1JlZ3VsYXJUb3ApKTsKKyAgICAgICAgZ3Jh
ZGllbnQtPmFkZENvbG9yU3RvcCgxLjAsIENvbG9yKHByb2dyZXNzUmVndWxhckJvdHRvbSkpOwor
ICAgICAgICBpbmZvLmNvbnRleHQtPnNldEZpbGxHcmFkaWVudChncmFkaWVudCk7CisgICAgfQor
ICAgIFBhdGggcGF0aDI7CisgICAgcGF0aDIuYWRkUm91bmRlZFJlY3QocmVjdDIsIHNtYWxsQ29y
bmVyKTsKKyAgICBpbmZvLmNvbnRleHQtPmZpbGxQYXRoKHBhdGgyKTsKKworICAgIGluZm8uY29u
dGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYmxhY2tiZXJyeS9S
ZW5kZXJUaGVtZUJsYWNrQmVycnkuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2JsYWNrYmVy
cnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uODM3ZjE3OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2JsYWNrYmVycnkvUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKwor
I2lmbmRlZiBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAorI2RlZmluZSBSZW5kZXJUaGVtZUJsYWNr
QmVycnlfaAorCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBSZW5kZXJUaGVtZUJsYWNrQmVycnkgOiBwdWJsaWMgUmVuZGVyVGhlbWUgewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKyAg
ICB2aXJ0dWFsIH5SZW5kZXJUaGVtZUJsYWNrQmVycnkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5n
IGV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0
dWFsIFN0cmluZyBleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCk7CisgICAgdmlydHVhbCBT
dHJpbmcgZm9ybWF0TWVkaWFDb250cm9sc1JlbWFpbmluZ1RpbWUoZmxvYXQgY3VycmVudFRpbWUs
IGZsb2F0IGR1cmF0aW9uKSBjb25zdDsKKyNlbmRpZgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0
c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAg
dmlydHVhbCBkb3VibGUgY2FyZXRCbGlua0ludGVydmFsKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFs
IHZvaWQgc3lzdGVtRm9udChpbnQgY3NzVmFsdWVJZCwgRm9udERlc2NyaXB0aW9uJikgY29uc3Q7
CisgICAgdmlydHVhbCBib29sIHBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRDaGVja2JveFNp
emUoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVh
bCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIHZpcnR1YWwgYm9v
bCBwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0Jik7CisgICAgdm9pZCBjYWxjdWxhdGVCdXR0b25TaXplKFJlbmRlclN0eWxlKikgY29uc3Q7
CisgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3Rvcios
IFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1l
bnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxl
KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBw
YWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgdmlydHVhbCBDb2xvciBw
bGF0Zm9ybVRhcEhpZ2hsaWdodENvbG9yKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHZpcnR1YWwg
Q29sb3IgcGxhdGZvcm1Gb2N1c1JpbmdDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBz
dXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0IHsgcmV0dXJu
IHN0eWxlLT5oYXNBcHBlYXJhbmNlKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7
CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRU
ZXh0RmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYp
OworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWlu
dFRleHRBcmVhKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3Qm
KTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2Vs
ZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQg
YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVu
ZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNo
RmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwor
ICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHls
ZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0Q2hlY2tib3hTdHls
ZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAg
dmlydHVhbCB2b2lkIGFkanVzdFJhZGlvU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0
eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVTbGlkZXJUcmFjayhSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVh
bCBib29sIHBhaW50TWVkaWFTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFWb2x1bWVT
bGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0
Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCos
IGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIGRvdWJs
ZSBhbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikg
Y29uc3Q7CisgICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0Jh
cihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OworCisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFj
dGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0
YXRpYyBjb25zdCBTdHJpbmcmIGRlZmF1bHRHVUlGb250KCk7CisKKyAgICAvLyBUaGUgZGVmYXVs
dCB2YXJpYWJsZS13aWR0aCBmb250IHNpemUuIFdlIHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGZv
bnQKKyAgICAvLyBzaXplIGZvciB0aGUgInN5c3RlbSBmb250IiwgYW5kIGFzIGEgYmFzZSBzaXpl
ICh3aGljaCB3ZSB0aGVuIHNocmluaykgZm9yCisgICAgLy8gZm9ybSBjb250cm9sIGZvbnRzLgor
ICAgIHN0YXRpYyBmbG9hdCBkZWZhdWx0Rm9udFNpemU7CisKKyAgICBSZW5kZXJUaGVtZUJsYWNr
QmVycnkoKTsKKyAgICB2b2lkIHNldEJ1dHRvblN0eWxlKFJlbmRlclN0eWxlKikgY29uc3Q7CisK
KyAgICB2b2lkIHBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudEFuZEFycm93KEdyYXBoaWNzQ29u
dGV4dCosIFJlbmRlck9iamVjdCosIEludFJlY3QgYnV0dG9uUmVjdCwgY29uc3QgUGF0aCYgY2xp
cFBhdGgpOworICAgIGJvb2wgcGFpbnRUZXh0RmllbGRPclRleHRBcmVhT3JTZWFyY2hGaWVsZChS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgYm9v
bCBwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgYm9vbCBwYWludFNsaWRlclRyYWNrUmVjdChSZW5kZXJPYmpl
Y3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0JiwgUkdCQTMyIHN0cm9rZUNvbG9y
U3RhcnQsCisgICAgICAgICAgICAgICAgUkdCQTMyIHN0cm9rZUNvbG9yRW5kLCBSR0JBMzIgZmls
bENvbG9yU3RhcnQsIFJHQkEzMiBmaWxsQ29sb3JFbmQpOworCit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZW5kZXJUaGVtZUJsYWNrQmVycnlfaAotLSAKMS43LjUu
NAoK
</data>

          </attachment>
      

    </bug>

</bugzilla>