<?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>79874</bug_id>
          
          <creation_ts>2012-02-28 22:35:29 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream LayerRenderer.{h, cpp}</short_desc>
          <delta_ts>2012-03-06 05:15:27 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</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>73119</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Robin Cao">robin.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>arvid2.nilsson</cc>
    
    <cc>charles.wei</cc>
    
    <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>567388</commentid>
    <comment_count>0</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-02-28 22:35:29 -0800</bug_when>
    <thetext>LayerRenderer is the class that takes care of drawing of composited layers using GLES2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567650</commentid>
    <comment_count>1</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-29 08:48:18 -0800</bug_when>
    <thetext>Note that we currently have this warning:

Source/WebCore/platform/graphics/blackberry/LayerRenderer.h: In constructor &apos;WebCore::LayerRenderer::LayerRenderer(BlackBerry::Platform::Graphics::GLES2Context*)&apos;:
Source/WebCore/platform/graphics/blackberry/LayerRenderer.h:191: warning: &apos;WebCore::LayerRenderer::m_needsCommit&apos; will be initialized after
ource/WebCore/platform/graphics/blackberry/LayerRenderer.h:150: warning:   &apos;unsigned int WebCore::LayerRenderer::m_colorProgramObject&apos;

Would be great to fix this in the upstreaming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568621</commentid>
    <comment_count>2</comment_count>
      <attachid>129696</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 06:24:32 -0800</bug_when>
    <thetext>Created attachment 129696
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570196</commentid>
    <comment_count>3</comment_count>
      <attachid>129696</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-03-03 18:14:02 -0800</bug_when>
    <thetext>Comment on attachment 129696
patch

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

Looks good to me, but we might need another round (see comment below)

&gt; Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp:51
&gt; +
&gt; +#define DEBUG_VIDEO_CLIPPING 0

drop blank line

&gt; Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp:340
&gt; +bool LayerRenderer::useSurface(RenderSurface* surface)

I think Niko asked you to rename RenderSurface to something else, right?

So this will need another  round :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>571741</commentid>
    <comment_count>4</comment_count>
      <attachid>130356</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-06 04:48:35 -0800</bug_when>
    <thetext>Created attachment 130356
patch-for-landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>571743</commentid>
    <comment_count>5</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-06 04:51:36 -0800</bug_when>
    <thetext>The blank line is removed, and all references to RenderSurface are updated in the revised patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>571746</commentid>
    <comment_count>6</comment_count>
      <attachid>130356</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-03-06 04:58:56 -0800</bug_when>
    <thetext>Comment on attachment 130356
patch-for-landing

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

&gt; Source/WebCore/platform/graphics/blackberry/LayerRenderer.cpp:505
&gt; +{
&gt; +
&gt; +    // The contract for LayerCompositingThread::setLayerRenderer is it must be set if the layer has been rendered.

:o</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>571757</commentid>
    <comment_count>7</comment_count>
      <attachid>130356</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-06 05:15:22 -0800</bug_when>
    <thetext>Comment on attachment 130356
patch-for-landing

Clearing flags on attachment: 130356

Committed r109908: &lt;http://trac.webkit.org/changeset/109908&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>571758</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-06 05:15:27 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129696</attachid>
            <date>2012-03-01 06:24:32 -0800</date>
            <delta_ts>2012-03-06 04:48:21 -0800</delta_ts>
            <desc>patch</desc>
            <filename>bug-79874-20120301222423.patch</filename>
            <type>text/plain</type>
            <size>57935</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MzAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmJjMWIzZmZmMjZjZTY2
ZjM1YTA0YzgyNThiZThlMzZjMWQyYWM3OS4uMWM2NzUzNjRkZjU5ZTgyOTA4ZmRmZTUzZmYxNTJi
MmY5MWZiYzVkOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDEyLTAzLTAxICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBMYXllclJlbmRlcmVyLntoLCBjcHB9CisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03OTg3NAorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0
cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJSZW5kZXJl
ci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpjaGVj
a0dMRXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6bG9hZFNoYWRlcik6CisgICAgICAgIChXZWJD
b3JlOjpsb2FkU2hhZGVyUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpvcnRob01hdHJpeCk6
CisgICAgICAgIChXZWJDb3JlOjpyYXdQdHJWZWN0b3JGcm9tUmVmUHRyVmVjdG9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclJlbmRlcmVyOjpMYXllclJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVu
ZGVyZXI6On5MYXllclJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6
OnJlbGVhc2VMYXllclJlc291cmNlcyk6CisgICAgICAgIChXZWJDb3JlOjpjb21wYXJlTGF5ZXJa
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OmRyYXdMYXllcnMpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6dXNlU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclJlbmRlcmVyOjpkcmF3TGF5ZXJzT25TdXJmYWNlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclJlbmRlcmVyOjpzZXRSb290TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJS
ZW5kZXJlcjo6YWRkTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6cmVt
b3ZlTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6YWRkTGF5ZXJUb1Jl
bGVhc2VUZXh0dXJlUmVzb3VyY2VzTGlzdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRl
cmVyOjp0b09wZW5HTFdpbmRvd0Nvb3JkaW5hdGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
UmVuZGVyZXI6OnRvV2ViS2l0V2luZG93Q29vcmRpbmF0ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJSZW5kZXJlcjo6dG9XZWJLaXREb2N1bWVudENvb3JkaW5hdGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyUmVuZGVyZXI6OmRyYXdEZWJ1Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclJlbmRlcmVyOjpkcmF3SG9sZVB1bmNoUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclJlbmRlcmVyOjp1cGRhdGVMYXllcnNSZWN1cnNpdmUpOgorICAgICAgICAoV2ViQ29yZTo6
aGFzUm90YXRpb25hbENvbXBvbmVudCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVy
OjpsYXllckFscmVhZHlPblN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6Y29sbGVjdDNEUHJl
c2VydmluZ0xheWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpjb21wb3Np
dGVMYXllcnNSZWN1cnNpdmUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6dXBk
YXRlU2Npc3NvcklmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6Om1h
a2VDb250ZXh0Q3VycmVudCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpiaW5k
Q29tbW9uQXR0cmliTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6
aW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRl
cmluZ1Jlc3VsdHM6OmhvbGVQdW5jaFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5k
ZXJpbmdSZXN1bHRzOjphZGRIb2xlUHVuY2hSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
UmVuZGVyaW5nUmVzdWx0czo6YWRkRGlydHlSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
UmVuZGVyaW5nUmVzdWx0czo6aXNFbXB0eSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9MYXllclJlbmRlcmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChMYXllclJlbmRlcmluZ1Jlc3VsdHMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJS
ZW5kZXJpbmdSZXN1bHRzOjpMYXllclJlbmRlcmluZ1Jlc3VsdHMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJpbmdSZXN1bHRzOjpob2xlUHVuY2hSZWN0U2l6ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllclJlbmRlcmluZ1Jlc3VsdHM6OmRpcnR5UmVjdCk6CisgICAgICAgIChMYXll
clJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OnJvb3RMYXllcik6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpoYXJkd2FyZUNvbXBvc2l0aW5nKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OnNldENsZWFyU3VyZmFjZU9uRHJhd0xh
eWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpjbGVhclN1cmZhY2VPbkRy
YXdMYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6Y29udGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpsYXN0UmVuZGVyaW5nUmVzdWx0cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpzZXROZWVkc0NvbW1pdCk6CisKIDIwMTIt
MDItMjkgIEphc29uIExpdSAgPGphc29uLmxpdUB0b3JjaG1vYmlsZS5jb20uY24+CiAKICAgICAg
ICAgW0JsYWNrQmVycnldTWFrZSBhYm91dDpjYWNoZSBmZWF0dXJlIGF2YWlsYWJsZSBpbiByZWxl
YXNlIHZlcnNpb24uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ibGFja2JlcnJ5L0xheWVyUmVuZGVyZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZDY4ZDg3
ZTcyYjBkYzg2ZjU3MWNmOTEyYzFhMjI1YmYwYTc5M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclJlbmRlcmVyLmNw
cApAQCAtMCwwICsxLDExMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIw
MTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1
ZGUgIkxheWVyUmVuZGVyZXIuaCIKKworI2luY2x1ZGUgIkxheWVyQ29tcG9zaXRpbmdUaHJlYWQu
aCIKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5oIgorCisjaW5jbHVk
ZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+
CisKKyNkZWZpbmUgRU5BQkxFX1NDSVNTT1IgMQorCisjZGVmaW5lIERFQlVHX1NIQURFUl9DT01Q
SUxBVElPTiAwCisjZGVmaW5lIERFQlVHX0RJUlRZX0xBWUVSUyAwIC8vIFNob3cgZGlydHkgbGF5
ZXJzIGFzIHJlZC4KKyNkZWZpbmUgREVCVUdfTEFZRVJfQU5JTUFUSU9OUyAwIC8vIFNob3cgcnVu
bmluZyBhbmltYXRpb25zIGFzIGdyZWVuLgorCisjZGVmaW5lIERFQlVHX1ZJREVPX0NMSVBQSU5H
IDAKKwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQ7
Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2
b2lkIGNoZWNrR0xFcnJvcigpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGlmIChHTGVudW0gZXJy
b3IgPSBnbEdldEVycm9yKCkpCisgICAgICAgIExPR19FUlJPUigiR0wgRXJyb3I6IDB4JXggIiAs
IGVycm9yKTsKKyNlbmRpZgorfQorCitzdGF0aWMgR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHR5
cGUsIGNvbnN0IGNoYXIqIHNoYWRlclNvdXJjZSkKK3sKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xD
cmVhdGVTaGFkZXIodHlwZSk7CisgICAgaWYgKCFzaGFkZXIpCisgICAgICAgIHJldHVybiAwOwor
ICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnNoYWRlclNvdXJjZSwgMCk7CisgICAgZ2xD
b21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgR0xpbnQgY29tcGlsZWQ7CisgICAgZ2xHZXRTaGFk
ZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOworICAgIGlmICghY29t
cGlsZWQpIHsKKyNpZiBERUJVR19TSEFERVJfQ09NUElMQVRJT04KKyAgICAgICAgY2hhciBpbmZv
TG9nWzIwNDhdOworICAgICAgICBHTHNpemVpIGxlbmd0aDsKKyAgICAgICAgZ2xHZXRTaGFkZXJJ
bmZvTG9nKHNoYWRlciwgMjA0OCwgJmxlbmd0aCwgaW5mb0xvZyk7CisgICAgICAgIGZwcmludGYo
c3RkZXJyLCAiRmFpbGVkIHRvIGNvbXBpbGUgc2hhZGVyOiAlcyIsIGluZm9Mb2cpOworI2VuZGlm
CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIHJldHVybiAwOworICAg
IH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCitzdGF0aWMgR0x1aW50IGxvYWRTaGFkZXJQcm9n
cmFtKGNvbnN0IGNoYXIqIHZlcnRleFNoYWRlclNvdXJjZSwgY29uc3QgY2hhciogZnJhZ21lbnRT
aGFkZXJTb3VyY2UpCit7CisgICAgR0x1aW50IHZlcnRleFNoYWRlcjsKKyAgICBHTHVpbnQgZnJh
Z21lbnRTaGFkZXI7CisgICAgR0x1aW50IHByb2dyYW1PYmplY3Q7CisgICAgR0xpbnQgbGlua2Vk
OworICAgIHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgdmVydGV4
U2hhZGVyU291cmNlKTsKKyAgICBpZiAoIXZlcnRleFNoYWRlcikKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgZnJhZ21lbnRTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgZnJh
Z21lbnRTaGFkZXJTb3VyY2UpOworICAgIGlmICghZnJhZ21lbnRTaGFkZXIpIHsKKyAgICAgICAg
Z2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
ICAgIHByb2dyYW1PYmplY3QgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbU9i
amVjdCkgeworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtT2JqZWN0LCB2ZXJ0ZXhTaGFk
ZXIpOworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtT2JqZWN0LCBmcmFnbWVudFNoYWRl
cik7CisgICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbU9iamVjdCk7CisgICAgICAgIGdsR2V0
UHJvZ3JhbWl2KHByb2dyYW1PYmplY3QsIEdMX0xJTktfU1RBVFVTLCAmbGlua2VkKTsKKyAgICAg
ICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtT2Jq
ZWN0KTsKKyAgICAgICAgICAgIHByb2dyYW1PYmplY3QgPSAwOworICAgICAgICB9CisgICAgfQor
ICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgZ2xEZWxldGVTaGFkZXIoZnJh
Z21lbnRTaGFkZXIpOworICAgIHJldHVybiBwcm9ncmFtT2JqZWN0OworfQorCitzdGF0aWMgVHJh
bnNmb3JtYXRpb25NYXRyaXggb3J0aG9NYXRyaXgoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZs
b2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyWiwgZmxvYXQgZmFyWikKK3sKKyAgICBm
bG9hdCBkZWx0YVggPSByaWdodCAtIGxlZnQ7CisgICAgZmxvYXQgZGVsdGFZID0gdG9wIC0gYm90
dG9tOworICAgIGZsb2F0IGRlbHRhWiA9IGZhclogLSBuZWFyWjsKKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBvcnRobzsKKyAgICBpZiAoIWRlbHRhWCB8fCAhZGVsdGFZIHx8ICFkZWx0YVopCisg
ICAgICAgIHJldHVybiBvcnRobzsKKyAgICBvcnRoby5zZXRNMTEoMi4wZiAvIGRlbHRhWCk7Cisg
ICAgb3J0aG8uc2V0TTQxKC0ocmlnaHQgKyBsZWZ0KSAvIGRlbHRhWCk7CisgICAgb3J0aG8uc2V0
TTIyKDIuMGYgLyBkZWx0YVkpOworICAgIG9ydGhvLnNldE00MigtKHRvcCArIGJvdHRvbSkgLyBk
ZWx0YVkpOworICAgIG9ydGhvLnNldE0zMygtMi4wZiAvIGRlbHRhWik7CisgICAgb3J0aG8uc2V0
TTQzKC0obmVhclogKyBmYXJaKSAvIGRlbHRhWik7CisgICAgcmV0dXJuIG9ydGhvOworfQorCitz
dGF0aWMgVmVjdG9yPExheWVyQ29tcG9zaXRpbmdUaHJlYWQqPiByYXdQdHJWZWN0b3JGcm9tUmVm
UHRyVmVjdG9yKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4gPiYg
c3VibGF5ZXJzKQoreworICAgIFZlY3RvcjxMYXllckNvbXBvc2l0aW5nVGhyZWFkKj4gc3VibGF5
ZXJMaXN0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsr
KQorICAgICAgICBzdWJsYXllckxpc3QuYXBwZW5kKHN1YmxheWVyc1tpXS5nZXQoKSk7CisKKyAg
ICByZXR1cm4gc3VibGF5ZXJMaXN0OworfQorCitQYXNzT3duUHRyPExheWVyUmVuZGVyZXI+IExh
eWVyUmVuZGVyZXI6OmNyZWF0ZShHTEVTMkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgcmV0dXJu
IGFkb3B0UHRyKG5ldyBMYXllclJlbmRlcmVyKGNvbnRleHQpKTsKK30KKworTGF5ZXJSZW5kZXJl
cjo6TGF5ZXJSZW5kZXJlcihHTEVTMkNvbnRleHQqIGNvbnRleHQpCisgICAgOiBtX2NvbG9yUHJv
Z3JhbU9iamVjdCgwKQorICAgICwgbV9jaGVja2VyUHJvZ3JhbU9iamVjdCgwKQorICAgICwgbV9w
b3NpdGlvbkxvY2F0aW9uKDApCisgICAgLCBtX3RleENvb3JkTG9jYXRpb24oMSkKKyAgICAsIG1f
ZmJvKDApCisgICAgLCBtX2N1cnJlbnRSZW5kZXJTdXJmYWNlKDApCisgICAgLCBtX2NsZWFyU3Vy
ZmFjZU9uRHJhd0xheWVycyh0cnVlKQorICAgICwgbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBt
X25lZWRzQ29tbWl0KGZhbHNlKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRh
OjpOdW1iZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnM7ICsraSkKKyAgICAgICAgbV9sYXllclByb2dy
YW1PYmplY3RbaV0gPSAwOworCisgICAgbV9oYXJkd2FyZUNvbXBvc2l0aW5nID0gaW5pdGlhbGl6
ZVNoYXJlZEdMT2JqZWN0cygpOworfQorCitMYXllclJlbmRlcmVyOjp+TGF5ZXJSZW5kZXJlcigp
Cit7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgaWYgKG1fZmJvKQorICAgICAgICBn
bERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbV9mYm8pOworICAgIGdsRGVsZXRlUHJvZ3JhbShtX2Nv
bG9yUHJvZ3JhbU9iamVjdCk7CisgICAgZ2xEZWxldGVQcm9ncmFtKG1fY2hlY2tlclByb2dyYW1P
YmplY3QpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVy
UHJvZ3JhbVNoYWRlcnM7ICsraSkKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fbGF5ZXJQcm9n
cmFtT2JqZWN0W2ldKTsKKyAgICBpZiAobV9oYXJkd2FyZUNvbXBvc2l0aW5nKSB7CisgICAgICAg
IC8vIEZyZWUgdXAgYWxsIEdMIHRleHR1cmVzLgorICAgICAgICB3aGlsZSAobV9sYXllcnMuYmVn
aW4oKSAhPSBtX2xheWVycy5lbmQoKSkgeworICAgICAgICAgICAgTGF5ZXJTZXQ6Oml0ZXJhdG9y
IGl0ZXIgPSBtX2xheWVycy5iZWdpbigpOworICAgICAgICAgICAgKCppdGVyKS0+ZGVsZXRlVGV4
dHVyZXMoKTsKKyAgICAgICAgICAgICgqaXRlciktPnNldExheWVyUmVuZGVyZXIoMCk7CisgICAg
ICAgICAgICByZW1vdmVMYXllcigqaXRlcik7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0dXJl
Q2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBMYXll
clJlbmRlcmVyOjpyZWxlYXNlTGF5ZXJSZXNvdXJjZXMoKQoreworICAgIGlmIChtX2hhcmR3YXJl
Q29tcG9zaXRpbmcpIHsKKyAgICAgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgICAgIC8v
IEZyZWUgdXAgYWxsIEdMIHRleHR1cmVzLgorICAgICAgICBmb3IgKExheWVyU2V0OjppdGVyYXRv
ciBpdGVyID0gbV9sYXllcnMuYmVnaW4oKTsgaXRlciAhPSBtX2xheWVycy5lbmQoKTsgKytpdGVy
KQorICAgICAgICAgICAgKCppdGVyKS0+ZGVsZXRlVGV4dHVyZXMoKTsKKworICAgICAgICB0ZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5jbGVhcigpOworICAgIH0KK30KKworc3RhdGlj
IGlubGluZSBib29sIGNvbXBhcmVMYXllclooY29uc3QgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCog
YSwgY29uc3QgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogYikKK3sKKyAgICBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtQSA9IGEtPmRyYXdUcmFuc2Zvcm0oKTsKKyAgICBjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtQiA9IGItPmRyYXdUcmFuc2Zvcm0oKTsK
KworICAgIHJldHVybiB0cmFuc2Zvcm1BLm00MygpIDwgdHJhbnNmb3JtQi5tNDMoKTsKK30KKwor
Ly8gUmUtY29tcG9zaXRlcyBhbGwgc3VibGF5ZXJzLgordm9pZCBMYXllclJlbmRlcmVyOjpkcmF3
TGF5ZXJzKGNvbnN0IEZsb2F0UmVjdCYgdmlzaWJsZVJlY3QsIGNvbnN0IEludFJlY3QmIGxheW91
dFJlY3QsIGNvbnN0IEludFNpemUmIGNvbnRlbnRzU2l6ZSwgY29uc3QgSW50UmVjdCYgZHN0UmVj
dCkKK3sKKyAgICBBU1NFUlQobV9oYXJkd2FyZUNvbXBvc2l0aW5nKTsKKworICAgIGJvb2wgd2Fz
RW1wdHkgPSBtX2xhc3RSZW5kZXJpbmdSZXN1bHRzLmlzRW1wdHkoKTsKKyAgICBtX2xhc3RSZW5k
ZXJpbmdSZXN1bHRzID0gTGF5ZXJSZW5kZXJpbmdSZXN1bHRzKCk7CisgICAgbV9sYXN0UmVuZGVy
aW5nUmVzdWx0cy53YXNFbXB0eSA9IHdhc0VtcHR5OworCisgICAgaWYgKCFtX3Jvb3RMYXllcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhlc2UgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBj
YWxjdWxhdGUgcG9zaXRpb24gb2YgZml4ZWQgcG9zaXRpb24gZWxlbWVudHMKKyAgICBtX3Zpc2li
bGVSZWN0ID0gdmlzaWJsZVJlY3Q7CisgICAgbV9sYXlvdXRSZWN0ID0gbGF5b3V0UmVjdDsKKyAg
ICBtX2NvbnRlbnRzU2l6ZSA9IGNvbnRlbnRzU2l6ZTsKKworICAgIC8vIFdlYktpdCB1c2VzIHJv
dyB2ZWN0b3JzIHdoaWNoIGFyZSBtdWx0aXBsaWVkIGJ5IHRoZSBtYXRyaXggb24gdGhlIGxlZnQg
KGkuZS4gdipNKQorICAgIC8vIFRyYW5zZm9ybWF0aW9ucyBhcmUgY29tcG9zZWQgb24gdGhlIGxl
ZnQgc28gdGhhdCBNMS54Zm9ybShNMikgbWVhbnMgTTIqTTEKKyAgICAvLyBXZSB0aGVyZWZvcmUg
c3RhcnQgd2l0aCBvdXIgKG90aG9nb25hbCkgcHJvamVjdGlvbiBtYXRyaXgsIHdoaWNoIHdpbGwg
YmUgYXBwbGllZAorICAgIC8vIGFzIHRoZSBsYXN0IHRyYW5zZm9ybWF0aW9uLgorICAgIFRyYW5z
Zm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9IG9ydGhvTWF0cml4KDAsIHZpc2libGVSZWN0LndpZHRo
KCksIHZpc2libGVSZWN0LmhlaWdodCgpLCAwLCAtMTAwMCwgMTAwMCk7CisgICAgbWF0cml4LnRy
YW5zbGF0ZTNkKC12aXNpYmxlUmVjdC54KCksIC12aXNpYmxlUmVjdC55KCksIDApOworCisgICAg
Ly8gT3BlbkdMIHdpbmRvdyBjb29yZGluYXRlcyBvcmlnaW4gaXMgYXQgdGhlIGxvd2VyIGxlZnQg
Y29ybmVyIG9mIHRoZSBzdXJmYWNlIHdoaWxlCisgICAgLy8gV2ViS2l0IHVzZXMgdXBwZXIgbGVm
dCBhcyB0aGUgb3JpZ2luIG9mIHRoZSB3aW5kb3cgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBwYXNz
ZWQgaW4gJ2RzdFJlY3QnCisgICAgLy8gaXMgaW4gV2ViS2l0IHdpbmRvdyBjb29yZGluYXRlIHN5
c3RlbS4gSGVyZSB3ZSBzZXR1cCB0aGUgdmlld3BvcnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFs
dWUKKyAgICAvLyBpbiBPcGVuR0wgd2luZG93IGNvb3JkaW5hdGVzLgorICAgIGludCB2aWV3cG9y
dFkgPSBzdGQ6Om1heCgwLCBtX2NvbnRleHQtPnN1cmZhY2VTaXplKCkuaGVpZ2h0KCkgLSBkc3RS
ZWN0Lm1heFkoKSk7CisgICAgbV92aWV3cG9ydCA9IEludFJlY3QoZHN0UmVjdC54KCksIHZpZXdw
b3J0WSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpKTsKKworICAgIGRvdWJsZSBh
bmltYXRpb25UaW1lID0gY3VycmVudFRpbWUoKTsKKworI2lmIERFQlVHX1ZJREVPX0NMSVBQSU5H
CisgICAgLy8gSW52b2tpbmcgdXBkYXRlTGF5ZXJzUmVjdXJzaXZlKCkgd2hpY2ggd2lsbCBjYWxs
IExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0oKS4KKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJM
YXllclJlbmRlcmVyOjpkcmF3TGF5ZXJzKCkgdmlzaWJsZT0oeD0lLjJmLHk9JS4yZix3aWR0aD0l
LjJmLGhlaWdodD0lLjJmKSwgbGF5b3V0PSh4PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKSwg
Y29udGVudHM9KCVkeCVkKSwgZHN0PSh4PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKS4iLAor
ICAgICAgICB2aXNpYmxlUmVjdC54KCksIHZpc2libGVSZWN0LnkoKSwgdmlzaWJsZVJlY3Qud2lk
dGgoKSwgdmlzaWJsZVJlY3QuaGVpZ2h0KCksCisgICAgICAgIGxheW91dFJlY3QueCgpLCBsYXlv
dXRSZWN0LnkoKSwgbGF5b3V0UmVjdC53aWR0aCgpLCBsYXlvdXRSZWN0LmhlaWdodCgpLAorICAg
ICAgICBjb250ZW50c1NpemUud2lkdGgoKSwgY29udGVudHNTaXplLmhlaWdodCgpLAorICAgICAg
ICBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWln
aHQoKSk7CisjZW5kaWYKKworICAgIFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZD4gPiBzdXJmYWNlTGF5ZXJzOworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3Np
dGluZ1RocmVhZD4gPiYgc3VibGF5ZXJzID0gbV9yb290TGF5ZXItPmdldFN1YmxheWVycygpOwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7CisgICAg
ICAgIGZsb2F0IG9wYWNpdHkgPSAxOworICAgICAgICBGbG9hdFJlY3QgY2xpcFJlY3QoLTEsIC0x
LCAyLCAyKTsKKyAgICAgICAgdXBkYXRlTGF5ZXJzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQo
KSwgbWF0cml4LCBzdXJmYWNlTGF5ZXJzLCBvcGFjaXR5LCBjbGlwUmVjdCwgYW5pbWF0aW9uVGlt
ZSk7CisgICAgfQorCisgICAgLy8gRGVjb21wb3NlIHRoZSBkaXJ0eSByZWN0IGludG8gYSBzZXQg
b2Ygbm9uLW92ZXJsYXBpbmcgcmVjdGFuZ2xlcworICAgIC8vICh0aGV5IG5lZWQgdG8gbm90IG92
ZXJsYXAgc28gdGhhdCB0aGUgYmxlbmRpbmcgY29kZSBkb2Vzbid0IGRyYXcgYW55IHJlZ2lvbiB0
d2ljZSkuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMYXllclJlbmRlcmluZ1Jlc3VsdHM6Ok51
bWJlck9mRGlydHlSZWN0czsgKytpKSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uIHJlZ2lvbihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdChtX2xhc3RS
ZW5kZXJpbmdSZXN1bHRzLmRpcnR5UmVjdChpKSkpOworICAgICAgICBtX2xhc3RSZW5kZXJpbmdS
ZXN1bHRzLmRpcnR5UmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246
OnVuaW9uUmVnaW9ucyhtX2xhc3RSZW5kZXJpbmdSZXN1bHRzLmRpcnR5UmVnaW9uLCByZWdpb24p
OworICAgIH0KKworICAgIC8vIElmIHdlIHdvbid0IGRyYXcgYW55dGhpbmcsIGRvbid0IHRvdWNo
IHRoZSBPcGVuR0wgQVBJcy4KKyAgICBpZiAobV9sYXN0UmVuZGVyaW5nUmVzdWx0cy5pc0VtcHR5
KCkgJiYgd2FzRW1wdHkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE9rYXksIHdlJ3JlIGdv
aW5nIHRvIGRvIHNvbWUgZHJhd2luZy4KKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKKworICAg
IGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobV9wb3NpdGlvbkxvY2F0aW9uKTsKKyAgICBnbEVu
YWJsZVZlcnRleEF0dHJpYkFycmF5KG1fdGV4Q29vcmRMb2NhdGlvbik7CisgICAgZ2xBY3RpdmVU
ZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAg
Z2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUKTsK
KworICAgIC8vIElmIGN1bGxpbmcgaXMgZW5hYmxlZCB0aGVuIHdlIHdpbGwgY3VsbCB0aGUgYmFj
a2ZhY2UuCisgICAgZ2xDdWxsRmFjZShHTF9CQUNLKTsKKyAgICAvLyBUaGUgb3J0aG9ncmFwaGlj
IHByb2plY3Rpb24gaXMgc2V0dXAgc3VjaCB0aGF0IFkgc3RhcnRzIGF0IHplcm8gYW5kCisgICAg
Ly8gaW5jcmVhc2VzIGdvaW5nIGRvd24gdGhlIHBhZ2Ugd2hpY2ggZmxpcHMgdGhlIHdpbmRpbmcg
b3JkZXIgb2YgdHJpYW5nbGVzLgorICAgIC8vIFRoZSBsYXllciBxdWFkcyBhcmUgZHJhd24gaW4g
Y2xvY2std2lzZSBvcmRlciBzbyB0aGUgZnJvbnQgZmFjZSBpcyBDQ1cuCisgICAgZ2xGcm9udEZh
Y2UoR0xfQ0NXKTsKKworICAgIC8vIFRoZSBzaGFkZXIgdXNlZCB0byByZW5kZXIgbGF5ZXJzIHJl
dHVybnMgcHJlLW11bHRpcGxpZWQgYWxwaGEgY29sb3JzCisgICAgLy8gc28gd2UgbmVlZCB0byBz
ZW5kIHRoZSBibGVuZGluZyBtb2RlIGFwcHJvcHJpYXRlbHkuCisgICAgZ2xFbmFibGUoR0xfQkxF
TkQpOworICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisK
KyAgICAvLyBVcGRhdGUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjaGVja2VyYm9hcmQgZHJhd2lu
Zy4KKyAgICBnbFVzZVByb2dyYW0obV9jaGVja2VyUHJvZ3JhbU9iamVjdCk7CisgICAgZmxvYXQg
Yml0bWFwU2NhbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4obV9sYXlvdXRSZWN0LndpZHRoKCkpIC8g
c3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fdmlzaWJsZVJlY3Qud2lkdGgoKSk7CisgICAgZ2xVbmlmb3Jt
MWYobV9jaGVja2VyU2NhbGVMb2NhdGlvbiwgYml0bWFwU2NhbGUpOworICAgIGZsb2F0IHNjYWxl
ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRzdFJlY3Qud2lkdGgoKSkgLyBzdGF0aWNfY2FzdDxmbG9h
dD4obV92aXNpYmxlUmVjdC53aWR0aCgpKTsKKyAgICBnbFVuaWZvcm0yZihtX2NoZWNrZXJPcmln
aW5Mb2NhdGlvbiwgbV92aXNpYmxlUmVjdC54KCkqc2NhbGUsIG1fdmlzaWJsZVJlY3QueSgpKnNj
YWxlKTsKKyAgICBnbFVuaWZvcm0xZihtX2NoZWNrZXJTdXJmYWNlSGVpZ2h0TG9jYXRpb24sIG1f
Y29udGV4dC0+c3VyZmFjZVNpemUoKS5oZWlnaHQoKSk7CisKKyAgICBjaGVja0dMRXJyb3IoKTsK
KworICAgIC8vIElmIHNvbWUgbGF5ZXJzIHNob3VsZCBiZSBkcmF3ZWQgb24gdGVtcG9yYXJ5IHN1
cmZhY2VzLCB3ZSBzaG91bGQgZG8gaXQgZmlyc3QuCisgICAgZHJhd0xheWVyc09uU3VyZmFjZXMo
c3VyZmFjZUxheWVycyk7CisKKyNpZiBFTkFCTEVfU0NJU1NPUgorICAgIG1fc2Npc3NvclJlY3Qg
PSBtX3ZpZXdwb3J0OworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xTY2lz
c29yKG1fc2Npc3NvclJlY3QueCgpLCBtX3NjaXNzb3JSZWN0LnkoKSwgbV9zY2lzc29yUmVjdC53
aWR0aCgpLCBtX3NjaXNzb3JSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgZ2xDbGVhclN0
ZW5jaWwoMCk7CisgICAgaWYgKG1fY2xlYXJTdXJmYWNlT25EcmF3TGF5ZXJzKSB7CisgICAgICAg
IGdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKKyAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZG
RVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Cisg
ICAgfQorCisgICAgLy8gRG9uJ3QgcmVuZGVyIHRoZSByb290IGxheWVyLCB0aGUgQmxhY2tCZXJy
eSBwb3J0IHVzZXMgdGhlIEJhY2tpbmdTdG9yZSB0byBkcmF3IHRoZQorICAgIC8vIHJvb3QgbGF5
ZXIuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspIHsK
KyAgICAgICAgaW50IGN1cnJlbnRTdGVuY2lsVmFsdWUgPSAwOworICAgICAgICBGbG9hdFJlY3Qg
Y2xpcFJlY3QoLTEsIC0xLCAyLCAyKTsKKyAgICAgICAgY29tcG9zaXRlTGF5ZXJzUmVjdXJzaXZl
KHN1YmxheWVyc1tpXS5nZXQoKSwgY3VycmVudFN0ZW5jaWxWYWx1ZSwgY2xpcFJlY3QpOworICAg
IH0KKworICAgIG1fY29udGV4dC0+c3dhcEJ1ZmZlcnMoKTsKKworICAgIExheWVyU2V0OjppdGVy
YXRvciBpdGVyID0gbV9sYXllcnNMb2NraW5nVGV4dHVyZVJlc291cmNlcy5iZWdpbigpOworICAg
IGZvciAoOyBpdGVyICE9IG1fbGF5ZXJzTG9ja2luZ1RleHR1cmVSZXNvdXJjZXMuZW5kKCk7ICsr
aXRlcikKKyAgICAgICAgKCppdGVyKS0+cmVsZWFzZVRleHR1cmVSZXNvdXJjZXMoKTsKKworICAg
IG1fbGF5ZXJzTG9ja2luZ1RleHR1cmVSZXNvdXJjZXMuY2xlYXIoKTsKKworICAgIGlmIChtX25l
ZWRzQ29tbWl0KSB7CisgICAgICAgIG1fbmVlZHNDb21taXQgPSBmYWxzZTsKKyAgICAgICAgbV9y
b290TGF5ZXItPnNjaGVkdWxlQ29tbWl0KCk7CisgICAgfQorCisgICAgdGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQoKS0+Y29sbGVjdEdhcmJhZ2UoKTsKK30KKworYm9vbCBMYXllclJlbmRl
cmVyOjp1c2VTdXJmYWNlKFJlbmRlclN1cmZhY2UqIHN1cmZhY2UpCit7CisgICAgaWYgKG1fY3Vy
cmVudFJlbmRlclN1cmZhY2UgPT0gc3VyZmFjZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAg
ICBtX2N1cnJlbnRSZW5kZXJTdXJmYWNlID0gc3VyZmFjZTsKKyAgICBpZiAoIXN1cmZhY2UpIHsK
KyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOworICAgICAgICBn
bFZpZXdwb3J0KG1fdmlld3BvcnQueCgpLCBtX3ZpZXdwb3J0LnkoKSwgbV92aWV3cG9ydC53aWR0
aCgpLCBtX3ZpZXdwb3J0LmhlaWdodCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgc3VyZmFjZS0+ZW5zdXJlVGV4dHVyZSgpOworCisgICAgaWYgKCFtX2ZibykKKyAgICAg
ICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJm1fZmJvKTsKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihH
TF9GUkFNRUJVRkZFUiwgbV9mYm8pOworICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJB
TUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9URVhUVVJFXzJELCBzdXJmYWNlLT50
ZXh0dXJlKCktPnRleHR1cmVJZCgpLCAwKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBHTGVudW0g
c3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKKyAgICBp
ZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgIGZwcmludGYo
c3RkZXJyLCAiZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzIGVycm9yICV4XG4iLCBzdGF0dXMpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICBnbFZpZXdwb3J0KDAs
IDAsIHN1cmZhY2UtPnNpemUoKS53aWR0aCgpLCBzdXJmYWNlLT5zaXplKCkuaGVpZ2h0KCkpOwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIExheWVyUmVuZGVyZXI6OmRyYXdMYXllcnNPblN1
cmZhY2VzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4gPiYgc3Vy
ZmFjZUxheWVycykKK3sKKyAgICBmb3IgKGludCBpID0gc3VyZmFjZUxheWVycy5zaXplKCkgLSAx
OyBpID49IDA7IGktLSkgeworICAgICAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciA9
IHN1cmZhY2VMYXllcnNbaV0uZ2V0KCk7CisgICAgICAgIFJlbmRlclN1cmZhY2UqIHN1cmZhY2Ug
PSBsYXllci0+cmVuZGVyU3VyZmFjZSgpOworICAgICAgICBpZiAoIXN1cmZhY2UgfHwgIXVzZVN1
cmZhY2Uoc3VyZmFjZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBnbERpc2Fi
bGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICAgICAgZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwor
ICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgICAgIGludCBjdXJy
ZW50U3RlbmNpbFZhbHVlID0gMDsKKyAgICAgICAgRmxvYXRSZWN0IGNsaXBSZWN0KC0xLCAtMSwg
MiwgMik7CisgICAgICAgIGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShzdXJmYWNlTGF5ZXJzW2ld
LmdldCgpLCBjdXJyZW50U3RlbmNpbFZhbHVlLCBjbGlwUmVjdCk7CisgICAgfQorCisgICAgLy8g
SWYgdGhlcmUgYXJlIGxheWVycyBkcmF3ZWQgb24gc3VyZmFjZXMsIHdlIG5lZWQgdG8gc3dpdGNo
IHRvIGRlZmF1bHQgZnJhbWVidWZmZXIuCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IG5lZWQg
dG8gc2V0IHZpZXdwb3J0LgorICAgIGlmIChzdXJmYWNlTGF5ZXJzLnNpemUoKSkKKyAgICAgICAg
dXNlU3VyZmFjZSgwKTsKKyAgICBlbHNlCisgICAgICAgIGdsVmlld3BvcnQobV92aWV3cG9ydC54
KCksIG1fdmlld3BvcnQueSgpLCBtX3ZpZXdwb3J0LndpZHRoKCksIG1fdmlld3BvcnQuaGVpZ2h0
KCkpOworfQorCit2b2lkIExheWVyUmVuZGVyZXI6OnNldFJvb3RMYXllcihMYXllckNvbXBvc2l0
aW5nVGhyZWFkKiBsYXllcikKK3sKKyAgICBtX3Jvb3RMYXllciA9IGxheWVyOworfQorCit2b2lk
IExheWVyUmVuZGVyZXI6OmFkZExheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyKQor
eworICAgIG1fbGF5ZXJzLmFkZChsYXllcik7Cit9CisKK2Jvb2wgTGF5ZXJSZW5kZXJlcjo6cmVt
b3ZlTGF5ZXIoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIpCit7CisgICAgTGF5ZXJTZXQ6
Oml0ZXJhdG9yIGl0ZXIgPSBtX2xheWVycy5maW5kKGxheWVyKTsKKyAgICBpZiAoaXRlciA9PSBt
X2xheWVycy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fbGF5ZXJzLnJlbW92
ZShsYXllcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJlcjo6YWRk
TGF5ZXJUb1JlbGVhc2VUZXh0dXJlUmVzb3VyY2VzTGlzdChMYXllckNvbXBvc2l0aW5nVGhyZWFk
KiBsYXllcikKK3sKKyAgICBtX2xheWVyc0xvY2tpbmdUZXh0dXJlUmVzb3VyY2VzLmFkZChsYXll
cik7Cit9CisKKy8vIFRyYW5zZm9ybSBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcyB0byB3
aW5kb3cgY29vcmRpbmF0ZXMKKy8vIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlbkdMIEVTIDIuMCBz
cGVjIHNlY3Rpb24gMi4xMi4xLgorSW50UmVjdCBMYXllclJlbmRlcmVyOjp0b09wZW5HTFdpbmRv
d0Nvb3JkaW5hdGVzKGNvbnN0IEZsb2F0UmVjdCYgcikgY29uc3QKK3sKKyAgICBmbG9hdCB2dzIg
PSBtX3ZpZXdwb3J0LndpZHRoKCkgLyAyLjA7CisgICAgZmxvYXQgdmgyID0gbV92aWV3cG9ydC5o
ZWlnaHQoKSAvIDIuMDsKKyAgICBmbG9hdCBveCA9IG1fdmlld3BvcnQueCgpICsgdncyOworICAg
IGZsb2F0IG95ID0gbV92aWV3cG9ydC55KCkgKyB2aDI7CisgICAgcmV0dXJuIGVuY2xvc2luZ0lu
dFJlY3QoRmxvYXRSZWN0KHIueCgpICogdncyICsgb3gsIHIueSgpICogdmgyICsgb3ksIHIud2lk
dGgoKSAqIHZ3Miwgci5oZWlnaHQoKSAqIHZoMikpOworfQorCisvLyBUcmFuc2Zvcm0gbm9ybWFs
aXplZCBkZXZpY2UgY29vcmRpbmF0ZXMgdG8gd2luZG93IGNvb3JkaW5hdGVzIGFzIFdlYktpdCB1
bmRlcnN0YW5kcyB0aGVtLgorLy8KKy8vIFRoZSBPcGVuR0wgc3VyZmFjZSBtYXkgYmUgbGFyZ2Vy
IHRoYW4gdGhlIFdlYktpdCB3aW5kb3csIGFuZCBPcGVuR0wgd2luZG93IGNvb3JkaW5hdGVzCisv
LyBoYXZlIG9yaWdpbiBpbiBib3R0b20gbGVmdCB3aGlsZSBXZWJLaXQgd2luZG93IGNvb3JkaW5h
dGVzIG9yaWdpbiBpcyBpbiB0b3AgbGVmdC4KKy8vIFRoZSB2aWV3cG9ydCBpcyBzZXR1cCB0byBj
b3ZlciB0aGUgdXBwZXIgcG9ydGlvbiBvZiB0aGUgbGFyZ2VyIE9wZW5HTCBzdXJmYWNlLgorSW50
UmVjdCBMYXllclJlbmRlcmVyOjp0b1dlYktpdFdpbmRvd0Nvb3JkaW5hdGVzKGNvbnN0IEZsb2F0
UmVjdCYgcikgY29uc3QKK3sKKyAgICBmbG9hdCB2dzIgPSBtX3ZpZXdwb3J0LndpZHRoKCkgLyAy
LjA7CisgICAgZmxvYXQgdmgyID0gbV92aWV3cG9ydC5oZWlnaHQoKSAvIDIuMDsKKyAgICBmbG9h
dCBveCA9IG1fdmlld3BvcnQueCgpICsgdncyOworICAgIGZsb2F0IG95ID0gbV9jb250ZXh0LT5z
dXJmYWNlU2l6ZSgpLmhlaWdodCgpIC0gKG1fdmlld3BvcnQueSgpICsgdmgyKTsKKyAgICByZXR1
cm4gZW5jbG9zaW5nSW50UmVjdChGbG9hdFJlY3Qoci54KCkgKiB2dzIgKyBveCwgLShyLnkoKSty
LmhlaWdodCgpKSAqIHZoMiArIG95LCByLndpZHRoKCkgKiB2dzIsIHIuaGVpZ2h0KCkgKiB2aDIp
KTsKK30KKworLy8gU2ltaWxhciB0byB0b1dlYktpdFdpbmRvd0Nvb3JkaW5hdGVzIGV4Y2VwdCB0
aGF0IHRoaXMgYWxzbyB0YWtlcyBhbnkgem9vbSBpbnRvIGFjY291bnQuCitJbnRSZWN0IExheWVy
UmVuZGVyZXI6OnRvV2ViS2l0RG9jdW1lbnRDb29yZGluYXRlcyhjb25zdCBGbG9hdFJlY3QmIHIp
IGNvbnN0Cit7CisgICAgLy8gVGhlIHpvb20gaXMgdGhlIHJhdGlvIGJldHdlZW4gdmlzaWJsZVJl
Y3QgKG9yIGxheW91dFJlY3QpIGFuZCBkc3RSZWN0IHBhcmFtZXRlcnMgd2hpY2ggYXJlIHBhc3Nl
ZCB0byBkcmF3TGF5ZXJzCisgICAgZmxvYXQgem9vbSA9IG1fdmlzaWJsZVJlY3Qud2lkdGgoKSAv
IG1fdmlld3BvcnQud2lkdGgoKTsKKyAgICAvLyBDb3VsZCBhc3NlcnQgaGVyZSB0aGF0IGl0IGRv
ZXNuJ3QgbWF0dGVyIHdoZXRoZXIgd2UgY2hvb3NlIHdpZHRoIG9yIGhlaWdodCBpbiB0aGUgYWJv
dmUgc3RhdGVtZW50OgorICAgIC8vIGJlY2F1c2UgYm90aCByZWN0YW5nbGVzIHNob3VsZCBoYXZl
IHZlcnkgc2ltaWxhciBzaGFwZXMgKHN1YmplY3Qgb25seSB0byBwaXhlbCByb3VuZGluZyBlcnJv
cikuCisKKyAgICBJbnRSZWN0IHJlc3VsdCA9IHRvV2ViS2l0V2luZG93Q29vcmRpbmF0ZXMocik7
CisgICAgcmVzdWx0LnNjYWxlKHpvb20pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIERy
YXdzIGEgZGVidWcgYm9yZGVyIGFyb3VuZCB0aGUgbGF5ZXIncyBib3VuZHMuCit2b2lkIExheWVy
UmVuZGVyZXI6OmRyYXdEZWJ1Z0JvcmRlcihMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllcikK
K3sKKyAgICBDb2xvciBib3JkZXJDb2xvciA9IGxheWVyLT5ib3JkZXJDb2xvcigpOworCisjaWYg
REVCVUdfRElSVFlfTEFZRVJTCisgICAgaWYgKGxheWVyLT5pc0RpcnR5KCkpCisgICAgICAgIGJv
cmRlckNvbG9yID0gQ29sb3IoMHhGRiwgMHgwMCwgMHgwMCwgMHhGRik7CisjZW5kaWYKKworI2lm
IERFQlVHX0xBWUVSX0FOSU1BVElPTlMKKyAgICBpZiAobGF5ZXItPmhhc1J1bm5pbmdBbmltYXRp
b25zKCkpCisgICAgICAgIGJvcmRlckNvbG9yID0gIENvbG9yKDB4MDAsIDB4RkYsIDB4MDAsIDB4
RkYpOworI2VuZGlmCisKKyAgICBpZiAoIWJvcmRlckNvbG9yLmFscGhhKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGdsVXNlUHJvZ3JhbShtX2NvbG9yUHJvZ3JhbU9iamVjdCk7CisgICAgZ2xW
ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgJmxheWVyLT5n
ZXRUcmFuc2Zvcm1lZEJvdW5kcygpKTsKKyAgICBnbFVuaWZvcm00ZihtX2NvbG9yQ29sb3JMb2Nh
dGlvbiwgYm9yZGVyQ29sb3IucmVkKCkgLyAyNTUuMCwgYm9yZGVyQ29sb3IuZ3JlZW4oKSAvIDI1
NS4wLCBib3JkZXJDb2xvci5ibHVlKCkgLyAyNTUuMCwgMSk7CisKKyAgICBnbExpbmVXaWR0aChs
YXllci0+Ym9yZGVyV2lkdGgoKSk7CisgICAgZ2xEcmF3QXJyYXlzKEdMX0xJTkVfTE9PUCwgMCwg
NCk7Cit9CisKKy8vIENsZWFycyBhIHJlY3RhbmdsZSBpbnNpZGUgdGhlIGxheWVyJ3MgYm91bmRz
Lgordm9pZCBMYXllclJlbmRlcmVyOjpkcmF3SG9sZVB1bmNoUmVjdChMYXllckNvbXBvc2l0aW5n
VGhyZWFkKiBsYXllcikKK3sKKyAgICBnbFVzZVByb2dyYW0obV9jb2xvclByb2dyYW1PYmplY3Qp
OworICAgIGdsVW5pZm9ybTRmKG1fY29sb3JDb2xvckxvY2F0aW9uLCAwLCAwLCAwLCAwKTsKKwor
ICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfWkVSTyk7CisgICAgRmxvYXRRdWFkIGhvbGUgPSBs
YXllci0+Z2V0VHJhbnNmb3JtZWRIb2xlUHVuY2hSZWN0KCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQ
b2ludGVyKDAsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgJmhvbGUpOworICAgIGdsRHJhd0Fy
cmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworICAgIGNoZWNrR0xFcnJvcigpOworICAgIGds
QmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisKKyAgICBJbnRSZWN0
IGhvbGVXQyA9IHRvV2ViS2l0V2luZG93Q29vcmRpbmF0ZXMoaG9sZS5ib3VuZGluZ0JveCgpKTsK
KyAgICBtX2xhc3RSZW5kZXJpbmdSZXN1bHRzLmFkZEhvbGVQdW5jaFJlY3QoaG9sZVdDKTsKK30K
Kwordm9pZCBMYXllclJlbmRlcmVyOjp1cGRhdGVMYXllcnNSZWN1cnNpdmUoTGF5ZXJDb21wb3Np
dGluZ1RocmVhZCogbGF5ZXIsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgsIFZl
Y3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4gPiYgc3VyZmFjZUxheWVycywgZmxv
YXQgb3BhY2l0eSwgRmxvYXRSZWN0IGNsaXBSZWN0LCBkb3VibGUgY3VycmVudFRpbWUpCit7CisK
KyAgICAvLyBUaGUgY29udHJhY3QgZm9yIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldExheWVy
UmVuZGVyZXIgaXMgaXQgbXVzdCBiZSBzZXQgaWYgdGhlIGxheWVyIGhhcyBiZWVuIHJlbmRlcmVk
LgorICAgIC8vIFNvIGRvIGl0IG5vdywgYmVmb3JlIHdlIHJlbmRlciBpdCBpbiBjb21wb3NpdGVM
YXllcnNSZWN1cnNpdmUuCisgICAgbGF5ZXItPnNldExheWVyUmVuZGVyZXIodGhpcyk7CisgICAg
aWYgKGxheWVyLT5tYXNrTGF5ZXIoKSkKKyAgICAgICAgbGF5ZXItPm1hc2tMYXllcigpLT5zZXRM
YXllclJlbmRlcmVyKHRoaXMpOworICAgIGlmIChsYXllci0+cmVwbGljYUxheWVyKCkpIHsKKyAg
ICAgICAgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogcmVwbGljYSA9IGxheWVyLT5yZXBsaWNhTGF5
ZXIoKTsKKyAgICAgICAgcmVwbGljYS0+c2V0TGF5ZXJSZW5kZXJlcih0aGlzKTsKKyAgICAgICAg
aWYgKHJlcGxpY2EtPm1hc2tMYXllcigpKQorICAgICAgICAgICAgcmVwbGljYS0+bWFza0xheWVy
KCktPnNldExheWVyUmVuZGVyZXIodGhpcyk7CisgICAgfQorCisgICAgLy8gVGhpcyBtaWdodCBj
YXVzZSB0aGUgbGF5ZXIgdG8gcmVjb21wdXRlIHNvbWUgYXR0cmlidXRlcy4KKyAgICBtX2xhc3RS
ZW5kZXJpbmdSZXN1bHRzLm5lZWRzQW5pbWF0aW9uRnJhbWUgfD0gbGF5ZXItPnVwZGF0ZUFuaW1h
dGlvbnMoY3VycmVudFRpbWUpOworCisgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IG1hdHJpeCB0cmFu
c2Zvcm1hdGlvbiB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGlzIGxheWVyIGFuZAorICAgIC8v
IGFsbCBpdHMgc3VibGF5ZXJzLiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZSBs
YXllcidzIHBvc2l0aW9uCisgICAgLy8gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXllcidzIGFu
Y2hvciBwb2ludC4gQWxzbywgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIHVzZWQKKyAgICAvLyBhc3N1
bWVzIHRoYXQgdGhlIG9yaWdpbiBpcyBhdCB0aGUgbG93ZXIgbGVmdCBldmVuIHRob3VnaCB0aGUg
Y29vcmRpbmF0ZXMgdGhlIGJyb3dzZXIKKyAgICAvLyBnaXZlcyB1cyBmb3IgdGhlIGxheWVycyBh
cmUgZm9yIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4gVGhlIFkgZmxpcCBoYXBwZW5zIHZpYQorICAg
IC8vIHRoZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBhcHBsaWVkIGF0IHJlbmRlciB0aW1lLgor
ICAgIC8vIFRoZSB0cmFuc2Zvcm1hdGlvbiBjaGFpbiBmb3IgdGhlIGxheWVyIGlzICh1c2luZyB0
aGUgTWF0cml4IHggVmVjdG9yIG9yZGVyKToKKyAgICAvLyBNID0gTVtwXSAqIFRyW2xdICogTVts
XSAqIFRyW2NdCisgICAgLy8gV2hlcmUgTVtwXSBpcyB0aGUgcGFyZW50IG1hdHJpeCBwYXNzZWQg
ZG93biB0byB0aGUgZnVuY3Rpb24KKyAgICAvLyAgICAgICBUcltsXSBpcyB0aGUgdHJhbnNsYXRp
b24gbWF0cml4IGxvY2F0aW5nIHRoZSBsYXllcidzIGFuY2hvciBwb2ludAorICAgIC8vICAgICAg
IFRyW2NdIGlzIHRoZSB0cmFuc2xhdGlvbiBvZmZzZXQgYmV0d2VlbiB0aGUgYW5jaG9yIHBvaW50
IGFuZCB0aGUgY2VudGVyIG9mIHRoZSBsYXllcgorICAgIC8vICAgICAgIE1bbF0gaXMgdGhlIGxh
eWVyJ3MgbWF0cml4IChhcHBsaWVkIGF0IHRoZSBhbmNob3IgcG9pbnQpCisgICAgLy8gVGhpcyB0
cmFuc2Zvcm0gY3JlYXRlcyBhIGNvb3JkaW5hdGUgc3lzdGVtIHdob3NlIG9yaWdpbiBpcyB0aGUg
Y2VudGVyIG9mIHRoZSBsYXllci4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIGZpbmFsIG1hdHJpeCB1
c2VkIGJ5IHRoZSBzaGFkZXIgZm9yIHRoZSBsYXllciBpcyBQICogTSAqIFMgLiBUaGlzIGZpbmFs
IHByb2R1Y3QKKyAgICAvLyBpcyBjb21wdXRlZCBpbiBkcmF3VGV4dHVyZWRRdWFkKCkuCisgICAg
Ly8gV2hlcmU6IFAgaXMgdGhlIHByb2plY3Rpb24gbWF0cml4CisgICAgLy8gICAgICAgIE0gaXMg
dGhlIGxheWVyJ3MgbWF0cml4IGNvbXB1dGVkIGFib3ZlCisgICAgLy8gICAgICAgIFMgaXMgdGhl
IHNjYWxlIGFkanVzdG1lbnQgKHRvIHNjYWxlIHVwIHRvIHRoZSBsYXllciBzaXplKQorICAgIElu
dFNpemUgYm91bmRzID0gbGF5ZXItPmJvdW5kcygpOworICAgIEZsb2F0UG9pbnQgYW5jaG9yUG9p
bnQgPSBsYXllci0+YW5jaG9yUG9pbnQoKTsKKyAgICBGbG9hdFBvaW50IHBvc2l0aW9uID0gbGF5
ZXItPnBvc2l0aW9uKCk7CisKKyAgICAvLyBMYXllciB3aG9zZSBoYXNGaXhlZENvbnRhaW5lciBp
cyB0cnVlIHdpbGwgZ2V0IHNjcm9sbGVkIHJlbGF0aXZlIHRvCisgICAgLy8gdGhlIGZpeGVkIHBv
c2l0aW9uZWQgcGFyZW50LgorICAgIGlmICghbGF5ZXItPmhhc0ZpeGVkQ29udGFpbmVyKCkgJiYg
KGxheWVyLT5pc0ZpeGVkUG9zaXRpb24oKSB8fCBsYXllci0+aGFzRml4ZWRBbmNlc3RvckluRE9N
VHJlZSgpKSkgeworICAgICAgICAvLyBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRvIHNldCB2aXNp
YmxlIHkgdG8gdGhlIHZhbHVlIHdlIHdhbnQsIGFuZAorICAgICAgICAvLyBsYXlvdXQgeSB0byB0
aGUgdmFsdWUgV2ViQ29yZSBsYXlvdXRlZCB0aGUgZml4ZWQgZWxlbWVudCB0by4KKyAgICAgICAg
ZmxvYXQgbWF4aW11bVNjcm9sbFkgPSBtX2NvbnRlbnRzU2l6ZS5oZWlnaHQoKSAtIG1fdmlzaWJs
ZVJlY3QuaGVpZ2h0KCk7CisgICAgICAgIGZsb2F0IHZpc2libGVZID0gbWF4KDAuMGYsIG1fdmlz
aWJsZVJlY3QueSgpKTsKKyAgICAgICAgZmxvYXQgbGF5b3V0WSA9IG1heCgwLjBmLCBtaW4obWF4
aW11bVNjcm9sbFksIChmbG9hdCltX2xheW91dFJlY3QueSgpKSk7CisKKyAgICAgICAgLy8gRm9y
IHN0dWZmIGxvY2F0ZWQgb24gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHNjcmVlbiwgd2Ugem9vbSBy
ZWxhdGl2ZSB0byBib3R0b20uCisgICAgICAgIC8vIFRoaXMgdHJpY2sgYWxsb3dzIHVzIHRvIGRp
c3BsYXkgZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cyBhbGlnbmVkIHRvIHRvcCBvcgorICAgICAg
ICAvLyBib3R0b20gY29ycmVjdGx5IHdoZW4gcGFubmluZyBhbmQgem9vbWluZywgd2l0aG91dCBh
Y3R1YWxseSBrbm93aW5nIHRoZQorICAgICAgICAvLyBudW1lcmljIHZhbHVlcyBvZiB0aGUgdG9w
IGFuZCBib3R0b20gQ1NTIGF0dHJpYnV0ZXMuCisgICAgICAgIC8vIEluIGZhY3QsIHRoZSBwb3Np
dGlvbiBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGFuY2hvciwgc28gdG8gZmluZCB0aGUgdG9wIGxl
ZnQKKyAgICAgICAgLy8gd2UgaGF2ZSB0byBzdWJ0cmFjdCB0aGUgYW5jaG9yIHRpbWVzIHRoZSBi
b3VuZHMuIFRoZSBhbmNob3IgZGVmYXVsdHMgdG8KKyAgICAgICAgLy8gKDAuNSwgMC41KSBmb3Ig
bW9zdCBsYXllcnMuCisgICAgICAgIGlmIChwb3NpdGlvbi55KCkgLSBhbmNob3JQb2ludC55KCkg
KiBib3VuZHMuaGVpZ2h0KCkgPiBsYXlvdXRZICsgbV9sYXlvdXRSZWN0LmhlaWdodCgpIC8gMikg
eworICAgICAgICAgICAgdmlzaWJsZVkgPSBtaW48ZmxvYXQ+KG1fY29udGVudHNTaXplLmhlaWdo
dCgpLCBtX3Zpc2libGVSZWN0LnkoKSArIG1fdmlzaWJsZVJlY3QuaGVpZ2h0KCkpOworICAgICAg
ICAgICAgbGF5b3V0WSA9IG1pbihtX2NvbnRlbnRzU2l6ZS5oZWlnaHQoKSwgbWF4KDAsIG1fbGF5
b3V0UmVjdC55KCkpICsgbV9sYXlvdXRSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHBvc2l0aW9uLnNldFkocG9zaXRpb24ueSgpICsgKHZpc2libGVZIC0gbGF5b3V0WSkpOwor
ICAgIH0KKworICAgIC8vIE9mZnNldCBiZXR3ZWVuIGFuY2hvciBwb2ludCBhbmQgdGhlIGNlbnRl
ciBvZiB0aGUgcXVhZC4KKyAgICBmbG9hdCBjZW50ZXJPZmZzZXRYID0gKDAuNSAtIGFuY2hvclBv
aW50LngoKSkgKiBib3VuZHMud2lkdGgoKTsKKyAgICBmbG9hdCBjZW50ZXJPZmZzZXRZID0gKDAu
NSAtIGFuY2hvclBvaW50LnkoKSkgKiBib3VuZHMuaGVpZ2h0KCk7CisKKyAgICAvLyBNID0gTVtw
XQorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsTWF0cml4ID0gbWF0cml4OworICAgIC8v
IE0gPSBNW3BdICogVHJbbF0KKyAgICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZChwb3NpdGlvbi54
KCksIHBvc2l0aW9uLnkoKSwgbGF5ZXItPmFuY2hvclBvaW50WigpKTsKKyAgICAvLyBNID0gTVtw
XSAqIFRyW2xdICogTVtsXQorICAgIGxvY2FsTWF0cml4Lm11bHRpcGx5KGxheWVyLT50cmFuc2Zv
cm0oKSk7CisgICAgLy8gTSA9IE1bcF0gKiBUcltsXSAqIE1bbF0gKiBUcltjXQorICAgIGxvY2Fs
TWF0cml4LnRyYW5zbGF0ZTNkKGNlbnRlck9mZnNldFgsIGNlbnRlck9mZnNldFksIC1sYXllci0+
YW5jaG9yUG9pbnRaKCkpOworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBsYXllcidzIG9wYWNpdHku
CisgICAgb3BhY2l0eSAqPSBsYXllci0+b3BhY2l0eSgpOworCisgICAgYm9vbCB1c2VSZW5kZXJT
dXJmYWNlID0gbGF5ZXItPm1hc2tMYXllcigpIHx8IGxheWVyLT5yZXBsaWNhTGF5ZXIoKTsKKyAg
ICBpZiAoIXVzZVJlbmRlclN1cmZhY2UpIHsKKyAgICAgICAgbGF5ZXItPnNldERyYXdPcGFjaXR5
KG9wYWNpdHkpOworICAgICAgICBsYXllci0+Y2xlYXJSZW5kZXJTdXJmYWNlKCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgaWYgKCFsYXllci0+cmVuZGVyU3VyZmFjZSgpKQorICAgICAgICAgICAg
bGF5ZXItPmNyZWF0ZVJlbmRlclN1cmZhY2UoKTsKKworICAgICAgICBSZW5kZXJTdXJmYWNlKiBz
dXJmYWNlID0gbGF5ZXItPnJlbmRlclN1cmZhY2UoKTsKKworICAgICAgICBsYXllci0+c2V0RHJh
d09wYWNpdHkoMS4wKTsKKyAgICAgICAgc3VyZmFjZS0+c2V0RHJhd09wYWNpdHkob3BhY2l0eSk7
CisKKyAgICAgICAgc3VyZmFjZS0+c2V0RHJhd1RyYW5zZm9ybShsb2NhbE1hdHJpeCk7CisgICAg
ICAgIGlmIChsYXllci0+cmVwbGljYUxheWVyKCkpIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IHJlcGxpY2FNYXRyaXggPSBsb2NhbE1hdHJpeDsKKyAgICAgICAgICAgIHJlcGxp
Y2FNYXRyaXgudHJhbnNsYXRlM2QoLTAuNSAqIGJvdW5kcy53aWR0aCgpLCAtMC41ICogYm91bmRz
LmhlaWdodCgpLCAwKTsKKyAgICAgICAgICAgIHJlcGxpY2FNYXRyaXgudHJhbnNsYXRlM2QobGF5
ZXItPnJlcGxpY2FMYXllcigpLT5wb3NpdGlvbigpLngoKSwgbGF5ZXItPnJlcGxpY2FMYXllcigp
LT5wb3NpdGlvbigpLnkoKSwgMCk7CisgICAgICAgICAgICByZXBsaWNhTWF0cml4Lm11bHRpcGx5
KGxheWVyLT5yZXBsaWNhTGF5ZXIoKS0+dHJhbnNmb3JtKCkpOworICAgICAgICAgICAgcmVwbGlj
YU1hdHJpeC50cmFuc2xhdGUzZChjZW50ZXJPZmZzZXRYLCBjZW50ZXJPZmZzZXRZLCAwKTsKKyAg
ICAgICAgICAgIHN1cmZhY2UtPnNldFJlcGxpY2FEcmF3VHJhbnNmb3JtKHJlcGxpY2FNYXRyaXgp
OworICAgICAgICB9CisKKyAgICAgICAgSW50UmVjdCBkcmF3UmVjdCA9IEludFJlY3QoSW50UG9p
bnQoKSwgYm91bmRzKTsKKyAgICAgICAgc3VyZmFjZS0+c2V0Q29udGVudFJlY3QoZHJhd1JlY3Qp
OworCisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHByb2plY3Rpb25NYXRyaXggPSBvcnRo
b01hdHJpeChkcmF3UmVjdC54KCksIGRyYXdSZWN0Lm1heFgoKSwgZHJhd1JlY3QueSgpLCBkcmF3
UmVjdC5tYXhZKCksIC0xMDAwLCAxMDAwKTsKKyAgICAgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUg
bmV3IHN1cmZhY2UgaXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBsYXllci4KKyAgICAg
ICAgVHJhbnNmb3JtYXRpb25NYXRyaXggZHJhd1RyYW5zZm9ybTsKKyAgICAgICAgZHJhd1RyYW5z
Zm9ybS50cmFuc2xhdGUzZCgwLjUgKiBib3VuZHMud2lkdGgoKSwgMC41ICogYm91bmRzLmhlaWdo
dCgpLCAwKTsKKyAgICAgICAgLy8gVGhpcyBsYXllciB3aWxsIHN0YXJ0IHVzaW5nIG5ldyB0cmFu
c2Zvcm1hdGlvbi4KKyAgICAgICAgbG9jYWxNYXRyaXggPSBwcm9qZWN0aW9uTWF0cml4ICogZHJh
d1RyYW5zZm9ybTsKKworICAgICAgICBzdXJmYWNlTGF5ZXJzLmFwcGVuZChsYXllcik7CisgICAg
fQorCisgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zvcm0obG9jYWxNYXRyaXgpOworCisjaWYgRU5B
QkxFKFZJREVPKQorICAgIGJvb2wgbGF5ZXJWaXNpYmxlID0gY2xpcFJlY3QuaW50ZXJzZWN0cyhs
YXllci0+Z2V0RHJhd1JlY3QoKSkgfHwgbGF5ZXItPm1lZGlhUGxheWVyKCk7CisjZWxzZQorICAg
IGJvb2wgbGF5ZXJWaXNpYmxlID0gY2xpcFJlY3QuaW50ZXJzZWN0cyhsYXllci0+Z2V0RHJhd1Jl
Y3QoKSk7CisjZW5kaWYKKworICAgIGlmIChsYXllci0+bmVlZHNUZXh0dXJlKCkgJiYgbGF5ZXJW
aXNpYmxlKSB7CisgICAgICAgIEludFJlY3QgZGlydHlSZWN0ID0gdG9XZWJLaXRXaW5kb3dDb29y
ZGluYXRlcyhpbnRlcnNlY3Rpb24obGF5ZXItPmdldERyYXdSZWN0KCksIGNsaXBSZWN0KSk7Cisg
ICAgICAgIG1fbGFzdFJlbmRlcmluZ1Jlc3VsdHMuYWRkRGlydHlSZWN0KGRpcnR5UmVjdCk7Cisg
ICAgfQorCisgICAgaWYgKGxheWVyLT5tYXNrc1RvQm91bmRzKCkpCisgICAgICAgIGNsaXBSZWN0
LmludGVyc2VjdChsYXllci0+Z2V0RHJhd1JlY3QoKSk7CisKKyAgICAvLyBGbGF0dGVuIHRvIDJE
IGlmIHRoZSBsYXllciBkb2Vzbid0IHByZXNlcnZlIDNELgorICAgIGlmICghbGF5ZXItPnByZXNl
cnZlczNEKCkpIHsKKyAgICAgICAgbG9jYWxNYXRyaXguc2V0TTEzKDApOworICAgICAgICBsb2Nh
bE1hdHJpeC5zZXRNMjMoMCk7CisgICAgICAgIGxvY2FsTWF0cml4LnNldE0zMSgwKTsKKyAgICAg
ICAgbG9jYWxNYXRyaXguc2V0TTMyKDApOworICAgICAgICAvLyBUaGlzIGNvcnJlc3BvbmRzIHRv
IHRoZSBkZXB0aCByYW5nZSBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIG9ydGhvZ3JhcGhpYyBw
cm9qZWN0aW9uIG1hdHJpeAorICAgICAgICBsb2NhbE1hdHJpeC5zZXRNMzMoMC4wMDEpOworICAg
ICAgICBsb2NhbE1hdHJpeC5zZXRNMzQoMCk7CisgICAgICAgIGxvY2FsTWF0cml4LnNldE00Mygw
KTsKKyAgICB9CisKKyAgICAvLyBBcHBseSB0aGUgc3VibGF5ZXIgdHJhbnNmb3JtLgorICAgIGxv
Y2FsTWF0cml4Lm11bHRpcGx5KGxheWVyLT5zdWJsYXllclRyYW5zZm9ybSgpKTsKKworICAgIC8v
IFRoZSBvcmlnaW4gb2YgdGhlIHN1YmxheWVycyBpcyBhY3R1YWxseSB0aGUgYm90dG9tIGxlZnQg
Y29ybmVyIG9mIHRoZSBsYXllcgorICAgIC8vIChvciB0b3AgbGVmdCB3aGVuIGxvb2tpbmcgaXQg
aXQgZnJvbSB0aGUgYnJvd3NlcidzIHBlc3BlY3RpdmUpIGluc3RlYWQgb2YgdGhlIGNlbnRlci4K
KyAgICAvLyBUaGUgbWF0cml4IHBhc3NlZCBkb3duIHRvIHRoZSBzdWJsYXllcnMgaXMgdGhlcmVm
b3JlOgorICAgIC8vIE1bc10gPSBNICogVHJbLWNlbnRlcl0KKyAgICBsb2NhbE1hdHJpeC50cmFu
c2xhdGUzZCgtYm91bmRzLndpZHRoKCkgKiAwLjUsIC1ib3VuZHMuaGVpZ2h0KCkgKiAwLjUsIDAp
OworCisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiA+JiBz
dWJsYXllcnMgPSBsYXllci0+Z2V0U3VibGF5ZXJzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisgICAgICAgIHVwZGF0ZUxheWVyc1JlY3Vyc2l2
ZShzdWJsYXllcnNbaV0uZ2V0KCksIGxvY2FsTWF0cml4LCBzdXJmYWNlTGF5ZXJzLCBvcGFjaXR5
LCBjbGlwUmVjdCwgY3VycmVudFRpbWUpOworfQorCitzdGF0aWMgYm9vbCBoYXNSb3RhdGlvbmFs
Q29tcG9uZW50KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtKQoreworICAgIHJldHVybiBt
Lm0xMigpIHx8IG0ubTEzKCkgfHwgbS5tMjMoKSB8fCBtLm0yMSgpIHx8IG0ubTMxKCkgfHwgbS5t
MzIoKTsKK30KKworYm9vbCBMYXllclJlbmRlcmVyOjpsYXllckFscmVhZHlPblN1cmZhY2UoTGF5
ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxheWVyLT5y
ZW5kZXJTdXJmYWNlKCkgJiYgbGF5ZXItPnJlbmRlclN1cmZhY2UoKSAhPSBtX2N1cnJlbnRSZW5k
ZXJTdXJmYWNlOworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0M0RQcmVzZXJ2aW5nTGF5ZXJzKFZl
Y3RvcjxMYXllckNvbXBvc2l0aW5nVGhyZWFkKj4mIGxheWVycykKK3sKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGxheWVycy5zaXplKCk7ICsraSkgeworICAgICAgICBMYXllckNvbXBvc2l0
aW5nVGhyZWFkKiBsYXllciA9IGxheWVyc1tpXTsKKyAgICAgICAgaWYgKCFsYXllci0+cHJlc2Vy
dmVzM0QoKSB8fCAhbGF5ZXItPmdldFN1YmxheWVycygpLnNpemUoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIFZlY3RvcjxMYXllckNvbXBvc2l0aW5nVGhyZWFkKj4gc3VibGF5
ZXJzID0gcmF3UHRyVmVjdG9yRnJvbVJlZlB0clZlY3RvcihsYXllci0+Z2V0U3VibGF5ZXJzKCkp
OworICAgICAgICBjb2xsZWN0M0RQcmVzZXJ2aW5nTGF5ZXJzKHN1YmxheWVycyk7CisgICAgICAg
IGxheWVycy5pbnNlcnQoaSsxLCBzdWJsYXllcnMpOworICAgICAgICBpICs9IHN1YmxheWVycy5z
aXplKCk7CisgICAgfQorfQorCit2b2lkIExheWVyUmVuZGVyZXI6OmNvbXBvc2l0ZUxheWVyc1Jl
Y3Vyc2l2ZShMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciwgaW50IHN0ZW5jaWxWYWx1ZSwg
RmxvYXRSZWN0IGNsaXBSZWN0KQoreworICAgIEZsb2F0UmVjdCByZWN0OworICAgIGlmIChsYXll
ckFscmVhZHlPblN1cmZhY2UobGF5ZXIpKQorICAgICAgICByZWN0ID0gbGF5ZXItPnJlbmRlclN1
cmZhY2UoKS0+ZHJhd1JlY3QoKTsKKyAgICBlbHNlCisgICAgICAgIHJlY3QgPSBsYXllci0+Z2V0
RHJhd1JlY3QoKTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICBib29sIGxheWVyVmlzaWJsZSA9
IGNsaXBSZWN0LmludGVyc2VjdHMocmVjdCkgfHwgbGF5ZXItPm1lZGlhUGxheWVyKCk7CisjZWxz
ZQorICAgIGJvb2wgbGF5ZXJWaXNpYmxlID0gY2xpcFJlY3QuaW50ZXJzZWN0cyhyZWN0KTsKKyNl
bmRpZgorCisgICAgbGF5ZXItPnNldFZpc2libGUobGF5ZXJWaXNpYmxlKTsKKworICAgIGdsU3Rl
bmNpbEZ1bmMoR0xfRVFVQUwsIHN0ZW5jaWxWYWx1ZSwgMHhmZik7CisgICAgZ2xTdGVuY2lsT3Ao
R0xfS0VFUCwgR0xfS0VFUCwgR0xfS0VFUCk7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlcmUgYXJl
IHR3byB0eXBlcyBvZiBsYXllcnM6CisgICAgLy8gMS4gTGF5ZXJzIHRoYXQgaGF2ZSB0aGVpciBv
d24gR3JhcGhpY3NDb250ZXh0IGFuZCBjYW4gZHJhdyB0aGVpciBjb250ZW50cyBvbiBkZW1hbmQg
KGxheWVyLT5kcmF3c0NvbnRlbnQoKSA9PSB0cnVlKS4KKyAgICAvLyAyLiBMYXllcnMgdGhhdCBh
cmUganVzdCBjb250YWluZXJzIG9mIGltYWdlcy92aWRlby9ldGMgdGhhdCBkb24ndCBvd24gYSBH
cmFwaGljc0NvbnRleHQgKGxheWVyLT5jb250ZW50cygpID09IHRydWUpLgorCisgICAgLy8gRXZl
biBub24tdmlzaWJsZSBsYXllcnMgbmVlZCB0byBwZXJmb3JtIHRoZWlyIHRleHR1cmUgam9icywg
b3IgdGhleSB3aWxsCisgICAgLy8gcGlsZSB1cCBhbmQgd2FzdGUgbWVtb3J5LgorICAgIGlmIChs
YXllci0+bmVlZHNUZXh0dXJlKCkpCisgICAgICAgIGxheWVyLT51cGRhdGVUZXh0dXJlQ29udGVu
dHNJZk5lZWRlZCgpOworICAgIGlmIChsYXllci0+bWFza0xheWVyKCkgJiYgbGF5ZXItPm1hc2tM
YXllcigpLT5uZWVkc1RleHR1cmUoKSkKKyAgICAgICAgbGF5ZXItPm1hc2tMYXllcigpLT51cGRh
dGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCgpOworICAgIGlmIChsYXllci0+cmVwbGljYUxheWVy
KCkpIHsKKyAgICAgICAgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogcmVwbGljYSA9IGxheWVyLT5y
ZXBsaWNhTGF5ZXIoKTsKKyAgICAgICAgaWYgKHJlcGxpY2EtPm5lZWRzVGV4dHVyZSgpKQorICAg
ICAgICAgICAgcmVwbGljYS0+dXBkYXRlVGV4dHVyZUNvbnRlbnRzSWZOZWVkZWQoKTsKKyAgICAg
ICAgaWYgKHJlcGxpY2EtPm1hc2tMYXllcigpICYmIHJlcGxpY2EtPm1hc2tMYXllcigpLT5uZWVk
c1RleHR1cmUoKSkKKyAgICAgICAgICAgIHJlcGxpY2EtPm1hc2tMYXllcigpLT51cGRhdGVUZXh0
dXJlQ29udGVudHNJZk5lZWRlZCgpOworICAgIH0KKworICAgIGlmICgobGF5ZXItPm5lZWRzVGV4
dHVyZSgpIHx8IGxheWVyLT5yZW5kZXJTdXJmYWNlKCkpICYmIGxheWVyVmlzaWJsZSkgeworICAg
ICAgICB1cGRhdGVTY2lzc29ySWZOZWVkZWQoY2xpcFJlY3QpOworCisgICAgICAgIGlmIChsYXll
ci0+ZG91YmxlU2lkZWQoKSkKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAg
ICAgIGlmIChsYXllci0+aGFzVmlzaWJsZUhvbGVQdW5jaFJlY3QoKSkKKyAgICAgICAgICAgIGRy
YXdIb2xlUHVuY2hSZWN0KGxheWVyKTsKKworICAgICAgICAvLyBEcmF3IHRoZSBzdXJmYWNlIG9u
dG8gYW5vdGhlciBzdXJmYWNlIG9yIHNjcmVlbi4KKyAgICAgICAgYm9vbCBkcmF3U3VyZmFjZSA9
IGxheWVyQWxyZWFkeU9uU3VyZmFjZShsYXllcik7CisgICAgICAgIC8vIFRoZSB0ZXh0dXJlIGZv
cm1hdCBmb3IgdGhlIHN1cmZhY2UgaXMgUkdCQS4KKyAgICAgICAgTGF5ZXJEYXRhOjpMYXllclBy
b2dyYW1TaGFkZXIgc2hhZGVyID0gZHJhd1N1cmZhY2UgPyBMYXllckRhdGE6OkxheWVyUHJvZ3Jh
bVNoYWRlclJHQkEgOiBsYXllci0+bGF5ZXJQcm9ncmFtU2hhZGVyKCk7CisKKyAgICAgICAgaWYg
KCFkcmF3U3VyZmFjZSkgeworICAgICAgICAgICAgZ2xVc2VQcm9ncmFtKG1fbGF5ZXJQcm9ncmFt
T2JqZWN0W3NoYWRlcl0pOworICAgICAgICAgICAgZ2xVbmlmb3JtMWYobV9hbHBoYUxvY2F0aW9u
W3NoYWRlcl0sIGxheWVyLT5kcmF3T3BhY2l0eSgpKTsKKyAgICAgICAgICAgIGxheWVyLT5kcmF3
VGV4dHVyZXMobV9wb3NpdGlvbkxvY2F0aW9uLCBtX3RleENvb3JkTG9jYXRpb24sIG1fdmlzaWJs
ZVJlY3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRHJhdyB0aGUgcmVmbGVj
dGlvbiBpZiBpdCBleGlzdHMuCisgICAgICAgICAgICBpZiAobGF5ZXItPnJlcGxpY2FMYXllcigp
KSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBsYXllciBhbmQgaXRzIHJlZmxlY3Rpb24g
Ym90aCBoYXZlIG1hc2ssIHdlIG5lZWQgYW5vdGhlciB0ZW1wb3Jhcnkgc3VyZmFjZS4KKyAgICAg
ICAgICAgICAgICAvLyBTaW5jZSB0aGlzIHVzZSBjYXNlIHNob3VsZCBiZSByYXJlLCBjdXJyZW50
bHkgaXQncyBub3QgaGFuZGxlZCBhbmQgdGhlIG1hc2sgZm9yCisgICAgICAgICAgICAgICAgLy8g
dGhlIHJlZmxlY3Rpb24gaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhpcyBsYXllciBoYXMgbm8gbWFz
ay4KKyAgICAgICAgICAgICAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBtYXNrID0gbGF5ZXIt
Pm1hc2tMYXllcigpOworICAgICAgICAgICAgICAgIGlmICghbWFzayAmJiBsYXllci0+cmVwbGlj
YUxheWVyKCkpCisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBsYXllci0+cmVwbGljYUxheWVy
KCktPm1hc2tMYXllcigpOworCisgICAgICAgICAgICAgICAgZ2xVc2VQcm9ncmFtKG1hc2sgPyBt
X2xheWVyTWFza1Byb2dyYW1PYmplY3Rbc2hhZGVyXSA6IG1fbGF5ZXJQcm9ncmFtT2JqZWN0W3No
YWRlcl0pOworICAgICAgICAgICAgICAgIGdsVW5pZm9ybTFmKG1hc2sgPyBtX21hc2tBbHBoYUxv
Y2F0aW9uW3NoYWRlcl0gOiBtX2FscGhhTG9jYXRpb25bc2hhZGVyXSwgbGF5ZXItPnJlbmRlclN1
cmZhY2UoKS0+ZHJhd09wYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgbGF5ZXItPmRyYXdTdXJm
YWNlKGxheWVyLT5yZW5kZXJTdXJmYWNlKCktPnJlcGxpY2FEcmF3VHJhbnNmb3JtKCksIG1hc2ss
IG1fcG9zaXRpb25Mb2NhdGlvbiwgbV90ZXhDb29yZExvY2F0aW9uKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgZ2xVc2VQcm9ncmFtKGxheWVyLT5tYXNrTGF5ZXIoKSA/IG1fbGF5ZXJN
YXNrUHJvZ3JhbU9iamVjdFtzaGFkZXJdIDogbV9sYXllclByb2dyYW1PYmplY3Rbc2hhZGVyXSk7
CisgICAgICAgICAgICBnbFVuaWZvcm0xZihsYXllci0+bWFza0xheWVyKCkgPyBtX21hc2tBbHBo
YUxvY2F0aW9uW3NoYWRlcl0gOiBtX2FscGhhTG9jYXRpb25bc2hhZGVyXSwgbGF5ZXItPnJlbmRl
clN1cmZhY2UoKS0+ZHJhd09wYWNpdHkoKSk7CisgICAgICAgICAgICBsYXllci0+ZHJhd1N1cmZh
Y2UobGF5ZXItPnJlbmRlclN1cmZhY2UoKS0+ZHJhd1RyYW5zZm9ybSgpLCBsYXllci0+bWFza0xh
eWVyKCksIG1fcG9zaXRpb25Mb2NhdGlvbiwgbV90ZXhDb29yZExvY2F0aW9uKTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChsYXllci0+aGFzTWlzc2luZ1RleHR1cmVzKCkpIHsKKyAgICAgICAg
ICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgICAgICBnbFVzZVByb2dyYW0obV9jaGVj
a2VyUHJvZ3JhbU9iamVjdCk7CisgICAgICAgICAgICBsYXllci0+ZHJhd01pc3NpbmdUZXh0dXJl
cyhtX3Bvc2l0aW9uTG9jYXRpb24sIG1fdGV4Q29vcmRMb2NhdGlvbiwgbV92aXNpYmxlUmVjdCk7
CisgICAgICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgICAgICBnbEJsZW5kRnVu
YyhHTF9PTkUsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gRHJhdyB0aGUgZGVidWcgYm9yZGVyIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBkcmF3RGVi
dWdCb3JkZXIobGF5ZXIpOworCisgICAgLy8gVGhlIHRleHR1cmUgZm9yIHRoZSBSZW5kZXJTdXJm
YWNlIGNhbiBiZSByZWxlYXNlZCBhZnRlciB0aGUgc3VyZmFjZSB3YXMgZHJhd2VkIG9uIGFub3Ro
ZXIgc3VyZmFjZS4KKyAgICBpZiAobGF5ZXJBbHJlYWR5T25TdXJmYWNlKGxheWVyKSkgeworICAg
ICAgICBsYXllci0+cmVuZGVyU3VyZmFjZSgpLT5yZWxlYXNlVGV4dHVyZSgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgbmVlZCB0byBtYXNrIHRvIGJvdW5kcyBidXQg
dGhlIHRyYW5zZm9ybWF0aW9uIGhhcyBhIHJvdGF0aW9uYWwgY29tcG9uZW50CisgICAgLy8gdG8g
aXQsIHNjaXNzb3JpbmcgaXMgbm90IGVub3VnaCBhbmQgd2UgbmVlZCB0byB1c2UgdGhlIHN0ZW5j
aWwgYnVmZmVyIGZvciBjbGlwcGluZy4KKyNpZiBFTkFCTEVfU0NJU1NPUgorICAgIGJvb2wgc3Rl
bmNpbENsaXAgPSBsYXllci0+bWFza3NUb0JvdW5kcygpICYmIGhhc1JvdGF0aW9uYWxDb21wb25l
bnQobGF5ZXItPmRyYXdUcmFuc2Zvcm0oKSk7CisjZWxzZQorICAgIGJvb2wgc3RlbmNpbENsaXAg
PSBsYXllci0+bWFza3NUb0JvdW5kcygpOworI2VuZGlmCisKKyAgICBpZiAoc3RlbmNpbENsaXAp
IHsKKyAgICAgICAgZ2xTdGVuY2lsRnVuYyhHTF9FUVVBTCwgc3RlbmNpbFZhbHVlLCAweGZmKTsK
KyAgICAgICAgZ2xTdGVuY2lsT3AoR0xfS0VFUCwgR0xfSU5DUiwgR0xfSU5DUik7CisKKyAgICAg
ICAgdXBkYXRlU2Npc3NvcklmTmVlZGVkKGNsaXBSZWN0KTsKKyAgICAgICAgZ2xVc2VQcm9ncmFt
KG1fY29sb3JQcm9ncmFtT2JqZWN0KTsKKyAgICAgICAgZ2xDb2xvck1hc2soR0xfRkFMU0UsIEdM
X0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UpOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50
ZXIoMCwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCAmbGF5ZXItPmdldFRyYW5zZm9ybWVkQm91
bmRzKCkpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKKyAg
ICAgICAgZ2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7Cisg
ICAgfQorCisgICAgaWYgKGxheWVyLT5tYXNrc1RvQm91bmRzKCkpCisgICAgICAgIGNsaXBSZWN0
LmludGVyc2VjdChsYXllci0+Z2V0RHJhd1JlY3QoKSk7CisKKyAgICAvLyBIZXJlLCB3ZSBuZWVk
IHRvIHNvcnQgdGhlIHdob2xlIHN1YnRyZWUgb2YgbGF5ZXJzIHdpdGggcHJlc2VydmUtM2QuIEl0
CisgICAgLy8gYWZmZWN0cyBhbGwgY2hpbGRyZW4sIGFuZCB0aGUgY2hpbGRyZW4gb2YgYW55IGNo
aWxkcmVuIHdpdGggcHJlc2VydmUtM2QsCisgICAgLy8gYW5kIHNvIG9uLgorICAgIFZlY3RvcjxM
YXllckNvbXBvc2l0aW5nVGhyZWFkKj4gc3VibGF5ZXJzID0gcmF3UHRyVmVjdG9yRnJvbVJlZlB0
clZlY3RvcihsYXllci0+Z2V0U3VibGF5ZXJzKCkpOworCisgICAgYm9vbCBwcmVzZXJ2ZXMzRCA9
IGxheWVyLT5wcmVzZXJ2ZXMzRCgpOworICAgIGJvb2wgc3VwZXJsYXllclByZXNlcnZlczNEID0g
bGF5ZXItPnN1cGVybGF5ZXIoKSAmJiBsYXllci0+c3VwZXJsYXllcigpLT5wcmVzZXJ2ZXMzRCgp
OworCisgICAgLy8gQ29sbGVjdCBhbmQgcmVuZGVyIGFsbCBzdWJsYXllcnMgd2l0aCBwcmVzZXJ2
ZXMtM0QuCisgICAgLy8gSWYgdGhlIHN1cGVybGF5ZXIgcHJlc2VydmVzIDNELCB3ZSd2ZSBhbHJl
YWR5IGNvbGxlY3RlZCBhbmQgcmVuZGVyZWQgaXRzCisgICAgLy8gY2hpbGRyZW4sIHNvIGJhaWwu
CisgICAgaWYgKHByZXNlcnZlczNEICYmICFzdXBlcmxheWVyUHJlc2VydmVzM0QpIHsKKyAgICAg
ICAgY29sbGVjdDNEUHJlc2VydmluZ0xheWVycyhzdWJsYXllcnMpOworICAgICAgICBzdGQ6OnN0
YWJsZV9zb3J0KHN1YmxheWVycy5iZWdpbigpLCBzdWJsYXllcnMuZW5kKCksIGNvbXBhcmVMYXll
clopOworICAgIH0KKworICAgIGludCBuZXdTdGVuY2lsVmFsdWUgPSBzdGVuY2lsQ2xpcCA/IHN0
ZW5jaWxWYWx1ZSsxIDogc3RlbmNpbFZhbHVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
c3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQq
IHN1YmxheWVyID0gc3VibGF5ZXJzW2ldOworICAgICAgICAvLyBUaGUgcm9vdCBvZiB0aGUgM2Qt
cHJlc2VydmluZyBzdWJ0cmVlIGhhcyBjb2xsZWN0ZWQgYWxsCisgICAgICAgIC8vIDNkLXByZXNl
cnZpbmcgbGF5ZXJzIGFuZCB0aGVpciBjaGlsZHJlbiBhbmQgd2lsbCByZW5kZXIgdGhlbSBhbGwg
aW4KKyAgICAgICAgLy8gdGhlIHJpZ2h0IG9yZGVyLgorICAgICAgICBpZiAocHJlc2VydmVzM0Qg
JiYgc3VwZXJsYXllclByZXNlcnZlczNEKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgIGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShzdWJsYXllciwgbmV3U3RlbmNpbFZhbHVlLCBj
bGlwUmVjdCk7CisgICAgfQorCisgICAgaWYgKHN0ZW5jaWxDbGlwKSB7CisgICAgICAgIGdsU3Rl
bmNpbEZ1bmMoR0xfTEVRVUFMLCBzdGVuY2lsVmFsdWUsIDB4ZmYpOworICAgICAgICBnbFN0ZW5j
aWxPcChHTF9LRUVQLCBHTF9SRVBMQUNFLCBHTF9SRVBMQUNFKTsKKworICAgICAgICB1cGRhdGVT
Y2lzc29ySWZOZWVkZWQoY2xpcFJlY3QpOworICAgICAgICBnbFVzZVByb2dyYW0obV9jb2xvclBy
b2dyYW1PYmplY3QpOworICAgICAgICBnbENvbG9yTWFzayhHTF9GQUxTRSwgR0xfRkFMU0UsIEdM
X0ZBTFNFLCBHTF9GQUxTRSk7CisgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcigwLCAyLCBH
TF9GTE9BVCwgR0xfRkFMU0UsIDAsICZsYXllci0+Z2V0VHJhbnNmb3JtZWRCb3VuZHMoKSk7Cisg
ICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworICAgICAgICBnbENv
bG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKKyAgICB9Cit9CisK
K3ZvaWQgTGF5ZXJSZW5kZXJlcjo6dXBkYXRlU2Npc3NvcklmTmVlZGVkKGNvbnN0IEZsb2F0UmVj
dCYgY2xpcFJlY3QpCit7CisjaWYgRU5BQkxFX1NDSVNTT1IKKyAgICBJbnRSZWN0IGNsaXBSZWN0
V0MgPSB0b09wZW5HTFdpbmRvd0Nvb3JkaW5hdGVzKGNsaXBSZWN0KTsKKyAgICBpZiAobV9zY2lz
c29yUmVjdCA9PSBjbGlwUmVjdFdDKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NjaXNzb3JS
ZWN0ID0gY2xpcFJlY3RXQzsKKyAgICBnbFNjaXNzb3IobV9zY2lzc29yUmVjdC54KCksIG1fc2Np
c3NvclJlY3QueSgpLCBtX3NjaXNzb3JSZWN0LndpZHRoKCksIG1fc2Npc3NvclJlY3QuaGVpZ2h0
KCkpOworI2VuZGlmCit9CisKK2Jvb2wgTGF5ZXJSZW5kZXJlcjo6bWFrZUNvbnRleHRDdXJyZW50
KCkKK3sKKyAgICByZXR1cm4gbV9jb250ZXh0LT5tYWtlQ3VycmVudCgpOworfQorCisvLyBCaW5k
cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgdG8gYSBjb21tb24gbG9jYXRpb24gYWNyb3NzIGFs
bCB0aHJlZSBwcm9ncmFtcworLy8gdXNlZCBieSB0aGUgY29tcG9zaXRvci4gVGhpcyBhbGxvd3Mg
dGhlIGNvZGUgdG8gYmluZCB0aGUgYXR0cmlidXRlcyBvbmx5IG9uY2UKKy8vIGV2ZW4gd2hlbiBz
d2l0Y2hpbmcgYmV0d2VlbiBwcm9ncmFtcy4KK3ZvaWQgTGF5ZXJSZW5kZXJlcjo6YmluZENvbW1v
bkF0dHJpYkxvY2F0aW9uKGludCBsb2NhdGlvbiwgY29uc3QgY2hhciogYXR0cmliTmFtZSkKK3sK
KyAgICBmb3IgKGludCBpID0gMDsgaSA8IExheWVyRGF0YTo6TnVtYmVyT2ZMYXllclByb2dyYW1T
aGFkZXJzOyArK2kpIHsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24obV9sYXllclByb2dy
YW1PYmplY3RbaV0sIGxvY2F0aW9uLCBhdHRyaWJOYW1lKTsKKyAgICAgICAgZ2xCaW5kQXR0cmli
TG9jYXRpb24obV9sYXllck1hc2tQcm9ncmFtT2JqZWN0W2ldLCBsb2NhdGlvbiwgYXR0cmliTmFt
ZSk7CisgICAgfQorCisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24obV9jb2xvclByb2dyYW1PYmpl
Y3QsIGxvY2F0aW9uLCBhdHRyaWJOYW1lKTsKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihtX2No
ZWNrZXJQcm9ncmFtT2JqZWN0LCBsb2NhdGlvbiwgYXR0cmliTmFtZSk7Cit9CisKK2Jvb2wgTGF5
ZXJSZW5kZXJlcjo6aW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cygpCit7CisgICAgLy8gU2hhZGVy
cyBmb3IgZHJhd2luZyB0aGUgbGF5ZXIgY29udGVudHMuCisgICAgY2hhciB2ZXJ0ZXhTaGFkZXJT
dHJpbmdbXSA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjNCBhX3Bvc2l0aW9uOyAgIFxuIgorICAg
ICAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXhDb29yZDsgICBcbiIKKyAgICAgICAgInZhcnlpbmcg
dmVjMiB2X3RleENvb3JkOyAgICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAg
ICAgICAgIFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAg
ICAgICAgIiAgZ2xfUG9zaXRpb24gPSBhX3Bvc2l0aW9uOyAgXG4iCisgICAgICAgICIgIHZfdGV4
Q29vcmQgPSBhX3RleENvb3JkOyAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcbiI7CisKKyAgICBjaGFyIGZyYWdtZW50U2hhZGVyU3RyaW5nUkdCQVtdID0KKyAg
ICAgICAgInZhcnlpbmcgbWVkaXVtcCB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIGxvd3Agc2FtcGxlcjJEIHNfdGV4dHVyZTsg
ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidW5pZm9ybSBsb3dwIGZsb2F0
IGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZv
aWQgbWFpbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XG4iCisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQo
c190ZXh0dXJlLCB2X3RleENvb3JkKSAqIGFscGhhOyBcbiIKKyAgICAgICAgIn0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iOworCisg
ICAgY2hhciBmcmFnbWVudFNoYWRlclN0cmluZ0JHUkFbXSA9CisgICAgICAgICJ2YXJ5aW5nIG1l
ZGl1bXAgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4i
CisgICAgICAgICJ1bmlmb3JtIGxvd3Agc2FtcGxlcjJEIHNfdGV4dHVyZTsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIGxvd3AgZmxvYXQgYWxwaGE7
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2b2lk
IG1haW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXG4iCisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHRl
eHR1cmUyRChzX3RleHR1cmUsIHZfdGV4Q29vcmQpLmJncmEgKiBhbHBoYTsgXG4iCisgICAgICAg
ICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXG4iOworCisgICAgY2hhciBmcmFnbWVudFNoYWRlclN0cmluZ01hc2tSR0JBW10g
PQorICAgICAgICAidmFyeWluZyBtZWRpdW1wIHZlYzIgdl90ZXhDb29yZDsgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gbG93cCBzYW1wbGVyMkQgc190ZXh0
dXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIGxvd3Ag
c2FtcGxlcjJEIHNfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAg
ICAidW5pZm9ybSBsb3dwIGZsb2F0IGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICBsb3dw
IHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoc190ZXh0dXJlLCB2X3RleENvb3JkKTsgICBcbiIK
KyAgICAgICAgIiAgbG93cCB2ZWM0IG1hc2tDb2xvciA9IHRleHR1cmUyRChzX21hc2ssIHZfdGV4
Q29vcmQpOyAgICAgXG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4Q29sb3Iu
eCwgdGV4Q29sb3IueSwgdGV4Q29sb3IueiwgdGV4Q29sb3IudykgKiBhbHBoYSAqIG1hc2tDb2xv
ci53OyAgICAgICAgICAgXG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIjsKKworICAgIGNoYXIgZnJhZ21lbnRT
aGFkZXJTdHJpbmdNYXNrQkdSQVtdID0KKyAgICAgICAgInZhcnlpbmcgbWVkaXVtcCB2ZWMyIHZf
dGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInVu
aWZvcm0gbG93cCBzYW1wbGVyMkQgc190ZXh0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gbG93cCBzYW1wbGVyMkQgc19tYXNrOyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gbG93cCBmbG9h
dCBhbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAg
ICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgbG93cCB2ZWM0
IHRleENvbG9yID0gdGV4dHVyZTJEKHNfdGV4dHVyZSwgdl90ZXhDb29yZCkuYmdyYTsgICAgICAg
ICAgICAgXG4iCisgICAgICAgICIgIGxvd3AgdmVjNCBtYXNrQ29sb3IgPSB0ZXh0dXJlMkQoc19t
YXNrLCB2X3RleENvb3JkKS5iZ3JhOyAgICAgICAgICBcbiIKKyAgICAgICAgIiAgZ2xfRnJhZ0Nv
bG9yID0gdmVjNCh0ZXhDb2xvci54LCB0ZXhDb2xvci55LCB0ZXhDb2xvci56LCB0ZXhDb2xvci53
KSAqIGFscGhhICogbWFza0NvbG9yLnc7ICAgICAgICAgXG4iCisgICAgICAgICJ9ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4i
OworCisKKyAgICAvLyBTaGFkZXJzIGZvciBkcmF3aW5nIHRoZSBkZWJ1ZyBib3JkZXJzIGFyb3Vu
ZCB0aGUgbGF5ZXJzLgorICAgIGNoYXIgY29sb3JWZXJ0ZXhTaGFkZXJTdHJpbmdbXSA9CisgICAg
ICAgICJhdHRyaWJ1dGUgdmVjNCBhX3Bvc2l0aW9uOyAgIFxuIgorICAgICAgICAidm9pZCBtYWlu
KCkgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IGFfcG9zaXRpb247IFxuIgorICAg
ICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7CisKKyAgICBjaGFyIGNvbG9y
RnJhZ21lbnRTaGFkZXJTdHJpbmdbXSA9CisgICAgICAgICJ1bmlmb3JtIGxvd3AgdmVjNCBjb2xv
cjsgICAgIFxuIgorICAgICAgICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAgICBcbiIKKyAg
ICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgIGdsX0Zy
YWdDb2xvciA9IGNvbG9yOyAgICAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcbiI7CisKKyAgICAvLyBGSVhNRTogZ2V0IHNjcmVlbiBzaXplLCBnZXQgbGlnaHQv
ZGFyayBjb2xvciwgdXNlCisgICAgLy8gc3RyaW5nIG1hbmlwdWxhdGlvbiBtZXRob2RzIHRvIGlu
c2VydCB0aG9zZSBjb25zdGFudHMgaW50bworICAgIC8vIHRoZSBzaGFkZXIgc291cmNlLgorICAg
IHN0YXRpYyBDb2xvciBsaWdodENvbG9yKDB4ZmIsIDB4ZmQsIDB4ZmYpOworICAgIC8vIGNoZWNr
ZXJib2FyZENvbG9yRGFyaygpCisgICAgc3RhdGljIENvbG9yIGRhcmtDb2xvcigweGU4LCAweGVl
LCAweGY3KTsKKyAgICBpbnQgY2hlY2tlclNpemUgPSAyMDsKKyAgICBTdHJpbmcgdG1wKAorICAg
ICAgICAidW5pZm9ybSBtZWRpdW1wIGZsb2F0IHNjYWxlOyAgICAgICAgICAgICAgICAgIFxuIgor
ICAgICAgICAidW5pZm9ybSBtZWRpdW1wIHZlYzIgb3JpZ2luOyAgICAgICAgICAgICAgICAgIFxu
IgorICAgICAgICAidW5pZm9ybSBtZWRpdW1wIGZsb2F0IHN1cmZhY2VIZWlnaHQ7ICAgICAgICAg
IFxuIgorICAgICAgICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFxuIgorICAgICAgICAiICBjb25zdCBtZWRpdW1wIGZsb2F0IGdyaWQgPSBHUklEOyAg
ICAgICAgICAgIFxuIgorICAgICAgICAiICBjb25zdCBsb3dwIHZlYzQgbGlnaHRDb2xvciA9IExJ
R0hUX0NPTE9SOyAgIFxuIgorICAgICAgICAiICBjb25zdCBsb3dwIHZlYzQgZGFya0NvbG9yID0g
REFSS19DT0xPUjsgICAgIFxuIgorICAgICAgICAiICBtZWRpdW1wIGZsb2F0IHRtcCA9IGdyaWQg
KiBzY2FsZTsgICAgICAgICAgIFxuIgorICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSBtb2QoZmxv
b3IoKGdsX0ZyYWdDb29yZC54ICsgb3JpZ2luLngpIC8gdG1wKSArIGZsb29yKChzdXJmYWNlSGVp
Z2h0IC0gZ2xfRnJhZ0Nvb3JkLnkgKyBvcmlnaW4ueSkgLyB0bXApLCAyLjApID4gMC45OSBcbiIK
KyAgICAgICAgIiAgICA/IGxpZ2h0Q29sb3IgOiBkYXJrQ29sb3I7ICAgICAgICAgICAgICAgICBc
biIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcbiIpOworCisgICAgLy8gTGV0IFdURjo6U3RyaW5nIGJlIG91ciBwcmVwcm9jZXNzb3IKKyAg
ICB0bXAucmVwbGFjZSgiTElHSFRfQ09MT1IiLCBTdHJpbmc6OmZvcm1hdCgidmVjNCglLjRmLCAl
LjRmLCAlLjRmLCAxLjApIiwgbGlnaHRDb2xvci5yZWQoKSAvIDI1NS4wLCBsaWdodENvbG9yLmdy
ZWVuKCkgLyAyNTUuMCwgbGlnaHRDb2xvci5ibHVlKCkgLyAyNTUuMCkpOworICAgIHRtcC5yZXBs
YWNlKCJEQVJLX0NPTE9SIiwgU3RyaW5nOjpmb3JtYXQoInZlYzQoJS40ZiwgJS40ZiwgJS40Ziwg
MS4wKSIsIGRhcmtDb2xvci5yZWQoKSAvIDI1NS4wLCBkYXJrQ29sb3IuZ3JlZW4oKSAvIDI1NS4w
LCBkYXJrQ29sb3IuYmx1ZSgpIC8gMjU1LjApKTsKKyAgICB0bXAucmVwbGFjZSgiR1JJRCIsIFN0
cmluZzo6Zm9ybWF0KCIlLjNmIiwgKGZsb2F0KWNoZWNrZXJTaXplKSk7CisgICAgQ1N0cmluZyBj
aGVja2VyRnJhZ21lbnRTaGFkZXJTdHJpbmcgPSB0bXAubGF0aW4xKCk7CisKKyAgICBtYWtlQ29u
dGV4dEN1cnJlbnQoKTsKKworICAgIG1fbGF5ZXJQcm9ncmFtT2JqZWN0W0xheWVyRGF0YTo6TGF5
ZXJQcm9ncmFtU2hhZGVyUkdCQV0gPQorICAgICAgICBsb2FkU2hhZGVyUHJvZ3JhbSh2ZXJ0ZXhT
aGFkZXJTdHJpbmcsIGZyYWdtZW50U2hhZGVyU3RyaW5nUkdCQSk7CisgICAgaWYgKCFtX2xheWVy
UHJvZ3JhbU9iamVjdFtMYXllckRhdGE6OkxheWVyUHJvZ3JhbVNoYWRlclJHQkFdKSB7CisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBzaGFkZXIgcHJvZ3JhbSBmb3IgUkdCQSBs
YXllcnMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbGF5ZXJQcm9n
cmFtT2JqZWN0W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVyQkdSQV0gPQorICAgICAgICBs
b2FkU2hhZGVyUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXJTdHJpbmcsIGZyYWdtZW50U2hhZGVyU3RyaW5n
QkdSQSk7CisgICAgaWYgKCFtX2xheWVyUHJvZ3JhbU9iamVjdFtMYXllckRhdGE6OkxheWVyUHJv
Z3JhbVNoYWRlckJHUkFdKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBz
aGFkZXIgcHJvZ3JhbSBmb3IgQkdSQSBsYXllcnMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIG1fbGF5ZXJNYXNrUHJvZ3JhbU9iamVjdFtMYXllckRhdGE6OkxheWVyUHJv
Z3JhbVNoYWRlclJHQkFdID0KKyAgICAgICAgbG9hZFNoYWRlclByb2dyYW0odmVydGV4U2hhZGVy
U3RyaW5nLCBmcmFnbWVudFNoYWRlclN0cmluZ01hc2tSR0JBKTsKKyAgICBpZiAoIW1fbGF5ZXJN
YXNrUHJvZ3JhbU9iamVjdFtMYXllckRhdGE6OkxheWVyUHJvZ3JhbVNoYWRlclJHQkFdKSB7Cisg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBzaGFkZXIgbWFzayBwcm9ncmFtIGZv
ciBSR0JBIGxheWVycyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9s
YXllck1hc2tQcm9ncmFtT2JqZWN0W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVyQkdSQV0g
PQorICAgICAgICBsb2FkU2hhZGVyUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXJTdHJpbmcsIGZyYWdtZW50
U2hhZGVyU3RyaW5nTWFza0JHUkEpOworICAgIGlmICghbV9sYXllck1hc2tQcm9ncmFtT2JqZWN0
W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVyQkdSQV0pIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBtYXNrIHByb2dyYW0gZm9yIEJHUkEgbGF5ZXJzIik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2NvbG9yUHJvZ3JhbU9iamVj
dCA9IGxvYWRTaGFkZXJQcm9ncmFtKGNvbG9yVmVydGV4U2hhZGVyU3RyaW5nLCBjb2xvckZyYWdt
ZW50U2hhZGVyU3RyaW5nKTsKKyAgICBpZiAoIW1fY29sb3JQcm9ncmFtT2JqZWN0KSB7CisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBzaGFkZXIgcHJvZ3JhbSBmb3IgZGVidWcg
Ym9yZGVycyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9jaGVja2Vy
UHJvZ3JhbU9iamVjdCA9IGxvYWRTaGFkZXJQcm9ncmFtKGNvbG9yVmVydGV4U2hhZGVyU3RyaW5n
LCBjaGVja2VyRnJhZ21lbnRTaGFkZXJTdHJpbmcuZGF0YSgpKTsKKyAgICBpZiAoIW1fY2hlY2tl
clByb2dyYW1PYmplY3QpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNo
YWRlciBwcm9ncmFtIGZvciBjaGVja2VyYm9hcmQgcGF0dGVybiIpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgLy8gU3BlY2lmeSB0aGUgYXR0cmliIGxvY2F0aW9uIGZvciB0
aGUgcG9zaXRpb24gYW5kIG1ha2UgaXQgdGhlIHNhbWUgZm9yIGFsbCB0aHJlZSBwcm9ncmFtcyB0
bworICAgIC8vIGF2b2lkIGJpbmRpbmcgcmUtYmluZGluZyB0aGUgdmVydGV4IGF0dHJpYnV0ZXMu
CisgICAgYmluZENvbW1vbkF0dHJpYkxvY2F0aW9uKG1fcG9zaXRpb25Mb2NhdGlvbiwgImFfcG9z
aXRpb24iKTsKKyAgICBiaW5kQ29tbW9uQXR0cmliTG9jYXRpb24obV90ZXhDb29yZExvY2F0aW9u
LCAiYV90ZXhDb29yZCIpOworCisgICAgY2hlY2tHTEVycm9yKCk7CisKKyAgICAvLyBSZS1saW5r
IHRoZSBzaGFkZXJzIHRvIGdldCB0aGUgbmV3IGF0dHJpYiBsb2NhdGlvbiB0byB0YWtlIGVmZmVj
dC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExheWVyRGF0YTo6TnVtYmVyT2ZMYXllclByb2dy
YW1TaGFkZXJzOyArK2kpIHsKKyAgICAgICAgZ2xMaW5rUHJvZ3JhbShtX2xheWVyUHJvZ3JhbU9i
amVjdFtpXSk7CisgICAgICAgIGdsTGlua1Byb2dyYW0obV9sYXllck1hc2tQcm9ncmFtT2JqZWN0
W2ldKTsKKyAgICB9CisKKyAgICBnbExpbmtQcm9ncmFtKG1fY29sb3JQcm9ncmFtT2JqZWN0KTsK
KyAgICBnbExpbmtQcm9ncmFtKG1fY2hlY2tlclByb2dyYW1PYmplY3QpOworCisgICAgY2hlY2tH
TEVycm9yKCk7CisKKyAgICAvLyBHZXQgbG9jYXRpb25zIG9mIHVuaWZvcm1zIGZvciB0aGUgbGF5
ZXIgY29udGVudCBzaGFkZXIgcHJvZ3JhbS4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExheWVy
RGF0YTo6TnVtYmVyT2ZMYXllclByb2dyYW1TaGFkZXJzOyArK2kpIHsKKyAgICAgICAgbV9zYW1w
bGVyTG9jYXRpb25baV0gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVj
dFtpXSwgInNfdGV4dHVyZSIpOworICAgICAgICBtX2FscGhhTG9jYXRpb25baV0gPSBnbEdldFVu
aWZvcm1Mb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVjdFtpXSwgImFscGhhIik7CisgICAgICAg
IGdsVXNlUHJvZ3JhbShtX2xheWVyUHJvZ3JhbU9iamVjdFtpXSk7CisgICAgICAgIGdsVW5pZm9y
bTFpKG1fc2FtcGxlckxvY2F0aW9uW2ldLCAwKTsKKyAgICAgICAgbV9tYXNrU2FtcGxlckxvY2F0
aW9uW2ldID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9sYXllck1hc2tQcm9ncmFtT2JqZWN0W2ld
LCAic190ZXh0dXJlIik7CisgICAgICAgIG1fbWFza1NhbXBsZXJMb2NhdGlvbk1hc2tbaV0gPSBn
bEdldFVuaWZvcm1Mb2NhdGlvbihtX2xheWVyTWFza1Byb2dyYW1PYmplY3RbaV0sICJzX21hc2si
KTsKKyAgICAgICAgbV9tYXNrQWxwaGFMb2NhdGlvbltpXSA9IGdsR2V0VW5pZm9ybUxvY2F0aW9u
KG1fbGF5ZXJNYXNrUHJvZ3JhbU9iamVjdFtpXSwgImFscGhhIik7CisgICAgICAgIGdsVXNlUHJv
Z3JhbShtX2xheWVyTWFza1Byb2dyYW1PYmplY3RbaV0pOworICAgICAgICBnbFVuaWZvcm0xaSht
X21hc2tTYW1wbGVyTG9jYXRpb25baV0sIDApOworICAgICAgICBnbFVuaWZvcm0xaShtX21hc2tT
YW1wbGVyTG9jYXRpb25NYXNrW2ldLCAxKTsKKyAgICB9CisKKyAgICAvLyBHZXQgbG9jYXRpb25z
IG9mIHVuaWZvcm1zIGZvciB0aGUgZGVidWcgYm9yZGVyIHNoYWRlciBwcm9ncmFtLgorICAgIG1f
Y29sb3JDb2xvckxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9jb2xvclByb2dyYW1P
YmplY3QsICJjb2xvciIpOworCisgICAgLy8gR2V0IGxvY2F0aW9ucyBvZiB1bmlmb3JtcyBmb3Ig
dGhlIGNoZWNrZXJib2FyZCBzaGFkZXIgcHJvZ3JhbS4KKyAgICBtX2NoZWNrZXJTY2FsZUxvY2F0
aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9jaGVja2VyUHJvZ3JhbU9iamVjdCwgInNjYWxl
Iik7CisgICAgbV9jaGVja2VyT3JpZ2luTG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbiht
X2NoZWNrZXJQcm9ncmFtT2JqZWN0LCAib3JpZ2luIik7CisgICAgbV9jaGVja2VyU3VyZmFjZUhl
aWdodExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9jaGVja2VyUHJvZ3JhbU9iamVj
dCwgInN1cmZhY2VIZWlnaHQiKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitJbnRSZWN0IExh
eWVyUmVuZGVyaW5nUmVzdWx0czo6aG9sZVB1bmNoUmVjdCh1bnNpZ25lZCBpbmRleCkgY29uc3QK
K3sKKyAgICBpZiAoaW5kZXggPj0gbV9ob2xlUHVuY2hSZWN0cy5zaXplKCkpCisgICAgICAgIHJl
dHVybiBJbnRSZWN0KCk7CisKKyAgICByZXR1cm4gbV9ob2xlUHVuY2hSZWN0cy5hdChpbmRleCk7
Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJpbmdSZXN1bHRzOjphZGRIb2xlUHVuY2hSZWN0KGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisjaWYgREVCVUdfVklERU9fQ0xJUFBJTkcKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJM
YXllclJlbmRlcmluZ1Jlc3VsdHM6OmFkZEhvbGVQdW5jaFJlY3QgKHg9JWQseT0lZCx3aWR0aD0l
ZCxoZWlnaHQ9JWQpLiIsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0Lmhl
aWdodCgpKTsKKyNlbmRpZgorICAgIGlmICghcmVjdC5pc0VtcHR5KCkpCisgICAgICAgIG1faG9s
ZVB1bmNoUmVjdHMuYXBwZW5kKHJlY3QpOworfQorCit2b2lkIExheWVyUmVuZGVyaW5nUmVzdWx0
czo6YWRkRGlydHlSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgSW50UmVjdCBkaXJ0
eVVuaW9uW051bWJlck9mRGlydHlSZWN0c107CisgICAgaW50IHNtYWxsZXN0SW5jcmVhc2UgPSBJ
TlRfTUFYOworICAgIGludCBtb2RpZmllZFJlY3QgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgTnVtYmVyT2ZEaXJ0eVJlY3RzOyArK2kpIHsKKyAgICAgICAgZGlydHlVbmlvbltpXSA9IG1f
ZGlydHlSZWN0c1tpXTsKKyAgICAgICAgZGlydHlVbmlvbltpXS51bml0ZShyZWN0KTsKKyAgICAg
ICAgaW50IGluY3JlYXNlID0gZGlydHlVbmlvbltpXS53aWR0aCgpKmRpcnR5VW5pb25baV0uaGVp
Z2h0KCkgLSBtX2RpcnR5UmVjdHNbaV0ud2lkdGgoKSptX2RpcnR5UmVjdHNbaV0uaGVpZ2h0KCk7
CisgICAgICAgIGlmIChpbmNyZWFzZSA8IHNtYWxsZXN0SW5jcmVhc2UpIHsKKyAgICAgICAgICAg
IHNtYWxsZXN0SW5jcmVhc2UgPSBpbmNyZWFzZTsKKyAgICAgICAgICAgIG1vZGlmaWVkUmVjdCA9
IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2RpcnR5UmVjdHNbbW9kaWZpZWRSZWN0XSA9
IGRpcnR5VW5pb25bbW9kaWZpZWRSZWN0XTsKK30KKworYm9vbCBMYXllclJlbmRlcmluZ1Jlc3Vs
dHM6OmlzRW1wdHkoKSBjb25zdAoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtYmVyT2ZE
aXJ0eVJlY3RzOyArK2kpIHsKKyAgICAgICAgaWYgKCFtX2RpcnR5UmVjdHNbaV0uaXNFbXB0eSgp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9MYXllclJlbmRlcmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L0xheWVyUmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44ODA2OTEwOGQ5MDI5
NWJkMDEyZTNmYTNkN2UwOWI5YzY3YmRiOTJjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclJlbmRlcmVyLmgKQEAgLTAs
MCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgTGF5ZXJSZW5k
ZXJlcl9oCisjZGVmaW5lIExheWVyUmVuZGVyZXJfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkxheWVyRGF0YS5o
IgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisKKyNpbmNsdWRlIDxCbGFja0Jl
cnJ5UGxhdGZvcm1HTEVTMkNvbnRleHQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1J
bnRSZWN0UmVnaW9uLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYv
Tm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMYXllckNvbXBvc2l0
aW5nVGhyZWFkOworY2xhc3MgUmVuZGVyU3VyZmFjZTsKKworY2xhc3MgTGF5ZXJSZW5kZXJpbmdS
ZXN1bHRzIHsKK3B1YmxpYzoKKyAgICBMYXllclJlbmRlcmluZ1Jlc3VsdHMoKSA6IHdhc0VtcHR5
KHRydWUpLCBuZWVkc0FuaW1hdGlvbkZyYW1lKGZhbHNlKSB7IH0KKworICAgIHZvaWQgYWRkSG9s
ZVB1bmNoUmVjdChjb25zdCBJbnRSZWN0Jik7CisgICAgSW50UmVjdCBob2xlUHVuY2hSZWN0KHNp
emVfdCBpbmRleCkgY29uc3Q7CisgICAgc2l6ZV90IGhvbGVQdW5jaFJlY3RTaXplKCkgeyByZXR1
cm4gbV9ob2xlUHVuY2hSZWN0cy5zaXplKCk7IH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQgTnVt
YmVyT2ZEaXJ0eVJlY3RzID0gMzsKKyAgICBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QoaW50IGkp
IGNvbnN0IHsgcmV0dXJuIG1fZGlydHlSZWN0c1tpXTsgfQorICAgIHZvaWQgYWRkRGlydHlSZWN0
KGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCk7CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CisK
KyAgICBib29sIHdhc0VtcHR5OworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RS
ZWdpb24gZGlydHlSZWdpb247CisKKyAgICBib29sIG5lZWRzQW5pbWF0aW9uRnJhbWU7CisKK3By
aXZhdGU6CisgICAgVmVjdG9yPEludFJlY3Q+IG1faG9sZVB1bmNoUmVjdHM7IC8vIFJlY3RzIGFy
ZSBpbiBjb21wb3NpdGluZyBzdXJmYWNlIGNvb3JkaW5hdGVzLgorICAgIEludFJlY3QgbV9kaXJ0
eVJlY3RzW051bWJlck9mRGlydHlSZWN0c107Cit9OworCisvLyBDbGFzcyB0aGF0IGhhbmRsZXMg
ZHJhd2luZyBvZiBjb21wb3NpdGVkIHJlbmRlciBsYXllcnMgdXNpbmcgR0wuCitjbGFzcyBMYXll
clJlbmRlcmVyIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShMYXllclJlbmRlcmVyKTsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyPiBjcmVhdGUoQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQqKTsKKworICAgIExheWVyUmVu
ZGVyZXIoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQqKTsKKyAg
ICB+TGF5ZXJSZW5kZXJlcigpOworCisgICAgdm9pZCByZWxlYXNlTGF5ZXJSZXNvdXJjZXMoKTsK
KworICAgIC8vIFJlY29tcG9zaXRlcyBhbGwgdGhlIGxheWVycy4gUmV0dXJucyB0cnVlIGlmIGl0
IG5lZWRzIG1vcmUgZHJhdy4KKyAgICB2b2lkIGRyYXdMYXllcnMoY29uc3QgRmxvYXRSZWN0JiB2
aXNpYmxlUmVjdCwgY29uc3QgSW50UmVjdCYgbGF5b3V0UmVjdCwgY29uc3QgSW50U2l6ZSYgY29u
dGVudHNTaXplLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0KTsKKworICAgIHZvaWQgc2V0Um9vdExh
eWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsKKyAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFk
KiByb290TGF5ZXIoKSB7IHJldHVybiBtX3Jvb3RMYXllci5nZXQoKTsgfQorCisgICAgLy8gS2Vl
cCB0cmFjayBvZiBsYXllcnMgdGhhdCBuZWVkIGNsZWFudXAgd2hlbiB0aGUgTGF5ZXJSZW5kZXJl
ciBpcyBkZXN0cm95ZWQKKyAgICB2b2lkIGFkZExheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQq
KTsKKyAgICBib29sIHJlbW92ZUxheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsKKworICAg
IC8vIEtlZXAgdHJhY2sgb2YgbGF5ZXJzIHRoYXQgbmVlZCB0byByZWxlYXNlIHRoZWlyIHRleHR1
cmVzIHdoZW4gd2Ugc3dhcCBidWZmZXJzCisgICAgdm9pZCBhZGRMYXllclRvUmVsZWFzZVRleHR1
cmVSZXNvdXJjZXNMaXN0KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsKKworICAgIGJvb2wgaGFy
ZHdhcmVDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1faGFyZHdhcmVDb21wb3NpdGluZzsg
fQorCisgICAgdm9pZCBzZXRDbGVhclN1cmZhY2VPbkRyYXdMYXllcnMoYm9vbCBjbGVhcikgeyBt
X2NsZWFyU3VyZmFjZU9uRHJhd0xheWVycyA9IGNsZWFyOyB9CisgICAgYm9vbCBjbGVhclN1cmZh
Y2VPbkRyYXdMYXllcnMoKSBjb25zdCB7IHJldHVybiBtX2NsZWFyU3VyZmFjZU9uRHJhd0xheWVy
czsgfQorCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQq
IGNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQ7IH0KKworICAgIGNvbnN0IExheWVy
UmVuZGVyaW5nUmVzdWx0cyYgbGFzdFJlbmRlcmluZ1Jlc3VsdHMoKSBjb25zdCB7IHJldHVybiBt
X2xhc3RSZW5kZXJpbmdSZXN1bHRzOyB9CisKKyAgICAvLyBTY2hlZHVsZSBhIGNvbW1pdCBvbiB0
aGUgV2ViS2l0IHRocmVhZCBhdCB0aGUgZW5kIG9mIHJlbmRlcmluZworICAgIC8vIFVzZWQgd2hl
biBhIGxheWVyIGRpc2NvdmVycyBkdXJpbmcgcmVuZGVyaW5nIHRoYXQgaXQgbmVlZHMgYSBjb21t
aXQuCisgICAgdm9pZCBzZXROZWVkc0NvbW1pdCgpIHsgbV9uZWVkc0NvbW1pdCA9IHRydWU7IH0K
KworICAgIEludFJlY3QgdG9XZWJLaXREb2N1bWVudENvb3JkaW5hdGVzKGNvbnN0IEZsb2F0UmVj
dCYpIGNvbnN0OworCisgICAgLy8gSWYgdGhlIGxheWVyIGhhcyBhbHJlYWR5IGJlZW4gZHJhd2Vk
IG9uIGEgc3VyZmFjZS4KKyAgICBib29sIGxheWVyQWxyZWFkeU9uU3VyZmFjZShMYXllckNvbXBv
c2l0aW5nVGhyZWFkKikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVMYXllcnNS
ZWN1cnNpdmUoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiBwYXJlbnRNYXRyaXgsIFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4g
PiYgc3VyZmFjZUxheWVycywgZmxvYXQgb3BhY2l0eSwgRmxvYXRSZWN0IGNsaXBSZWN0LCBkb3Vi
bGUgY3VycmVudFRpbWUpOworICAgIHZvaWQgY29tcG9zaXRlTGF5ZXJzUmVjdXJzaXZlKExheWVy
Q29tcG9zaXRpbmdUaHJlYWQqLCBpbnQgc3RlbmNpbFZhbHVlLCBGbG9hdFJlY3QgY2xpcFJlY3Qp
OworICAgIHZvaWQgdXBkYXRlU2Npc3NvcklmTmVlZGVkKGNvbnN0IEZsb2F0UmVjdCYgY2xpcFJl
Y3QpOworCisgICAgYm9vbCB1c2VTdXJmYWNlKFJlbmRlclN1cmZhY2UqKTsKKyAgICB2b2lkIGRy
YXdMYXllcnNPblN1cmZhY2VzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZD4gPiYgc3VyZmFjZUxheWVycyk7CisKKyAgICB2b2lkIGRyYXdEZWJ1Z0JvcmRlcihMYXll
ckNvbXBvc2l0aW5nVGhyZWFkKik7CisgICAgdm9pZCBkcmF3SG9sZVB1bmNoUmVjdChMYXllckNv
bXBvc2l0aW5nVGhyZWFkKik7CisKKyAgICBJbnRSZWN0IHRvT3BlbkdMV2luZG93Q29vcmRpbmF0
ZXMoY29uc3QgRmxvYXRSZWN0JikgY29uc3Q7CisgICAgSW50UmVjdCB0b1dlYktpdFdpbmRvd0Nv
b3JkaW5hdGVzKGNvbnN0IEZsb2F0UmVjdCYpIGNvbnN0OworCisgICAgdm9pZCBiaW5kQ29tbW9u
QXR0cmliTG9jYXRpb24oaW50IGxvY2F0aW9uLCBjb25zdCBjaGFyKiBhdHRyaWJOYW1lKTsKKwor
ICAgIGJvb2wgbWFrZUNvbnRleHRDdXJyZW50KCk7CisKKyAgICBib29sIGluaXRpYWxpemVTaGFy
ZWRHTE9iamVjdHMoKTsKKworICAgIC8vIEdMIHNoYWRlciBwcm9ncmFtIG9iamVjdCBJRHMuCisg
ICAgdW5zaWduZWQgbV9sYXllclByb2dyYW1PYmplY3RbTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVy
UHJvZ3JhbVNoYWRlcnNdOworICAgIHVuc2lnbmVkIG1fbGF5ZXJNYXNrUHJvZ3JhbU9iamVjdFtM
YXllckRhdGE6Ok51bWJlck9mTGF5ZXJQcm9ncmFtU2hhZGVyc107CisgICAgdW5zaWduZWQgbV9j
b2xvclByb2dyYW1PYmplY3Q7CisgICAgdW5zaWduZWQgbV9jaGVja2VyUHJvZ3JhbU9iamVjdDsK
KworICAgIC8vIFNoYWRlciB1bmlmb3JtIGFuZCBhdHRyaWJ1dGUgbG9jYXRpb25zLgorICAgIGNv
bnN0IGludCBtX3Bvc2l0aW9uTG9jYXRpb247CisgICAgY29uc3QgaW50IG1fdGV4Q29vcmRMb2Nh
dGlvbjsKKyAgICBpbnQgbV9zYW1wbGVyTG9jYXRpb25bTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVy
UHJvZ3JhbVNoYWRlcnNdOworICAgIGludCBtX2FscGhhTG9jYXRpb25bTGF5ZXJEYXRhOjpOdW1i
ZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnNdOworICAgIGludCBtX21hc2tTYW1wbGVyTG9jYXRpb25b
TGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnNdOworICAgIGludCBtX21hc2tT
YW1wbGVyTG9jYXRpb25NYXNrW0xheWVyRGF0YTo6TnVtYmVyT2ZMYXllclByb2dyYW1TaGFkZXJz
XTsKKyAgICBpbnQgbV9tYXNrQWxwaGFMb2NhdGlvbltMYXllckRhdGE6Ok51bWJlck9mTGF5ZXJQ
cm9ncmFtU2hhZGVyc107CisKKyAgICBpbnQgbV9jb2xvckNvbG9yTG9jYXRpb247CisgICAgaW50
IG1fY2hlY2tlclNjYWxlTG9jYXRpb247CisgICAgaW50IG1fY2hlY2tlck9yaWdpbkxvY2F0aW9u
OworICAgIGludCBtX2NoZWNrZXJTdXJmYWNlSGVpZ2h0TG9jYXRpb247CisKKyAgICAvLyBDdXJy
ZW50IGRyYXcgY29uZmlndXJhdGlvbi4KKyAgICBGbG9hdFJlY3QgbV92aXNpYmxlUmVjdDsKKyAg
ICBJbnRSZWN0IG1fbGF5b3V0UmVjdDsKKyAgICBJbnRTaXplIG1fY29udGVudHNTaXplOworCisg
ICAgSW50UmVjdCBtX3ZpZXdwb3J0OworICAgIEludFJlY3QgbV9zY2lzc29yUmVjdDsKKworICAg
IFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiBtX3Jvb3RMYXllcjsKKworICAgIHVuc2ln
bmVkIG1fZmJvOworICAgIFJlbmRlclN1cmZhY2UqIG1fY3VycmVudFJlbmRlclN1cmZhY2U7CisK
KyAgICBib29sIG1faGFyZHdhcmVDb21wb3NpdGluZzsKKyAgICBib29sIG1fY2xlYXJTdXJmYWNl
T25EcmF3TGF5ZXJzOworCisgICAgLy8gTWFwIGFzc29jaWF0aW5nIGxheWVycyB3aXRoIHRleHR1
cmVzIGlkcyB1c2VkIGJ5IHRoZSBHTCBjb21wb3NpdG9yLgorICAgIHR5cGVkZWYgSGFzaFNldDxM
YXllckNvbXBvc2l0aW5nVGhyZWFkKj4gTGF5ZXJTZXQ7CisgICAgTGF5ZXJTZXQgbV9sYXllcnM7
CisgICAgTGF5ZXJTZXQgbV9sYXllcnNMb2NraW5nVGV4dHVyZVJlc291cmNlczsKKworICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6R0xFUzJDb250ZXh0KiBtX2NvbnRleHQ7CisK
KyAgICBMYXllclJlbmRlcmluZ1Jlc3VsdHMgbV9sYXN0UmVuZGVyaW5nUmVzdWx0czsKKyAgICBi
b29sIG1fbmVlZHNDb21taXQ7Cit9OworCit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisKKyNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130356</attachid>
            <date>2012-03-06 04:48:35 -0800</date>
            <delta_ts>2012-03-06 05:15:22 -0800</delta_ts>
            <desc>patch-for-landing</desc>
            <filename>bug-79874-20120306204830.patch</filename>
            <type>text/plain</type>
            <size>58238</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5OTA0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTMwNTU4ZDdiNGM2Nzcy
MjMxNjUxOGE4MTY2ZWExZjY1Y2U2ZmMzZS4uZDAxNWNkYjEwYzcwNGViNDhlODhhYmQ4OWRmNjll
Zjg2OGJlMGQ3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDEyLTAzLTA2ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBMYXllclJlbmRlcmVyLntoLCBjcHB9CisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03OTg3NAorCisgICAgICAgIFJldmlld2VkIGJ5
IEFudG9uaW8gR29tZXMuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRlc3Rz
LgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclJlbmRlcmVy
LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNr
R0xFcnJvcik6CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hhZGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OmxvYWRTaGFkZXJQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6Om9ydGhvTWF0cml4KToK
KyAgICAgICAgKFdlYkNvcmU6OnJhd1B0clZlY3RvckZyb21SZWZQdHJWZWN0b3IpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyUmVuZGVyZXI6OkxheWVyUmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5k
ZXJlcjo6fkxheWVyUmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6
cmVsZWFzZUxheWVyUmVzb3VyY2VzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXBhcmVMYXllclop
OgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6ZHJhd0xheWVycyk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjp1c2VTdXJmYWNlKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyUmVuZGVyZXI6OmRyYXdMYXllcnNPblN1cmZhY2VzKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyUmVuZGVyZXI6OnNldFJvb3RMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJl
bmRlcmVyOjphZGRMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpyZW1v
dmVMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjphZGRMYXllclRvUmVs
ZWFzZVRleHR1cmVSZXNvdXJjZXNMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVy
ZXI6OnRvT3BlbkdMV2luZG93Q29vcmRpbmF0ZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJS
ZW5kZXJlcjo6dG9XZWJLaXRXaW5kb3dDb29yZGluYXRlcyk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclJlbmRlcmVyOjp0b1dlYktpdERvY3VtZW50Q29vcmRpbmF0ZXMpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJSZW5kZXJlcjo6ZHJhd0RlYnVnQm9yZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyUmVuZGVyZXI6OmRyYXdIb2xlUHVuY2hSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyUmVuZGVyZXI6OnVwZGF0ZUxheWVyc1JlY3Vyc2l2ZSk6CisgICAgICAgIChXZWJDb3JlOjpo
YXNSb3RhdGlvbmFsQ29tcG9uZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6
OmxheWVyQWxyZWFkeU9uU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpjb2xsZWN0M0RQcmVz
ZXJ2aW5nTGF5ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OmNvbXBvc2l0
ZUxheWVyc1JlY3Vyc2l2ZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjp1cGRh
dGVTY2lzc29ySWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6bWFr
ZUNvbnRleHRDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OmJpbmRD
b21tb25BdHRyaWJMb2NhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpp
bml0aWFsaXplU2hhcmVkR0xPYmplY3RzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVy
aW5nUmVzdWx0czo6aG9sZVB1bmNoUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRl
cmluZ1Jlc3VsdHM6OmFkZEhvbGVQdW5jaFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJS
ZW5kZXJpbmdSZXN1bHRzOjphZGREaXJ0eVJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJS
ZW5kZXJpbmdSZXN1bHRzOjppc0VtcHR5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9i
bGFja2JlcnJ5L0xheWVyUmVuZGVyZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKExheWVyUmVuZGVyaW5nUmVzdWx0cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJl
bmRlcmluZ1Jlc3VsdHM6OkxheWVyUmVuZGVyaW5nUmVzdWx0cyk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclJlbmRlcmluZ1Jlc3VsdHM6OmhvbGVQdW5jaFJlY3RTaXplKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyUmVuZGVyaW5nUmVzdWx0czo6ZGlydHlSZWN0KToKKyAgICAgICAgKExheWVy
UmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6cm9vdExheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OmhhcmR3YXJlQ29tcG9zaXRpbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlcjo6c2V0Q2xlYXJTdXJmYWNlT25EcmF3TGF5
ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OmNsZWFyU3VyZmFjZU9uRHJh
d0xheWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyOjpjb250ZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6Omxhc3RSZW5kZXJpbmdSZXN1bHRzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXI6OnNldE5lZWRzQ29tbWl0KToKKwogMjAxMi0w
My0wNiAgVnNldm9sb2QgVmxhc292ICA8dnNldmlrQGNocm9taXVtLm9yZz4KIAogICAgICAgICBX
ZWIgSW5zcGVjdG9yOiBbUmVncmVzc2lvbl0gRXhlY3V0aW9uIGxpbmUgaXMgbm90IHJldmVhbGVk
IHdoZW4gZGVidWdnZXIgaXMgc3RvcHBlZCBpZiBzY3JpcHRzIHBhbmVsIHdhcyBub3QgeWV0IHNo
b3duLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2ti
ZXJyeS9MYXllclJlbmRlcmVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2JsYWNrYmVycnkvTGF5ZXJSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODE4ZmMyNmZhZGNlNjEz
NDMxNWExMTljZWExNDUyZjdjNjJiYTEwZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJSZW5kZXJlci5jcHAKQEAgLTAs
MCArMSwxMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2Vh
cmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXll
clJlbmRlcmVyLmgiCisKKyNpbmNsdWRlICJMYXllckNvbXBvc2l0aW5nVGhyZWFkLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGVDb21wb3NpdGlu
Z1RocmVhZC5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CisjaW5jbHVk
ZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCisj
ZGVmaW5lIEVOQUJMRV9TQ0lTU09SIDEKKworI2RlZmluZSBERUJVR19TSEFERVJfQ09NUElMQVRJ
T04gMAorI2RlZmluZSBERUJVR19ESVJUWV9MQVlFUlMgMCAvLyBTaG93IGRpcnR5IGxheWVycyBh
cyByZWQuCisjZGVmaW5lIERFQlVHX0xBWUVSX0FOSU1BVElPTlMgMCAvLyBTaG93IHJ1bm5pbmcg
YW5pbWF0aW9ucyBhcyBncmVlbi4KKyNkZWZpbmUgREVCVUdfVklERU9fQ0xJUFBJTkcgMAorCit1
c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkdMRVMyQ29udGV4dDsKK3VzaW5n
IG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgY2hl
Y2tHTEVycm9yKCkKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgaWYgKEdMZW51bSBlcnJvciA9IGds
R2V0RXJyb3IoKSkKKyAgICAgICAgTE9HX0VSUk9SKCJHTCBFcnJvcjogMHgleCAiICwgZXJyb3Ip
OworI2VuZGlmCit9CisKK3N0YXRpYyBHTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gdHlwZSwgY29u
c3QgY2hhciogc2hhZGVyU291cmNlKQoreworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNo
YWRlcih0eXBlKTsKKyAgICBpZiAoIXNoYWRlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZ2xT
aGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc2hhZGVyU291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVT
aGFkZXIoc2hhZGVyKTsKKyAgICBHTGludCBjb21waWxlZDsKKyAgICBnbEdldFNoYWRlcml2KHNo
YWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7CisgICAgaWYgKCFjb21waWxlZCkg
eworI2lmIERFQlVHX1NIQURFUl9DT01QSUxBVElPTgorICAgICAgICBjaGFyIGluZm9Mb2dbMjA0
OF07CisgICAgICAgIEdMc2l6ZWkgbGVuZ3RoOworICAgICAgICBnbEdldFNoYWRlckluZm9Mb2co
c2hhZGVyLCAyMDQ4LCAmbGVuZ3RoLCBpbmZvTG9nKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIs
ICJGYWlsZWQgdG8gY29tcGlsZSBzaGFkZXI6ICVzIiwgaW5mb0xvZyk7CisjZW5kaWYKKyAgICAg
ICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAg
IHJldHVybiBzaGFkZXI7Cit9CisKK3N0YXRpYyBHTHVpbnQgbG9hZFNoYWRlclByb2dyYW0oY29u
c3QgY2hhciogdmVydGV4U2hhZGVyU291cmNlLCBjb25zdCBjaGFyKiBmcmFnbWVudFNoYWRlclNv
dXJjZSkKK3sKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyOworICAgIEdMdWludCBmcmFnbWVudFNo
YWRlcjsKKyAgICBHTHVpbnQgcHJvZ3JhbU9iamVjdDsKKyAgICBHTGludCBsaW5rZWQ7CisgICAg
dmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTaGFkZXJT
b3VyY2UpOworICAgIGlmICghdmVydGV4U2hhZGVyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBm
cmFnbWVudFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNo
YWRlclNvdXJjZSk7CisgICAgaWYgKCFmcmFnbWVudFNoYWRlcikgeworICAgICAgICBnbERlbGV0
ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJv
Z3JhbU9iamVjdCA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtT2JqZWN0KSB7
CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW1PYmplY3QsIHZlcnRleFNoYWRlcik7Cisg
ICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW1PYmplY3QsIGZyYWdtZW50U2hhZGVyKTsKKyAg
ICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtT2JqZWN0KTsKKyAgICAgICAgZ2xHZXRQcm9ncmFt
aXYocHJvZ3JhbU9iamVjdCwgR0xfTElOS19TVEFUVVMsICZsaW5rZWQpOworICAgICAgICBpZiAo
IWxpbmtlZCkgeworICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW1PYmplY3QpOwor
ICAgICAgICAgICAgcHJvZ3JhbU9iamVjdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xE
ZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNo
YWRlcik7CisgICAgcmV0dXJuIHByb2dyYW1PYmplY3Q7Cit9CisKK3N0YXRpYyBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCBvcnRob01hdHJpeChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90
dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXJaLCBmbG9hdCBmYXJaKQoreworICAgIGZsb2F0IGRl
bHRhWCA9IHJpZ2h0IC0gbGVmdDsKKyAgICBmbG9hdCBkZWx0YVkgPSB0b3AgLSBib3R0b207Cisg
ICAgZmxvYXQgZGVsdGFaID0gZmFyWiAtIG5lYXJaOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IG9ydGhvOworICAgIGlmICghZGVsdGFYIHx8ICFkZWx0YVkgfHwgIWRlbHRhWikKKyAgICAgICAg
cmV0dXJuIG9ydGhvOworICAgIG9ydGhvLnNldE0xMSgyLjBmIC8gZGVsdGFYKTsKKyAgICBvcnRo
by5zZXRNNDEoLShyaWdodCArIGxlZnQpIC8gZGVsdGFYKTsKKyAgICBvcnRoby5zZXRNMjIoMi4w
ZiAvIGRlbHRhWSk7CisgICAgb3J0aG8uc2V0TTQyKC0odG9wICsgYm90dG9tKSAvIGRlbHRhWSk7
CisgICAgb3J0aG8uc2V0TTMzKC0yLjBmIC8gZGVsdGFaKTsKKyAgICBvcnRoby5zZXRNNDMoLShu
ZWFyWiArIGZhclopIC8gZGVsdGFaKTsKKyAgICByZXR1cm4gb3J0aG87Cit9CisKK3N0YXRpYyBW
ZWN0b3I8TGF5ZXJDb21wb3NpdGluZ1RocmVhZCo+IHJhd1B0clZlY3RvckZyb21SZWZQdHJWZWN0
b3IoY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiA+JiBzdWJsYXll
cnMpCit7CisgICAgVmVjdG9yPExheWVyQ29tcG9zaXRpbmdUaHJlYWQqPiBzdWJsYXllckxpc3Q7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisgICAg
ICAgIHN1YmxheWVyTGlzdC5hcHBlbmQoc3VibGF5ZXJzW2ldLmdldCgpKTsKKworICAgIHJldHVy
biBzdWJsYXllckxpc3Q7Cit9CisKK1Bhc3NPd25QdHI8TGF5ZXJSZW5kZXJlcj4gTGF5ZXJSZW5k
ZXJlcjo6Y3JlYXRlKEdMRVMyQ29udGV4dCogY29udGV4dCkKK3sKKyAgICByZXR1cm4gYWRvcHRQ
dHIobmV3IExheWVyUmVuZGVyZXIoY29udGV4dCkpOworfQorCitMYXllclJlbmRlcmVyOjpMYXll
clJlbmRlcmVyKEdMRVMyQ29udGV4dCogY29udGV4dCkKKyAgICA6IG1fY29sb3JQcm9ncmFtT2Jq
ZWN0KDApCisgICAgLCBtX2NoZWNrZXJQcm9ncmFtT2JqZWN0KDApCisgICAgLCBtX3Bvc2l0aW9u
TG9jYXRpb24oMCkKKyAgICAsIG1fdGV4Q29vcmRMb2NhdGlvbigxKQorICAgICwgbV9mYm8oMCkK
KyAgICAsIG1fY3VycmVudExheWVyUmVuZGVyZXJTdXJmYWNlKDApCisgICAgLCBtX2NsZWFyU3Vy
ZmFjZU9uRHJhd0xheWVycyh0cnVlKQorICAgICwgbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBt
X25lZWRzQ29tbWl0KGZhbHNlKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRh
OjpOdW1iZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnM7ICsraSkKKyAgICAgICAgbV9sYXllclByb2dy
YW1PYmplY3RbaV0gPSAwOworCisgICAgbV9oYXJkd2FyZUNvbXBvc2l0aW5nID0gaW5pdGlhbGl6
ZVNoYXJlZEdMT2JqZWN0cygpOworfQorCitMYXllclJlbmRlcmVyOjp+TGF5ZXJSZW5kZXJlcigp
Cit7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgaWYgKG1fZmJvKQorICAgICAgICBn
bERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbV9mYm8pOworICAgIGdsRGVsZXRlUHJvZ3JhbShtX2Nv
bG9yUHJvZ3JhbU9iamVjdCk7CisgICAgZ2xEZWxldGVQcm9ncmFtKG1fY2hlY2tlclByb2dyYW1P
YmplY3QpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVy
UHJvZ3JhbVNoYWRlcnM7ICsraSkKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fbGF5ZXJQcm9n
cmFtT2JqZWN0W2ldKTsKKyAgICBpZiAobV9oYXJkd2FyZUNvbXBvc2l0aW5nKSB7CisgICAgICAg
IC8vIEZyZWUgdXAgYWxsIEdMIHRleHR1cmVzLgorICAgICAgICB3aGlsZSAobV9sYXllcnMuYmVn
aW4oKSAhPSBtX2xheWVycy5lbmQoKSkgeworICAgICAgICAgICAgTGF5ZXJTZXQ6Oml0ZXJhdG9y
IGl0ZXIgPSBtX2xheWVycy5iZWdpbigpOworICAgICAgICAgICAgKCppdGVyKS0+ZGVsZXRlVGV4
dHVyZXMoKTsKKyAgICAgICAgICAgICgqaXRlciktPnNldExheWVyUmVuZGVyZXIoMCk7CisgICAg
ICAgICAgICByZW1vdmVMYXllcigqaXRlcik7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0dXJl
Q2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBMYXll
clJlbmRlcmVyOjpyZWxlYXNlTGF5ZXJSZXNvdXJjZXMoKQoreworICAgIGlmIChtX2hhcmR3YXJl
Q29tcG9zaXRpbmcpIHsKKyAgICAgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgICAgIC8v
IEZyZWUgdXAgYWxsIEdMIHRleHR1cmVzLgorICAgICAgICBmb3IgKExheWVyU2V0OjppdGVyYXRv
ciBpdGVyID0gbV9sYXllcnMuYmVnaW4oKTsgaXRlciAhPSBtX2xheWVycy5lbmQoKTsgKytpdGVy
KQorICAgICAgICAgICAgKCppdGVyKS0+ZGVsZXRlVGV4dHVyZXMoKTsKKworICAgICAgICB0ZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5jbGVhcigpOworICAgIH0KK30KKworc3RhdGlj
IGlubGluZSBib29sIGNvbXBhcmVMYXllclooY29uc3QgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCog
YSwgY29uc3QgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogYikKK3sKKyAgICBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtQSA9IGEtPmRyYXdUcmFuc2Zvcm0oKTsKKyAgICBjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtQiA9IGItPmRyYXdUcmFuc2Zvcm0oKTsK
KworICAgIHJldHVybiB0cmFuc2Zvcm1BLm00MygpIDwgdHJhbnNmb3JtQi5tNDMoKTsKK30KKwor
Ly8gUmUtY29tcG9zaXRlcyBhbGwgc3VibGF5ZXJzLgordm9pZCBMYXllclJlbmRlcmVyOjpkcmF3
TGF5ZXJzKGNvbnN0IEZsb2F0UmVjdCYgdmlzaWJsZVJlY3QsIGNvbnN0IEludFJlY3QmIGxheW91
dFJlY3QsIGNvbnN0IEludFNpemUmIGNvbnRlbnRzU2l6ZSwgY29uc3QgSW50UmVjdCYgZHN0UmVj
dCkKK3sKKyAgICBBU1NFUlQobV9oYXJkd2FyZUNvbXBvc2l0aW5nKTsKKworICAgIGJvb2wgd2Fz
RW1wdHkgPSBtX2xhc3RSZW5kZXJpbmdSZXN1bHRzLmlzRW1wdHkoKTsKKyAgICBtX2xhc3RSZW5k
ZXJpbmdSZXN1bHRzID0gTGF5ZXJSZW5kZXJpbmdSZXN1bHRzKCk7CisgICAgbV9sYXN0UmVuZGVy
aW5nUmVzdWx0cy53YXNFbXB0eSA9IHdhc0VtcHR5OworCisgICAgaWYgKCFtX3Jvb3RMYXllcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhlc2UgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBj
YWxjdWxhdGUgcG9zaXRpb24gb2YgZml4ZWQgcG9zaXRpb24gZWxlbWVudHMKKyAgICBtX3Zpc2li
bGVSZWN0ID0gdmlzaWJsZVJlY3Q7CisgICAgbV9sYXlvdXRSZWN0ID0gbGF5b3V0UmVjdDsKKyAg
ICBtX2NvbnRlbnRzU2l6ZSA9IGNvbnRlbnRzU2l6ZTsKKworICAgIC8vIFdlYktpdCB1c2VzIHJv
dyB2ZWN0b3JzIHdoaWNoIGFyZSBtdWx0aXBsaWVkIGJ5IHRoZSBtYXRyaXggb24gdGhlIGxlZnQg
KGkuZS4gdipNKQorICAgIC8vIFRyYW5zZm9ybWF0aW9ucyBhcmUgY29tcG9zZWQgb24gdGhlIGxl
ZnQgc28gdGhhdCBNMS54Zm9ybShNMikgbWVhbnMgTTIqTTEKKyAgICAvLyBXZSB0aGVyZWZvcmUg
c3RhcnQgd2l0aCBvdXIgKG90aG9nb25hbCkgcHJvamVjdGlvbiBtYXRyaXgsIHdoaWNoIHdpbGwg
YmUgYXBwbGllZAorICAgIC8vIGFzIHRoZSBsYXN0IHRyYW5zZm9ybWF0aW9uLgorICAgIFRyYW5z
Zm9ybWF0aW9uTWF0cml4IG1hdHJpeCA9IG9ydGhvTWF0cml4KDAsIHZpc2libGVSZWN0LndpZHRo
KCksIHZpc2libGVSZWN0LmhlaWdodCgpLCAwLCAtMTAwMCwgMTAwMCk7CisgICAgbWF0cml4LnRy
YW5zbGF0ZTNkKC12aXNpYmxlUmVjdC54KCksIC12aXNpYmxlUmVjdC55KCksIDApOworCisgICAg
Ly8gT3BlbkdMIHdpbmRvdyBjb29yZGluYXRlcyBvcmlnaW4gaXMgYXQgdGhlIGxvd2VyIGxlZnQg
Y29ybmVyIG9mIHRoZSBzdXJmYWNlIHdoaWxlCisgICAgLy8gV2ViS2l0IHVzZXMgdXBwZXIgbGVm
dCBhcyB0aGUgb3JpZ2luIG9mIHRoZSB3aW5kb3cgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBwYXNz
ZWQgaW4gJ2RzdFJlY3QnCisgICAgLy8gaXMgaW4gV2ViS2l0IHdpbmRvdyBjb29yZGluYXRlIHN5
c3RlbS4gSGVyZSB3ZSBzZXR1cCB0aGUgdmlld3BvcnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFs
dWUKKyAgICAvLyBpbiBPcGVuR0wgd2luZG93IGNvb3JkaW5hdGVzLgorICAgIGludCB2aWV3cG9y
dFkgPSBzdGQ6Om1heCgwLCBtX2NvbnRleHQtPnN1cmZhY2VTaXplKCkuaGVpZ2h0KCkgLSBkc3RS
ZWN0Lm1heFkoKSk7CisgICAgbV92aWV3cG9ydCA9IEludFJlY3QoZHN0UmVjdC54KCksIHZpZXdw
b3J0WSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpKTsKKworICAgIGRvdWJsZSBh
bmltYXRpb25UaW1lID0gY3VycmVudFRpbWUoKTsKKworI2lmIERFQlVHX1ZJREVPX0NMSVBQSU5H
CisgICAgLy8gSW52b2tpbmcgdXBkYXRlTGF5ZXJzUmVjdXJzaXZlKCkgd2hpY2ggd2lsbCBjYWxs
IExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0oKS4KKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJM
YXllclJlbmRlcmVyOjpkcmF3TGF5ZXJzKCkgdmlzaWJsZT0oeD0lLjJmLHk9JS4yZix3aWR0aD0l
LjJmLGhlaWdodD0lLjJmKSwgbGF5b3V0PSh4PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKSwg
Y29udGVudHM9KCVkeCVkKSwgZHN0PSh4PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKS4iLAor
ICAgICAgICB2aXNpYmxlUmVjdC54KCksIHZpc2libGVSZWN0LnkoKSwgdmlzaWJsZVJlY3Qud2lk
dGgoKSwgdmlzaWJsZVJlY3QuaGVpZ2h0KCksCisgICAgICAgIGxheW91dFJlY3QueCgpLCBsYXlv
dXRSZWN0LnkoKSwgbGF5b3V0UmVjdC53aWR0aCgpLCBsYXlvdXRSZWN0LmhlaWdodCgpLAorICAg
ICAgICBjb250ZW50c1NpemUud2lkdGgoKSwgY29udGVudHNTaXplLmhlaWdodCgpLAorICAgICAg
ICBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWln
aHQoKSk7CisjZW5kaWYKKworICAgIFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZD4gPiBzdXJmYWNlTGF5ZXJzOworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3Np
dGluZ1RocmVhZD4gPiYgc3VibGF5ZXJzID0gbV9yb290TGF5ZXItPmdldFN1YmxheWVycygpOwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7CisgICAg
ICAgIGZsb2F0IG9wYWNpdHkgPSAxOworICAgICAgICBGbG9hdFJlY3QgY2xpcFJlY3QoLTEsIC0x
LCAyLCAyKTsKKyAgICAgICAgdXBkYXRlTGF5ZXJzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQo
KSwgbWF0cml4LCBzdXJmYWNlTGF5ZXJzLCBvcGFjaXR5LCBjbGlwUmVjdCwgYW5pbWF0aW9uVGlt
ZSk7CisgICAgfQorCisgICAgLy8gRGVjb21wb3NlIHRoZSBkaXJ0eSByZWN0IGludG8gYSBzZXQg
b2Ygbm9uLW92ZXJsYXBpbmcgcmVjdGFuZ2xlcworICAgIC8vICh0aGV5IG5lZWQgdG8gbm90IG92
ZXJsYXAgc28gdGhhdCB0aGUgYmxlbmRpbmcgY29kZSBkb2Vzbid0IGRyYXcgYW55IHJlZ2lvbiB0
d2ljZSkuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMYXllclJlbmRlcmluZ1Jlc3VsdHM6Ok51
bWJlck9mRGlydHlSZWN0czsgKytpKSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uIHJlZ2lvbihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdChtX2xhc3RS
ZW5kZXJpbmdSZXN1bHRzLmRpcnR5UmVjdChpKSkpOworICAgICAgICBtX2xhc3RSZW5kZXJpbmdS
ZXN1bHRzLmRpcnR5UmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246
OnVuaW9uUmVnaW9ucyhtX2xhc3RSZW5kZXJpbmdSZXN1bHRzLmRpcnR5UmVnaW9uLCByZWdpb24p
OworICAgIH0KKworICAgIC8vIElmIHdlIHdvbid0IGRyYXcgYW55dGhpbmcsIGRvbid0IHRvdWNo
IHRoZSBPcGVuR0wgQVBJcy4KKyAgICBpZiAobV9sYXN0UmVuZGVyaW5nUmVzdWx0cy5pc0VtcHR5
KCkgJiYgd2FzRW1wdHkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE9rYXksIHdlJ3JlIGdv
aW5nIHRvIGRvIHNvbWUgZHJhd2luZy4KKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKKworICAg
IGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobV9wb3NpdGlvbkxvY2F0aW9uKTsKKyAgICBnbEVu
YWJsZVZlcnRleEF0dHJpYkFycmF5KG1fdGV4Q29vcmRMb2NhdGlvbik7CisgICAgZ2xBY3RpdmVU
ZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAg
Z2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUKTsK
KworICAgIC8vIElmIGN1bGxpbmcgaXMgZW5hYmxlZCB0aGVuIHdlIHdpbGwgY3VsbCB0aGUgYmFj
a2ZhY2UuCisgICAgZ2xDdWxsRmFjZShHTF9CQUNLKTsKKyAgICAvLyBUaGUgb3J0aG9ncmFwaGlj
IHByb2plY3Rpb24gaXMgc2V0dXAgc3VjaCB0aGF0IFkgc3RhcnRzIGF0IHplcm8gYW5kCisgICAg
Ly8gaW5jcmVhc2VzIGdvaW5nIGRvd24gdGhlIHBhZ2Ugd2hpY2ggZmxpcHMgdGhlIHdpbmRpbmcg
b3JkZXIgb2YgdHJpYW5nbGVzLgorICAgIC8vIFRoZSBsYXllciBxdWFkcyBhcmUgZHJhd24gaW4g
Y2xvY2std2lzZSBvcmRlciBzbyB0aGUgZnJvbnQgZmFjZSBpcyBDQ1cuCisgICAgZ2xGcm9udEZh
Y2UoR0xfQ0NXKTsKKworICAgIC8vIFRoZSBzaGFkZXIgdXNlZCB0byByZW5kZXIgbGF5ZXJzIHJl
dHVybnMgcHJlLW11bHRpcGxpZWQgYWxwaGEgY29sb3JzCisgICAgLy8gc28gd2UgbmVlZCB0byBz
ZW5kIHRoZSBibGVuZGluZyBtb2RlIGFwcHJvcHJpYXRlbHkuCisgICAgZ2xFbmFibGUoR0xfQkxF
TkQpOworICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisK
KyAgICAvLyBVcGRhdGUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjaGVja2VyYm9hcmQgZHJhd2lu
Zy4KKyAgICBnbFVzZVByb2dyYW0obV9jaGVja2VyUHJvZ3JhbU9iamVjdCk7CisgICAgZmxvYXQg
Yml0bWFwU2NhbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4obV9sYXlvdXRSZWN0LndpZHRoKCkpIC8g
c3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fdmlzaWJsZVJlY3Qud2lkdGgoKSk7CisgICAgZ2xVbmlmb3Jt
MWYobV9jaGVja2VyU2NhbGVMb2NhdGlvbiwgYml0bWFwU2NhbGUpOworICAgIGZsb2F0IHNjYWxl
ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRzdFJlY3Qud2lkdGgoKSkgLyBzdGF0aWNfY2FzdDxmbG9h
dD4obV92aXNpYmxlUmVjdC53aWR0aCgpKTsKKyAgICBnbFVuaWZvcm0yZihtX2NoZWNrZXJPcmln
aW5Mb2NhdGlvbiwgbV92aXNpYmxlUmVjdC54KCkqc2NhbGUsIG1fdmlzaWJsZVJlY3QueSgpKnNj
YWxlKTsKKyAgICBnbFVuaWZvcm0xZihtX2NoZWNrZXJTdXJmYWNlSGVpZ2h0TG9jYXRpb24sIG1f
Y29udGV4dC0+c3VyZmFjZVNpemUoKS5oZWlnaHQoKSk7CisKKyAgICBjaGVja0dMRXJyb3IoKTsK
KworICAgIC8vIElmIHNvbWUgbGF5ZXJzIHNob3VsZCBiZSBkcmF3ZWQgb24gdGVtcG9yYXJ5IHN1
cmZhY2VzLCB3ZSBzaG91bGQgZG8gaXQgZmlyc3QuCisgICAgZHJhd0xheWVyc09uU3VyZmFjZXMo
c3VyZmFjZUxheWVycyk7CisKKyNpZiBFTkFCTEVfU0NJU1NPUgorICAgIG1fc2Npc3NvclJlY3Qg
PSBtX3ZpZXdwb3J0OworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xTY2lz
c29yKG1fc2Npc3NvclJlY3QueCgpLCBtX3NjaXNzb3JSZWN0LnkoKSwgbV9zY2lzc29yUmVjdC53
aWR0aCgpLCBtX3NjaXNzb3JSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgZ2xDbGVhclN0
ZW5jaWwoMCk7CisgICAgaWYgKG1fY2xlYXJTdXJmYWNlT25EcmF3TGF5ZXJzKSB7CisgICAgICAg
IGdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKKyAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZG
RVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Cisg
ICAgfQorCisgICAgLy8gRG9uJ3QgcmVuZGVyIHRoZSByb290IGxheWVyLCB0aGUgQmxhY2tCZXJy
eSBwb3J0IHVzZXMgdGhlIEJhY2tpbmdTdG9yZSB0byBkcmF3IHRoZQorICAgIC8vIHJvb3QgbGF5
ZXIuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspIHsK
KyAgICAgICAgaW50IGN1cnJlbnRTdGVuY2lsVmFsdWUgPSAwOworICAgICAgICBGbG9hdFJlY3Qg
Y2xpcFJlY3QoLTEsIC0xLCAyLCAyKTsKKyAgICAgICAgY29tcG9zaXRlTGF5ZXJzUmVjdXJzaXZl
KHN1YmxheWVyc1tpXS5nZXQoKSwgY3VycmVudFN0ZW5jaWxWYWx1ZSwgY2xpcFJlY3QpOworICAg
IH0KKworICAgIG1fY29udGV4dC0+c3dhcEJ1ZmZlcnMoKTsKKworICAgIExheWVyU2V0OjppdGVy
YXRvciBpdGVyID0gbV9sYXllcnNMb2NraW5nVGV4dHVyZVJlc291cmNlcy5iZWdpbigpOworICAg
IGZvciAoOyBpdGVyICE9IG1fbGF5ZXJzTG9ja2luZ1RleHR1cmVSZXNvdXJjZXMuZW5kKCk7ICsr
aXRlcikKKyAgICAgICAgKCppdGVyKS0+cmVsZWFzZVRleHR1cmVSZXNvdXJjZXMoKTsKKworICAg
IG1fbGF5ZXJzTG9ja2luZ1RleHR1cmVSZXNvdXJjZXMuY2xlYXIoKTsKKworICAgIGlmIChtX25l
ZWRzQ29tbWl0KSB7CisgICAgICAgIG1fbmVlZHNDb21taXQgPSBmYWxzZTsKKyAgICAgICAgbV9y
b290TGF5ZXItPnNjaGVkdWxlQ29tbWl0KCk7CisgICAgfQorCisgICAgdGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQoKS0+Y29sbGVjdEdhcmJhZ2UoKTsKK30KKworYm9vbCBMYXllclJlbmRl
cmVyOjp1c2VTdXJmYWNlKExheWVyUmVuZGVyZXJTdXJmYWNlKiBzdXJmYWNlKQoreworICAgIGlm
IChtX2N1cnJlbnRMYXllclJlbmRlcmVyU3VyZmFjZSA9PSBzdXJmYWNlKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIG1fY3VycmVudExheWVyUmVuZGVyZXJTdXJmYWNlID0gc3VyZmFjZTsK
KyAgICBpZiAoIXN1cmZhY2UpIHsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVC
VUZGRVIsIDApOworICAgICAgICBnbFZpZXdwb3J0KG1fdmlld3BvcnQueCgpLCBtX3ZpZXdwb3J0
LnkoKSwgbV92aWV3cG9ydC53aWR0aCgpLCBtX3ZpZXdwb3J0LmhlaWdodCgpKTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3VyZmFjZS0+ZW5zdXJlVGV4dHVyZSgpOworCisg
ICAgaWYgKCFtX2ZibykKKyAgICAgICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJm1fZmJvKTsKKyAg
ICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgbV9mYm8pOworICAgIGdsRnJhbWVi
dWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9U
RVhUVVJFXzJELCBzdXJmYWNlLT50ZXh0dXJlKCktPnRleHR1cmVJZCgpLCAwKTsKKworI2lmbmRl
ZiBOREVCVUcKKyAgICBHTGVudW0gc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdM
X0ZSQU1FQlVGRkVSKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRF
KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzIGVy
cm9yICV4XG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlm
CisKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHN1cmZhY2UtPnNpemUoKS53aWR0aCgpLCBzdXJmYWNl
LT5zaXplKCkuaGVpZ2h0KCkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIExheWVyUmVu
ZGVyZXI6OmRyYXdMYXllcnNPblN1cmZhY2VzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21w
b3NpdGluZ1RocmVhZD4gPiYgc3VyZmFjZUxheWVycykKK3sKKyAgICBmb3IgKGludCBpID0gc3Vy
ZmFjZUxheWVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBMYXllckNvbXBv
c2l0aW5nVGhyZWFkKiBsYXllciA9IHN1cmZhY2VMYXllcnNbaV0uZ2V0KCk7CisgICAgICAgIExh
eWVyUmVuZGVyZXJTdXJmYWNlKiBzdXJmYWNlID0gbGF5ZXItPmxheWVyUmVuZGVyZXJTdXJmYWNl
KCk7CisgICAgICAgIGlmICghc3VyZmFjZSB8fCAhdXNlU3VyZmFjZShzdXJmYWNlKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwor
ICAgICAgICBnbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09M
T1JfQlVGRkVSX0JJVCk7CisKKyAgICAgICAgaW50IGN1cnJlbnRTdGVuY2lsVmFsdWUgPSAwOwor
ICAgICAgICBGbG9hdFJlY3QgY2xpcFJlY3QoLTEsIC0xLCAyLCAyKTsKKyAgICAgICAgY29tcG9z
aXRlTGF5ZXJzUmVjdXJzaXZlKHN1cmZhY2VMYXllcnNbaV0uZ2V0KCksIGN1cnJlbnRTdGVuY2ls
VmFsdWUsIGNsaXBSZWN0KTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbGF5ZXJzIGRy
YXdlZCBvbiBzdXJmYWNlcywgd2UgbmVlZCB0byBzd2l0Y2ggdG8gZGVmYXVsdCBmcmFtZWJ1ZmZl
ci4KKyAgICAvLyBPdGhlcndpc2UsIHdlIGp1c3QgbmVlZCB0byBzZXQgdmlld3BvcnQuCisgICAg
aWYgKHN1cmZhY2VMYXllcnMuc2l6ZSgpKQorICAgICAgICB1c2VTdXJmYWNlKDApOworICAgIGVs
c2UKKyAgICAgICAgZ2xWaWV3cG9ydChtX3ZpZXdwb3J0LngoKSwgbV92aWV3cG9ydC55KCksIG1f
dmlld3BvcnQud2lkdGgoKSwgbV92aWV3cG9ydC5oZWlnaHQoKSk7Cit9CisKK3ZvaWQgTGF5ZXJS
ZW5kZXJlcjo6c2V0Um9vdExheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyKQorewor
ICAgIG1fcm9vdExheWVyID0gbGF5ZXI7Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJlcjo6YWRkTGF5
ZXIoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIpCit7CisgICAgbV9sYXllcnMuYWRkKGxh
eWVyKTsKK30KKworYm9vbCBMYXllclJlbmRlcmVyOjpyZW1vdmVMYXllcihMYXllckNvbXBvc2l0
aW5nVGhyZWFkKiBsYXllcikKK3sKKyAgICBMYXllclNldDo6aXRlcmF0b3IgaXRlciA9IG1fbGF5
ZXJzLmZpbmQobGF5ZXIpOworICAgIGlmIChpdGVyID09IG1fbGF5ZXJzLmVuZCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgbV9sYXllcnMucmVtb3ZlKGxheWVyKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBMYXllclJlbmRlcmVyOjphZGRMYXllclRvUmVsZWFzZVRleHR1cmVS
ZXNvdXJjZXNMaXN0KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyKQoreworICAgIG1fbGF5
ZXJzTG9ja2luZ1RleHR1cmVSZXNvdXJjZXMuYWRkKGxheWVyKTsKK30KKworLy8gVHJhbnNmb3Jt
IG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzIHRvIHdpbmRvdyBjb29yZGluYXRlcworLy8g
YXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuR0wgRVMgMi4wIHNwZWMgc2VjdGlvbiAyLjEyLjEuCitJ
bnRSZWN0IExheWVyUmVuZGVyZXI6OnRvT3BlbkdMV2luZG93Q29vcmRpbmF0ZXMoY29uc3QgRmxv
YXRSZWN0JiByKSBjb25zdAoreworICAgIGZsb2F0IHZ3MiA9IG1fdmlld3BvcnQud2lkdGgoKSAv
IDIuMDsKKyAgICBmbG9hdCB2aDIgPSBtX3ZpZXdwb3J0LmhlaWdodCgpIC8gMi4wOworICAgIGZs
b2F0IG94ID0gbV92aWV3cG9ydC54KCkgKyB2dzI7CisgICAgZmxvYXQgb3kgPSBtX3ZpZXdwb3J0
LnkoKSArIHZoMjsKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChGbG9hdFJlY3Qoci54KCkg
KiB2dzIgKyBveCwgci55KCkgKiB2aDIgKyBveSwgci53aWR0aCgpICogdncyLCByLmhlaWdodCgp
ICogdmgyKSk7Cit9CisKKy8vIFRyYW5zZm9ybSBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRl
cyB0byB3aW5kb3cgY29vcmRpbmF0ZXMgYXMgV2ViS2l0IHVuZGVyc3RhbmRzIHRoZW0uCisvLwor
Ly8gVGhlIE9wZW5HTCBzdXJmYWNlIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgV2ViS2l0IHdpbmRv
dywgYW5kIE9wZW5HTCB3aW5kb3cgY29vcmRpbmF0ZXMKKy8vIGhhdmUgb3JpZ2luIGluIGJvdHRv
bSBsZWZ0IHdoaWxlIFdlYktpdCB3aW5kb3cgY29vcmRpbmF0ZXMgb3JpZ2luIGlzIGluIHRvcCBs
ZWZ0LgorLy8gVGhlIHZpZXdwb3J0IGlzIHNldHVwIHRvIGNvdmVyIHRoZSB1cHBlciBwb3J0aW9u
IG9mIHRoZSBsYXJnZXIgT3BlbkdMIHN1cmZhY2UuCitJbnRSZWN0IExheWVyUmVuZGVyZXI6OnRv
V2ViS2l0V2luZG93Q29vcmRpbmF0ZXMoY29uc3QgRmxvYXRSZWN0JiByKSBjb25zdAoreworICAg
IGZsb2F0IHZ3MiA9IG1fdmlld3BvcnQud2lkdGgoKSAvIDIuMDsKKyAgICBmbG9hdCB2aDIgPSBt
X3ZpZXdwb3J0LmhlaWdodCgpIC8gMi4wOworICAgIGZsb2F0IG94ID0gbV92aWV3cG9ydC54KCkg
KyB2dzI7CisgICAgZmxvYXQgb3kgPSBtX2NvbnRleHQtPnN1cmZhY2VTaXplKCkuaGVpZ2h0KCkg
LSAobV92aWV3cG9ydC55KCkgKyB2aDIpOworICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KEZs
b2F0UmVjdChyLngoKSAqIHZ3MiArIG94LCAtKHIueSgpK3IuaGVpZ2h0KCkpICogdmgyICsgb3ks
IHIud2lkdGgoKSAqIHZ3Miwgci5oZWlnaHQoKSAqIHZoMikpOworfQorCisvLyBTaW1pbGFyIHRv
IHRvV2ViS2l0V2luZG93Q29vcmRpbmF0ZXMgZXhjZXB0IHRoYXQgdGhpcyBhbHNvIHRha2VzIGFu
eSB6b29tIGludG8gYWNjb3VudC4KK0ludFJlY3QgTGF5ZXJSZW5kZXJlcjo6dG9XZWJLaXREb2N1
bWVudENvb3JkaW5hdGVzKGNvbnN0IEZsb2F0UmVjdCYgcikgY29uc3QKK3sKKyAgICAvLyBUaGUg
em9vbSBpcyB0aGUgcmF0aW8gYmV0d2VlbiB2aXNpYmxlUmVjdCAob3IgbGF5b3V0UmVjdCkgYW5k
IGRzdFJlY3QgcGFyYW1ldGVycyB3aGljaCBhcmUgcGFzc2VkIHRvIGRyYXdMYXllcnMKKyAgICBm
bG9hdCB6b29tID0gbV92aXNpYmxlUmVjdC53aWR0aCgpIC8gbV92aWV3cG9ydC53aWR0aCgpOwor
ICAgIC8vIENvdWxkIGFzc2VydCBoZXJlIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB3
ZSBjaG9vc2Ugd2lkdGggb3IgaGVpZ2h0IGluIHRoZSBhYm92ZSBzdGF0ZW1lbnQ6CisgICAgLy8g
YmVjYXVzZSBib3RoIHJlY3RhbmdsZXMgc2hvdWxkIGhhdmUgdmVyeSBzaW1pbGFyIHNoYXBlcyAo
c3ViamVjdCBvbmx5IHRvIHBpeGVsIHJvdW5kaW5nIGVycm9yKS4KKworICAgIEludFJlY3QgcmVz
dWx0ID0gdG9XZWJLaXRXaW5kb3dDb29yZGluYXRlcyhyKTsKKyAgICByZXN1bHQuc2NhbGUoem9v
bSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gRHJhd3MgYSBkZWJ1ZyBib3JkZXIgYXJv
dW5kIHRoZSBsYXllcidzIGJvdW5kcy4KK3ZvaWQgTGF5ZXJSZW5kZXJlcjo6ZHJhd0RlYnVnQm9y
ZGVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyKQoreworICAgIENvbG9yIGJvcmRlckNv
bG9yID0gbGF5ZXItPmJvcmRlckNvbG9yKCk7CisKKyNpZiBERUJVR19ESVJUWV9MQVlFUlMKKyAg
ICBpZiAobGF5ZXItPmlzRGlydHkoKSkKKyAgICAgICAgYm9yZGVyQ29sb3IgPSBDb2xvcigweEZG
LCAweDAwLCAweDAwLCAweEZGKTsKKyNlbmRpZgorCisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9O
UworICAgIGlmIChsYXllci0+aGFzUnVubmluZ0FuaW1hdGlvbnMoKSkKKyAgICAgICAgYm9yZGVy
Q29sb3IgPSAgQ29sb3IoMHgwMCwgMHhGRiwgMHgwMCwgMHhGRik7CisjZW5kaWYKKworICAgIGlm
ICghYm9yZGVyQ29sb3IuYWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2xVc2VQcm9n
cmFtKG1fY29sb3JQcm9ncmFtT2JqZWN0KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoMCwg
MiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCAmbGF5ZXItPmdldFRyYW5zZm9ybWVkQm91bmRzKCkp
OworICAgIGdsVW5pZm9ybTRmKG1fY29sb3JDb2xvckxvY2F0aW9uLCBib3JkZXJDb2xvci5yZWQo
KSAvIDI1NS4wLCBib3JkZXJDb2xvci5ncmVlbigpIC8gMjU1LjAsIGJvcmRlckNvbG9yLmJsdWUo
KSAvIDI1NS4wLCAxKTsKKworICAgIGdsTGluZVdpZHRoKGxheWVyLT5ib3JkZXJXaWR0aCgpKTsK
KyAgICBnbERyYXdBcnJheXMoR0xfTElORV9MT09QLCAwLCA0KTsKK30KKworLy8gQ2xlYXJzIGEg
cmVjdGFuZ2xlIGluc2lkZSB0aGUgbGF5ZXIncyBib3VuZHMuCit2b2lkIExheWVyUmVuZGVyZXI6
OmRyYXdIb2xlUHVuY2hSZWN0KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyKQoreworICAg
IGdsVXNlUHJvZ3JhbShtX2NvbG9yUHJvZ3JhbU9iamVjdCk7CisgICAgZ2xVbmlmb3JtNGYobV9j
b2xvckNvbG9yTG9jYXRpb24sIDAsIDAsIDAsIDApOworCisgICAgZ2xCbGVuZEZ1bmMoR0xfT05F
LCBHTF9aRVJPKTsKKyAgICBGbG9hdFF1YWQgaG9sZSA9IGxheWVyLT5nZXRUcmFuc2Zvcm1lZEhv
bGVQdW5jaFJlY3QoKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoMCwgMiwgR0xfRkxPQVQs
IEdMX0ZBTFNFLCAwLCAmaG9sZSk7CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwg
MCwgNCk7CisgICAgY2hlY2tHTEVycm9yKCk7CisgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9P
TkVfTUlOVVNfU1JDX0FMUEhBKTsKKworICAgIEludFJlY3QgaG9sZVdDID0gdG9XZWJLaXRXaW5k
b3dDb29yZGluYXRlcyhob2xlLmJvdW5kaW5nQm94KCkpOworICAgIG1fbGFzdFJlbmRlcmluZ1Jl
c3VsdHMuYWRkSG9sZVB1bmNoUmVjdChob2xlV0MpOworfQorCit2b2lkIExheWVyUmVuZGVyZXI6
OnVwZGF0ZUxheWVyc1JlY3Vyc2l2ZShMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciwgY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCwgVmVjdG9yPFJlZlB0cjxMYXllckNvbXBv
c2l0aW5nVGhyZWFkPiA+JiBzdXJmYWNlTGF5ZXJzLCBmbG9hdCBvcGFjaXR5LCBGbG9hdFJlY3Qg
Y2xpcFJlY3QsIGRvdWJsZSBjdXJyZW50VGltZSkKK3sKKworICAgIC8vIFRoZSBjb250cmFjdCBm
b3IgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TGF5ZXJSZW5kZXJlciBpcyBpdCBtdXN0IGJl
IHNldCBpZiB0aGUgbGF5ZXIgaGFzIGJlZW4gcmVuZGVyZWQuCisgICAgLy8gU28gZG8gaXQgbm93
LCBiZWZvcmUgd2UgcmVuZGVyIGl0IGluIGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZS4KKyAgICBs
YXllci0+c2V0TGF5ZXJSZW5kZXJlcih0aGlzKTsKKyAgICBpZiAobGF5ZXItPm1hc2tMYXllcigp
KQorICAgICAgICBsYXllci0+bWFza0xheWVyKCktPnNldExheWVyUmVuZGVyZXIodGhpcyk7Cisg
ICAgaWYgKGxheWVyLT5yZXBsaWNhTGF5ZXIoKSkgeworICAgICAgICBMYXllckNvbXBvc2l0aW5n
VGhyZWFkKiByZXBsaWNhID0gbGF5ZXItPnJlcGxpY2FMYXllcigpOworICAgICAgICByZXBsaWNh
LT5zZXRMYXllclJlbmRlcmVyKHRoaXMpOworICAgICAgICBpZiAocmVwbGljYS0+bWFza0xheWVy
KCkpCisgICAgICAgICAgICByZXBsaWNhLT5tYXNrTGF5ZXIoKS0+c2V0TGF5ZXJSZW5kZXJlcih0
aGlzKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIG1pZ2h0IGNhdXNlIHRoZSBsYXllciB0byByZWNv
bXB1dGUgc29tZSBhdHRyaWJ1dGVzLgorICAgIG1fbGFzdFJlbmRlcmluZ1Jlc3VsdHMubmVlZHNB
bmltYXRpb25GcmFtZSB8PSBsYXllci0+dXBkYXRlQW5pbWF0aW9ucyhjdXJyZW50VGltZSk7CisK
KyAgICAvLyBDb21wdXRlIHRoZSBuZXcgbWF0cml4IHRyYW5zZm9ybWF0aW9uIHRoYXQgd2lsbCBi
ZSBhcHBsaWVkIHRvIHRoaXMgbGF5ZXIgYW5kCisgICAgLy8gYWxsIGl0cyBzdWJsYXllcnMuIEl0
J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgdGhlIGxheWVyJ3MgcG9zaXRpb24KKyAgICAv
LyBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxheWVyJ3MgYW5jaG9yIHBvaW50LiBBbHNvLCB0aGUg
Y29vcmRpbmF0ZSBzeXN0ZW0gdXNlZAorICAgIC8vIGFzc3VtZXMgdGhhdCB0aGUgb3JpZ2luIGlz
IGF0IHRoZSBsb3dlciBsZWZ0IGV2ZW4gdGhvdWdoIHRoZSBjb29yZGluYXRlcyB0aGUgYnJvd3Nl
cgorICAgIC8vIGdpdmVzIHVzIGZvciB0aGUgbGF5ZXJzIGFyZSBmb3IgdGhlIHVwcGVyIGxlZnQg
Y29ybmVyLiBUaGUgWSBmbGlwIGhhcHBlbnMgdmlhCisgICAgLy8gdGhlIG9ydGhvZ3JhcGhpYyBw
cm9qZWN0aW9uIGFwcGxpZWQgYXQgcmVuZGVyIHRpbWUuCisgICAgLy8gVGhlIHRyYW5zZm9ybWF0
aW9uIGNoYWluIGZvciB0aGUgbGF5ZXIgaXMgKHVzaW5nIHRoZSBNYXRyaXggeCBWZWN0b3Igb3Jk
ZXIpOgorICAgIC8vIE0gPSBNW3BdICogVHJbbF0gKiBNW2xdICogVHJbY10KKyAgICAvLyBXaGVy
ZSBNW3BdIGlzIHRoZSBwYXJlbnQgbWF0cml4IHBhc3NlZCBkb3duIHRvIHRoZSBmdW5jdGlvbgor
ICAgIC8vICAgICAgIFRyW2xdIGlzIHRoZSB0cmFuc2xhdGlvbiBtYXRyaXggbG9jYXRpbmcgdGhl
IGxheWVyJ3MgYW5jaG9yIHBvaW50CisgICAgLy8gICAgICAgVHJbY10gaXMgdGhlIHRyYW5zbGF0
aW9uIG9mZnNldCBiZXR3ZWVuIHRoZSBhbmNob3IgcG9pbnQgYW5kIHRoZSBjZW50ZXIgb2YgdGhl
IGxheWVyCisgICAgLy8gICAgICAgTVtsXSBpcyB0aGUgbGF5ZXIncyBtYXRyaXggKGFwcGxpZWQg
YXQgdGhlIGFuY2hvciBwb2ludCkKKyAgICAvLyBUaGlzIHRyYW5zZm9ybSBjcmVhdGVzIGEgY29v
cmRpbmF0ZSBzeXN0ZW0gd2hvc2Ugb3JpZ2luIGlzIHRoZSBjZW50ZXIgb2YgdGhlIGxheWVyLgor
ICAgIC8vIE5vdGUgdGhhdCB0aGUgZmluYWwgbWF0cml4IHVzZWQgYnkgdGhlIHNoYWRlciBmb3Ig
dGhlIGxheWVyIGlzIFAgKiBNICogUyAuIFRoaXMgZmluYWwgcHJvZHVjdAorICAgIC8vIGlzIGNv
bXB1dGVkIGluIGRyYXdUZXh0dXJlZFF1YWQoKS4KKyAgICAvLyBXaGVyZTogUCBpcyB0aGUgcHJv
amVjdGlvbiBtYXRyaXgKKyAgICAvLyAgICAgICAgTSBpcyB0aGUgbGF5ZXIncyBtYXRyaXggY29t
cHV0ZWQgYWJvdmUKKyAgICAvLyAgICAgICAgUyBpcyB0aGUgc2NhbGUgYWRqdXN0bWVudCAodG8g
c2NhbGUgdXAgdG8gdGhlIGxheWVyIHNpemUpCisgICAgSW50U2l6ZSBib3VuZHMgPSBsYXllci0+
Ym91bmRzKCk7CisgICAgRmxvYXRQb2ludCBhbmNob3JQb2ludCA9IGxheWVyLT5hbmNob3JQb2lu
dCgpOworICAgIEZsb2F0UG9pbnQgcG9zaXRpb24gPSBsYXllci0+cG9zaXRpb24oKTsKKworICAg
IC8vIExheWVyIHdob3NlIGhhc0ZpeGVkQ29udGFpbmVyIGlzIHRydWUgd2lsbCBnZXQgc2Nyb2xs
ZWQgcmVsYXRpdmUgdG8KKyAgICAvLyB0aGUgZml4ZWQgcG9zaXRpb25lZCBwYXJlbnQuCisgICAg
aWYgKCFsYXllci0+aGFzRml4ZWRDb250YWluZXIoKSAmJiAobGF5ZXItPmlzRml4ZWRQb3NpdGlv
bigpIHx8IGxheWVyLT5oYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKCkpKSB7CisgICAgICAgIC8v
IFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gc2V0IHZpc2libGUgeSB0byB0aGUgdmFsdWUgd2Ug
d2FudCwgYW5kCisgICAgICAgIC8vIGxheW91dCB5IHRvIHRoZSB2YWx1ZSBXZWJDb3JlIGxheW91
dGVkIHRoZSBmaXhlZCBlbGVtZW50IHRvLgorICAgICAgICBmbG9hdCBtYXhpbXVtU2Nyb2xsWSA9
IG1fY29udGVudHNTaXplLmhlaWdodCgpIC0gbV92aXNpYmxlUmVjdC5oZWlnaHQoKTsKKyAgICAg
ICAgZmxvYXQgdmlzaWJsZVkgPSBtYXgoMC4wZiwgbV92aXNpYmxlUmVjdC55KCkpOworICAgICAg
ICBmbG9hdCBsYXlvdXRZID0gbWF4KDAuMGYsIG1pbihtYXhpbXVtU2Nyb2xsWSwgKGZsb2F0KW1f
bGF5b3V0UmVjdC55KCkpKTsKKworICAgICAgICAvLyBGb3Igc3R1ZmYgbG9jYXRlZCBvbiB0aGUg
bG93ZXIgaGFsZiBvZiB0aGUgc2NyZWVuLCB3ZSB6b29tIHJlbGF0aXZlIHRvIGJvdHRvbS4KKyAg
ICAgICAgLy8gVGhpcyB0cmljayBhbGxvd3MgdXMgdG8gZGlzcGxheSBmaXhlZCBwb3NpdGlvbmVk
IGVsZW1lbnRzIGFsaWduZWQgdG8gdG9wIG9yCisgICAgICAgIC8vIGJvdHRvbSBjb3JyZWN0bHkg
d2hlbiBwYW5uaW5nIGFuZCB6b29taW5nLCB3aXRob3V0IGFjdHVhbGx5IGtub3dpbmcgdGhlCisg
ICAgICAgIC8vIG51bWVyaWMgdmFsdWVzIG9mIHRoZSB0b3AgYW5kIGJvdHRvbSBDU1MgYXR0cmli
dXRlcy4KKyAgICAgICAgLy8gSW4gZmFjdCwgdGhlIHBvc2l0aW9uIGlzIHRoZSBsb2NhdGlvbiBv
ZiB0aGUgYW5jaG9yLCBzbyB0byBmaW5kIHRoZSB0b3AgbGVmdAorICAgICAgICAvLyB3ZSBoYXZl
IHRvIHN1YnRyYWN0IHRoZSBhbmNob3IgdGltZXMgdGhlIGJvdW5kcy4gVGhlIGFuY2hvciBkZWZh
dWx0cyB0bworICAgICAgICAvLyAoMC41LCAwLjUpIGZvciBtb3N0IGxheWVycy4KKyAgICAgICAg
aWYgKHBvc2l0aW9uLnkoKSAtIGFuY2hvclBvaW50LnkoKSAqIGJvdW5kcy5oZWlnaHQoKSA+IGxh
eW91dFkgKyBtX2xheW91dFJlY3QuaGVpZ2h0KCkgLyAyKSB7CisgICAgICAgICAgICB2aXNpYmxl
WSA9IG1pbjxmbG9hdD4obV9jb250ZW50c1NpemUuaGVpZ2h0KCksIG1fdmlzaWJsZVJlY3QueSgp
ICsgbV92aXNpYmxlUmVjdC5oZWlnaHQoKSk7CisgICAgICAgICAgICBsYXlvdXRZID0gbWluKG1f
Y29udGVudHNTaXplLmhlaWdodCgpLCBtYXgoMCwgbV9sYXlvdXRSZWN0LnkoKSkgKyBtX2xheW91
dFJlY3QuaGVpZ2h0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcG9zaXRpb24uc2V0WShwb3Np
dGlvbi55KCkgKyAodmlzaWJsZVkgLSBsYXlvdXRZKSk7CisgICAgfQorCisgICAgLy8gT2Zmc2V0
IGJldHdlZW4gYW5jaG9yIHBvaW50IGFuZCB0aGUgY2VudGVyIG9mIHRoZSBxdWFkLgorICAgIGZs
b2F0IGNlbnRlck9mZnNldFggPSAoMC41IC0gYW5jaG9yUG9pbnQueCgpKSAqIGJvdW5kcy53aWR0
aCgpOworICAgIGZsb2F0IGNlbnRlck9mZnNldFkgPSAoMC41IC0gYW5jaG9yUG9pbnQueSgpKSAq
IGJvdW5kcy5oZWlnaHQoKTsKKworICAgIC8vIE0gPSBNW3BdCisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggbG9jYWxNYXRyaXggPSBtYXRyaXg7CisgICAgLy8gTSA9IE1bcF0gKiBUcltsXQorICAg
IGxvY2FsTWF0cml4LnRyYW5zbGF0ZTNkKHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpLCBsYXll
ci0+YW5jaG9yUG9pbnRaKCkpOworICAgIC8vIE0gPSBNW3BdICogVHJbbF0gKiBNW2xdCisgICAg
bG9jYWxNYXRyaXgubXVsdGlwbHkobGF5ZXItPnRyYW5zZm9ybSgpKTsKKyAgICAvLyBNID0gTVtw
XSAqIFRyW2xdICogTVtsXSAqIFRyW2NdCisgICAgbG9jYWxNYXRyaXgudHJhbnNsYXRlM2QoY2Vu
dGVyT2Zmc2V0WCwgY2VudGVyT2Zmc2V0WSwgLWxheWVyLT5hbmNob3JQb2ludFooKSk7CisKKyAg
ICAvLyBDYWxjdWxhdGUgdGhlIGxheWVyJ3Mgb3BhY2l0eS4KKyAgICBvcGFjaXR5ICo9IGxheWVy
LT5vcGFjaXR5KCk7CisKKyAgICBib29sIHVzZUxheWVyUmVuZGVyZXJTdXJmYWNlID0gbGF5ZXIt
Pm1hc2tMYXllcigpIHx8IGxheWVyLT5yZXBsaWNhTGF5ZXIoKTsKKyAgICBpZiAoIXVzZUxheWVy
UmVuZGVyZXJTdXJmYWNlKSB7CisgICAgICAgIGxheWVyLT5zZXREcmF3T3BhY2l0eShvcGFjaXR5
KTsKKyAgICAgICAgbGF5ZXItPmNsZWFyTGF5ZXJSZW5kZXJlclN1cmZhY2UoKTsKKyAgICB9IGVs
c2UgeworICAgICAgICBpZiAoIWxheWVyLT5sYXllclJlbmRlcmVyU3VyZmFjZSgpKQorICAgICAg
ICAgICAgbGF5ZXItPmNyZWF0ZUxheWVyUmVuZGVyZXJTdXJmYWNlKCk7CisKKyAgICAgICAgTGF5
ZXJSZW5kZXJlclN1cmZhY2UqIHN1cmZhY2UgPSBsYXllci0+bGF5ZXJSZW5kZXJlclN1cmZhY2Uo
KTsKKworICAgICAgICBsYXllci0+c2V0RHJhd09wYWNpdHkoMS4wKTsKKyAgICAgICAgc3VyZmFj
ZS0+c2V0RHJhd09wYWNpdHkob3BhY2l0eSk7CisKKyAgICAgICAgc3VyZmFjZS0+c2V0RHJhd1Ry
YW5zZm9ybShsb2NhbE1hdHJpeCk7CisgICAgICAgIGlmIChsYXllci0+cmVwbGljYUxheWVyKCkp
IHsKKyAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXggPSBsb2Nh
bE1hdHJpeDsKKyAgICAgICAgICAgIHJlcGxpY2FNYXRyaXgudHJhbnNsYXRlM2QoLTAuNSAqIGJv
dW5kcy53aWR0aCgpLCAtMC41ICogYm91bmRzLmhlaWdodCgpLCAwKTsKKyAgICAgICAgICAgIHJl
cGxpY2FNYXRyaXgudHJhbnNsYXRlM2QobGF5ZXItPnJlcGxpY2FMYXllcigpLT5wb3NpdGlvbigp
LngoKSwgbGF5ZXItPnJlcGxpY2FMYXllcigpLT5wb3NpdGlvbigpLnkoKSwgMCk7CisgICAgICAg
ICAgICByZXBsaWNhTWF0cml4Lm11bHRpcGx5KGxheWVyLT5yZXBsaWNhTGF5ZXIoKS0+dHJhbnNm
b3JtKCkpOworICAgICAgICAgICAgcmVwbGljYU1hdHJpeC50cmFuc2xhdGUzZChjZW50ZXJPZmZz
ZXRYLCBjZW50ZXJPZmZzZXRZLCAwKTsKKyAgICAgICAgICAgIHN1cmZhY2UtPnNldFJlcGxpY2FE
cmF3VHJhbnNmb3JtKHJlcGxpY2FNYXRyaXgpOworICAgICAgICB9CisKKyAgICAgICAgSW50UmVj
dCBkcmF3UmVjdCA9IEludFJlY3QoSW50UG9pbnQoKSwgYm91bmRzKTsKKyAgICAgICAgc3VyZmFj
ZS0+c2V0Q29udGVudFJlY3QoZHJhd1JlY3QpOworCisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IHByb2plY3Rpb25NYXRyaXggPSBvcnRob01hdHJpeChkcmF3UmVjdC54KCksIGRyYXdSZWN0
Lm1heFgoKSwgZHJhd1JlY3QueSgpLCBkcmF3UmVjdC5tYXhZKCksIC0xMDAwLCAxMDAwKTsKKyAg
ICAgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgbmV3IHN1cmZhY2UgaXMgdGhlIHVwcGVyIGxlZnQg
Y29ybmVyIG9mIHRoZSBsYXllci4KKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggZHJhd1Ry
YW5zZm9ybTsKKyAgICAgICAgZHJhd1RyYW5zZm9ybS50cmFuc2xhdGUzZCgwLjUgKiBib3VuZHMu
d2lkdGgoKSwgMC41ICogYm91bmRzLmhlaWdodCgpLCAwKTsKKyAgICAgICAgLy8gVGhpcyBsYXll
ciB3aWxsIHN0YXJ0IHVzaW5nIG5ldyB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgbG9jYWxNYXRy
aXggPSBwcm9qZWN0aW9uTWF0cml4ICogZHJhd1RyYW5zZm9ybTsKKworICAgICAgICBzdXJmYWNl
TGF5ZXJzLmFwcGVuZChsYXllcik7CisgICAgfQorCisgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zv
cm0obG9jYWxNYXRyaXgpOworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIGJvb2wgbGF5ZXJWaXNp
YmxlID0gY2xpcFJlY3QuaW50ZXJzZWN0cyhsYXllci0+Z2V0RHJhd1JlY3QoKSkgfHwgbGF5ZXIt
Pm1lZGlhUGxheWVyKCk7CisjZWxzZQorICAgIGJvb2wgbGF5ZXJWaXNpYmxlID0gY2xpcFJlY3Qu
aW50ZXJzZWN0cyhsYXllci0+Z2V0RHJhd1JlY3QoKSk7CisjZW5kaWYKKworICAgIGlmIChsYXll
ci0+bmVlZHNUZXh0dXJlKCkgJiYgbGF5ZXJWaXNpYmxlKSB7CisgICAgICAgIEludFJlY3QgZGly
dHlSZWN0ID0gdG9XZWJLaXRXaW5kb3dDb29yZGluYXRlcyhpbnRlcnNlY3Rpb24obGF5ZXItPmdl
dERyYXdSZWN0KCksIGNsaXBSZWN0KSk7CisgICAgICAgIG1fbGFzdFJlbmRlcmluZ1Jlc3VsdHMu
YWRkRGlydHlSZWN0KGRpcnR5UmVjdCk7CisgICAgfQorCisgICAgaWYgKGxheWVyLT5tYXNrc1Rv
Qm91bmRzKCkpCisgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdChsYXllci0+Z2V0RHJhd1JlY3Qo
KSk7CisKKyAgICAvLyBGbGF0dGVuIHRvIDJEIGlmIHRoZSBsYXllciBkb2Vzbid0IHByZXNlcnZl
IDNELgorICAgIGlmICghbGF5ZXItPnByZXNlcnZlczNEKCkpIHsKKyAgICAgICAgbG9jYWxNYXRy
aXguc2V0TTEzKDApOworICAgICAgICBsb2NhbE1hdHJpeC5zZXRNMjMoMCk7CisgICAgICAgIGxv
Y2FsTWF0cml4LnNldE0zMSgwKTsKKyAgICAgICAgbG9jYWxNYXRyaXguc2V0TTMyKDApOworICAg
ICAgICAvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBkZXB0aCByYW5nZSBzcGVjaWZpZWQgaW4g
dGhlIG9yaWdpbmFsIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeAorICAgICAgICBsb2Nh
bE1hdHJpeC5zZXRNMzMoMC4wMDEpOworICAgICAgICBsb2NhbE1hdHJpeC5zZXRNMzQoMCk7Cisg
ICAgICAgIGxvY2FsTWF0cml4LnNldE00MygwKTsKKyAgICB9CisKKyAgICAvLyBBcHBseSB0aGUg
c3VibGF5ZXIgdHJhbnNmb3JtLgorICAgIGxvY2FsTWF0cml4Lm11bHRpcGx5KGxheWVyLT5zdWJs
YXllclRyYW5zZm9ybSgpKTsKKworICAgIC8vIFRoZSBvcmlnaW4gb2YgdGhlIHN1YmxheWVycyBp
cyBhY3R1YWxseSB0aGUgYm90dG9tIGxlZnQgY29ybmVyIG9mIHRoZSBsYXllcgorICAgIC8vIChv
ciB0b3AgbGVmdCB3aGVuIGxvb2tpbmcgaXQgaXQgZnJvbSB0aGUgYnJvd3NlcidzIHBlc3BlY3Rp
dmUpIGluc3RlYWQgb2YgdGhlIGNlbnRlci4KKyAgICAvLyBUaGUgbWF0cml4IHBhc3NlZCBkb3du
IHRvIHRoZSBzdWJsYXllcnMgaXMgdGhlcmVmb3JlOgorICAgIC8vIE1bc10gPSBNICogVHJbLWNl
bnRlcl0KKyAgICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZCgtYm91bmRzLndpZHRoKCkgKiAwLjUs
IC1ib3VuZHMuaGVpZ2h0KCkgKiAwLjUsIDApOworCisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxM
YXllckNvbXBvc2l0aW5nVGhyZWFkPiA+JiBzdWJsYXllcnMgPSBsYXllci0+Z2V0U3VibGF5ZXJz
KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisg
ICAgICAgIHVwZGF0ZUxheWVyc1JlY3Vyc2l2ZShzdWJsYXllcnNbaV0uZ2V0KCksIGxvY2FsTWF0
cml4LCBzdXJmYWNlTGF5ZXJzLCBvcGFjaXR5LCBjbGlwUmVjdCwgY3VycmVudFRpbWUpOworfQor
CitzdGF0aWMgYm9vbCBoYXNSb3RhdGlvbmFsQ29tcG9uZW50KGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiBtKQoreworICAgIHJldHVybiBtLm0xMigpIHx8IG0ubTEzKCkgfHwgbS5tMjMoKSB8
fCBtLm0yMSgpIHx8IG0ubTMxKCkgfHwgbS5tMzIoKTsKK30KKworYm9vbCBMYXllclJlbmRlcmVy
OjpsYXllckFscmVhZHlPblN1cmZhY2UoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGxheWVyLT5sYXllclJlbmRlcmVyU3VyZmFjZSgpICYmIGxheWVy
LT5sYXllclJlbmRlcmVyU3VyZmFjZSgpICE9IG1fY3VycmVudExheWVyUmVuZGVyZXJTdXJmYWNl
OworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0M0RQcmVzZXJ2aW5nTGF5ZXJzKFZlY3RvcjxMYXll
ckNvbXBvc2l0aW5nVGhyZWFkKj4mIGxheWVycykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGxheWVycy5zaXplKCk7ICsraSkgeworICAgICAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFk
KiBsYXllciA9IGxheWVyc1tpXTsKKyAgICAgICAgaWYgKCFsYXllci0+cHJlc2VydmVzM0QoKSB8
fCAhbGF5ZXItPmdldFN1YmxheWVycygpLnNpemUoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgIFZlY3RvcjxMYXllckNvbXBvc2l0aW5nVGhyZWFkKj4gc3VibGF5ZXJzID0gcmF3
UHRyVmVjdG9yRnJvbVJlZlB0clZlY3RvcihsYXllci0+Z2V0U3VibGF5ZXJzKCkpOworICAgICAg
ICBjb2xsZWN0M0RQcmVzZXJ2aW5nTGF5ZXJzKHN1YmxheWVycyk7CisgICAgICAgIGxheWVycy5p
bnNlcnQoaSsxLCBzdWJsYXllcnMpOworICAgICAgICBpICs9IHN1YmxheWVycy5zaXplKCk7Cisg
ICAgfQorfQorCit2b2lkIExheWVyUmVuZGVyZXI6OmNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShM
YXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciwgaW50IHN0ZW5jaWxWYWx1ZSwgRmxvYXRSZWN0
IGNsaXBSZWN0KQoreworICAgIEZsb2F0UmVjdCByZWN0OworICAgIGlmIChsYXllckFscmVhZHlP
blN1cmZhY2UobGF5ZXIpKQorICAgICAgICByZWN0ID0gbGF5ZXItPmxheWVyUmVuZGVyZXJTdXJm
YWNlKCktPmRyYXdSZWN0KCk7CisgICAgZWxzZQorICAgICAgICByZWN0ID0gbGF5ZXItPmdldERy
YXdSZWN0KCk7CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAgYm9vbCBsYXllclZpc2libGUgPSBj
bGlwUmVjdC5pbnRlcnNlY3RzKHJlY3QpIHx8IGxheWVyLT5tZWRpYVBsYXllcigpOworI2Vsc2UK
KyAgICBib29sIGxheWVyVmlzaWJsZSA9IGNsaXBSZWN0LmludGVyc2VjdHMocmVjdCk7CisjZW5k
aWYKKworICAgIGxheWVyLT5zZXRWaXNpYmxlKGxheWVyVmlzaWJsZSk7CisKKyAgICBnbFN0ZW5j
aWxGdW5jKEdMX0VRVUFMLCBzdGVuY2lsVmFsdWUsIDB4ZmYpOworICAgIGdsU3RlbmNpbE9wKEdM
X0tFRVAsIEdMX0tFRVAsIEdMX0tFRVApOworCisgICAgLy8gTm90ZSB0aGF0IHRoZXJlIGFyZSB0
d28gdHlwZXMgb2YgbGF5ZXJzOgorICAgIC8vIDEuIExheWVycyB0aGF0IGhhdmUgdGhlaXIgb3du
IEdyYXBoaWNzQ29udGV4dCBhbmQgY2FuIGRyYXcgdGhlaXIgY29udGVudHMgb24gZGVtYW5kIChs
YXllci0+ZHJhd3NDb250ZW50KCkgPT0gdHJ1ZSkuCisgICAgLy8gMi4gTGF5ZXJzIHRoYXQgYXJl
IGp1c3QgY29udGFpbmVycyBvZiBpbWFnZXMvdmlkZW8vZXRjIHRoYXQgZG9uJ3Qgb3duIGEgR3Jh
cGhpY3NDb250ZXh0IChsYXllci0+Y29udGVudHMoKSA9PSB0cnVlKS4KKworICAgIC8vIEV2ZW4g
bm9uLXZpc2libGUgbGF5ZXJzIG5lZWQgdG8gcGVyZm9ybSB0aGVpciB0ZXh0dXJlIGpvYnMsIG9y
IHRoZXkgd2lsbAorICAgIC8vIHBpbGUgdXAgYW5kIHdhc3RlIG1lbW9yeS4KKyAgICBpZiAobGF5
ZXItPm5lZWRzVGV4dHVyZSgpKQorICAgICAgICBsYXllci0+dXBkYXRlVGV4dHVyZUNvbnRlbnRz
SWZOZWVkZWQoKTsKKyAgICBpZiAobGF5ZXItPm1hc2tMYXllcigpICYmIGxheWVyLT5tYXNrTGF5
ZXIoKS0+bmVlZHNUZXh0dXJlKCkpCisgICAgICAgIGxheWVyLT5tYXNrTGF5ZXIoKS0+dXBkYXRl
VGV4dHVyZUNvbnRlbnRzSWZOZWVkZWQoKTsKKyAgICBpZiAobGF5ZXItPnJlcGxpY2FMYXllcigp
KSB7CisgICAgICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIHJlcGxpY2EgPSBsYXllci0+cmVw
bGljYUxheWVyKCk7CisgICAgICAgIGlmIChyZXBsaWNhLT5uZWVkc1RleHR1cmUoKSkKKyAgICAg
ICAgICAgIHJlcGxpY2EtPnVwZGF0ZVRleHR1cmVDb250ZW50c0lmTmVlZGVkKCk7CisgICAgICAg
IGlmIChyZXBsaWNhLT5tYXNrTGF5ZXIoKSAmJiByZXBsaWNhLT5tYXNrTGF5ZXIoKS0+bmVlZHNU
ZXh0dXJlKCkpCisgICAgICAgICAgICByZXBsaWNhLT5tYXNrTGF5ZXIoKS0+dXBkYXRlVGV4dHVy
ZUNvbnRlbnRzSWZOZWVkZWQoKTsKKyAgICB9CisKKyAgICBpZiAoKGxheWVyLT5uZWVkc1RleHR1
cmUoKSB8fCBsYXllci0+bGF5ZXJSZW5kZXJlclN1cmZhY2UoKSkgJiYgbGF5ZXJWaXNpYmxlKSB7
CisgICAgICAgIHVwZGF0ZVNjaXNzb3JJZk5lZWRlZChjbGlwUmVjdCk7CisKKyAgICAgICAgaWYg
KGxheWVyLT5kb3VibGVTaWRlZCgpKQorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFD
RSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisK
KyAgICAgICAgaWYgKGxheWVyLT5oYXNWaXNpYmxlSG9sZVB1bmNoUmVjdCgpKQorICAgICAgICAg
ICAgZHJhd0hvbGVQdW5jaFJlY3QobGF5ZXIpOworCisgICAgICAgIC8vIERyYXcgdGhlIHN1cmZh
Y2Ugb250byBhbm90aGVyIHN1cmZhY2Ugb3Igc2NyZWVuLgorICAgICAgICBib29sIGRyYXdTdXJm
YWNlID0gbGF5ZXJBbHJlYWR5T25TdXJmYWNlKGxheWVyKTsKKyAgICAgICAgLy8gVGhlIHRleHR1
cmUgZm9ybWF0IGZvciB0aGUgc3VyZmFjZSBpcyBSR0JBLgorICAgICAgICBMYXllckRhdGE6Okxh
eWVyUHJvZ3JhbVNoYWRlciBzaGFkZXIgPSBkcmF3U3VyZmFjZSA/IExheWVyRGF0YTo6TGF5ZXJQ
cm9ncmFtU2hhZGVyUkdCQSA6IGxheWVyLT5sYXllclByb2dyYW1TaGFkZXIoKTsKKworICAgICAg
ICBpZiAoIWRyYXdTdXJmYWNlKSB7CisgICAgICAgICAgICBnbFVzZVByb2dyYW0obV9sYXllclBy
b2dyYW1PYmplY3Rbc2hhZGVyXSk7CisgICAgICAgICAgICBnbFVuaWZvcm0xZihtX2FscGhhTG9j
YXRpb25bc2hhZGVyXSwgbGF5ZXItPmRyYXdPcGFjaXR5KCkpOworICAgICAgICAgICAgbGF5ZXIt
PmRyYXdUZXh0dXJlcyhtX3Bvc2l0aW9uTG9jYXRpb24sIG1fdGV4Q29vcmRMb2NhdGlvbiwgbV92
aXNpYmxlUmVjdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEcmF3IHRoZSBy
ZWZsZWN0aW9uIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmIChsYXllci0+cmVwbGljYUxh
eWVyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGxheWVyIGFuZCBpdHMgcmVmbGVj
dGlvbiBib3RoIGhhdmUgbWFzaywgd2UgbmVlZCBhbm90aGVyIHRlbXBvcmFyeSBzdXJmYWNlLgor
ICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgdXNlIGNhc2Ugc2hvdWxkIGJlIHJhcmUsIGN1
cnJlbnRseSBpdCdzIG5vdCBoYW5kbGVkIGFuZCB0aGUgbWFzayBmb3IKKyAgICAgICAgICAgICAg
ICAvLyB0aGUgcmVmbGVjdGlvbiBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGlzIGxheWVyIGhhcyBu
byBtYXNrLgorICAgICAgICAgICAgICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIG1hc2sgPSBs
YXllci0+bWFza0xheWVyKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtYXNrICYmIGxheWVyLT5y
ZXBsaWNhTGF5ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IGxheWVyLT5yZXBsaWNh
TGF5ZXIoKS0+bWFza0xheWVyKCk7CisKKyAgICAgICAgICAgICAgICBnbFVzZVByb2dyYW0obWFz
ayA/IG1fbGF5ZXJNYXNrUHJvZ3JhbU9iamVjdFtzaGFkZXJdIDogbV9sYXllclByb2dyYW1PYmpl
Y3Rbc2hhZGVyXSk7CisgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMWYobWFzayA/IG1fbWFza0Fs
cGhhTG9jYXRpb25bc2hhZGVyXSA6IG1fYWxwaGFMb2NhdGlvbltzaGFkZXJdLCBsYXllci0+bGF5
ZXJSZW5kZXJlclN1cmZhY2UoKS0+ZHJhd09wYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgbGF5
ZXItPmRyYXdTdXJmYWNlKGxheWVyLT5sYXllclJlbmRlcmVyU3VyZmFjZSgpLT5yZXBsaWNhRHJh
d1RyYW5zZm9ybSgpLCBtYXNrLCBtX3Bvc2l0aW9uTG9jYXRpb24sIG1fdGV4Q29vcmRMb2NhdGlv
bik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdsVXNlUHJvZ3JhbShsYXllci0+bWFz
a0xheWVyKCkgPyBtX2xheWVyTWFza1Byb2dyYW1PYmplY3Rbc2hhZGVyXSA6IG1fbGF5ZXJQcm9n
cmFtT2JqZWN0W3NoYWRlcl0pOworICAgICAgICAgICAgZ2xVbmlmb3JtMWYobGF5ZXItPm1hc2tM
YXllcigpID8gbV9tYXNrQWxwaGFMb2NhdGlvbltzaGFkZXJdIDogbV9hbHBoYUxvY2F0aW9uW3No
YWRlcl0sIGxheWVyLT5sYXllclJlbmRlcmVyU3VyZmFjZSgpLT5kcmF3T3BhY2l0eSgpKTsKKyAg
ICAgICAgICAgIGxheWVyLT5kcmF3U3VyZmFjZShsYXllci0+bGF5ZXJSZW5kZXJlclN1cmZhY2Uo
KS0+ZHJhd1RyYW5zZm9ybSgpLCBsYXllci0+bWFza0xheWVyKCksIG1fcG9zaXRpb25Mb2NhdGlv
biwgbV90ZXhDb29yZExvY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXllci0+
aGFzTWlzc2luZ1RleHR1cmVzKCkpIHsKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7
CisgICAgICAgICAgICBnbFVzZVByb2dyYW0obV9jaGVja2VyUHJvZ3JhbU9iamVjdCk7CisgICAg
ICAgICAgICBsYXllci0+ZHJhd01pc3NpbmdUZXh0dXJlcyhtX3Bvc2l0aW9uTG9jYXRpb24sIG1f
dGV4Q29vcmRMb2NhdGlvbiwgbV92aXNpYmxlUmVjdCk7CisgICAgICAgICAgICBnbEVuYWJsZShH
TF9CTEVORCk7CisgICAgICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5VU19T
UkNfQUxQSEEpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJhdyB0aGUgZGVidWcgYm9y
ZGVyIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBkcmF3RGVidWdCb3JkZXIobGF5ZXIpOworCisgICAg
Ly8gVGhlIHRleHR1cmUgZm9yIHRoZSBMYXllclJlbmRlcmVyU3VyZmFjZSBjYW4gYmUgcmVsZWFz
ZWQgYWZ0ZXIgdGhlIHN1cmZhY2Ugd2FzIGRyYXdlZCBvbiBhbm90aGVyIHN1cmZhY2UuCisgICAg
aWYgKGxheWVyQWxyZWFkeU9uU3VyZmFjZShsYXllcikpIHsKKyAgICAgICAgbGF5ZXItPmxheWVy
UmVuZGVyZXJTdXJmYWNlKCktPnJlbGVhc2VUZXh0dXJlKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIG1hc2sgdG8gYm91bmRzIGJ1dCB0aGUgdHJhbnNm
b3JtYXRpb24gaGFzIGEgcm90YXRpb25hbCBjb21wb25lbnQKKyAgICAvLyB0byBpdCwgc2Npc3Nv
cmluZyBpcyBub3QgZW5vdWdoIGFuZCB3ZSBuZWVkIHRvIHVzZSB0aGUgc3RlbmNpbCBidWZmZXIg
Zm9yIGNsaXBwaW5nLgorI2lmIEVOQUJMRV9TQ0lTU09SCisgICAgYm9vbCBzdGVuY2lsQ2xpcCA9
IGxheWVyLT5tYXNrc1RvQm91bmRzKCkgJiYgaGFzUm90YXRpb25hbENvbXBvbmVudChsYXllci0+
ZHJhd1RyYW5zZm9ybSgpKTsKKyNlbHNlCisgICAgYm9vbCBzdGVuY2lsQ2xpcCA9IGxheWVyLT5t
YXNrc1RvQm91bmRzKCk7CisjZW5kaWYKKworICAgIGlmIChzdGVuY2lsQ2xpcCkgeworICAgICAg
ICBnbFN0ZW5jaWxGdW5jKEdMX0VRVUFMLCBzdGVuY2lsVmFsdWUsIDB4ZmYpOworICAgICAgICBn
bFN0ZW5jaWxPcChHTF9LRUVQLCBHTF9JTkNSLCBHTF9JTkNSKTsKKworICAgICAgICB1cGRhdGVT
Y2lzc29ySWZOZWVkZWQoY2xpcFJlY3QpOworICAgICAgICBnbFVzZVByb2dyYW0obV9jb2xvclBy
b2dyYW1PYmplY3QpOworICAgICAgICBnbENvbG9yTWFzayhHTF9GQUxTRSwgR0xfRkFMU0UsIEdM
X0ZBTFNFLCBHTF9GQUxTRSk7CisgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcigwLCAyLCBH
TF9GTE9BVCwgR0xfRkFMU0UsIDAsICZsYXllci0+Z2V0VHJhbnNmb3JtZWRCb3VuZHMoKSk7Cisg
ICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworICAgICAgICBnbENv
bG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKKyAgICB9CisKKyAg
ICBpZiAobGF5ZXItPm1hc2tzVG9Cb3VuZHMoKSkKKyAgICAgICAgY2xpcFJlY3QuaW50ZXJzZWN0
KGxheWVyLT5nZXREcmF3UmVjdCgpKTsKKworICAgIC8vIEhlcmUsIHdlIG5lZWQgdG8gc29ydCB0
aGUgd2hvbGUgc3VidHJlZSBvZiBsYXllcnMgd2l0aCBwcmVzZXJ2ZS0zZC4gSXQKKyAgICAvLyBh
ZmZlY3RzIGFsbCBjaGlsZHJlbiwgYW5kIHRoZSBjaGlsZHJlbiBvZiBhbnkgY2hpbGRyZW4gd2l0
aCBwcmVzZXJ2ZS0zZCwKKyAgICAvLyBhbmQgc28gb24uCisgICAgVmVjdG9yPExheWVyQ29tcG9z
aXRpbmdUaHJlYWQqPiBzdWJsYXllcnMgPSByYXdQdHJWZWN0b3JGcm9tUmVmUHRyVmVjdG9yKGxh
eWVyLT5nZXRTdWJsYXllcnMoKSk7CisKKyAgICBib29sIHByZXNlcnZlczNEID0gbGF5ZXItPnBy
ZXNlcnZlczNEKCk7CisgICAgYm9vbCBzdXBlcmxheWVyUHJlc2VydmVzM0QgPSBsYXllci0+c3Vw
ZXJsYXllcigpICYmIGxheWVyLT5zdXBlcmxheWVyKCktPnByZXNlcnZlczNEKCk7CisKKyAgICAv
LyBDb2xsZWN0IGFuZCByZW5kZXIgYWxsIHN1YmxheWVycyB3aXRoIHByZXNlcnZlcy0zRC4KKyAg
ICAvLyBJZiB0aGUgc3VwZXJsYXllciBwcmVzZXJ2ZXMgM0QsIHdlJ3ZlIGFscmVhZHkgY29sbGVj
dGVkIGFuZCByZW5kZXJlZCBpdHMKKyAgICAvLyBjaGlsZHJlbiwgc28gYmFpbC4KKyAgICBpZiAo
cHJlc2VydmVzM0QgJiYgIXN1cGVybGF5ZXJQcmVzZXJ2ZXMzRCkgeworICAgICAgICBjb2xsZWN0
M0RQcmVzZXJ2aW5nTGF5ZXJzKHN1YmxheWVycyk7CisgICAgICAgIHN0ZDo6c3RhYmxlX3NvcnQo
c3VibGF5ZXJzLmJlZ2luKCksIHN1YmxheWVycy5lbmQoKSwgY29tcGFyZUxheWVyWik7CisgICAg
fQorCisgICAgaW50IG5ld1N0ZW5jaWxWYWx1ZSA9IHN0ZW5jaWxDbGlwID8gc3RlbmNpbFZhbHVl
KzEgOiBzdGVuY2lsVmFsdWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMu
c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogc3VibGF5ZXIg
PSBzdWJsYXllcnNbaV07CisgICAgICAgIC8vIFRoZSByb290IG9mIHRoZSAzZC1wcmVzZXJ2aW5n
IHN1YnRyZWUgaGFzIGNvbGxlY3RlZCBhbGwKKyAgICAgICAgLy8gM2QtcHJlc2VydmluZyBsYXll
cnMgYW5kIHRoZWlyIGNoaWxkcmVuIGFuZCB3aWxsIHJlbmRlciB0aGVtIGFsbCBpbgorICAgICAg
ICAvLyB0aGUgcmlnaHQgb3JkZXIuCisgICAgICAgIGlmIChwcmVzZXJ2ZXMzRCAmJiBzdXBlcmxh
eWVyUHJlc2VydmVzM0QpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgY29tcG9z
aXRlTGF5ZXJzUmVjdXJzaXZlKHN1YmxheWVyLCBuZXdTdGVuY2lsVmFsdWUsIGNsaXBSZWN0KTsK
KyAgICB9CisKKyAgICBpZiAoc3RlbmNpbENsaXApIHsKKyAgICAgICAgZ2xTdGVuY2lsRnVuYyhH
TF9MRVFVQUwsIHN0ZW5jaWxWYWx1ZSwgMHhmZik7CisgICAgICAgIGdsU3RlbmNpbE9wKEdMX0tF
RVAsIEdMX1JFUExBQ0UsIEdMX1JFUExBQ0UpOworCisgICAgICAgIHVwZGF0ZVNjaXNzb3JJZk5l
ZWRlZChjbGlwUmVjdCk7CisgICAgICAgIGdsVXNlUHJvZ3JhbShtX2NvbG9yUHJvZ3JhbU9iamVj
dCk7CisgICAgICAgIGdsQ29sb3JNYXNrKEdMX0ZBTFNFLCBHTF9GQUxTRSwgR0xfRkFMU0UsIEdM
X0ZBTFNFKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKDAsIDIsIEdMX0ZMT0FULCBH
TF9GQUxTRSwgMCwgJmxheWVyLT5nZXRUcmFuc2Zvcm1lZEJvdW5kcygpKTsKKyAgICAgICAgZ2xE
cmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7CisgICAgICAgIGdsQ29sb3JNYXNrKEdM
X1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOworICAgIH0KK30KKwordm9pZCBMYXll
clJlbmRlcmVyOjp1cGRhdGVTY2lzc29ySWZOZWVkZWQoY29uc3QgRmxvYXRSZWN0JiBjbGlwUmVj
dCkKK3sKKyNpZiBFTkFCTEVfU0NJU1NPUgorICAgIEludFJlY3QgY2xpcFJlY3RXQyA9IHRvT3Bl
bkdMV2luZG93Q29vcmRpbmF0ZXMoY2xpcFJlY3QpOworICAgIGlmIChtX3NjaXNzb3JSZWN0ID09
IGNsaXBSZWN0V0MpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc2Npc3NvclJlY3QgPSBjbGlw
UmVjdFdDOworICAgIGdsU2Npc3NvcihtX3NjaXNzb3JSZWN0LngoKSwgbV9zY2lzc29yUmVjdC55
KCksIG1fc2Npc3NvclJlY3Qud2lkdGgoKSwgbV9zY2lzc29yUmVjdC5oZWlnaHQoKSk7CisjZW5k
aWYKK30KKworYm9vbCBMYXllclJlbmRlcmVyOjptYWtlQ29udGV4dEN1cnJlbnQoKQoreworICAg
IHJldHVybiBtX2NvbnRleHQtPm1ha2VDdXJyZW50KCk7Cit9CisKKy8vIEJpbmRzIHRoZSBnaXZl
biBhdHRyaWJ1dGUgbmFtZSB0byBhIGNvbW1vbiBsb2NhdGlvbiBhY3Jvc3MgYWxsIHRocmVlIHBy
b2dyYW1zCisvLyB1c2VkIGJ5IHRoZSBjb21wb3NpdG9yLiBUaGlzIGFsbG93cyB0aGUgY29kZSB0
byBiaW5kIHRoZSBhdHRyaWJ1dGVzIG9ubHkgb25jZQorLy8gZXZlbiB3aGVuIHN3aXRjaGluZyBi
ZXR3ZWVuIHByb2dyYW1zLgordm9pZCBMYXllclJlbmRlcmVyOjpiaW5kQ29tbW9uQXR0cmliTG9j
YXRpb24oaW50IGxvY2F0aW9uLCBjb25zdCBjaGFyKiBhdHRyaWJOYW1lKQoreworICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnM7ICsr
aSkgeworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVjdFtp
XSwgbG9jYXRpb24sIGF0dHJpYk5hbWUpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbiht
X2xheWVyTWFza1Byb2dyYW1PYmplY3RbaV0sIGxvY2F0aW9uLCBhdHRyaWJOYW1lKTsKKyAgICB9
CisKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihtX2NvbG9yUHJvZ3JhbU9iamVjdCwgbG9jYXRp
b24sIGF0dHJpYk5hbWUpOworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKG1fY2hlY2tlclByb2dy
YW1PYmplY3QsIGxvY2F0aW9uLCBhdHRyaWJOYW1lKTsKK30KKworYm9vbCBMYXllclJlbmRlcmVy
Ojppbml0aWFsaXplU2hhcmVkR0xPYmplY3RzKCkKK3sKKyAgICAvLyBTaGFkZXJzIGZvciBkcmF3
aW5nIHRoZSBsYXllciBjb250ZW50cy4KKyAgICBjaGFyIHZlcnRleFNoYWRlclN0cmluZ1tdID0K
KyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9zaXRpb247ICAgXG4iCisgICAgICAgICJhdHRy
aWJ1dGUgdmVjMiBhX3RleENvb3JkOyAgIFxuIgorICAgICAgICAidmFyeWluZyB2ZWMyIHZfdGV4
Q29vcmQ7ICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAgICAgXG4i
CisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICBn
bF9Qb3NpdGlvbiA9IGFfcG9zaXRpb247ICBcbiIKKyAgICAgICAgIiAgdl90ZXhDb29yZCA9IGFf
dGV4Q29vcmQ7ICAgXG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxu
IjsKKworICAgIGNoYXIgZnJhZ21lbnRTaGFkZXJTdHJpbmdSR0JBW10gPQorICAgICAgICAidmFy
eWluZyBtZWRpdW1wIHZlYzIgdl90ZXhDb29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICBc
biIKKyAgICAgICAgInVuaWZvcm0gbG93cCBzYW1wbGVyMkQgc190ZXh0dXJlOyAgICAgICAgICAg
ICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIGxvd3AgZmxvYXQgYWxwaGE7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidm9pZCBtYWluKCkg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAg
ICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRChzX3RleHR1cmUs
IHZfdGV4Q29vcmQpICogYWxwaGE7IFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7CisKKyAgICBjaGFyIGZy
YWdtZW50U2hhZGVyU3RyaW5nQkdSQVtdID0KKyAgICAgICAgInZhcnlpbmcgbWVkaXVtcCB2ZWMy
IHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAg
InVuaWZvcm0gbG93cCBzYW1wbGVyMkQgc190ZXh0dXJlOyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gbG93cCBmbG9hdCBhbHBoYTsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAg
ICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHNf
dGV4dHVyZSwgdl90ZXhDb29yZCkuYmdyYSAqIGFscGhhOyBcbiIKKyAgICAgICAgIn0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
biI7CisKKyAgICBjaGFyIGZyYWdtZW50U2hhZGVyU3RyaW5nTWFza1JHQkFbXSA9CisgICAgICAg
ICJ2YXJ5aW5nIG1lZGl1bXAgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFxuIgorICAgICAgICAidW5pZm9ybSBsb3dwIHNhbXBsZXIyRCBzX3RleHR1cmU7ICAgICAg
ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gbG93cCBzYW1wbGVyMkQg
c19tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3Jt
IGxvd3AgZmxvYXQgYWxwaGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgor
ICAgICAgICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgIGxvd3AgdmVjNCB0ZXhD
b2xvciA9IHRleHR1cmUyRChzX3RleHR1cmUsIHZfdGV4Q29vcmQpOyAgIFxuIgorICAgICAgICAi
ICBsb3dwIHZlYzQgbWFza0NvbG9yID0gdGV4dHVyZTJEKHNfbWFzaywgdl90ZXhDb29yZCk7ICAg
ICBcbiIKKyAgICAgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXhDb2xvci54LCB0ZXhDb2xv
ci55LCB0ZXhDb2xvci56LCB0ZXhDb2xvci53KSAqIGFscGhhICogbWFza0NvbG9yLnc7ICAgICAg
ICAgICBcbiIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXG4iOworCisgICAgY2hhciBmcmFnbWVudFNoYWRlclN0cmlu
Z01hc2tCR1JBW10gPQorICAgICAgICAidmFyeWluZyBtZWRpdW1wIHZlYzIgdl90ZXhDb29yZDsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidW5pZm9ybSBsb3dw
IHNhbXBsZXIyRCBzX3RleHR1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgor
ICAgICAgICAidW5pZm9ybSBsb3dwIHNhbXBsZXIyRCBzX21hc2s7ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidW5pZm9ybSBsb3dwIGZsb2F0IGFscGhhOyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidm9pZCBt
YWluKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICBsb3dwIHZlYzQgdGV4Q29sb3Ig
PSB0ZXh0dXJlMkQoc190ZXh0dXJlLCB2X3RleENvb3JkKS5iZ3JhOyAgICAgICAgICAgICBcbiIK
KyAgICAgICAgIiAgbG93cCB2ZWM0IG1hc2tDb2xvciA9IHRleHR1cmUyRChzX21hc2ssIHZfdGV4
Q29vcmQpLmJncmE7ICAgICAgICAgIFxuIgorICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0
KHRleENvbG9yLngsIHRleENvbG9yLnksIHRleENvbG9yLnosIHRleENvbG9yLncpICogYWxwaGEg
KiBtYXNrQ29sb3IudzsgICAgICAgICBcbiIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7CisKKworICAg
IC8vIFNoYWRlcnMgZm9yIGRyYXdpbmcgdGhlIGRlYnVnIGJvcmRlcnMgYXJvdW5kIHRoZSBsYXll
cnMuCisgICAgY2hhciBjb2xvclZlcnRleFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgImF0dHJp
YnV0ZSB2ZWM0IGFfcG9zaXRpb247ICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAg
ICAgICAgICAgIFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIK
KyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0gYV9wb3NpdGlvbjsgXG4iCisgICAgICAgICJ9ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIjsKKworICAgIGNoYXIgY29sb3JGcmFnbWVudFNo
YWRlclN0cmluZ1tdID0KKyAgICAgICAgInVuaWZvcm0gbG93cCB2ZWM0IGNvbG9yOyAgICAgXG4i
CisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAieyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgZ2xfRnJhZ0NvbG9yID0g
Y29sb3I7ICAgICAgXG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxu
IjsKKworICAgIC8vIEZJWE1FOiBnZXQgc2NyZWVuIHNpemUsIGdldCBsaWdodC9kYXJrIGNvbG9y
LCB1c2UKKyAgICAvLyBzdHJpbmcgbWFuaXB1bGF0aW9uIG1ldGhvZHMgdG8gaW5zZXJ0IHRob3Nl
IGNvbnN0YW50cyBpbnRvCisgICAgLy8gdGhlIHNoYWRlciBzb3VyY2UuCisgICAgc3RhdGljIENv
bG9yIGxpZ2h0Q29sb3IoMHhmYiwgMHhmZCwgMHhmZik7CisgICAgLy8gY2hlY2tlcmJvYXJkQ29s
b3JEYXJrKCkKKyAgICBzdGF0aWMgQ29sb3IgZGFya0NvbG9yKDB4ZTgsIDB4ZWUsIDB4ZjcpOwor
ICAgIGludCBjaGVja2VyU2l6ZSA9IDIwOworICAgIFN0cmluZyB0bXAoCisgICAgICAgICJ1bmlm
b3JtIG1lZGl1bXAgZmxvYXQgc2NhbGU7ICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1
bmlmb3JtIG1lZGl1bXAgdmVjMiBvcmlnaW47ICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAg
ICJ1bmlmb3JtIG1lZGl1bXAgZmxvYXQgc3VyZmFjZUhlaWdodDsgICAgICAgICAgXG4iCisgICAg
ICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisg
ICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4i
CisgICAgICAgICIgIGNvbnN0IG1lZGl1bXAgZmxvYXQgZ3JpZCA9IEdSSUQ7ICAgICAgICAgICAg
XG4iCisgICAgICAgICIgIGNvbnN0IGxvd3AgdmVjNCBsaWdodENvbG9yID0gTElHSFRfQ09MT1I7
ICAgXG4iCisgICAgICAgICIgIGNvbnN0IGxvd3AgdmVjNCBkYXJrQ29sb3IgPSBEQVJLX0NPTE9S
OyAgICAgXG4iCisgICAgICAgICIgIG1lZGl1bXAgZmxvYXQgdG1wID0gZ3JpZCAqIHNjYWxlOyAg
ICAgICAgICAgXG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IG1vZChmbG9vcigoZ2xfRnJh
Z0Nvb3JkLnggKyBvcmlnaW4ueCkgLyB0bXApICsgZmxvb3IoKHN1cmZhY2VIZWlnaHQgLSBnbF9G
cmFnQ29vcmQueSArIG9yaWdpbi55KSAvIHRtcCksIDIuMCkgPiAwLjk5IFxuIgorICAgICAgICAi
ICAgID8gbGlnaHRDb2xvciA6IGRhcmtDb2xvcjsgICAgICAgICAgICAgICAgIFxuIgorICAgICAg
ICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CisK
KyAgICAvLyBMZXQgV1RGOjpTdHJpbmcgYmUgb3VyIHByZXByb2Nlc3NvcgorICAgIHRtcC5yZXBs
YWNlKCJMSUdIVF9DT0xPUiIsIFN0cmluZzo6Zm9ybWF0KCJ2ZWM0KCUuNGYsICUuNGYsICUuNGYs
IDEuMCkiLCBsaWdodENvbG9yLnJlZCgpIC8gMjU1LjAsIGxpZ2h0Q29sb3IuZ3JlZW4oKSAvIDI1
NS4wLCBsaWdodENvbG9yLmJsdWUoKSAvIDI1NS4wKSk7CisgICAgdG1wLnJlcGxhY2UoIkRBUktf
Q09MT1IiLCBTdHJpbmc6OmZvcm1hdCgidmVjNCglLjRmLCAlLjRmLCAlLjRmLCAxLjApIiwgZGFy
a0NvbG9yLnJlZCgpIC8gMjU1LjAsIGRhcmtDb2xvci5ncmVlbigpIC8gMjU1LjAsIGRhcmtDb2xv
ci5ibHVlKCkgLyAyNTUuMCkpOworICAgIHRtcC5yZXBsYWNlKCJHUklEIiwgU3RyaW5nOjpmb3Jt
YXQoIiUuM2YiLCAoZmxvYXQpY2hlY2tlclNpemUpKTsKKyAgICBDU3RyaW5nIGNoZWNrZXJGcmFn
bWVudFNoYWRlclN0cmluZyA9IHRtcC5sYXRpbjEoKTsKKworICAgIG1ha2VDb250ZXh0Q3VycmVu
dCgpOworCisgICAgbV9sYXllclByb2dyYW1PYmplY3RbTGF5ZXJEYXRhOjpMYXllclByb2dyYW1T
aGFkZXJSR0JBXSA9CisgICAgICAgIGxvYWRTaGFkZXJQcm9ncmFtKHZlcnRleFNoYWRlclN0cmlu
ZywgZnJhZ21lbnRTaGFkZXJTdHJpbmdSR0JBKTsKKyAgICBpZiAoIW1fbGF5ZXJQcm9ncmFtT2Jq
ZWN0W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVyUkdCQV0pIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBwcm9ncmFtIGZvciBSR0JBIGxheWVycyIpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9sYXllclByb2dyYW1PYmplY3Rb
TGF5ZXJEYXRhOjpMYXllclByb2dyYW1TaGFkZXJCR1JBXSA9CisgICAgICAgIGxvYWRTaGFkZXJQ
cm9ncmFtKHZlcnRleFNoYWRlclN0cmluZywgZnJhZ21lbnRTaGFkZXJTdHJpbmdCR1JBKTsKKyAg
ICBpZiAoIW1fbGF5ZXJQcm9ncmFtT2JqZWN0W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVy
QkdSQV0pIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBwcm9n
cmFtIGZvciBCR1JBIGxheWVycyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgbV9sYXllck1hc2tQcm9ncmFtT2JqZWN0W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVy
UkdCQV0gPQorICAgICAgICBsb2FkU2hhZGVyUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXJTdHJpbmcsIGZy
YWdtZW50U2hhZGVyU3RyaW5nTWFza1JHQkEpOworICAgIGlmICghbV9sYXllck1hc2tQcm9ncmFt
T2JqZWN0W0xheWVyRGF0YTo6TGF5ZXJQcm9ncmFtU2hhZGVyUkdCQV0pIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBtYXNrIHByb2dyYW0gZm9yIFJHQkEgbGF5
ZXJzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2xheWVyTWFza1By
b2dyYW1PYmplY3RbTGF5ZXJEYXRhOjpMYXllclByb2dyYW1TaGFkZXJCR1JBXSA9CisgICAgICAg
IGxvYWRTaGFkZXJQcm9ncmFtKHZlcnRleFNoYWRlclN0cmluZywgZnJhZ21lbnRTaGFkZXJTdHJp
bmdNYXNrQkdSQSk7CisgICAgaWYgKCFtX2xheWVyTWFza1Byb2dyYW1PYmplY3RbTGF5ZXJEYXRh
OjpMYXllclByb2dyYW1TaGFkZXJCR1JBXSkgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0
byBjcmVhdGUgc2hhZGVyIG1hc2sgcHJvZ3JhbSBmb3IgQkdSQSBsYXllcnMiKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fY29sb3JQcm9ncmFtT2JqZWN0ID0gbG9hZFNo
YWRlclByb2dyYW0oY29sb3JWZXJ0ZXhTaGFkZXJTdHJpbmcsIGNvbG9yRnJhZ21lbnRTaGFkZXJT
dHJpbmcpOworICAgIGlmICghbV9jb2xvclByb2dyYW1PYmplY3QpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBwcm9ncmFtIGZvciBkZWJ1ZyBib3JkZXJzIik7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2NoZWNrZXJQcm9ncmFtT2Jq
ZWN0ID0gbG9hZFNoYWRlclByb2dyYW0oY29sb3JWZXJ0ZXhTaGFkZXJTdHJpbmcsIGNoZWNrZXJG
cmFnbWVudFNoYWRlclN0cmluZy5kYXRhKCkpOworICAgIGlmICghbV9jaGVja2VyUHJvZ3JhbU9i
amVjdCkgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgc2hhZGVyIHByb2dy
YW0gZm9yIGNoZWNrZXJib2FyZCBwYXR0ZXJuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICAvLyBTcGVjaWZ5IHRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRoZSBwb3NpdGlv
biBhbmQgbWFrZSBpdCB0aGUgc2FtZSBmb3IgYWxsIHRocmVlIHByb2dyYW1zIHRvCisgICAgLy8g
YXZvaWQgYmluZGluZyByZS1iaW5kaW5nIHRoZSB2ZXJ0ZXggYXR0cmlidXRlcy4KKyAgICBiaW5k
Q29tbW9uQXR0cmliTG9jYXRpb24obV9wb3NpdGlvbkxvY2F0aW9uLCAiYV9wb3NpdGlvbiIpOwor
ICAgIGJpbmRDb21tb25BdHRyaWJMb2NhdGlvbihtX3RleENvb3JkTG9jYXRpb24sICJhX3RleENv
b3JkIik7CisKKyAgICBjaGVja0dMRXJyb3IoKTsKKworICAgIC8vIFJlLWxpbmsgdGhlIHNoYWRl
cnMgdG8gZ2V0IHRoZSBuZXcgYXR0cmliIGxvY2F0aW9uIHRvIHRha2UgZWZmZWN0LgorICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnM7
ICsraSkgeworICAgICAgICBnbExpbmtQcm9ncmFtKG1fbGF5ZXJQcm9ncmFtT2JqZWN0W2ldKTsK
KyAgICAgICAgZ2xMaW5rUHJvZ3JhbShtX2xheWVyTWFza1Byb2dyYW1PYmplY3RbaV0pOworICAg
IH0KKworICAgIGdsTGlua1Byb2dyYW0obV9jb2xvclByb2dyYW1PYmplY3QpOworICAgIGdsTGlu
a1Byb2dyYW0obV9jaGVja2VyUHJvZ3JhbU9iamVjdCk7CisKKyAgICBjaGVja0dMRXJyb3IoKTsK
KworICAgIC8vIEdldCBsb2NhdGlvbnMgb2YgdW5pZm9ybXMgZm9yIHRoZSBsYXllciBjb250ZW50
IHNoYWRlciBwcm9ncmFtLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTGF5ZXJEYXRhOjpOdW1i
ZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnM7ICsraSkgeworICAgICAgICBtX3NhbXBsZXJMb2NhdGlv
bltpXSA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0W2ldLCAic190
ZXh0dXJlIik7CisgICAgICAgIG1fYWxwaGFMb2NhdGlvbltpXSA9IGdsR2V0VW5pZm9ybUxvY2F0
aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0W2ldLCAiYWxwaGEiKTsKKyAgICAgICAgZ2xVc2VQcm9n
cmFtKG1fbGF5ZXJQcm9ncmFtT2JqZWN0W2ldKTsKKyAgICAgICAgZ2xVbmlmb3JtMWkobV9zYW1w
bGVyTG9jYXRpb25baV0sIDApOworICAgICAgICBtX21hc2tTYW1wbGVyTG9jYXRpb25baV0gPSBn
bEdldFVuaWZvcm1Mb2NhdGlvbihtX2xheWVyTWFza1Byb2dyYW1PYmplY3RbaV0sICJzX3RleHR1
cmUiKTsKKyAgICAgICAgbV9tYXNrU2FtcGxlckxvY2F0aW9uTWFza1tpXSA9IGdsR2V0VW5pZm9y
bUxvY2F0aW9uKG1fbGF5ZXJNYXNrUHJvZ3JhbU9iamVjdFtpXSwgInNfbWFzayIpOworICAgICAg
ICBtX21hc2tBbHBoYUxvY2F0aW9uW2ldID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9sYXllck1h
c2tQcm9ncmFtT2JqZWN0W2ldLCAiYWxwaGEiKTsKKyAgICAgICAgZ2xVc2VQcm9ncmFtKG1fbGF5
ZXJNYXNrUHJvZ3JhbU9iamVjdFtpXSk7CisgICAgICAgIGdsVW5pZm9ybTFpKG1fbWFza1NhbXBs
ZXJMb2NhdGlvbltpXSwgMCk7CisgICAgICAgIGdsVW5pZm9ybTFpKG1fbWFza1NhbXBsZXJMb2Nh
dGlvbk1hc2tbaV0sIDEpOworICAgIH0KKworICAgIC8vIEdldCBsb2NhdGlvbnMgb2YgdW5pZm9y
bXMgZm9yIHRoZSBkZWJ1ZyBib3JkZXIgc2hhZGVyIHByb2dyYW0uCisgICAgbV9jb2xvckNvbG9y
TG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX2NvbG9yUHJvZ3JhbU9iamVjdCwgImNv
bG9yIik7CisKKyAgICAvLyBHZXQgbG9jYXRpb25zIG9mIHVuaWZvcm1zIGZvciB0aGUgY2hlY2tl
cmJvYXJkIHNoYWRlciBwcm9ncmFtLgorICAgIG1fY2hlY2tlclNjYWxlTG9jYXRpb24gPSBnbEdl
dFVuaWZvcm1Mb2NhdGlvbihtX2NoZWNrZXJQcm9ncmFtT2JqZWN0LCAic2NhbGUiKTsKKyAgICBt
X2NoZWNrZXJPcmlnaW5Mb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fY2hlY2tlclBy
b2dyYW1PYmplY3QsICJvcmlnaW4iKTsKKyAgICBtX2NoZWNrZXJTdXJmYWNlSGVpZ2h0TG9jYXRp
b24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX2NoZWNrZXJQcm9ncmFtT2JqZWN0LCAic3VyZmFj
ZUhlaWdodCIpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0ludFJlY3QgTGF5ZXJSZW5kZXJp
bmdSZXN1bHRzOjpob2xlUHVuY2hSZWN0KHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAgIGlm
IChpbmRleCA+PSBtX2hvbGVQdW5jaFJlY3RzLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIEludFJl
Y3QoKTsKKworICAgIHJldHVybiBtX2hvbGVQdW5jaFJlY3RzLmF0KGluZGV4KTsKK30KKwordm9p
ZCBMYXllclJlbmRlcmluZ1Jlc3VsdHM6OmFkZEhvbGVQdW5jaFJlY3QoY29uc3QgSW50UmVjdCYg
cmVjdCkKK3sKKyNpZiBERUJVR19WSURFT19DTElQUElORworICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIkxheWVyUmVuZGVy
aW5nUmVzdWx0czo6YWRkSG9sZVB1bmNoUmVjdCAoeD0lZCx5PSVkLHdpZHRoPSVkLGhlaWdodD0l
ZCkuIiwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwor
I2VuZGlmCisgICAgaWYgKCFyZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgbV9ob2xlUHVuY2hSZWN0
cy5hcHBlbmQocmVjdCk7Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJpbmdSZXN1bHRzOjphZGREaXJ0
eVJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBJbnRSZWN0IGRpcnR5VW5pb25bTnVt
YmVyT2ZEaXJ0eVJlY3RzXTsKKyAgICBpbnQgc21hbGxlc3RJbmNyZWFzZSA9IElOVF9NQVg7Cisg
ICAgaW50IG1vZGlmaWVkUmVjdCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1iZXJP
ZkRpcnR5UmVjdHM7ICsraSkgeworICAgICAgICBkaXJ0eVVuaW9uW2ldID0gbV9kaXJ0eVJlY3Rz
W2ldOworICAgICAgICBkaXJ0eVVuaW9uW2ldLnVuaXRlKHJlY3QpOworICAgICAgICBpbnQgaW5j
cmVhc2UgPSBkaXJ0eVVuaW9uW2ldLndpZHRoKCkqZGlydHlVbmlvbltpXS5oZWlnaHQoKSAtIG1f
ZGlydHlSZWN0c1tpXS53aWR0aCgpKm1fZGlydHlSZWN0c1tpXS5oZWlnaHQoKTsKKyAgICAgICAg
aWYgKGluY3JlYXNlIDwgc21hbGxlc3RJbmNyZWFzZSkgeworICAgICAgICAgICAgc21hbGxlc3RJ
bmNyZWFzZSA9IGluY3JlYXNlOworICAgICAgICAgICAgbW9kaWZpZWRSZWN0ID0gaTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIG1fZGlydHlSZWN0c1ttb2RpZmllZFJlY3RdID0gZGlydHlVbmlv
blttb2RpZmllZFJlY3RdOworfQorCitib29sIExheWVyUmVuZGVyaW5nUmVzdWx0czo6aXNFbXB0
eSgpIGNvbnN0Cit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1iZXJPZkRpcnR5UmVjdHM7
ICsraSkgeworICAgICAgICBpZiAoIW1fZGlydHlSZWN0c1tpXS5pc0VtcHR5KCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5
L0xheWVyUmVuZGVyZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNr
YmVycnkvTGF5ZXJSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZlNWVhMDAxMTAyNDc2OGU0MmFiOWFj
MGFkYjIwMDQ1NGFlZTRmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyUmVuZGVyZXIuaApAQCAtMCwwICsxLDE5MSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2lmbmRlZiBMYXllclJlbmRlcmVyX2gKKyNk
ZWZpbmUgTGF5ZXJSZW5kZXJlcl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTGF5ZXJEYXRhLmgiCisjaW5jbHVk
ZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9y
bUdMRVMyQ29udGV4dC5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUludFJlY3RSZWdp
b24uaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJs
ZS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ7
CitjbGFzcyBMYXllclJlbmRlcmVyU3VyZmFjZTsKKworY2xhc3MgTGF5ZXJSZW5kZXJpbmdSZXN1
bHRzIHsKK3B1YmxpYzoKKyAgICBMYXllclJlbmRlcmluZ1Jlc3VsdHMoKSA6IHdhc0VtcHR5KHRy
dWUpLCBuZWVkc0FuaW1hdGlvbkZyYW1lKGZhbHNlKSB7IH0KKworICAgIHZvaWQgYWRkSG9sZVB1
bmNoUmVjdChjb25zdCBJbnRSZWN0Jik7CisgICAgSW50UmVjdCBob2xlUHVuY2hSZWN0KHNpemVf
dCBpbmRleCkgY29uc3Q7CisgICAgc2l6ZV90IGhvbGVQdW5jaFJlY3RTaXplKCkgeyByZXR1cm4g
bV9ob2xlUHVuY2hSZWN0cy5zaXplKCk7IH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQgTnVtYmVy
T2ZEaXJ0eVJlY3RzID0gMzsKKyAgICBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QoaW50IGkpIGNv
bnN0IHsgcmV0dXJuIG1fZGlydHlSZWN0c1tpXTsgfQorICAgIHZvaWQgYWRkRGlydHlSZWN0KGNv
bnN0IEludFJlY3QmIGRpcnR5UmVjdCk7CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CisKKyAg
ICBib29sIHdhc0VtcHR5OworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdp
b24gZGlydHlSZWdpb247CisKKyAgICBib29sIG5lZWRzQW5pbWF0aW9uRnJhbWU7CisKK3ByaXZh
dGU6CisgICAgVmVjdG9yPEludFJlY3Q+IG1faG9sZVB1bmNoUmVjdHM7IC8vIFJlY3RzIGFyZSBp
biBjb21wb3NpdGluZyBzdXJmYWNlIGNvb3JkaW5hdGVzLgorICAgIEludFJlY3QgbV9kaXJ0eVJl
Y3RzW051bWJlck9mRGlydHlSZWN0c107Cit9OworCisvLyBDbGFzcyB0aGF0IGhhbmRsZXMgZHJh
d2luZyBvZiBjb21wb3NpdGVkIHJlbmRlciBsYXllcnMgdXNpbmcgR0wuCitjbGFzcyBMYXllclJl
bmRlcmVyIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShMYXllclJlbmRlcmVyKTsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyPiBjcmVhdGUoQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQqKTsKKworICAgIExheWVyUmVuZGVy
ZXIoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQqKTsKKyAgICB+
TGF5ZXJSZW5kZXJlcigpOworCisgICAgdm9pZCByZWxlYXNlTGF5ZXJSZXNvdXJjZXMoKTsKKwor
ICAgIC8vIFJlY29tcG9zaXRlcyBhbGwgdGhlIGxheWVycy4gUmV0dXJucyB0cnVlIGlmIGl0IG5l
ZWRzIG1vcmUgZHJhdy4KKyAgICB2b2lkIGRyYXdMYXllcnMoY29uc3QgRmxvYXRSZWN0JiB2aXNp
YmxlUmVjdCwgY29uc3QgSW50UmVjdCYgbGF5b3V0UmVjdCwgY29uc3QgSW50U2l6ZSYgY29udGVu
dHNTaXplLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0KTsKKworICAgIHZvaWQgc2V0Um9vdExheWVy
KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsKKyAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBy
b290TGF5ZXIoKSB7IHJldHVybiBtX3Jvb3RMYXllci5nZXQoKTsgfQorCisgICAgLy8gS2VlcCB0
cmFjayBvZiBsYXllcnMgdGhhdCBuZWVkIGNsZWFudXAgd2hlbiB0aGUgTGF5ZXJSZW5kZXJlciBp
cyBkZXN0cm95ZWQKKyAgICB2b2lkIGFkZExheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsK
KyAgICBib29sIHJlbW92ZUxheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsKKworICAgIC8v
IEtlZXAgdHJhY2sgb2YgbGF5ZXJzIHRoYXQgbmVlZCB0byByZWxlYXNlIHRoZWlyIHRleHR1cmVz
IHdoZW4gd2Ugc3dhcCBidWZmZXJzCisgICAgdm9pZCBhZGRMYXllclRvUmVsZWFzZVRleHR1cmVS
ZXNvdXJjZXNMaXN0KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqKTsKKworICAgIGJvb2wgaGFyZHdh
cmVDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1faGFyZHdhcmVDb21wb3NpdGluZzsgfQor
CisgICAgdm9pZCBzZXRDbGVhclN1cmZhY2VPbkRyYXdMYXllcnMoYm9vbCBjbGVhcikgeyBtX2Ns
ZWFyU3VyZmFjZU9uRHJhd0xheWVycyA9IGNsZWFyOyB9CisgICAgYm9vbCBjbGVhclN1cmZhY2VP
bkRyYXdMYXllcnMoKSBjb25zdCB7IHJldHVybiBtX2NsZWFyU3VyZmFjZU9uRHJhd0xheWVyczsg
fQorCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMkNvbnRleHQqIGNv
bnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQ7IH0KKworICAgIGNvbnN0IExheWVyUmVu
ZGVyaW5nUmVzdWx0cyYgbGFzdFJlbmRlcmluZ1Jlc3VsdHMoKSBjb25zdCB7IHJldHVybiBtX2xh
c3RSZW5kZXJpbmdSZXN1bHRzOyB9CisKKyAgICAvLyBTY2hlZHVsZSBhIGNvbW1pdCBvbiB0aGUg
V2ViS2l0IHRocmVhZCBhdCB0aGUgZW5kIG9mIHJlbmRlcmluZworICAgIC8vIFVzZWQgd2hlbiBh
IGxheWVyIGRpc2NvdmVycyBkdXJpbmcgcmVuZGVyaW5nIHRoYXQgaXQgbmVlZHMgYSBjb21taXQu
CisgICAgdm9pZCBzZXROZWVkc0NvbW1pdCgpIHsgbV9uZWVkc0NvbW1pdCA9IHRydWU7IH0KKwor
ICAgIEludFJlY3QgdG9XZWJLaXREb2N1bWVudENvb3JkaW5hdGVzKGNvbnN0IEZsb2F0UmVjdCYp
IGNvbnN0OworCisgICAgLy8gSWYgdGhlIGxheWVyIGhhcyBhbHJlYWR5IGJlZW4gZHJhd2VkIG9u
IGEgc3VyZmFjZS4KKyAgICBib29sIGxheWVyQWxyZWFkeU9uU3VyZmFjZShMYXllckNvbXBvc2l0
aW5nVGhyZWFkKikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVMYXllcnNSZWN1
cnNpdmUoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
JiBwYXJlbnRNYXRyaXgsIFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4gPiYg
c3VyZmFjZUxheWVycywgZmxvYXQgb3BhY2l0eSwgRmxvYXRSZWN0IGNsaXBSZWN0LCBkb3VibGUg
Y3VycmVudFRpbWUpOworICAgIHZvaWQgY29tcG9zaXRlTGF5ZXJzUmVjdXJzaXZlKExheWVyQ29t
cG9zaXRpbmdUaHJlYWQqLCBpbnQgc3RlbmNpbFZhbHVlLCBGbG9hdFJlY3QgY2xpcFJlY3QpOwor
ICAgIHZvaWQgdXBkYXRlU2Npc3NvcklmTmVlZGVkKGNvbnN0IEZsb2F0UmVjdCYgY2xpcFJlY3Qp
OworCisgICAgYm9vbCB1c2VTdXJmYWNlKExheWVyUmVuZGVyZXJTdXJmYWNlKik7CisgICAgdm9p
ZCBkcmF3TGF5ZXJzT25TdXJmYWNlcyhjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ29tcG9zaXRp
bmdUaHJlYWQ+ID4mIHN1cmZhY2VMYXllcnMpOworCisgICAgdm9pZCBkcmF3RGVidWdCb3JkZXIo
TGF5ZXJDb21wb3NpdGluZ1RocmVhZCopOworICAgIHZvaWQgZHJhd0hvbGVQdW5jaFJlY3QoTGF5
ZXJDb21wb3NpdGluZ1RocmVhZCopOworCisgICAgSW50UmVjdCB0b09wZW5HTFdpbmRvd0Nvb3Jk
aW5hdGVzKGNvbnN0IEZsb2F0UmVjdCYpIGNvbnN0OworICAgIEludFJlY3QgdG9XZWJLaXRXaW5k
b3dDb29yZGluYXRlcyhjb25zdCBGbG9hdFJlY3QmKSBjb25zdDsKKworICAgIHZvaWQgYmluZENv
bW1vbkF0dHJpYkxvY2F0aW9uKGludCBsb2NhdGlvbiwgY29uc3QgY2hhciogYXR0cmliTmFtZSk7
CisKKyAgICBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpOworCisgICAgYm9vbCBpbml0aWFsaXpl
U2hhcmVkR0xPYmplY3RzKCk7CisKKyAgICAvLyBHTCBzaGFkZXIgcHJvZ3JhbSBvYmplY3QgSURz
LgorICAgIHVuc2lnbmVkIG1fbGF5ZXJQcm9ncmFtT2JqZWN0W0xheWVyRGF0YTo6TnVtYmVyT2ZM
YXllclByb2dyYW1TaGFkZXJzXTsKKyAgICB1bnNpZ25lZCBtX2xheWVyTWFza1Byb2dyYW1PYmpl
Y3RbTGF5ZXJEYXRhOjpOdW1iZXJPZkxheWVyUHJvZ3JhbVNoYWRlcnNdOworICAgIHVuc2lnbmVk
IG1fY29sb3JQcm9ncmFtT2JqZWN0OworICAgIHVuc2lnbmVkIG1fY2hlY2tlclByb2dyYW1PYmpl
Y3Q7CisKKyAgICAvLyBTaGFkZXIgdW5pZm9ybSBhbmQgYXR0cmlidXRlIGxvY2F0aW9ucy4KKyAg
ICBjb25zdCBpbnQgbV9wb3NpdGlvbkxvY2F0aW9uOworICAgIGNvbnN0IGludCBtX3RleENvb3Jk
TG9jYXRpb247CisgICAgaW50IG1fc2FtcGxlckxvY2F0aW9uW0xheWVyRGF0YTo6TnVtYmVyT2ZM
YXllclByb2dyYW1TaGFkZXJzXTsKKyAgICBpbnQgbV9hbHBoYUxvY2F0aW9uW0xheWVyRGF0YTo6
TnVtYmVyT2ZMYXllclByb2dyYW1TaGFkZXJzXTsKKyAgICBpbnQgbV9tYXNrU2FtcGxlckxvY2F0
aW9uW0xheWVyRGF0YTo6TnVtYmVyT2ZMYXllclByb2dyYW1TaGFkZXJzXTsKKyAgICBpbnQgbV9t
YXNrU2FtcGxlckxvY2F0aW9uTWFza1tMYXllckRhdGE6Ok51bWJlck9mTGF5ZXJQcm9ncmFtU2hh
ZGVyc107CisgICAgaW50IG1fbWFza0FscGhhTG9jYXRpb25bTGF5ZXJEYXRhOjpOdW1iZXJPZkxh
eWVyUHJvZ3JhbVNoYWRlcnNdOworCisgICAgaW50IG1fY29sb3JDb2xvckxvY2F0aW9uOworICAg
IGludCBtX2NoZWNrZXJTY2FsZUxvY2F0aW9uOworICAgIGludCBtX2NoZWNrZXJPcmlnaW5Mb2Nh
dGlvbjsKKyAgICBpbnQgbV9jaGVja2VyU3VyZmFjZUhlaWdodExvY2F0aW9uOworCisgICAgLy8g
Q3VycmVudCBkcmF3IGNvbmZpZ3VyYXRpb24uCisgICAgRmxvYXRSZWN0IG1fdmlzaWJsZVJlY3Q7
CisgICAgSW50UmVjdCBtX2xheW91dFJlY3Q7CisgICAgSW50U2l6ZSBtX2NvbnRlbnRzU2l6ZTsK
KworICAgIEludFJlY3QgbV92aWV3cG9ydDsKKyAgICBJbnRSZWN0IG1fc2Npc3NvclJlY3Q7CisK
KyAgICBSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4gbV9yb290TGF5ZXI7CisKKyAgICB1
bnNpZ25lZCBtX2ZibzsKKyAgICBMYXllclJlbmRlcmVyU3VyZmFjZSogbV9jdXJyZW50TGF5ZXJS
ZW5kZXJlclN1cmZhY2U7CisKKyAgICBib29sIG1faGFyZHdhcmVDb21wb3NpdGluZzsKKyAgICBi
b29sIG1fY2xlYXJTdXJmYWNlT25EcmF3TGF5ZXJzOworCisgICAgLy8gTWFwIGFzc29jaWF0aW5n
IGxheWVycyB3aXRoIHRleHR1cmVzIGlkcyB1c2VkIGJ5IHRoZSBHTCBjb21wb3NpdG9yLgorICAg
IHR5cGVkZWYgSGFzaFNldDxMYXllckNvbXBvc2l0aW5nVGhyZWFkKj4gTGF5ZXJTZXQ7CisgICAg
TGF5ZXJTZXQgbV9sYXllcnM7CisgICAgTGF5ZXJTZXQgbV9sYXllcnNMb2NraW5nVGV4dHVyZVJl
c291cmNlczsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6R0xFUzJDb250
ZXh0KiBtX2NvbnRleHQ7CisKKyAgICBMYXllclJlbmRlcmluZ1Jlc3VsdHMgbV9sYXN0UmVuZGVy
aW5nUmVzdWx0czsKKyAgICBib29sIG1fbmVlZHNDb21taXQ7Cit9OworCit9CisKKyNlbmRpZiAv
LyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>